用AppleScript打造稳定的Mac版微信RPA群聊机器人:从搭建到使用全指南

如果你经常需要在微信上处理重复信息,比如群聊中的常规问答、数据记录等,可能会想过有没有办法用机器人自动完成这些工作。市面上常见的微信机器人方案不少,但要么稳定性不足,要么需要额外付费。今天要分享的,是一个基于Mac版微信客户端和AppleScript打造的简易RPA群聊机器人——它速度不快、功能不多,但胜在稳定,而且完全可以自己动手搭建。

为什么需要这个微信机器人?

在做这个机器人之前,我尝试过不少主流方案,比如wechaty。但实际使用中发现,wechaty依赖的puppet(可以理解为“操作接口”)存在一些问题:免费的网页版或UOS版本经常莫名下线,稳定性很差;而像ipadlocal这样稳定且功能全的方案,又需要花钱购买token。

对于只有Mac设备的我来说,这些方案都不够理想。于是就有了这个基于AppleScript和少量Python代码的机器人——它直接操作Mac版微信客户端,不需要依赖第三方接口,只要登录状态稳定,机器人就能一直运行。

简单说,这个机器人适合这样的场景:需要在固定群聊或私聊中自动回复消息,比如记录消费数据、汇总信息,或者对接自己的工具(比如让机器人调用大模型总结文章),而且希望方案稳定、低成本(几乎零成本)、不需要复杂的技术背景。

准备工作:你需要这些工具和环境

在开始搭建之前,先确认你的设备和环境是否满足要求。这个机器人的核心是AppleScript(Mac系统自带的脚本语言,用于自动化操作应用),再配合一点点Python代码实现鼠标点击——因为AppleScript自带的点击功能没法直接作用于微信客户端。

必备条件

  1. 一台安装了Mac版微信的苹果电脑(我使用的微信版本是3.8.6 (28078),其他版本可能需要微调脚本);
  2. 已登录微信账号(机器人需要用这个账号接收和发送消息);
  3. Python3解释器(Mac通常自带,可通过python3 --version检查是否安装);
  4. 安装PyUserInput库(用于模拟鼠标点击)。

安装PyUserInput的步骤

PyUserInput是一个能模拟鼠标和键盘操作的Python库,虽然现在已经标记为“Deprecated”(不再维护),但目前在Mac上仍能正常使用。如果之后它不能用了,你也可以换成其他类似的鼠标模拟工具(比如PyAutoGUI),操作逻辑是一样的。

安装方法很简单,打开终端,输入以下命令:

pip3 install PyUserInput

等待安装完成后,就可以进入下一步了。

核心文件说明:机器人的“大脑”是什么?

这个机器人的核心文件有两个:

  • wemac.applescript:主要脚本文件,负责找到聊天窗口、读取消息、判断是否需要回复、发送消息等核心逻辑;
  • mouseclick.py:辅助的Python脚本,用于实现鼠标点击操作(被AppleScript调用)。

你可以从项目中获取这两个文件,然后根据自己的需求修改配置。下面重点说一下如何配置wemac.applescript——这是让机器人正常工作的关键。

详细配置步骤:让机器人认识你的微信环境

打开wemac.applescript文件,你需要修改几个关键变量,这些变量决定了机器人如何找到聊天窗口、识别自己的身份、以及在哪里运行脚本。

必须修改的5个核心变量

这5个变量就像机器人的“设置向导”,直接影响它的工作效果,建议逐个检查并设置:

变量名称 作用说明 示例值
chatWindowName 指定机器人要处理的聊天窗口名称。如果是私聊,填对方的昵称或备注;如果是群聊,填群聊名称。 “公司项目群” 或 “张三”
botName 机器人自己的微信昵称(或备注),用于判断别人是否@自己(只有@时才会回复)。 “数据助手机器人”
pythonBin Python3解释器的路径,用于调用mouseclick.py “/usr/local/bin/python3”
workingDir 工作目录,也就是mouseclick.py文件所在的文件夹路径。 “/Users/yourname/wechat-bot”
windowOffset 用于定位机器人发送的消息位置(方便删除消息),一般设置为“显示器宽度 – 400 – 20”。 1440(如果显示器宽度是1920,1920-400-20=1440)

