Giter Site home page Giter Site logo

wechatbot-webhook's Introduction

GitHub Workflow Status (with event) npm dowloads Docker Pulls GitHub release (with filter)

🚢 Docker 镜像 | 📦 NPM包🔍 FAQ

一个小小的微信机器人webhook,帮你抹平了很多自己开发的障碍,基于 http 请求

✨ Features

Caution

当前版本基于web协议,其支持的功能有限,也不完美,除了bug修补和稳定性功能外,不再接收新的 feature request,后续精力会放到 windows 分支上,感兴趣的可以点个 watch 👀

功能 web协议 windows协议
目前可用性
代码分支 main windows
Docker Tag latest windows
<发送消息> ✅ 单条 / 多条 / 群发 ✅ 单条 / 多条 / 群发
发文字
发图片 ✅ 本地图片 / url图片解析 ✅ 本地图片 / url图片解析
发视频(mp4) ✅ 本地视频 / url视频解析
发文件 ✅ 本地文件 / url文件解析 ✅ 本地文件 / url文件解析
<接收消息>
接收文字
接收语音
接收图片
接收视频
接收文件
接收公众号推文链接
接收系统通知 ✅ 上线通知 / 掉线通知 / 异常通知
头像获取
快捷回复
<群管理>
<好友管理>
接收好友申请
通过好友申请
获取联系人列表
<其他功能>
非掉线自动登录
API 鉴权
n8n 无缝接入
支持docker部署 ✅ arm64 / amd64 ✅ amd64
日志文件导出

⚠️ 特别说明:

以上提到的功能 ✅ 为已实现,受限于微信协议限制,不同协议支持功能也是不同的,并不是所有功能都可以对接,例如:

  • 企业微信消息的收发 #142
  • 发送语音消息 / 分享音乐 / 公众号等在 features 中未提到的功能

🚀 一分钟 Demo

1. 运行 & 扫码

npx wechatbot-webhook

除非掉线,默认记住上次登录,换帐号请运行以下命令 npx wechatbot-webhook -r

2. 复制推消息 api

从命令行中复制推消息api,例如 http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN]

3. 使用以下结构发消息

新开个终端试试以下 curl,to、token 字段值换成你要值

curl --location 'http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN]' \
--header 'Content-Type: application/json' \
--data '{ "to": "测试昵称", data: { "content": "Hello World!" }}'

🔧 开发

Important

包管理器迁移已至 pnpm,安装依赖请使用它,以支持一些不定时的临时包修补(patches)和加速依赖安装

⛰️ 部署 Deploy(推荐)

1.使用 docker 部署

拉取最新镜像
docker pull dannicool/docker-wechatbot-webhook
docker 部署
# 启动容器并映射日志目录,日志按天维度生成,e.g: app.2024-01-01.log
docker run -d --name wxBotWebhook -p 3001:3001 \
-v ~/wxBot_logs:/app/log \
dannicool/docker-wechatbot-webhook
使用 compose 部署 (可选)
wget -O docker-compose.yml https://cdn.jsdelivr.net/gh/danni-cool/wechatbot-webhook@main/docker-compose.yml && docker-compose down && docker-compose -p wx_bot_webhook up

2.登录

docker logs -f wxBotWebhook

找到二维码登录地址,图下 url 部分,浏览器访问,扫码登录wx

https://localhost:3001/login?token=[YOUR_PERSONAL_TOKEN]

可选 env 参数

Tips:需要增加参数使用 -e,多行用 \ 隔开,例如 -e RECVD_MSG_API="https://example.com/your/url" \

功能 变量 备注
日志级别 LOG_LEVEL=info 日志级别,默认 info,只影响当前日志输出,详细输出考虑使用 debug。无论该值如何变化,日志文件总是记录debug级别的日志
收消息 API RECVD_MSG_API=https://example.com/your/url 如果想自己处理收到消息的逻辑,比如根据消息联动,填上你的处理逻辑 url
收消息 API 接受自己发的消息 ACCEPT_RECVD_MSG_MYSELF=false RECVD_MSG_API 是否接收来自自己发的消息(设置为true,即接收, 默认false)
自定义登录 API token LOGIN_API_TOKEN=abcdefg123 你也可以自定义一个自己的登录令牌,不配置的话,默认会生成一个
禁用自动登录 DISABLE_AUTO_LOGIN=true 非微信踢下线账号,可以依靠当前登录的session免登, 如果想每次都扫码登陆,则增加该条配置

🛠️ API

1. 推消息 API

v2版本接口增加了群发功能,v1 版本接口请移步 legacy-api

payload 结构

发文字或文件外链, 外链会解析成图片或者文件

参数 说明 数据类型 默认值 可否为空 可选参数
to 消息接收方,传入String 默认是发给昵称(群名同理), 传入Object 结构支持发给备注过的人,比如:{alias: '备注名'},群名不支持备注名 String Object - N -
isRoom 是否发给群消息,这个参数决定了找人的时候找的是群还是人,因为昵称其实和群名相同在技术处理上 Boolean false Y true false
data 消息体结构,见下方 payload.data Object Array false N true false

