Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

do1234521/WxBox

Repository files navigation

WxBox

主要功能

  • WeChat进程实例多开;
  • 消息防撤回;
  • 监控账户生命周期【登录、注销、退出PC客户端】;
  • 检查PC微信是否处于登录状态;
  • Plugin触发PC端退出登录;
  • 获取登录账户的Profile;
  • 获取包括群聊在内的所有联系人信息【只获取昵称、备注、wxnumber和wxid】;
  • 昵称、wxnumber和wxid之间的相互转换;
  • 接管WeChat原始消息和处理过的消息;
  • 接管WeChat发送文本消息;
  • Plugin主动执行发送文本消息、文件、图片,对于群聊可以指定@列表。可以指定发送的目标和内容;
  • 过滤接收到的消息【原始消息拦截事件中】;
  • 替换接收到的消息【原始消息拦截事件中】,可以替换发送者、消息内容,对于群聊可以替换talker;
  • 通过WxBox或者手机端WeChat的"文件传输助手"向PC WeChat客户端发出执行Plugin命令的指令;
  • 自定义纯文本和二进制类型的Plugin。

Plugin预定义wxbox模块提供的部分API接口

WxBox的核心功能在Plugin上,上面的所有功能都可以在自定义的Plugin中调用,而Plugin可以通过WxBox和filehelper来调用。

​ WxBot里面预定义了一个wxbox模块,它提供了一些API接口,这些API包含了上面还有之外的功能,完整的wxbox模块API可以看plugins目录下的wxbox_apis.txt文件,下面列出部分:

  • >>wxbox.version查看wxbox的版本
  • >>wxbox.help查看wxbox命令帮助,它会给文件传输助手发送一个wxbox_apis.txt文件
  • >>wxbox.get_phone_test_case如果处于登录状态的话,会给手机上的文件传输助手发送所有手机的测试用例
  • >>wxbox.snap向filehelper发送一个桌面系统所有显示器拼接的"载图"
  • >>wxbox.snap_main_monitor向filehelper发送一个桌面主Monitor的"载图"
  • >>wxbox.info、>>wxbox.warning、>>wxbox.error向WxBox发送不同Level的日志
  • >>wxbox.shell在PC系统上执行有权限执行的所有类型的shell命令【*】,可以通过它执行关机、打开程序、图片等指令
  • >>wxbox.msgbox给PC弹出一个对话框,用来提示消息的
  • >>wxbox.speak让PC播放一段指定文本的语音
  • >>wxbox.lock_screen让PC锁屏
  • >>wxbox.list_drivers列出PC系统上所有的硬盘驱动器盘符
  • >>wxbox.list_files列出PC系统上指定文件夹目录下的所有文件和文件夹
  • >>wxbox.download把PC上指定的文件通过filehelper传输到手机上,大小限制跟WeChat发送文件大小的限制一样,听说最大是1GB,但是没测试过
  • >>wxbox.uninject_wxbot卸载PC上当前用户的WxBot模块
  • >>wxbox.exit_wxbox关闭PC上的WxBox
  • >>wxbox.logout让PC上的WeChat退出登录
  • >>wxbox.nickname_to_wxid昵称转为wxid
  • >>wxbox.wxid_to_wxnumber从wxid转为wxnumber
  • >>wxbox.chatroom_wxid获取群聊的roomWxid
  • >>wxbox.send_text_to_filehelper向filehelper发送文本消息
  • >>wxbox.send_picture_to_filehelper向filehelper发送图片
  • >>wxbox.send_file_to_filehelper向filehelper发送文件
  • >>wxbox.send_text向指定wxid联系人发送文本消息
  • >>wxbox.send_picture向指定wxid联系人发送图片
  • >>wxbox.send_file向指定wxid联系人发送文件
  • >>wxbox.send_text_with_wxnumber向指定wxnumber联系人发送文本消息
  • >>wxbox.send_picture_with_wxnumber向指定wxnumber联系人发送图片
  • >>wxbox.send_file_with_wxnumber向指定wxnumber联系人发送文件
  • >>wxbox.send_text_to_chatroom向指定群聊发送文本消息,消息后面可选带@列表
  • >>wxbox.send_picture_to_chatroom向群聊发送图片
  • >>wxbox.send_file_to_chatroom向群聊发送文件
  • >>wxbox.chatroom_notiry在群聊上@一部分人
  • >>wxbox.chatroom_notiry_all在群聊上@所有人

