我用脚本给几百个微信好友群发了祝福
前阵子有个需求,要给微信上几百个好友发节日祝福。手动发就得复制粘贴几百次,肯定不现实。微信又没开放 API,所以只剩 GUI 自动化这一个办法。反正就是写个脚本,模拟人去点它的界面。
macOS 版微信是用原生 AppKit 写的,底层是 WKWebView。AppleScript 能直接操作它的 GUI。
基础方案:AppleScript
流程很简单,大概就三步,打开微信,搜好友,把消息发出去。其实就是把人手动干的那套动作,用脚本重放一遍。
微信没有开放 API,脚本只能假扮成人去操作界面,搜索好友、输入、回车,把消息发出去
tell application "WeChat"
activate
delay 0.5
tell application "System Events"
keystroke "f" using command down -- Command+F 搜索
delay 0.3
keystroke "对方微信名"
delay 0.5
keystroke return
delay 0.3
keystroke "新年快乐!"
delay 0.2
keystroke return
end tell
end tell
macOS 版微信按 Command+F 能搜联系人和聊天记录,用它就能直接找到好友。
批量发送的问题
几百个好友,每发一条都得停一会儿。微信有风控,操作太频繁会弹「操作频繁」的提示,我试下来隔 2 到 3 秒比较安全。反正就是别太快,太快它就觉得不是人在操作。
还有个问题,联系人列表怎么喂进去。AppleScript 自己从文件读数据不太方便,所以我让 Python 做编排层,AppleScript 做执行层。Python 负责读列表、控制节奏,真正按键的活还是丢给 AppleScript 去干。
把自动化拆成两层:上面 Python 编排层读列表、控节奏,下面 AppleScript 执行层真正按键发消息
import subprocess
import time
contacts = ["张三", "李四", "王五"] # 从文件读取
message = "新年快乐!🎉"
for name in contacts:
script = f'''
tell application "WeChat" to activate
delay 0.5
tell application "System Events"
keystroke "f" using command down
delay 0.3
keystroke "{name}"
delay 0.5
keystroke return
delay 0.3
keystroke "{message}"
delay 0.2
keystroke return
end tell
'''
subprocess.run(["osascript", "-e", script])
time.sleep(3) # 风控间隔
进阶:图片和文件
发图片得稍微绕一下。微信支持拖拽或者粘贴,所以可以拿剪贴板中转,先把图片复制到剪贴板,再到微信输入框里粘贴、发送。
-- 先把图片复制到剪贴板
set the clipboard to (POSIX file "/path/to/image.jpg")
-- 在微信中粘贴
keystroke "v" using command down
keystroke return
坑和注意事项
这套东西的坑,基本都出在 GUI 自动化本身。第一,微信必须在前台,发的时候你不能切到别的窗口去干别的,AppleScript 的 activate 会把微信强行拉回前台。第二,每次 keystroke 之间的 delay 不能太短,因为界面反应要时间,delay 太短,按键可能就被吞了。第三是输入法。如果当前是中文输入法,keystroke 可能会进拼音模式。解决办法是每次发消息前先确认输入法是英文,可以用 keystroke 切一下,或者提前检查一遍。
然后要提醒一下安全的事。这个方案只适合个人在合规范围内用。微信有反骚扰机制,大规模批量操作可能会被封号。给真正的好友发祝福没什么问题,拿去做营销群发就请三思了。另外脚本能做的事也有限,微信转账、发红包这类功能不走 GUI,AppleScript 做不到。
完整脚本
完整的代码放在 GitHub 上了:wechat-automation,里面有管理联系人列表、记录发送状态、失败重试这些逻辑。
顺便说一句,这套 AppleScript 的思路不只微信能用,macOS 上其他没开放 API 的原生 App 也可以照着搞。