payload.data 结构

参数 说明 数据类型 默认值 可否为空 可选参数
type 消息类型, 字段留空解析为纯文本 String text - Y text fileUrl
content 消息内容,如果希望发多个Url并解析,type 指定为 fileUrl 同时,content 里填 url 以英文逗号分隔 String - N -

Example(curl)

发单条消息
curl --location 'http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN]' \
--header 'Content-Type: application/json' \
--data '{
    "to": "testUser",
    "data": { "content": "你好👋" }
}'
发文件 url 同时支持修改成目标文件名

有些情况下,直接发送 url 文件名可能不是我们想要的,给 url 拼接 query 参数 $alias 可用于指定发送给目标的文件名(注意:别名不做文件转换)

curl --location 'http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN]' \
--header 'Content-Type: application/json' \
--data '{
    "to": "testUser",
    "data": { 
      "type": "fileUrl" , 
      "content": "https://download.samplelib.com/jpeg/sample-clouds-400x300.jpg?$alias=cloud.jpg" 
    }
}'
发给群消息
curl --location 'http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN]' \
--header 'Content-Type: application/json' \
--data '{
    "to": "testGroup",
    "isRoom": true,
    "data": { "type": "fileUrl" , "content": "https://download.samplelib.com/jpeg/sample-clouds-400x300.jpg" },
}'
同一对象多条消息(群消息同理)
curl --location 'http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN]' \
--header 'Content-Type: application/json' \
--data '{
    "to": "testUser",
    "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=[YOUR_PERSONAL_TOKEN]' \
--header 'Content-Type: application/json' \
--data '[
    {
        "to": "testUser1",
        "data": {
            "content": "你好👋"
        }
    },
    {
        "to": "testUser2",
        "data": [
          {
            "content": "你好👋"
          },
          {
            "content": "近况如何?"
          }
        ]
    }
]'

返回值 response 结构

  • success: 消息发送成功与否,群发消息即使部份发送成功也会返回 true
  • message: 出错时提示的消息
    • 消息发送成功: Message sent successfully
    • 参数校验不通过: Some params is not valid, sending task is suspend...
    • 消息都发送失败: All Messages [number] sent failed...
    • 部份发送成功: Part of the message sent successfully...
  • task: 发送任务详细信息
    • task.successCount: 发送成功条数
    • task.totalCount: 总消息条数
    • task.failedCount: 发送失败条数
    • task.reject: 因为参数校验不通过的参数和 error 提示
    • task.sentFailed: 因为发送失败和 error 提示
    • task.notFound: 因为未找到用户或者群和 error 提示

确保消息单次发送一致性,某一条参数校验失败会终止所有消息发送任务

{
    "success": true,
    "message": "",
    "task": {
        "successCount": 0,
        "totalCount": 0,
        "failedCount": 0,
        "reject": [],
        "sentFailed": [],
        "notFound": []
    }
}

读文件发送

读文件暂时只支持单条发送

payload 结构
参数 说明 数据类型 默认值 可否为空 可选值
to 消息接收方,传入String 默认是发给昵称(群名同理), 传入 Json String 结构支持发给备注过的人,比如:--form 'to="{alias: "小号"}"',群名不支持备注名称 String - N -
isRoom 是否发的群消息,formData纯文本只能使用 String 类型,1代表是,0代表否, String 0 Y 1 0
content 文件,本地文件一次只能发一个,多个文件手动调用多次 Binary - N -
Curl
curl --location --request POST 'http://localhost:3001/webhook/msg?token=[YOUR_PERSONAL_TOKEN]' \
--form 'to=testGroup' \
--form content=@"$HOME/demo.jpg" \
--form 'isRoom=1'

返回值 response 结构

{
  "success": true,
  "message": "Message sent successfully"
}

2. 收消息 API

payload 结构

  • Methods: POST
  • ContentType: multipart/form-data
  • Form格式如下
formData 说明 数据类型 可选值 示例
type
功能类型
  • ✅ 文字(text)
  • ✅ 链接卡片(urlLink)
  • ✅ 图片(file)
  • ✅ 视频(file)
  • ✅ 附件(file)
  • ✅ 语音(file)
  • ✅ 添加好友邀请(friendship)
其他类型
  • 未实现的消息类型(unknown)
系统类型
  • ✅ 登录(system_event_login)
  • ✅ 登出(system_event_logout)
  • ✅ 异常报错(system_event_error)
  • ✅ 快捷回复后消息推送状态通知(system_event_push_notify)
String text file urlLink friendship unknown system_event_login system_event_logout system_event_error system_event_push_notify -
content 传输的内容, 文本或传输的文件共用这个字段,结构映射请看示例 String Binary 示例
source 消息的相关发送方数据, JSON String String 示例
isMentioned 该消息是@我的消息 #38 String 1 0 -
isMsgFromSelf 是否是来自自己的消息 #159 String 1 0 -