第三方依赖

​ 注意:以下部分库存在编译好的版本或者我们自己编译过的Windows版本放在这个仓库上:https://gitee.com/phantom27/wxbox-public-storage

  • gRPC - v1.41.1
  • protobuf - v3.17.3
  • frida-gum(弃用)
  • TitanEngine(弃用)
  • Qt5
  • spdlog - v1.9.2
  • meson+ninja - >=v0.60.2
  • cmake
  • pkg-config
  • lua - v5.4.3
  • googletest - v1.11.0
  • yaml-cpp - v0.7.0

i18n支持

​ 项目中以简体中文为原始语言,如果加入新的文本还有翻译,需要手动更新assets/translations/下的zh_cn.ts和en.ts,可以配合Linguist做调整,然后执行以下命令,生成对应的qm文件,并touch wxbox.qrc使编译器知道资源文件更新了(如果执行githooks/setup_hook可以安装一个git的pre-commit钩子,在commit前会自动检查更新)

# Windows
.\scripts\update_i18n.bat
# Mac OS
./scripts/update_i18n

​ 另外由于采用的原始语言是英文,而在一些编辑器上,特别是中文环境的Visual Studio IDE上,默认的编码可能用的是gbk,直接使用中文文本这就有可能导致跟ts文件的对不上,所以在非.ui文件上,也就是在.cpp或者.h上的文本尽量使用英文,然后在zh_cn.ts上转成中文,zh_cn.ts和en.ts用的都是utf8。

​ 或者用转义的方式(utf8一般一个汉字三个字节)也可以,例如:

QMessageBox::information(this, tr("Title"), tr("345円205円263円344円272円216円 WxBox"));

构建方法

​ 首先需要安装meson+ninja构建工具,可以到以下路径下载:https://github.com/mesonbuild/meson/releases。

  • ​ spdbuf需要cmake构建工具。
  • ​ 编译器需要C++17以上标准。
  • ​ 构建路径必须包含在build里面(不管是debug还是release版本的),ninja为backend使用build/debug和build/release,vs为backend使用build/vsdebug和build/release,mac用xcode构建的话使用build/xcodedebug和build/xcoderelease

关于构建时出现的Warning

​ 在编译时,部分第三方库有非常多的Warning,这些全部忽略它,但是不关闭这些警告。但是主项目构建时出现的所有Warning都要重新检查,对主项目的所有Warning零容忍

Qt SDK环境路径

​ 在Windows中要把qmake的路径加入Path中,否则meson识别不到Qt5

# 下面是一个msvc2017构建kit路径的例子,注意必须是32位的版本
F:\Qt\Qt5.14.25円.14.2\msvc2017\bin

​ Qt SDK下载路径:https://download.qt.io/archive/qt/,官方镜像列表:https://download.qt.io/static/mirrorlist/,尽量使用Qt 5.11~ Qt 5.15版本的SDK。

Qt依赖处理

​ 在Windows下使用windeployqt,Mac OS下使用macdeployqt,这两个都是Qt官方的工具。

lua wrap补丁

​ meson官方的lua wrap生成的是动态库,但是我们需要的是静态库,所以对meson官方的lua_5.4.3-1 wrap打了个补丁,修改为生成静态库。这个直接以zip包方式放在仓库上,wrap下回来的包使用的是这个。

# 打补丁的位置是lua-5.4.3/meson.build
# 补丁内容如下:
index a9c4d56..2004cfb 100644
--- a/meson_original.build
+++ b/meson.build
@@ -49,7 +49,7 @@ if get_option('line_editing')
 endif
 # Targets.
