Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/x5iu/wemac
一个 it just works 的 Mac 版微信 RPA 群聊机器人
https://github.com/x5iu/wemac
chatbot rpa wechat
Last synced: about 2 months ago
JSON representation
一个 it just works 的 Mac 版微信 RPA 群聊机器人
- Host: GitHub
- URL: https://github.com/x5iu/wemac
- Owner: x5iu
- Created: 2024-03-21T03:01:18.000Z (6 months ago)
- Default Branch: main
- Last Pushed: 2024-04-22T03:54:06.000Z (5 months ago)
- Last Synced: 2024-05-02T13:47:36.409Z (5 months ago)
- Topics: chatbot, rpa, wechat
- Language: AppleScript
- Homepage:
- Size: 8.79 KB
- Stars: 84
- Watchers: 2
- Forks: 6
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
- awesome - x5iu/wemac - 一个 it just works 的 Mac 版微信 RPA 群聊机器人 (AppleScript)
README
# Mac 版微信 RPA 群聊机器人
这是一个利用 AppleScript 和 Mac 版微信客户端制作的简易版微信机器人。这个机器人起源于,我想做一个 ChatBot,帮我记录消费、饮食、运动等数据,以及帮我总结微信公众号文章内容。目前利用个人微信实现 ChatBot 的方案,主流的是 wechaty,但是 wechaty 使用的 puppet 中,免费的网页版或 UOS 版本不够稳定(意思是经常莫名奇妙被踢下线),稳定且功能丰富的 ipadloacl 等方案又需要花费额外的金币购买 token。于是我经过一些小小的尝试,实现了这个速度慢、功能少但足够稳定的微信机器人(*选择 Mac 版微信客户端是因为我手上只有 Mac 设备*)。
## 如何跑起来
这个机器人主要利用 AppleScript 完成,辅以一些 Python 代码,使用 Python 是因为 AppleScript 自带的鼠标点击操作无法作用于微信客户端,因此使用了额外的 Python 库来实现点击操作。因此,你需要先有一个 Python3 的解释器,以及安装 [PyUserInput](https://github.com/PyUserInput/PyUserInput):
```
pip3 install PyUserInput
```当然,如果你有其他模拟鼠标点击的方案,也可以用自己的(在写这篇 README 时才发现 PyUserInput 已经 Deprecated 了)。
接下来,你需要修改 `wemac.applescript` 中的一些配置,如下所示:
- **chatWindowName**: 指定当前处理哪一个窗口的聊天,如果是私聊则是对方的昵称或备注,如果是群聊则是群聊名称;
- **botName**: 机器人本身账号的名称,其作用是判断是否有人 at 自己,然后进行回复;
- **pythonBin**: Python3 解释器的路径;
- **workingDir**: 工作目录,也是放置 `mouseclick.py` 文件的目录;
- **windowOffset**: 基本上,这个值是显示器宽度 - 400 - 20,它的作用是用于定位由机器人发送的消息的位置(如果你发现执行 AppleScript 的过程中,脚本无法顺利删除机器人自己发送的消息,请尝试调整这个值);设置完上述变量后,就可以尝试运行一次脚本了,**运行之前,请确保已登录 Mac 版微信**。执行脚本,你会发现 AppleScript 会自动找到目标的聊天,点击聊天窗口,并**开始删除最近的一条聊天记录**,没错,这个 AppleScript 会删除聊天记录,当时的考虑是,由于没有地方记录每条消息是否已被回复,只能通过删除消息的方式来避免重复回复消息;删除完消息后,如果这条消息 at 了机器人,则会进行回复;然后,AppleScript 的执行就结束了,注意,**一次 AppleScript 执行只会处理一条消息**。
那么如何让机器人一直运作下去呢,可行的方案是写个 `run.sh`,在里面写死循环不断执行 `wemac.applescript`(事实上我自己也是这么做的)。
### 如何自定义回复内容
如果想自定义回复内容,比如接入大语言模型,在 `wemac.applescript` 的 270 行,“消息处理逻辑”注释处,你可以添加自己的回复逻辑,由于 AppleScript 本身能力有限,你可以利用 shell 外接其他语言,例如 Python,你可以用以下方式调用一个 Python 脚本来自定义回复内容:
```
set replyMessage to do shell script "python3 your_script.py " & (my escaped(question))
```被执行的 shell 的标准输出(stdout)将会赋值给 `replyMessage`,然后作为回复由机器人发出去。
在拼接 shell 命令时,可以使用 `escaped` 函数转义参数,以避免注入攻击。
至此,一个简单的聊天机器人就跑起来了,期间可能遇到一些无法定位元素的错误,但是一般而言忽略他们重新运行一遍 AppleScript 就可以了。
## 局限
- 无法获取用户唯一 ID,openid 和 unionid 都不可以,只有昵称或备注;
- 无法获取消息的唯一 ID,只能处理一条删一条;
- 处理速度慢,如果群聊的速度大于 AppleScript 的运行速度,那就会出现消息永远无法被处理的情况;
- 必须用一台 Mac 来 Host,当然也可以通过开虚拟机的方式让一台 Mac 运行多个机器人;
- 一个 AppleScript 脚本只能处理一个聊天窗口,当然也可以在 `run.sh` 中同时添加多个 AppleScript 以处理不同的聊天,但这样会拖慢运行速度;但好处就是足够稳定,只要登录上基本能一直运行下去,而且用 AppleScript 模拟点击理论上也不会被微信检测到导致封号。
## 其他
使用的 Mac 微信客户端版本是 `Version. 3.8.6 (28078)`。
## TODO
- [ ] 支持处理图片、语音、链接等消息;
- [ ] 支持发送图片、文件;
- [ ] 支持发送朋友圈;
- [ ] **支持企业微信**;