服务端处理 formData 一般需要对应的处理程序,假设你已经完成这一步,你将得到以下 request

  {
    "type": "text",
    "content": "你好",
    "source": "{\"room\":\"\",\"to\":{\"_events\":{},\"_eventsCount\":0,\"id\":\"@f387910fa45\",\"payload\":{\"alias\":\"\",\"avatar\":\"/cgi-bin/mmwebwx-bin/webwxgeticon?seq=1302335654&username=@f38bfd1e0567910fa45&skey=@crypaafc30\",\"friend\":false,\"gender\":1,\"id\":\"@f38bfd1e10fa45\",\"name\":\"ch.\",\"phone\":[],\"star\":false,\"type\":1}},\"from\":{\"_events\":{},\"_eventsCount\":0,\"id\":\"@6b5111dcc269b6901fbb58\",\"payload\":{\"address\":\"\",\"alias\":\"\",\"avatar\":\"/cgi-bin/mmwebwx-bin/webwxgeticon?seq=123234564&username=@6b5dbb58&skey=@crypt_ec356afc30\",\"city\":\"Mars\",\"friend\":false,\"gender\":1,\"id\":\"@6b5dbd3facb58\",\"name\":\"Daniel\",\"phone\":[],\"province\":\"Earth\",\"signature\":\"\",\"star\":false,\"weixin\":\"\",\"type\":1}}}",
    "isMentioned": "0",
    "isMsgFromSelf": "0",
    "isSystemEvent": "0" // 考虑废弃,请使用type类型判断系统消息
  }

收消息 api curl示例(直接导入postman调试)

curl --location 'https://your.recvdapi.com' \
--form 'type="file"' \
--form 'content=@"/Users/Downloads/13482835.jpeg"' \
--form 'source="{\\\"room\\\":\\\"\\\",\\\"to\\\":{\\\"_events\\\":{},\\\"_eventsCount\\\":0,\\\"id\\\":\\\"@f387910fa45\\\",\\\"payload\\\":{\\\"alias\\\":\\\"\\\",\\\"avatar\\\":\\\"/cgi-bin/mmwebwx-bin/webwxgeticon?seq=1302335654&username=@f38bfd1e0567910fa45&skey=@crypaafc30\\\",\\\"friend\\\":false,\\\"gender\\\":1,\\\"id\\\":\\\"@f38bfd1e10fa45\\\",\\\"name\\\":\\\"ch.\\\",\\\"phone\\\":[],\\\"star\\\":false,\\\"type\\\":1}},\\\"from\\\":{\\\"_events\\\":{},\\\"_eventsCount\\\":0,\\\"id\\\":\\\"@6b5111dcc269b6901fbb58\\\",\\\"payload\\\":{\\\"address\\\":\\\"\\\",\\\"alias\\\":\\\"\\\",\\\"avatar\\\":\\\"/cgi-bin/mmwebwx-bin/webwxgeticon?seq=123234564&username=@6b5dbb58&skey=@crypt_ec356afc30\\\",\\\"city\\\":\\\"Mars\\\",\\\"friend\\\":false,\\\"gender\\\":1,\\\"id\\\":\\\"@6b5dbd3facb58\\\",\\\"name\\\":\\\"Daniel\\\",\\\"phone\\\":[],\\\"province\\\":\\\"Earth\\\",\\\"signature\\\":\\\"\\\",\\\"star\\\":false,\\\"weixin\\\":\\\"\\\",\\\"type\\\":1}}}"' \
--form 'isMentioned="0"'

返回值 response 结构(可选)

如果期望用 RECVD_MSG_API 收消息后立即回复(快捷回复),请按以下结构返回返回值,无返回值则不会回复消息

  • ContentType: json
参数 说明 数据类型 默认值 可否为空 可选参数
success 该条请求成功与否,返回 false 或者无该字段,不会处理回复,有一些特殊消息也通过这个字段控制,比如加好友邀请,返回 true 则会通过好友请求 Boolean - Y true false
data 如果需要回复消息的话,需要定义data字段 Object Object Array - Y

response.data 结构

参数 说明 数据类型 默认值 可否为空 可选参数
type 消息类型,该字段不填默认当文本类型传输 String text Y text fileUrl
content 消息内容,如果希望发多个Url并解析,type 指定为 fileUrl 同时,content 里填 url 以英文逗号分隔 String - N -

如果回复单条消息

 {
    "success": true,
    "data": {
      "type": "text",
      "content": "hello world!"
    }
  }

组合回复多条消息

 {
    "success": true,
    "data": [
      {
        "type": "text",
        "content": "hello world!"
      },
      {
        "type": "fileUrl",
        "content": "https://samplelib.com/lib/preview/mp3/sample-3s.mp3"
      }
    ]
  }

3. 其他API

token 配置说明

除了在 docker 启动时配置token,在默认缺省 token 的情况,会默认生成一个写入 .env 文件中

3.1 获取登录二维码接口

登录成功

返回 json 包含当前用户

{"success":true,"message":"Contact<TestUser>is already login"}
登录失败

展示微信登录扫码页面

3.2 健康检测接口

可以主动轮询该接口,检查服务是否正常运行

微信已登录, 返回纯文本 healthy,否则返回 unHealthy

3.3 获取静态资源接口