如何确定这些变量的值?

  • chatWindowName:打开微信,找到你要处理的聊天窗口,直接复制窗口顶部的名称即可(注意不要有多余的空格);
  • botName:在微信“我”的页面查看自己的昵称,确保和脚本中的名称完全一致(包括大小写);
  • pythonBin:在终端输入which python3,会显示Python3的路径,直接复制过来;
  • workingDir:找到你存放mouseclick.py的文件夹,右键选择“显示简介”,复制“位置”路径;
  • windowOffset:先查看你的显示器分辨率(Mac系统偏好设置→显示器→分辨率),比如分辨率是1920×1080,那么宽度是1920,计算1920-400-20=1440。如果之后发现机器人删不掉自己发的消息,再微调这个值(比如±50)。

运行机器人:第一次启动需要注意什么?

配置完成后,就可以尝试运行脚本了。不过在运行前,有几个关键点需要确认,否则可能会失败。

运行前的3个检查项

  1. 微信已登录:确保Mac版微信处于登录状态,并且已经打开了chatWindowName对应的聊天窗口(不需要置顶,但要能在微信的窗口列表中找到);
  2. 文件路径正确workingDir中必须有mouseclick.py文件,否则脚本会提示“找不到文件”;
  3. 权限设置:如果运行时提示“没有权限控制微信”,需要在“系统偏好设置→安全性与隐私→隐私→自动化”中,勾选终端(或你运行脚本的工具)对微信的控制权限。

第一次运行脚本的步骤

  1. 打开终端,进入wemac.applescript所在的文件夹(比如cd /Users/yourname/wechat-bot);
  2. 输入命令运行脚本:osascript wemac.applescript
  3. 观察微信窗口:脚本会自动找到目标聊天窗口,点击它,然后删除最近的一条消息(这是正常现象,后面会解释为什么要删消息);
  4. 如果这条被删除的消息中有人@你的机器人(botName),机器人会自动回复一条消息;
  5. 脚本运行结束(一次运行只处理一条消息)。

为什么机器人要删除消息?

这是一个“取巧”的设计:由于这个机器人没有办法记录“哪些消息已经处理过”,所以只能通过“删除消息”来标记——删过的消息就不会再处理了。这样可以避免重复回复同一条消息。

如果你的聊天记录比较重要,担心误删,可以先在测试群里试用,熟悉逻辑后再正式使用。

让机器人持续工作:如何实现24小时运行?

上面的步骤只能让机器人处理一条消息,处理完就会停止。要让它一直运行,需要让脚本循环执行。最直接的方法是写一个run.sh脚本,用死循环不断调用wemac.applescript

制作run.sh的步骤

  1. workingDir文件夹中新建一个文本文件,命名为run.sh
  2. 打开文件,输入以下内容(作用是每3秒运行一次wemac.applescript):
#!/bin/bash
while true; do
  osascript /Users/yourname/wechat-bot/wemac.applescript  # 替换为你的脚本路径
  sleep 3  # 间隔时间,可根据需要调整(比如5秒)
done
  1. 保存文件后,在终端中给文件添加执行权限:chmod +x run.sh
  2. 运行run.sh./run.sh

这样,机器人就会每隔3秒检查一次聊天窗口,处理新消息了。如果需要停止,按Ctrl+C即可。

间隔时间设置多少合适?

间隔时间(sleep后面的数字)取决于你的聊天频率:

  • 群聊消息多:可以设为2-3秒(但不要太短,避免频繁操作导致微信卡顿);
  • 消息少:可以设为5-10秒,减少资源占用。

自定义回复内容:让机器人说你想让它说的话

默认情况下,机器人的回复可能比较简单。但你可以根据自己的需求,让它对接工具(比如大模型、数据记录脚本等),实现更复杂的回复逻辑。

在哪里修改回复逻辑?

打开wemac.applescript,找到大约270行的“消息处理逻辑”注释处,这里就是设置回复内容的地方。

AppleScript本身的功能有限,所以更推荐用“调用外部脚本”的方式来生成回复——比如用Python写一个处理逻辑,让AppleScript调用它,再把结果作为回复发送出去。

调用Python脚本的示例

比如,你有一个reply_handler.py脚本,功能是接收用户的问题,返回对应的回答。可以在wemac.applescript中这样写:

