我用脚本给几百个微信好友群发了祝福
前阵子有个需求,要给微信上几百个好友发节日祝福。手动发的话就是复制粘贴几百次,这个肯定不现实。微信又没有开放 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 不能太短,UI 响应需要时间,delay 太短按键可能就被吞掉。第三是输入法,如果当前是中文输入法,keystroke 可能进入拼音模式,解决办法是每次发消息前确保输入法是英文,用 keystroke 切一下,或者提前检查一遍。
然后是安全层面的提醒:这个方案只适合个人合规用途。微信有反骚扰机制,大规模批量操作可能被封号,给真正的好友发祝福没什么问题,拿去做营销群发就请三思了。另外脚本能执行的操作也有限,微信转账、发红包这类功能不走 GUI,AppleScript 做不到。
完整脚本
完整的代码放在 GitHub 上了:wechat-automation,里面有联系人列表管理、发送状态记录、失败重试这些逻辑。
顺便说一句,这套 AppleScript 的思路不只微信能用,macOS 上其他没开放 API 的原生 App 也可以照着搞。