-lua_lib = library('lua',
+lua_lib = static_library('lua',
 'src/lapi.c',
 'src/lauxlib.c',
 'src/lbaselib.c',
@@ -83,8 +83,6 @@ lua_lib = library('lua',
 'src/lvm.c',
 'src/lzio.c',
 dependencies: lua_lib_deps,
- version: meson.project_version(),
- soversion: lua_versions[0] + '.' + lua_versions[1],

构建依赖

​ 由于只有gRPC构建出来比较麻烦,所以这里只记录gRPC的构建方法。另外在编译gRPC的时候protobuf也一起编译了,所以不需要另外编译protobuf了。

gRPC构建方法

​ 如果在Mac OS环境下能用brew安装gRPC的dev包,那么就不需要,对于Windows已经编译好了一份Debug和一份Release版本的了,它们将放在仓库上,并且已经给gRPC写了一个meson的wrap,在使用meson构建时将会自动下载。(note:这个也可以用vcpkg来构建,不过版本相对有点旧,所以不用vcpkg的port)

# 克隆gRPC
git clone --recurse-submodules -b v1.43.0 https://github.com/grpc/grpc
# 如果克隆下来后因为网络原因导致一些submodules未下回来,可以先把grpc克隆回来,然后后面再用下面的命令来把submodule拉回来
git submodule init
git submodule update
# 对于Windows 需要下载依赖
sudo choco install nasm
# 对于Mac OS 需要下载以下依赖
brew install autoconf automake libtool pkg-config
# 另外注意,这是用cmake来构建configure的所以cmake在两个平台下都需要
# Windows环境下编译gRPC Debug版本(先切到gRPC仓库的根目录后执行下面命令)
mkdir -p cmake/build/debug & cd cmake/build/debug
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Debug -DgRPC_BUILD_TESTS=OFF -DgRPC_INSTALL=ON -DgRPC_BUILD_GRPC_CSHARP_PLUGIN=OFF -DgRPC_BUILD_GRPC_NODE_PLUGIN=OFF -DgRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN=OFF -DgRPC_BUILD_GRPC_PHP_PLUGIN=OFF -DgRPC_BUILD_GRPC_PYTHON_PLUGIN=OFF -DgRPC_BUILD_GRPC_RUBY_PLUGIN=OFF -DgRPC_BUILD_CSHARP_EXT=OFF -DCMAKE_INSTALL_PREFIX=../../install/debug ../..
nmake
nmake install
# Windows环境下编译gRPC Release版本(先切到gRPC仓库的根目录后执行下面命令)
mkdir -p cmake/build/debug & cd cmake/build/debug
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DgRPC_BUILD_TESTS=OFF -DgRPC_INSTALL=ON -DgRPC_BUILD_GRPC_CSHARP_PLUGIN=OFF -DgRPC_BUILD_GRPC_NODE_PLUGIN=OFF -DgRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN=OFF -DgRPC_BUILD_GRPC_PHP_PLUGIN=OFF -DgRPC_BUILD_GRPC_PYTHON_PLUGIN=OFF -DgRPC_BUILD_GRPC_RUBY_PLUGIN=OFF -DgRPC_BUILD_CSHARP_EXT=OFF -DCMAKE_INSTALL_PREFIX=../../install/release ../..
nmake
nmake install
# Mac OS环境下编译gRPC Debug版本(先切到gRPC仓库的根目录后执行下面命令)
mkdir -p cmake/build/debug & cd cmake/build/debug
cmake -G -DCMAKE_BUILD_TYPE=Debug -DgRPC_BUILD_TESTS=OFF -DgRPC_INSTALL=ON -DgRPC_BUILD_GRPC_CSHARP_PLUGIN=OFF -DgRPC_BUILD_GRPC_NODE_PLUGIN=OFF -DgRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN=OFF -DgRPC_BUILD_GRPC_PHP_PLUGIN=OFF -DgRPC_BUILD_GRPC_PYTHON_PLUGIN=OFF -DgRPC_BUILD_GRPC_RUBY_PLUGIN=OFF -DgRPC_BUILD_CSHARP_EXT=OFF -DCMAKE_INSTALL_PREFIX=../../install/debug ../..
make -j
make install
# Mac OS环境下编译gRPC Release版本(先切到gRPC仓库的根目录后执行下面命令)
mkdir -p cmake/build/debug & cd cmake/build/debug
cmake -DCMAKE_BUILD_TYPE=Release -DgRPC_BUILD_TESTS=OFF -DgRPC_INSTALL=ON -DgRPC_BUILD_GRPC_CSHARP_PLUGIN=OFF -DgRPC_BUILD_GRPC_NODE_PLUGIN=OFF -DgRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN=OFF -DgRPC_BUILD_GRPC_PHP_PLUGIN=OFF -DgRPC_BUILD_GRPC_PYTHON_PLUGIN=OFF -DgRPC_BUILD_GRPC_RUBY_PLUGIN=OFF -DgRPC_BUILD_CSHARP_EXT=OFF -DCMAKE_INSTALL_PREFIX=../../install/release ../..
make
make install
gRPC引用注意

​ gRPC在install后是会打包好给pkg-config用的pc文件的,但是由于生成的lib文件非常的多,执行一次pkg-config搜索非常的慢,所以项目中用的方法是,调用一次pkg-config然后把参数记录下来,直接写进meson的wrap中。

# 下面是在Windows环境下执行的pkg-config,PKG_CONFIG_PATH需要根据实际情况修改
PKG_CONFIG_PATH=/g/Tutorial/meson/testgrpc/grpc/lib/pkgconfig ./pkg-config.exe grpc++ --cflags --libs
# 结果如下:
/W3 /DNOMINMAX /DWIN32_LEAN_AND_MEAN /D_CRT_SECURE_NO_WARNINGS /D_SCL_SECURE_NO_WARNINGS /D_ENABLE_EXTENDED_ALIGNED_STORAGE /bigobj /wd4005 /wd4068 /wd4180 /wd4244 /wd4267 /wd4503 /wd4800 -IG:/Tutorial/meson/testgrpc/grpc/include -ignore:4221 -LG:/Tutorial/meson/testgrpc/grpc/lib -lgrpc++ -lgrpc -laddress_sorting -lre2 -lupb -lcares -lz -lgpr -labsl_statusor -lssl -lcrypto -labsl_hash -labsl_raw_hash_set -labsl_hashtablez_sampler -labsl_city -labsl_low_level_hash -labsl_random_distributions -labsl_random_seed_sequences -labsl_random_internal_pool_urbg -labsl_random_internal_randen -labsl_random_seed_gen_exception -labsl_random_internal_randen_hwaes -labsl_random_internal_randen_slow -labsl_random_internal_randen_hwaes_impl -labsl_random_internal_platform -labsl_random_internal_seed_material -labsl_status -labsl_cord -labsl_cordz_info -labsl_cord_internal -labsl_cordz_functions -labsl_cordz_handle -labsl_exponential_biased -labsl_synchronization -labsl_bad_optional_access -labsl_str_format_internal -labsl_graphcycles_internal -labsl_stacktrace -labsl_symbolize -labsl_time -labsl_debugging_internal -labsl_demangle_internal -labsl_malloc_internal -labsl_civil_time -labsl_strings -labsl_time_zone -labsl_strings_internal -labsl_int128 -labsl_throw_delegate -labsl_base -labsl_spinlock_wait -labsl_bad_variant_access -labsl_raw_logging_internal -labsl_log_severity
# 处理过之后编译参数整理为:
['/DNOMINMAX', '/DWIN32_LEAN_AND_MEAN', '/D_CRT_SECURE_NO_WARNINGS', '/D_SCL_SECURE_NO_WARNINGS', '/D_ENABLE_EXTENDED_ALIGNED_STORAGE', '/bigobj', '/wd4005', '/wd4068', '/wd4180', '/wd4244', '/wd4267', '/wd4503', '/wd4800']
# 依赖的静态库文件整理如下(这里还实际调试把漏掉的补上了):
['grpc++', 'grpc', 'address_sorting', 're2', 'upb', 'cares', 'zlib', 'gpr', 'absl_statusor', 'ssl', 'crypto', 'absl_hash', 'absl_raw_hash_set', 'absl_hashtablez_sampler', 'absl_city', 'absl_low_level_hash', 'absl_random_distributions', 'absl_random_seed_sequences', 'absl_random_internal_pool_urbg', 'absl_random_internal_randen', 'absl_random_seed_gen_exception', 'absl_random_internal_randen_hwaes', 'absl_random_internal_randen_slow', 'absl_random_internal_randen_hwaes_impl', 'absl_random_internal_platform', 'absl_random_internal_seed_material', 'absl_status', 'absl_cord', 'absl_cordz_info', 'absl_cord_internal', 'absl_cordz_functions', 'absl_cordz_handle', 'absl_exponential_biased', 'absl_synchronization', 'absl_bad_optional_access', 'absl_str_format_internal', 'absl_graphcycles_internal', 'absl_stacktrace', 'absl_symbolize', 'absl_time', 'absl_debugging_internal', 'absl_demangle_internal', 'absl_malloc_internal', 'absl_civil_time', 'absl_strings', 'absl_time_zone', 'absl_strings_internal', 'absl_int128', 'absl_throw_delegate', 'absl_base', 'absl_spinlock_wait', 'absl_bad_variant_access', 'absl_raw_logging_internal', 'absl_log_severity', 'libprotobuf', 'grpc++_reflection']

更换为v1.41.1版本

​ 由于v1.44.0版本使用时出现崩溃,所以换成了较老的1.41.1版本的gRPC.

Windows下构建

# 在Visual Studio "x86"开发人员命令提示符执行以下命令
# 默认用的backend是ninja
# !!! 构建路径必须包含在build里面 !!!
meson setup build/release --buildtype release
meson compile -C build/release

Mac OS下构建

​ ......

关于测试

​ 测试使用的框架是googletest,详细文档可以看:https://google.github.io/googletest/

# 执行测试(以debug版本为例子)
meson compile -C build/debug
meson test -C build/debug

​ 另外测试时要留意是否出现内存泄漏,对内存泄漏零容忍,必须避免。

禁用测试用例

​ 可以通过宏开关来禁用某些测试用例,例如:禁用wxbox_utils的测试用例,可以用下面的方法reconfigure:

meson build/vsdebug --reconfigure -Ddisable_wxbox_utils_test=true

​ 更多的开关可以看meson_options.txt

开发时的调试方法

​ 开发调试不使用ninja作为backend,也不使用vscode作为编辑器,而是切为IDE,在Windows下用Visual Studio,在Mac OS下用xcode。另外下面Windows版本中,Visual Studio指定了wxbox为启动项目,在使用Visual Studio写测试用例时可以改为测试用例为启动项目。

安装git钩子

# 安装git pre-commit钩子,用于提交前自动完成代码风格化和更新i18n文件
./githooks/setup_hook

Windows下使用Visual Studio IDE来开发并调试

# 以Visual Studio为backend创建工程
meson setup build/vsdebug --buildtype debug --backend vs -Dbackend_startup_project=wxbox
# 构建vs工程完成后,就可以打开build/vsdebug/WxBox.sln工程,然后把"wxbox@exe"修改为启动项目,接着就可以开发调试了
# 另外在IDE环境开发时,如果加入某些新源文件、修改的项目的配置,可以用以下命令reconfigure
meson build/vsdebug --reconfigure

Mac OS下使用xcode IDE来开发并调试

# 以xcode为backend创建工程
meson setup build/xcodedebug --buildtype debug --backend xcode

关于调试开发时一些dll、so查找路径的问题

​ 如果是执行meson test进行测试话,在meson.build中已经配置好了PATH,但是如果像在Visual Studio中,调试开发运行时,dll、so的查找路径并没有通过meson.build中指定(meson目前应该是不支持的),通过脚本拷贝dll去工作目录的话没啥必要,所以就手动在Visual Studio中配置PATH吧。

image

​ 这里的例子是包含wintools\bin和gRPC的bin目录:

PATH=%PATH%;$(SolutionDir)..\..\wintools\bin;$(SolutionDir)..\..\subprojects\grpc-windows-x86-v1.41.1-dev-debug\bin

​ 多个dll查找路径用";"隔开

代码风格

​ 代码风格使用clang-format来统一,在命令行或在IDE(Visual Studio、xcode)上构建都要使用clang-format来把所有代码给格式化。

# 项目中已经为Windows还有Mac OS写了两个脚本,执行下面的Target就会调用了,另外-C不一定需要build/release
meson compile -C build/release pretty_format

​ 另外Visual Studio是支持clang-format的,按下";"分号或者保存,会触发Visual Studio自动应用项目根目录下的.clang-format文件,另外选中代码然后Ctrl+K,Ctrl+F也可以主动触发。并且也有一个LLVM官方的ClangFormat扩展:https://marketplace.visualstudio.com/items?itemName=LLVMExtensions.ClangFormat配合。

​ 不过Visual Studio 2015自带的clang-format版本比较老,有些开关不支持,会报错,所以这里把一些会报错的开关给注释掉了。

​ 果执行githooks/setup_hook可以安装一个git的pre-commit钩子,在commit前会自动检查执行pretty_format。

​ lint可以用cppcheck。

Plugins

​ WxBox使用lua来实现扩展,要注意的是,项目中的lua是C语言的构建版本而不是C++,所以"让出"、"错误处理"等操作用的是setjmp、longjmp来完成长跳转的,这会破坏栈帧结构,像在自定义封装的lua C函数内使用了C++的局部对象,那么是否能够调用对象的析构函数这是无法保证的,默认情况下,在Visual Studio编译环境由于编译器有补充了一些处理,所以可以调用析构函数,但是在Linux环境就不行。所以尽量不要在编写lua扩展的部分使用C++类对象。

plugins目录结构

+---plugins:存放所有包括纯文本和二进制的扩展; | +---common:存放"第三方"的lua库,比如:yaml库; | | ---libs:存放"第三方"的动态lua库 | +---libs:存放二进制的lua扩展 | | ---template:一个二进制扩展的模板,要想编写二进制的扩展可以参考这个模板。 | | ---subprojects | ---storage:供所有脚本存储配置信息、数据;

Plugin类型

​ 分为纯文本的扩展还有动态库的扩展,但WxBot识别为扩展并主动加载的只有plugins根目录下的纯文本lua,动态库类型还有其它第三方的lua都作为辅助的模块

热更新

​ wxbot会监控plugins文件夹的变化,根据实际情况来加载、卸载或重新加载扩展

Plugin事件

​ load、prereload和unload事件处理不接收参数,其它参数都会传递一个PluginEventModel,下面列出几个常用的事件

  • load:扩展加载事件,返回true表示初始化成功,返回false表示初始化失败;
  • prereload:扩展重载前事件,没有返回值;
  • unload:扩展卸载事件,没有返回值。
  • receive_text_message:微信接收文本消息,接收一个PluginEventModel,没有返回值
  • send_text_message:微信发送文本消息,接收一个PluginEventModel,没有返回值

Plugin任务超时机制

​ 为了避免Plugin中出现死循环或者耗时过长的调用,所以Plugin有超时机制,如果一个调用超过设定的时间,那么会被强制结束任务并让出

Storage

​ lua可以自由的在storage文件夹内存储配置文件和数据文件,尽量每个模块对应一个文件夹,用wxbox.package_storage_path(plugin_name)来获取给扩展使用的存储目录,或者通过plugin.storage_path来获取。

引入第三方的lua库

​ 纯文本的放在plugins/common根目录下,二进制的放进plugins/common/libs

Plugin命令调用语法(BNF)

​ statement ::= prefixexp methodcall

​ prefixexp ::= ">>"

​ methodcall ::= method | method ":" arglist

​ method ::= methodname | modulename "." methodname

​ arglist ::= expr {"," expr}

​ expr ::= false | true | Numeral | LiteralString

可以执行Plugin命令的对象

​ 可调用的模块只有wxbox的内部模块还有在plugins根目录下的纯本文lua扩展,不过全局的函数可以任意调用

  • ​ filehelper联系人发送的文本消息
  • ​ wxbox执行命令

交互式调用语法测试工具interact

​ 这里提供一个interact工具来在控制台下交互式的测试Plugin的调用语法

image

WxBox Plugin API

​ 看plugins\wxbox_module_apis.txt文件

Plugin例子

​ 这个扩展的功能是,文件传输助手收到"关机"那么系统会定时2分钟后关机,"取消关机"就是取消这次关机任务,收到其它消息,在PC上会自动把文本语音播放出来。

helpme = declare_plugin('helpme')
function helpme.handle_filehelper_text_message(event)
 message = event:message()
 if (message == '关机') then
 wxbox.shell('shutdown', '/s /t 120')
 elseif (message == '取消关机') then
 wxbox.shell('shutdown', '/a')
 else
 wxbox.speak(message)
 end
end
local text_message_handler = {
 ['filehelper'] = helpme.handle_filehelper_text_message
}
function helpme.receive_text_message(event)
 text_message_handler[event:wxid()](event)
end

install与打包方法

# ninja作为后端编译打包
meson setup build\release --buildtype=release
meson compile -C build\release
meson install -C build\release

​ 最终会被打包到build\dist\release目录下,build\install是一个过度路径,给meson执行install。这个项目里别用DESTDIR或者--prefix来重新指定打包路径,这不会生效。 ​ 打包最终会生成四个文件,分别是wxbox主体的.tar.xz和.zip包(它们内容相同),还有symbol的.tar.xz和.zip包。 ​ 另外别打包debug版本的,debug版有些运行时的依赖没有做处理。

运行环境

​ Windows 7以上

CoreDump分析

​ wxbox崩溃时会自动启动crashdumper进行转储,把源码和符号文件拷贝下来,在windbg上配置好源码和符号路径,然后执行

# windbg
!analyze -v

image

About

桌面端微信机器人

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C++ 89.9%
  • Lua 6.4%
  • Meson 2.6%
  • Batchfile 0.4%
  • QML 0.3%
  • Shell 0.2%
  • Other 0.2%

AltStyle によって変換されたページ (->オリジナル) /