微信机器人 / Wechat Webhook

type
status
date
Apr 14, 2024 05:23 AM
category
tags
summary
slug
password
URL
icon
微信 Webhook 机器人是基于 Web 协议实现的,用于研究和学习目的。该项目能够使用户通过HTTP服务运行一个微信机器人,支持消息的发送和接收。
notion image

特点

  • • 发送文字、图片、文件
  • • 接收文字、链接卡片、图片、视频、附件、语音
  • • 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值,访问后可以看到一个二维码,使用微信扫码登录账号。
notion image
扫码登录后,再次访问该登录页面即可看到账号登录成功了。
notion image

发送消息

在成功登录微信账号后,如何给某个微信好友发送消息呢?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,届时可以来我测试并宣传一波😊。
 
 
 
使用Docker搭建自己的KMS激活服务器FreeAskInternet/AI搜索引擎
技术分享
Kimi技能合集
开源推荐
自由互联网