从 2.8.0 版本开始,可以通过本接口访问到头像等静态资源,具体见 recvd_api 数据结构示例的 avatar 字段

注意所有上报 recvd_api 的静态资源地址不会默认带上 token, 需要自己拼接,否则会返回 401 错误, 请确保自己微信已登录,需要通过登录态去获取资源

status: 200

成功获取资源, 返回静态资源文件

status: 404

获取资源失败

status: 401 未携带登录token
{"success":false, "message":"Unauthorized: Access is denied due to invalid credentials."}
status: 401 微信登录态已过期
{
   "success": false, "message": "you must login first"
}

🌟 Star History

Star History Chart

Contributors

Thanks to all our contributors!

⏫ 更新日志

更新内容参见 CHANGELOG

wechatbot-webhook's People

Contributors

cassius0924 avatar danni-cool avatar daydaylw3 avatar github-actions[bot] avatar jdeseva avatar leinad59 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wechatbot-webhook's Issues

接收微信消息的消息体问题

您好,非常感谢您的项目。我看了一下源码,有个疑惑(我是nodejs小白),我看到代码是这样:
image

image

这里的body是消息体吗??我启动了我restfull服务,收不到这个消息。
image

image

我的服务接口,我通过swagger做了测试,手动输入测试,是可以的。。但用 docker-wechatbot-webhook 自动推送不行。

image

探讨一下重启服务无需登录的可能性

我记得之前是用了一个wechat-gpt 的服务,可以把登录状态储存起来,然后重启服务不用再次扫码来着,但是想不起来了🤣

我用的 zeabur,经常会出现容器调度重启容器的情况,导致还得扫码🤣

如何配合n8n推送消息

我想推送语雀更新的消息,然后推送到微信上,但是我配置不出来,能否提供一下n8n的流程图,谢谢大佬

探讨一下自动化的持久在线方式

再次感谢作者的付出,这个项目是我见的的非常好的项目。。

如果想自动化的持久在线,想到两个办法:

一、是否可以定时(每小时)调用:
You can also check login by API: http://localhost:3001/loginCheck?token=XXXXXX

不知道这个方式中的接口有没有刷新在线状态的能力。还是说这个接口,就是获取当前状态,无法刷新当前状态。

二、本项目用两个微信启动两个实例,然后互相定时发消息?

微信持久在线存在问题

当我搭建好相关的服务,调用接口发送消息的时候,当天下午测试可以调用发送,第二天早上好像也可以调用发送,但是第三天早上可能就发送失败了,根据代码查看发现500

