Weixin OC (ClawBot) 协议实现最安全、不封号的自动化推送
在 AstrBot 中接入个人微信,主要有两种主流方式:一种是基于微信官方最新开放的 Weixin OC (ClawBot 智联协议),另一种是社区广泛使用的第三方 iPad 协议 Gewechat。 [1, 2, 3]
以下是这两种方式的详细配置与主动消息推送指南。
方案一:微信官方 Weixin OC (ClawBot) 接入(推荐,最安全稳定)
这是腾讯官方底层基于 iLink(智联)协议提供的个人 Bot API。支持干净的 Markdown 渲染,不容易被封号,但原生不支持纯主动异步推送(必须由用户先发起对话,或者通过特定工具绕过)。 [1]
1. 准备工作
确保你的手机微信已升级到最新版本(iOS ≥ 8.0.70,Android ≥ 8.0.69)。 []
2. AstrBot 配置步骤 [1]
进入 AstrBot 管理面板,点击左侧导航栏的 机器人。
点击右上角的 + 创建机器人。
选择 个人微信 (weixin_oc)。
勾选 启用,其他参数(如轮询间隔、超时时间)保持默认即可。
点击保存。此时弹窗或控制台会向微信接口申请登录二维码。
使用手机微信扫码,并在手机上确认加入“ClawBot 插件功能”。 [1]
3. 实现主动消息推送(重点)
微信官方 ClawBot 原生对主动发起对话有严格限制。如果你想用它做定时任务、警报等主动推送,可以通过社区方案(如 wxclawbot-cli 命令行工具)或编写 AstrBot 自定义插件来维持会话上下文进行推送。 [1]
方案二:Gewechat 协议接入(功能最全,支持完美推送)
Gewechat 模拟了 iPad 微信客户端,不需要你的电脑保持微信登录,且天生完美支持主动向任何好友、群聊发送消息。 [1, 2]
1. 准备工作(部署 Gewechat 容器) [1]
由于 Gewechat 是独立的服务,你需要先使用 Docker 部署它。
bash
# 拉取社区优化过的 Gewechat 镜像(避免 cgroupv2 错误)
docker pull registry.cn-chengdu.aliyuncs.com/tu1h/wechotd
# 运行容器(开放 2531 和 2532 端口)
docker run -d --name gewechat -p 2531:2531 -p 2532:2532 -v /root/temp:/root/temp registry.cn-chengdu.aliyuncs.com/tu1h/wechotd
请谨慎使用此类代码。
2. AstrBot 配置步骤 [1]
进入 AstrBot 管理面板 -> 机器人 -> + 创建机器人。
选择 Gewechat 适配器。 [1]
填写关键参数:
ID:任意填写(如
wx_bot)。base_url:填写你部署 Gewechat 的服务器地址(例如
http://<你的服务器IP>:2531)。host / port:填写 AstrBot 本身的回调地址与端口(默认端口通常为
11451)。 [1]
点击保存并重启项目。 [1]
访问 AstrBot 控制台日志,复制日志中输出的二维码链接,用手机微信扫码登录即可。 [1]
3. 代码实现:利用 AstrBot 插件主动推送消息
一旦使用 Gewechat 接入,你可以编写简单的 Python 脚本或 AstrBot 插件,利用框架的 send_message 接口随时主动推送消息。
Python 主动推送示例代码:
python
from astrbot.api.event import Context
from astrbot.api.message_components import Plain
async def send_notification(ctx: Context, target_wxid: str, text: str):
"""
target_wxid: 接收者的微信内部ID(好友通常以 wxid_ 开头,群聊以 @chatroom 结尾)
text: 要推送的文字内容
"""
# 获取已经登录的 Gewechat 平台实例
platform = ctx.get_platform("gewechat")
if platform:
# 构建消息链并主动发送
message_chain = [Plain(text)]
await platform.send_message(target_wxid, message_chain)
print("主动消息推送成功!")
else:
print("未找到对应的微信机器人实例")
请谨慎使用此类代码。
💡 避坑与安全提示
防止风控封号:个人微信(尤其是使用第三方 iPad 协议如 Gewechat 时)极易受到微信官方的风控风险。建议使用微信小号进行测试,日常不要短时间内发送大量、高频的主动推送消息。
账号在线状态:由于 Gewechat 独占一个 iPad 登录槽位,你必须保持手机端微信同时在线,否则机器人会掉线。 [1, 2]
你想选择哪种方案来实现?如果需要,我可以为你提供完整的自定义定时推送插件模板代码。
wxclawbot-cli 命令行工具)或编写 AstrBot 自定义插件
对于个人微信,如果你希望使用官方 Weixin OC (ClawBot) 协议实现最安全、不封号的自动化推送,你既可以利用 wxclawbot-cli 命令行工具在外部脚本中调用,也可以直接在 AstrBot 内部编写自定义插件。
以下是这两种实现方式的详细教程和代码:
方法一:编写 AstrBot 自定义插件(推荐,一体化管理)
由于官方 ClawBot 协议要求必须有上下文或特定凭证,在 AstrBot 框架内编写插件是最直接的方式。它可以利用现有的机器人实例,直接向指定的微信用户或群聊发送消息。
1. 创建插件结构
在 AstrBot 的 data/plugins/ 目录下创建一个名为 wx_pusher 的文件夹,并在内部新建 __init__.py:
text
astrbot/
└── data/
└── plugins/
└── wx_pusher/
└── __init__.py
请谨慎使用此类代码。
2. 编写插件代码 __init__.py
将以下代码写入 __init__.py。该插件不仅提供了一个通用的主动推送函数,还顺便注册了一个定时器,演示如何每隔一小时主动向你推送天气或提醒。
python
import asyncio
from astrbot.api.all import *
@register("wx_pusher", "你的名字", "个人微信主动推送插件", "1.0.0")
class WxPusherPlugin(Plugin):
def __init__(self, context: Context):
super().__init__(context)
# 激活定时任务(示例:每1小时推送一次)
self.context.register_task(self.timed_push_task, trigger="interval", hours=1)
async def send_wx_notification(self, target_id: str, text: str):
"""
核心推送函数
:param target_id: 接收者的微信内部ID(获取方式见后文)
:param text: 推送的文本内容(支持Markdown)
"""
# 获取当前运行的 weixin_oc 平台实例
platform = self.context.get_platform("weixin_oc")
if not platform:
logger.error("未找到 weixin_oc 机器人实例,请确认已在后台启用并扫码。")
return False
try:
# 构建消息链
message_chain = MessageChain().message(Plain(text))
# 调用底层发送接口
# 注意:weixin_oc 协议底层通常需要对应的 session,若报错可尝试通过模拟事件回复
await platform.send_message(target_id, message_chain)
logger.info(f"成功向 {target_id} 推送消息!")
return True
except Exception as e:
logger.error(f"消息推送失败: {e}")
return False
async def timed_push_task(self):
"""定时任务示例"""
# 替换为你要推送的微信用户 ID 或群 ID
MY_WX_ID = "wxid_xxxxxxxxxxxxxx"
await self.send_wx_notification(MY_WX_ID, "⏰ **定时提醒**\n这是一条来自 AstrBot 的主动推送消息。")
@command("push_test")
async def push_test_cmd(self, event: CommandResult):
"""在聊天框输入 /push_test 测试主动推送接口"""
user_id = event.message_obj.sender.user_id
success = await self.send_wx_notification(user_id, "✅ 收到测试指令,主动推送函数工作正常!")
if success:
yield event.plain_result("已触发主动推送。")
请谨慎使用此类代码。
方法二:使用 wxclawbot-cli 命令行工具(适合外部脚本)
如果你有其他独立的 Python 脚本、服务器监控脚本(如 Shell、宝塔定时任务),想在它们报错时通过微信通知你,可以使用基于 ClawBot 协议的命令行工具。
1. 安装与登录
在你的服务器或电脑终端执行以下命令安装工具(需确保本地已配置好 Python 环境):
bash
pip install wxclawbot-cli
请谨慎使用此类代码。
安装完成后进行初始化登录,它会在终端打印出官方的登录二维码,使用手机微信扫码:
bash
wxclawbot login
请谨慎使用此类代码。
2. 在外部 Python 脚本中调用推送
登录成功后,你可以在任何外部 Python 自动化脚本中通过 subprocess 调用该工具进行消息主动推送:
python
import subprocess
import json
def send_wechat_notification(target_id: str, message: str):
"""
通过调用系统命令实现个人微信主动推送
"""
# 构建执行命令
# wxclawbot send --to <目标ID> --text <内容>
cmd = ["wxclawbot", "send", "--to", target_id, "--text", message]
try:
result = subprocess.run(cmd, capture_output=True, text=True, check=True)
print("推送成功:", result.stdout)
except subprocess.CalledProcessError as e:
print("推送失败, 错误信息:", e.stderr)
# 示例:服务器硬盘满了,报警推送
send_wechat_notification("wxid_xxxxxxxxxxxxxx", "🚨 【服务器报警】\n硬盘空间已不足 10%,请及时清理!")
请谨慎使用此类代码。
🔍 关键问题:如何获取好友或自己的 wxid?
无论是插件形式还是命令行形式,你都需要知道接收者的“内部 ID”(格式通常为 wxid_xxxxxxxxxxxxxx 或微信号,群聊通常是以 @chatroom 结尾的字符串)。
最简单的获取方法:
启动 AstrBot 并成功扫码登录你的个人微信。
用你的手机微信(或让好友)给机器人随便发送一条消息,例如发送:
hello。立即查看 AstrBot 的后台控制台日志,日志中会清晰地打印出接收到的事件详情,里面就包含了发送人的
user_id(即wxid)。将其复制下来写入代码即可。