-- 消息处理逻辑
set question to the content of the message  -- 获取用户消息内容
-- 调用Python脚本处理问题,获取回复
set replyMessage to do shell script "python3 " & quoted form of (workingDir & "/reply_handler.py") & " " & (my escaped(question))

这里的关键点:

  • escaped(question):这是脚本中自带的转义函数,能处理消息中的特殊字符(比如空格、引号),避免“注入攻击”(比如用户发的消息包含; rm -rf *这样的恶意命令);
  • quoted form of:用于处理文件路径中的特殊字符,确保脚本能正确找到reply_handler.py

举个实际场景:让机器人记录消费数据

假设你想让机器人帮你记录“今天花了多少钱”,可以写一个expense_recorder.py脚本,功能是接收类似“买咖啡 30元”的消息,返回“已记录:买咖啡,30元”。然后在AppleScript中调用它,这样当有人@机器人发送“买咖啡 30元”时,机器人就会自动记录并回复。

机器人的局限:这些情况它可能不适用

虽然这个机器人足够稳定,但它的设计原理(模拟人工操作微信客户端)决定了它存在一些局限。在使用前,最好了解这些限制,避免不符合预期。

  1. 无法获取用户唯一ID:只能识别用户的昵称或备注,无法获取openid、unionid等唯一标识。如果有人改了昵称,机器人可能会“认不出”;
  2. 没有消息唯一ID:因为靠“删除消息”标记已处理,所以无法追溯历史消息,也无法区分重复内容的消息;
  3. 处理速度慢:一次只能处理一条消息,而且依赖脚本循环间隔。如果群聊消息发送速度比处理速度快,就会有消息一直没被处理;
  4. 仅限Mac设备:因为基于AppleScript和Mac版微信,Windows或手机无法直接使用(但可以在Mac上开虚拟机运行多个机器人);
  5. 单窗口处理:一个脚本只能对应一个聊天窗口。如果需要处理多个群聊,得同时运行多个脚本,可能会拖慢电脑速度。

未来可以扩展的功能(TODO列表)

这个机器人目前是基础版本,还有很多可以完善的地方,如果你有兴趣,可以尝试自己开发:

  • 支持处理图片、语音、链接等非文本消息;
  • 实现发送图片、文件的功能;
  • 对接朋友圈操作(比如自动点赞、发朋友圈);
  • 适配企业微信(目前只能用个人微信)。

常见问题(FAQ)

1. 这个机器人会被微信封号吗?

目前来看风险很低。因为它是通过模拟人工点击操作微信客户端,和人自己用微信的行为很像,理论上不会被微信检测为“违规机器人”。但微信的规则可能变化,建议不要用于频繁发送广告等可能违规的行为。

2. 换了显示器,windowOffset需要重新设置吗?

需要。windowOffset和显示器宽度相关,换显示器后分辨率可能变化,建议按新的宽度重新计算(显示器宽度-400-20),如果删除消息不正常,再微调。

3. 可以用其他语言替代Python实现鼠标点击吗?

可以。只要能模拟鼠标点击,并且能被AppleScript调用(比如通过shell命令),用什么语言都可以,比如Node.js、Shell脚本等。

4. 机器人没反应,可能是什么原因?

先检查这几点:

  • 微信是否登录,目标聊天窗口是否存在;
  • chatWindowName是否和窗口名称完全一致(包括空格、特殊符号);
  • pythonBinworkingDir路径是否正确;
  • 终端是否有报错信息(比如“找不到文件”“权限不足”)。

如果是“无法定位元素”的错误,通常重试一次脚本就会解决,这是AppleScript操作应用时的常见小问题。

5. 如何让机器人只回复特定关键词的消息?

在“消息处理逻辑”部分添加判断即可。比如,只处理包含“记录”的消息:

set question to the content of the message
if question contains "记录" then
  set replyMessage to "正在处理记录..."
else
  set replyMessage to ""  -- 不回复
end if

总结:适合自己的才是最好的

这个Mac版微信RPA机器人可能不是功能最强大的,但它胜在稳定、低成本、易上手。如果你需要一个能长期运行的微信自动回复工具,又不想为付费接口买单,或者刚好只有Mac设备,那么这个方案值得一试。

搭建过程中如果遇到问题,可以多检查配置变量和文件路径——大部分问题都出在这些细节上。随着使用场景的深入,你也可以不断扩展它的功能,让它更贴合自己的需求。