uncaughtException AssertionError [ERR_ASSERTION]: 3 == 0
at Object.equal (/app/node_modules/wechat4u/lib/util/global.js:69:24)
at /app/node_modules/wechat4u/lib/core.js:444:24
at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {
code: 2,
details: 'AssertionError [ERR_ASSERTION]: 3 == 0\n' +
' at Object.equal (/app/node_modules/wechat4u/lib/util/global.js:69:24)\n' +
' at /app/node_modules/wechat4u/lib/core.js:444:24\n' +
' at process.processTicksAndRejections (node:internal/process/task_queues:95:5)'
}
uncaughtException GError: 状态同步超过284.609s未响应,5s后尝试重启
at Wechat.checkPolling (/app/node_modules/wechat4u/lib/wechat.js:298:19)
at Timeout._onTimeout (/app/node_modules/wechat4u/lib/wechat.js:319:25)
at listOnTimeout (node:internal/timers:569:17)
at process.processTimers (node:internal/timers:512:7) {
code: 2,
details: 'Error: 状态同步超过284.609s未响应,5s后尝试重启\n' +
' at Wechat.checkPolling (/app/node_modules/wechat4u/lib/wechat.js:298:19)\n' +
' at Timeout._onTimeout (/app/node_modules/wechat4u/lib/wechat.js:319:25)\n' +
' at listOnTimeout (node:internal/timers:569:17)\n' +
' at process.processTimers (node:internal/timers:512:7)'
}
Error handling POST request: AssertionError [ERR_ASSERTION]: 1102 == 0
at Object.equal (/app/node_modules/wechat4u/lib/util/global.js:69:24)
at /app/node_modules/wechat4u/lib/core.js:535:24
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async PuppetWechat4u.messageSendText (/app/node_modules/wechaty-puppet-wechat4u/dist/cjs/src/puppet-wechat4u.js:635:9)
at async WechatifiedUserClass.say (/app/node_modules/wechaty/dist/cjs/src/user-modules/room.js:371:21)
at async formatAndSendMsg (/app/src/service/msg.js:8:7)
at async /app/src/route/msg.js:31:28 {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 1102,
expected: 0,

docker启动后登录报错

2023-09-28 13:54:28 Scan QR Code to login: 3
2023-09-28 13:54:28 https://wechaty.js.org/qrcode/xxxxxxxxxxxxxxxxx
2023-09-28 13:54:37 uncaughtException AssertionError [ERR_ASSERTION]: 1 == 0
2023-09-28 13:54:37 at Object.equal (/app/node_modules/wechat4u/lib/util/global.js:69:24)
2023-09-28 13:54:37 at /app/node_modules/wechat4u/lib/core.js:227:24
2023-09-28 13:54:37 at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {
2023-09-28 13:54:37 code: 2,
2023-09-28 13:54:37 details: 'AssertionError [ERR_ASSERTION]: 1 == 0\n' +
2023-09-28 13:54:37 ' at Object.equal (/app/node_modules/wechat4u/lib/util/global.js:69:24)\n' +
2023-09-28 13:54:37 ' at /app/node_modules/wechat4u/lib/core.js:227:24\n' +
2023-09-28 13:54:37 ' at process.processTicksAndRejections (node:internal/process/task_queues:95:5)'
2023-09-28 13:54:37 }

新加的好友获取不到名称

{"room":"","to":{"_events":{},"_eventsCount":0,"id":"@cfb64364352740190bf822275fad2012effc08049d2c1db88056a83c57494ea3","payload":{"alias":"","avatar":"/cgi-bin/mmwebwx-bin/webwxgeticon?seq=1644152229&username=@cfb64364352740190bf822275fad2012effc08049d2c1db88056a83c57494ea3&skey=@crypt_3e633608_8a76f6305d59c0b0cbd6cfce27e54da6","friend":false,"id":"@cfb64364352740190bf822275fad2012effc08049d2c1db88056a83c57494ea3","name":"笔记","phone":[],"star":false,"type":1}},"from":{"_events":{},"_eventsCount":0,"id":"@6c9cd9b3ea40ae53d6ab996e6b270ba87acae2dccd23413293adfabfd74bcaf0","payload":{"address":"","alias":"","avatar":"","city":"","friend":false,"gender":0,"id":"@6c9cd9b3ea40ae53d6ab996e6b270ba87acae2dccd23413293adfabfd74bcaf0","name":"","phone":[],"province":"","signature":"","star":false,"weixin":"","type":1}}}

新加的好友,获取的name信息为空

是否发送的群消息没有起作用

测试环境:使用aardio的web.rest.client库,代码如下:
`
import console;
import web.rest.client;
var http = web.rest.client();
url = "http://*******:3333/webhook/msg"
Request = http.api(url);
http.setHeaders({
['Content-Type'] = 'application/json; charset=UTF-8';
});
收信人 = "风行者aar教学第二期" //String,会话名,发群消息填群名,发给个人填昵称
群发标志 = "false" //Boolean,是否发的群消息
类型 = "text" //String,发送消息类型:text,img
内容 = "测试,测试,测试,测试" //String,如果希望发多张图,type 指定为 img 同时,content 里填 url 以英文逗号分隔
import web.json;

postjson = {
"to":收信人,
"isRoom":群发标志,
"type":类型,
"content":内容
}

postjson = web.json.stringify(postjson,true);
resp = Request.post(postjson);
console.varDump(resp)
console.pause(true);
`
一个是微信群:风行者aar教学第二期
一个是个人修改昵称为:风行者aar教学第二期

不管isRoom参数设置true还是false 都是发到群里的

收消息API 重用返回值以实现快捷回复

          客户端不是本身就可以提供http访问推送消息吗? 那我理解客户端应该具备给某个用户发消息的能力,直接把post的返回推送给发送方,就实现了回复拦截、处理、再回应的功能.

不然的话,就必须得两台服务

Originally posted by @lucasjinreal in #56 (comment)

非登出场景,重启保持登陆态

          我现在调试的时候,需要关闭docker,我的意思是我关闭docker,然后同样的docker再启动的时候,能否直接加载之前的状态呢,因为我看手机显示还在线,但是我启动的新docker已经掉了

Originally posted by @glwhappen in #78 (comment)

登录报错问题,先检查下自己的微信号是否实名

我新注册一个微信号登录报错 信息:{"event":"error","error":{"code":2,"details":"AssertionError [ERR_ASSERTION]: 1 == 0\n at Object.equal (/app/node_modules/wechat4u/lib/util/global.js:69:24)\n at /app/node_modules/wechat4u/lib/core.js:227:24\n at process.processTicksAndRejections (node:internal/process/task_queues:95:5)","message":"1 == 0","name":"AssertionError","stack":"AssertionError [ERR_ASSERTION]: 1 == 0\n at Object.equal (/app/node_modules/wechat4u/lib/util/global.js:69:24)\n at /app/node_modules/wechat4u/lib/core.js:227:24\n at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"},"user":null} 这个是为什么?

登录状态添加好友,获取不到好友信息

source 参数值

{
"room": "",
"to": {
"_events": {},
"_eventsCount": 0,
"id": "@acc5cad76fa9ad91f19a7935d49c55560a08ffcd6cae2912a9f1e6ade6416079",
"payload": {
"alias": "",
"avatar": "/cgi-bin/mmwebwx-bin/webwxgeticon?seq=1807265423&username=@acc5cad76fa9ad91f19a7935d49c55560a08ffcd6cae2912a9f1e6ade6416079&skey=@crypt_5f142b66_cf2b90c170d79652d4792207facb2905",
"friend": False,
"id": "@acc5cad76fa9ad91f19a7935d49c55560a08ffcd6cae2912a9f1e6ade6416079",
"name": "wxBot",
"phone": [],
"star": False,
"type": 1
}
},
"from": {
"_events": {},
"_eventsCount": 0,
"id": "@68f6ad55deb901584e3dbbfa11e0f375e7594e4f9cc3b3e69c53e5ae2ecf64b3",
"payload": {
"address": "",
"alias": "",
"avatar": "",
"city": "",
"friend": False,
"gender": 0,
"id": "@68f6ad55deb901584e3dbbfa11e0f375e7594e4f9cc3b3e69c53e5ae2ecf64b3",
"name": "",
"phone": [],
"province": "",
"signature": "",
"star": False,
"weixin": "",
"type": 1
}
}
}

安装后,登录3001错误

{
"success": false,
"message": "Unauthorized: Access is denied due to invalid credentials."
}
以上为错误代码

接入zapier的可能性?

Danni你好,在少数派上看到了这个项目。好奇是否有可能把这个bot接入zapier,这样就可以把微信对话框里的内容与腾讯会议、outlook calendar、备忘录、文件管理之间打通了,我不太懂技术但觉得这个会很cool

扫码之后没有任何反应

微信已经实名认证并且也已经绑定微信支付,扫描二维码后没有任何反应,这是啥情况哈?

发消息是发生错误

wxBotWebhook | 15:47:39 WARN Contact find() got more than 1 result: 2 total
wxBotWebhook | Error handling request: AssertionError [ERR_ASSERTION]: -1 == 0
wxBotWebhook | at Object.equal (/app/node_modules/wechat4u/lib/util/global.js:69:24)
wxBotWebhook | at /app/node_modules/wechat4u/lib/core.js:537:24
wxBotWebhook | at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
wxBotWebhook | at async PuppetWechat4u.messageSendText (/app/node_modules/wechaty-puppet-wechat4u/dist/cjs/src/puppet-wechat4u.js:640:9)
wxBotWebhook | at async WechatifiedUserClass.say (/app/node_modules/wechaty/dist/cjs/src/user-modules/contact.js:300:23)
wxBotWebhook | at async Object.formatAndSendMsg (/app/src/service/msg.js:8:7)
wxBotWebhook | at async /app/src/route/msg.js:123:28 {
wxBotWebhook | generatedMessage: true,
wxBotWebhook | code: 'ERR_ASSERTION',
wxBotWebhook | actual: -1,
wxBotWebhook | expected: 0,
wxBotWebhook | operator: '==',
wxBotWebhook | response: [Object],
wxBotWebhook | tips: '发送文本信息失败'
wxBotWebhook | }

[alpha] wine + docker + Windows 版微信计划

Caution

目前该分支正在 WIP 中,如果遇到预期之外的问题,请留言

背景

  • windows协议替换web协议版本 #22 分支:windows

目前尝试方案(基于wechaty-puppet-engine + hook)

  • wine环境 和 docker 相关

    • 解决 wine 环境Windows 版本 Node 无法运行的问题,以及 sidecar 的 frida 模块找不到 Process的问题
    • 解决无法运行wechat的问题
    • 解决遇到wsl编译的微信但在纯ubuntu上dockfile构建不成功 #54
    • 替换 sureer/wine-box:8.0.2(占用率极高)100% -> 50%
    • 重新编写镜像
    • wine 环境重启崩溃无法重启问题修复
    • 降级windows版本,使用hook版本,确保成功
    • nodeService 跟随docker镜像自动化
  • windows 服务部署

    • 使用hook版本 替换frida协议

历史方案(废弃)(基于puppet-wechaty-xp)

msg.js中追加存储发送者的name轮询及添加发送到多人多群的规则

如题,目前我在使用中无法读取和写入来自群内或单人会话者的昵称,添加http请求发送时也只能一次发送一个对象值,不能一次发送多个对象,需求1记录群内记录可追加发言者的昵称或需求2可将昵称参数加入到TG发送中:
上述两图传到了本仓库,如有不便请删除,需求3:在读取判断if函数时能记录name参数

FAQ 遇到问题可先自查

1. 登陆问题

1.1 微信个人信息合规问题 (新号请:实名+绑定手机号+绑定银行卡)

  • 因为微信未实名导致登陆不了。see #39
  • 因为未开通微信支付登陆不了 see #5
  • 因为未绑定银行卡导致登陆不了 see #88

1.2 登录时 AssertionError: 1205 == 0

  • 尝试手机上退出重新登录。see #188

1.3 触发了微信风控机制被限制登录

  • 等数个小时 or 天后 or 换个账号尝试。see #210

2. 掉线问题

2.1 登陆一段时间后掉线问题,web协议受微信风控策略控制,固定2天一掉,如果合理使用则会增加在线时间

2. 发送消息问题

2.2 文字没法换行,请使用 \n 转义字符

2.3发送图片消息 1205 == 0

  • 有可能是发送太频繁 #194

2.4 字符编码问题

  • windows bash 因为字符编码问题 see #21

2.5 无法给文件传输助手发消息 User is not found

  • 大概率是被微信风控了,微信爸爸把文件传输助手从你的通讯录里摘除了,所以不要乱搞文件传输助手 (比如1小时发一条消息给文件传输助手)#21 (comment)

2.6无法艾特人

2.7发送昵称重复时会发给谁

  • 发给第一个匹配到的人

2.8发送消息时 {"success":false,"message":"Unauthorized: Access is denied due to invalid credentials."}

2.9 发送给备注名时格式错误

3. 联系人or群成员信息不是最新的

3.1 wechaty 信息同步问题:暂时不修复,重启容器解决(欢迎贡献PR)

4. 收消息问题

4.1 无法区分是否是真 @,Wechaty 也是不区分的,有一原则上真 @ 和 @+手打你的昵称都算

4.2 如何判断消息是否是引用消息

给微信发送消息问题

我发送这个:
curl --location --request POST 'http://127.0.0.1:3001/webhook/msg'
--header 'Content-Type: application/json'
--data-raw '{"to": "文件传输助手","type": "text","content": "Hello World"}'

返回结果:
{"success":false,"message":"User is not found"}

截图如下:
image

我看看也试试wsl。

接受服务端fastapi如何构建传入数据结构

Hello, 我用这么个写法,但是由于传进来的数据string 和 binary共用,传入的结构解析失败

@app.post("/wc_receive")
def handle_wcbot_msg_receive_callback(type: str = Form(...),
                                      content: UploadFile = File(...),
                                      source: str = Form(...),
                                      isMentioned: Optional[str] = Form(None),
                                      isSystemEvent: Optional[str] = Form(None)):
INFO:     119.7.10.198:7242 - "POST /wc_receive HTTP/1.1" 422 Unprocessable Entity
INFO:     117.10.198:7243 - "POST /wc_receive HTTP/1.1" 422 Unprocessable Entity

咋整

Windows分支docker打包卡住了

docker build 执行后卡住不动,是有系统限制吗,直接运行https://github.com/ChisBread/wechat-box 项目也是一样的表现 ChisBread/wechat-box#3

Ubuntu系统表现如下:

gitpod /workspace/docker-wechatbot-webhook (windows) $ docker build . -t atorber/docker-wechatbot-webhook:latest --no-cache
[+] Building 173.4s (7/14)                                                                                                                                                                                   docker:default
 => [internal] load .dockerignore                                                                                                                                                                                      0.0s
 => => transferring context: 107B                                                                                                                                                                                      0.0s
 => [internal] load build definition from dockerfile                                                                                                                                                                   0.0s
 => => transferring dockerfile: 3.03kB                                                                                                                                                                                 0.0s
 => [internal] load metadata for docker.io/sureer/wine-box:8.0.2                                                                                                                                                       0.3s
 => CACHED [ 1/10] FROM docker.io/sureer/wine-box:8.0.2@sha256:92d871c01ba3e8c5288f161ba6f5c530408053f59e5c67519e69ce8ca38d550b                                                                                        0.0s
 => [internal] load build context                                                                                                                                                                                      0.0s
 => => transferring context: 5.12kB                                                                                                                                                                                    0.0s
 => [ 2/10] RUN wget -O /tmp/WeChatSetup-3.9.2.23.exe https://github.com/tom-snow/wechat-windows-versions/releases/download/v3.9.2.23/WeChatSetup-3.9.2.23.exe &&     mv /tmp/WeChatSetup-3.9.2.23.exe /root/ &&       2.3s
 => [ 3/10] COPY root/ /                                                                                                                                                                                               0.0s 
 => [ 4/10] RUN bash -c 'nohup /entrypoint.sh 2>&1 &' && sleep 10 && /payloads.sh     && sudo cp -r /wechat-etc/* /etc/     && sudo rm /tmp/.X0-lock                                                                 170.7s 
 => => # Defaulting to search window name, class, and classname                                                                                                                                                             
 => => # Defaulting to search window name, class, and classname                                                                                                                                                             
 => => # Defaulting to search window name, class, and classname                                                                                                                                                             
 => => # Defaulting to search window name, class, and classname                                                                                                                                                             
 => => # Defaulting to search window name, class, and classname                                                                                                                                                            
 => => # Defaulting to search window name, class, and classname   

如何在接受消息回调的时候返回数据直接回复消息发送方?

设置reciveMsgUrl回调, 看起来目前只是单向的,如果我要接收消息回复,就还是得走发送消息的接口。但目前问题是,我只想用一个远程服务器设置一个接受消息的回调,然后再我本地的windows上面启动docker (反过来的)

这样的话,虽然远程服务器可以处理接收消息,但是发送就没法发送了。

然而理论上来说,是不是可以我本地启动的docker,访问了接收消息的回调服务,那为什么不把接受消息服务的返回值,用来返回呢?这样对我这个需求,就不用两台服务器了 (PS:我的接受消息服务器需要跑大模型,不太适合阿里云), 只用一台服务器,至少本地测试方便很多。

带emoji的群名无法发送消息

09:06:53 WARN Room find() got more than one(2) result
Error handling POST request: AssertionError [ERR_ASSERTION]: -1 == 0
at Object.equal (/app/node_modules/.pnpm/[email protected]/node_modules/wechat4u/lib/util/global.js:69:24)
at /app/node_modules/.pnpm/[email protected]/node_modules/wechat4u/lib/core.js:535:24
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async PuppetWechat4u.messageSendText (/app/node_modules/.pnpm/wechaty-puppet-wechat4u@1.14.6_@swc[email protected][email protected]/node_modules/wechaty-puppet-wechat4u/dist/cjs/src/puppet-wechat4u.js:640:9)
at async WechatifiedUserClass.say (/app/node_modules/.pnpm/wechaty@1.20.2_@swc[email protected][email protected][email protected][email protected]/node_modules/wechaty/dist/cjs/src/user-modules/room.js:371:21)
at async Object.formatAndSendMsg (/app/src/service/msg.js:8:7)
at async /app/src/route/msg.js:119:30 {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: -1,
expected: 0,
operator: '==',
response: [Object],
tips: '发送文本信息失败'
}

掉线提醒(优化)

能否考虑增加一个掉线提醒的接口,和处理消息的接口一样就行了,如果掉线了,或者发生异常了,就调用这个接口,然后我继续做后续的逻辑处理,发邮件或者其他操作。

wechat4u库更新

如果你的Docker日志里出现了Error: 连续3次同步失败,5s后尝试重启\n at /app/node_modules/wechat4u/lib/wechat.js:129:22"}这样的报错,根据报错堆栈信息,错误发生在wechat4u库的wechat.js文件的第129行,具体是在同步失败后触发的重启逻辑,更新命令:npm update wechat4u yarn upgrade wechat4u但更新的要求是Node.js版本是"^18.17.0 || >=20.5.0",如果你的系统版本不允许安装高版本Node则可以直接在package.json文件底部更改wechat4u版本号为1.14.12
we
然后构建你的docker容器如 docker build -t wxbot . 然后再docker run -d你的容器即可,已测试,之后不会再报此类错误

feautre 1.x -2.x discussion

如果有好的建议欢迎评论或者提mr,以下是后续的研发计划

  • windows版微信计划 #66

  • 支持消息@ 人(不可行)#57

  • #38

  • Discoard讨论频道 => Discussion(Discord)

  • 已知长时间不主动发消息,最多在线 2 天,根据这个机制,定时向 文件传输助手 发消息,保持长时间在线的状态(不可行)

  • 登出后的通知机制
    已知服务可能会因为微信的风控机制出现退登等情况,因此增加一套通知机制,支持在登出/首次登录时将登录二维码发送到指定的api。#9

  • 消息Push #6 (comment)

  • 发送URL卡片 (不支持 ref)

  • 发送小程序 (不支持 ref)

  • 发送发送联系人卡片 (不支持 ref)

  • 发送位置 (不支持 ref

  • 发送语音(底层无此api支持)

  • 支持文件Url

  • 支持直接发文件

  • 消息 Receive #10

    • 支持 URL
    • 支持语音
    • 支持文件(包含图片)
  • 登录 api 优化
    登录 api 原先是为了总是拿到最新的扫码 api 设计的,但是实际使用下来还得拿到数据判断后再拿到登录地址,其实可以简化一点。

    1. 登录成功返回 200 和登录人的信息
    2. 登出则直接 301 到扫码登录的 url
  • #34

没法获取群里有人@我的精确问题

在微信中@人和内容之间的空白,我之前看的是个空白符(非空格),我以为所有端都一样.
今天发现在macOS PC端居然是空格,其他端都是空白符
这样的话,导致我无法区分是有人@我,还是聊天信息里出现了"@我 "的字符.

我看了wechaty他是有mention信息的(非web接口)
docker-wechatbot-webhook 没有提供这个字段

或有什么好办法?

推送文件url 失败

Error handling POST request: AssertionError [ERR_ASSERTION]: -1 == 0
at Object.equal (/app/node_modules/wechat4u/lib/util/global.js:69:24)
at /app/node_modules/wechat4u/lib/core.js:850:24
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async PuppetWechat4u.messageSendFile (/app/node_modules/wechaty-puppet-wechat4u/dist/cjs/src/puppet-wechat4u.js:660:9)
at async /app/node_modules/wechaty/dist/cjs/src/sayable/deliver-sayable.js:25:17
at async WechatifiedUserClass.say (/app/node_modules/wechaty/dist/cjs/src/user-modules/contact.js:300:23)
at async Object.formatAndSendMsg (/app/src/service/msg.js:17:9)
at async /app/src/route/msg.js:55:28 {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: -1,
expected: 0,
operator: '==',
response: [Object],
tips: '发送文件失败'
}

大佬帮忙看看为啥子推送文件url失败呢?

如何自定义端口啊

参考了这个教程:https://sspai.com/post/83274

docker run -d --name wcbot -p 3001:3001 dannicool/docker-wechatbot-webhook

我发现即便是更改 -p 3003:3003 还是会监听3001端口,但是我的服务有一个重要的进程已经使用了该端口,应如何十号

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.