微信 Webhook 机器人是基于 Web 协议实现的,用于研究和学习目的。该项目能够使用户通过HTTP服务运行一个微信机器人,支持消息的发送和接收。
特点
-
发送文字、图片、文件
-
接收文字、链接卡片、图片、视频、附件、语音
-
Webhook 接口
-
易于部署和使用
如何部署
部署的过程和方式非常简单,这里需要使用Docker快速部署微信机器人服务。
拉取镜像
首先我将需要的镜像拉取下来:
docker pull dannicool/docker-wechatbot-webhook
创建我们的容器:
docker run \
-d \
--name wxBotWebhook \
-p 3001:3001 \
-e RECVD_MSG_API=http://192.168.31.100:8080/api \
-e DISABLE_AUTO_LOGIN=true
-e LOGIN_API_TOKEN=abc
-v ~/wxBot_logs:/app/log \
dannicool/docker-wechatbot-webhook
环境变量解读:
-
RECVD_MSG_API
:当机器人收到消息时会将将消息推送到此接口上。 -
DISABLE_AUTO_LOGIN
:服务重启时自动登录微信号。 -
LOGIN_API_TOKEN
:自定义登录 API token。
也可以使用compose部署:
version: '3.8'
services:
wxBotWebhook:
image: dannicool/docker-wechatbot-webhook
container_name: wxbot_app
volumes:
- ./wxBot_logs:/app/log
ports:
- "3001:3001"
environment:
- LOG_LEVEL=info # 调整容器输出级别(不影响日志文件输出等级)运行时提示的消息等级(默认info,debug级别会输出详细的日志)
# - DISABLE_AUTO_LOGIN=true # 如果不希望登录一次后就记住当前账号,想每次都扫码登陆,填 true
# - ACCEPT_RECVD_MSG_MYSELF=true # 如果希望机器人可以自己接收消息,填 true
# - RECVD_MSG_API= # 如果想自己处理收到消息的逻辑,在下面填上你的API地址, 默认为空
# - LOGIN_API_TOKEN= # 登录地址Token访问地址:http://localhost:3001/login?token=[LOCAL_LOGIN_API_TOKEN]
restart: unless-stopped
登录机器人账号
服务部署成功时,通过访问:
https://localhost:3001/login?token=abc
此处的token
参数即为你设定的LOGIN_API_TOKEN
值,访问后可以看到一个二维码,使用微信扫码登录账号。
扫码登录后,再次访问该登录页面即可看到账号登录成功了。
发送消息
在成功登录微信账号后,如何给某个微信好友发送消息呢?wechatbot-webhook
提供了一种以http协议的API接口,通过调用提供的api接口即可操控机器人给好友发送消息。
API接口地址:
http://your_server_ip:3001/webhook/msg/v2?token=[LOGIN_API_TOKEN]
发送文本消息
我们通过向API接口推送指定的消息结构即可完成消息的发送。
curl --location --request POST 'http://localhost:3001/webhook/msg/v2?token=[LOGIN_API_TOKEN]' \
--header 'Content-Type: application/json' \
--data-raw '{
"to": "好友昵称",
"data": {
"type": "text" ,
"content": "你好👋"
}
}'
参数解析:
to
:消息接收方,传入String
默认是发给昵称(群名同理), 传入Object
结构支持发给备注过的人,比如:{alias: '备注名'}
,群名不支持备注名。
type
:消息类型, 字段留空或者为text
解析为纯文本。也可以填写fileUrl
表示发送此链接的文件给好友。
content
:消息内容,如果希望发多个Url并解析,type 指定为 fileUrl 同时,content 里填 url 以英文逗号分隔。
还有一些其他的参数,例如:
isRoom
:是否发给群消息(true/false),这个参数决定了找人的时候找的是群还是人(默认发送给人),因为昵称其实和群名相同在技术处理上。
发送消息到群组
curl --location 'http://localhost:3001/webhook/msg/v2?token=[LOGIN_API_TOKEN]' \
--header 'Content-Type: application/json' \
--data '{
"to": "群组名称",
"isRoom": true,
"data": {
"type": "text",
"content": "你好这是一条群组消息。"
}
}'
多发消息
一次性发送多条消息到指定的好友:
curl --location 'http://localhost:3001/webhook/msg/v2?token=[LOGIN_API_TOKEN]' \
--header 'Content-Type: application/json' \
--data '{
"to": "好友昵称",
"data": [
{
"type": "text",
"content": "你好👋"
},
{
"type": "fileUrl",
"content": "https://samplelib.com/lib/preview/mp3/sample-3s.mp3"
}
]
}'
群发消息
一次发送多条消息到多个人:
curl --location 'http://localhost:3001/webhook/msg/v2?token=[LOGIN_API_TOKEN]' \
--header 'Content-Type: application/json' \
--data '[
{
"to": "好友1",
"data": {
"content": "你好👋"
}
},
{
"to": "好友2",
"data": [
{
"content": "你好👋"
},
{
"content": "近况如何?"
}
]
}
]'
发送文件
我们可以给好友发送指定的文件信息:
curl --location 'http://localhost:3001/webhook/msg/v2?token=[LOGIN_API_TOKEN]' \
--header 'Content-Type: application/json' \
--data '{
"to": "好友昵称",
"data": {
"type": "fileUrl" ,
"content": "https://download.samplelib.com/jpeg/sample-clouds-400x300.jpg?$alias=cloud.jpg"
}
}'
其中的content
对应的内容:
https://xxxx.jpg?$alias=cloud.jpg
后面跟随的alias
参数则代表发送的此文件自定义的名称,也可以不追加此参数。
消息是否发送成功
在我们调用消息推送的接口是,该接口会返回数据高知我们是否成功的发送了消息:
{
# 消息发送成功与否
"success": true,
# 出错时提示的消息
"message": "",
"task": {
# 发送成功条数
"successCount": 0,
# 总消息条数
"totalCount": 0,
# 发送失败条数
"failedCount": 0,
"reject": [],
"sentFailed": [],
# 因为未找到用户或者群和 error 提示
"notFound": []
}
}
接收消息
学习完消息的发送,我们来看看如何接收来自群组以及好友的消息。
在容器部署的时候我们指定过一个环境变量RECVD_MSG_API
。当机器人收到消息时会将消息主体以POST
形式推送到该接口上。
消息结构
{
# 消息类型
"type": "text",
# 消息内容
"content": "你好",
# 消息发送方的数据
"source": "{}",
# 是否被艾特
"isMentioned": "0",
# 是否自己发送给自己的消息
"isMsgFromSelf": "0",
# 被遗弃的参数
"isSystemEvent": "0"
}
消息类型对应的有:
功能类型
:文字消息 text、链接卡片 urlLink、图片 视频 附件 语音 file、添加好友邀请 friendship。
系统类型
:登录 system_event_login、登出 system_event_logout、异常报错 system_event_error、 快捷回复后消息推送状态通知 system_event_push_notify。
其他类型
:未实现的消息类型 unknown。
处理收到的消息
如果在收到消息后,可以快速回复该消息。只需要给请求方响应对应的结构即可回复该好友的消息:
{
"success": true,
"data": {
"type": "text",
"content": "hello world!"
}
}
此处的消息结构与主动发送给好友消息结构是一样的,只不过这里不添加isRoom
参数。
写在末尾
由于该项目是一个webhook服务,所有的事件响应以及处理都是通过http
协议来交互。使用有一定的门槛,需要自己开发一个Server服务端来接收并相应由机器人服务推送过来的消息。这里欢迎大家可以使用自己擅长的语言来针对此服务开发一个SDK,届时可以来我测试并宣传一波😊。