Home

Awesome

wxbot - 微信聊天机器人

适用于微信(WeChat 3.9.8.25 | 3.9.8.15 | 3.9.7.29) 可在Windows PC微信 设置 - 关于微信 - 版本信息 中获取您当前的微信版本,如果您当前的微信版本不在上述可用的版本列表中,请至下方 3、可用版本微信安装包获取 选择最新版微信重新安装使用

未经过大量测试,存在封号风险!

免责声明

本仓库发布的内容,仅用于学习研究,请勿用于非法用途和商业用途!如因此产生任何法律纠纷,均与作者无关! 无任何后门、木马,也不获取、存储任何信息,请大家在国家法律、法规和腾讯相关原则下学习研究! 不对任何下载和使用者的任何行为负责,请于下载后24小时内删除!

关于免注

因注入版本(注入DLL,功能多点)被举报了后续不再更新了,和使用方式(READNE.md)一起放在wxbot-injector目录下了 现在只更新免注版本了 (免注只是不注入DLL了,并不是真的不需要注入!)

1、运行

bin目录下wxbot-sidecar.exe,直接运行即可

多种情况说明:

> .\wxbot-sidecar.exe -p 30568
> .\wxbot-sidecar.exe --help
Usage: wxbot-sidecar.exe -p [pid] [ OPTIONS ] [ VALUE ]

Options:
        -p, --pid  [ pid ]              Specify the process number for injection
        -c, --config  [ path ]          Specify the configuration file path
        -a, --address                   Specify listening address (e.g. 0.0.0.0:8080)
        -b, --auto-click-login          Automatically click login when there is a login button
        -q, --qrcode-callback           If there is a QR code when WeChat is not logged in, specify the callback address for the QR code URL, using English commas as as separators (e.g. http://127.0.0.1:8081/callback,http://127.0.0.1:8082/callback)
        -w, --wechat [wechat_path,optional]     Ignoring the -p parameter will pull up a WeChat instance. Please use this -w parameter after lifting the multi opening restriction!
        -s, --silence                   Enable silent mode(without popping up the console)
        -m, --multi                     Remove WeChat multi instance restrictions (allowing multiple instances)
        -v, --version                   Output Version Information
        -h, --help                      Output Help Information

目前免注入版本仅支持 3.9.8.25,请务必确认版本号正确

Linux下Docker部署

Linux 下使用 Docker 部署 Wechat + wxbot 全部流程已经跑通了,目前构建的公共镜像测试时间不长稳定性未知,建议各位使用时先测试 构建方式在docker路径下查看README.mdDockerfile

ENV:
  WXBOT_ARGS:wxbot的运行参数,默认已经指定了-w和-b参数
  WINEPREFIX:指定wine运行的目录(一些驱动文件、程序目录的存放地址),基本无需变动

# 运行
# -e 指定环境变量
# -p 指定端口映射,这里是将本地环境的8080端口映射到容器内的8080端口,可按需更改
$ docker run -itd --name wxbot -e WXBOT_ARGS="-q xxx" -p 8080:8080 registry.cn-shanghai.aliyuncs.com/jwping/wxbot:v1.10.1-9-3.9.8.25
# 如果希望将微信的数据持久化出来(包括指定wxbot.json),请使用-v参数把/home/wxbot目录映射出来
$ docker run -itd --name wxbot -e WXBOT_ARGS="-q xxx" -p 8080:8080 -v xxxx:/home/wxbot registry.cn-shanghai.aliyuncs.com/jwping/wxbot:v1.10.1-9-3.9.8.25

# 可能会刷一些错误日志,不用担心,不影响使用
# 查看登陆URL,可通过百度随便找个二维码在线生成工具将登陆URL转为二维码后使用手机扫码登陆
# 再次提醒,URL不是直接访问出二维码,或者手机微信访问就可以登陆,是需要百度一个二维码在线生成,将此URL生成为二维码后使用手机微信扫码登陆!
# wxbot第一次运行时需要进行一些初始化动作,时间会较久(大约3-5分钟),此命令会占用shell不断输出,5分钟内无输出也可能是正常的,等待它初始化完成后输出登陆地址即可,期间任何报错都可以忽略,只要容器没有退出运行都可以继续等待
# 二维码扫描确认登陆后也需要一段时间才会触发服务端口监听(因为微信也有一些初始化动作),期间他也会一致刷登陆URL,这是正常的,后面再次启动就不需要了
# 直到日志出现Http Server Listen 0.0.0.0:8080,那么就可以进行访问验证了
# 正常来说初始化动作不会超过五分钟(具体视你的环境配置),如果出现了login url但是没有具体的地址并且一直无输出了那么大概率挂掉了,请尝试使用docker rm -f wxbot后重新run一个
$ docker logs -f wxbot

# 如果最终日志输出报错:
Manager Init Base faild: -3
Please review the logs and provide feedback
Manager init faild: -1

那么这可能是您当前的docker版本较低(> 20.10.8),或者在docker run时添加--security-opt seccomp=unconfined参数,完整运行命令如下:
$ docker run -itd --name wxbot -e WXBOT_ARGS="-q xxx" -p 8080:8080 --security-opt seccomp=unconfined registry.cn-shanghai.aliyuncs.com/jwping/wxbot:v1.10.1-9-3.9.8.25

# 如果您还是无法成功运行,那么请尝试registry.cn-shanghai.aliyuncs.com/jwping/wxbot:v1.10.1-8-3.9.8.25镜像,启动命令如下:
$ docker run -itd --name wxbot -e WXBOT_ARGS="-q xxx" -p 8080:8080 registry.cn-shanghai.aliyuncs.com/jwping/wxbot:v1.10.1-8-3.9.8.25

# docker运行微信是加了自动登陆点击的,所以对于二次及以上的运行会自动触发登陆,只需要等待手机上弹出登录框即可,如果启动长时间无响应请使用下面的命令重启
$ docker restart wxbot

2、使用

如果您在使用时遇到了缺少运行库的报错 如:由于找不到 MSVCP140.dll,无法继续执行代码。重新安装程序可能会解决此问题 如果您遇到了此类问题可通过文档最下方的网盘链接中下载 微软常用运行库.exe 进行安装 或通过此链接下载最新微软常用运行库合集解决

如果您不希望在启动时弹出命令行窗口(CMD黑框框),那么您可以使用-s参数以静默方式运行!

2.1、自动登陆

目前已支持自动登陆,这里有两种情况:

配置二维码图片回调时,命令行参数中指定的回调地址优先级要高于配置文件

2.2、多开

2.3、配置文件

配置文件支持两种方式分别是:

Tips: 配置文件路径为 wxbot-sidecar.exe 所在的同级目录,或使用-c参数指定配置文件路径 配置文件为json格式,默认不自动创建! 配置文件优先级:-c 参数指定的配置文件 > wxbot.json > 无配置文件时的默认值

2.3.1、配置文件示例

{
    "addr": "0.0.0.0:8080",
    "sync-url": {
        "qrcode": [
          {
            "timeout": 3000,
            "url": "http://localhost:8081/qrlogin-callback"
          }
        ],
        "public-msg": [
            {
                "timeout": 3000,
                "url": "http://localhost:8082/callback"
            }
        ],
        "general-msg": [
            {
                "timeout": 3000,
                "url": "http://localhost:8081/callback"
            }
        ]
    },
    "authorization": {
        "enable": false,
        "users": [
            {
                "user": "admin",
                "password": "123",
                "token": "token123"
            },
            {
                "user": "user",
                "password": "321",
                "token": "token321"
            }
        ]
    },
    "root-dir": "D:\\WeChat",
    "log": {
        "level": "info"
    }
}

Tips:这里的http://localhost:8081/callback只是一个例子,而并非必须的,如果您未启动此回调地址,那么请删除它,否则一个不可达地址将会影响后续每个回调的到达时间!

实际上配置文件中的所有字段都是非必填项,它们都可以独立存在,如果您不需要配置任何项,那么请不要创建它!

2.2、路由列表

响应信息 固定为JSON格式响应: {"code": 200, data: xxxx, "message": "xxx"}

路由列表概览:

2.2.1、功能类接口

[]中括号括起来的字段为可选字段 目前所有请求和响应字段均按大驼峰命名法规范

2.2.1.0、检查登陆状态

协议信息

GET /api/checklogin

别名

/api/checkLogin

/api/check-login

/api/check_login

响应字段

2.2.1.1、登陆用户信息

协议信息

GET /api/userinfo

别名

/api/userInfo

/api/user-info

/api/user_info

响应字段

2.2.1.2、通讯录

不建议使用,请使用下面的从数据库中获取通讯录接口

协议信息

GET /api/contacts

响应字段

2.2.1.3、从数据库中获取通讯录

协议信息

GET /api/dbcontacts

别名

/api/dbContacts

/api/db-contacts

/api/db_contacts

响应字段

2.2.1.4、发送文本消息

对于群聊组消息发送支持艾特

协议信息

POST /api/sendtxtmsg

别名

/api/sendTxtMsg

/api/send-txt-msg

/api/send_txt_msg

请求字段

Tips:如果是群聊艾特消息,那么content字段中的@艾特符号数量需要和atlist中的被艾特人数组长度一致,简单来说,就是atlist中有多少个被艾特人的wxid,那么content字段中就需要有多少个艾特组合,位置随意,例如: {"wxid": "xx@chatroom", "content": "这里@11 只是@22 想告诉你@33 每个被艾特人的位置并不重要", "atlist": ["wxid_a", "wxid_b", "wxid_c"]} 每个被艾特人在content中 固定为@[至少两个字符的被艾特人名] + 一个空格 如果是发送@所有人消息,那么请在atlist字段中仅传入一个notify@all字符串,content字段中仅包含一个@符号规范(最少两字符+一个空格), 一般建议是@所有人见名知意

响应示例

{"code":200,"msg":"success"}

2.2.1.5、发送图片消息

如果您发送图片失败,那么可能是权限问题,如果您的程序工作目录(wxbot-sidecar所在的目录)是在C盘,那么请尝试移动到其他分区中,例如D盘,如果还未解决,请您在github上提issue或加交流群反馈

协议信息

POST /api/sendimgmsg

别名

/api/sendImgMsg

/api/send-img-msg

/api/send_img_msg

/api/sendimagemsg

/api/sendImageMsg

/api/send-image-msg

/api/send_image_msg

支持JSON和form-data表单两种方式提交

请求头

请求字段

pathimage二选一即可,当pathimage同时存在时,path优先

2.2.1.6、发送文件消息

如果您发送文件失败,那么可能是权限问题,如果您的程序工作目录(wxbot-sidecar所在的目录)是在C盘,那么请尝试移动到其他分区中,例如D盘,如果还未解决,请您在github上提issue或加交流群反馈

协议信息

POST /api/sendfilemsg

别名

/api/sendFileMsg

/api/send-file-msg

/api/send_file_msg

支持JSON和form-data表单两种方式提交

请求头

请求字段

Tips: 当文件大小大于5M时则建议使用path文件路径的方式传参,但这并不意味着file不支持大文件发送,只是它需要更久的调用时间,可能是分钟级!pathfile二选一即可,当pathfile同时存在时,path优先,当使用JSON格式和file参数直接传递文件数据时filename是必填项!

pathfile二选一即可,当pathfile同时存在时,path优先

2.2.1.7、获取群聊组信息

不建议使用,请使用下面的从数据库中获取群聊组信息

协议信息

同时支持GET和POST

GET /api/chatroom?wxid=xxxx POST /api/chatroom

别名

/api/chatRoom

/api/chat-room

/api/chat_room

请求字段

响应字段

2.2.1.8、从数据库中获取群聊组成员信息

协议信息

同时支持GET和POST

GET /api/dbchatroom?wxid=xxxx POST /api/dbchatroom

别名

/api/dbChatRoom

/api/db-chat-room

/api/db_chat_room

请求字段

响应字段

2.2.1.9、WXID反查信息

不建议使用,请使用下面的从数据库中通过WXID反查信息 协议信息

同时支持GET和POST

GET /api/accountbywxid?wxid=xxxx POST /api/accountbywxid

别名

/api/accountByWxid

/api/account-by-wxid

/api/account_by_wxid

请求字段

响应字段

2.2.1.10、从数据库中通过WXID反查信息

协议信息

同时支持GET和POST

GET /api/dbaccountbywxid?wxid=xxxx POST /api/dbaccountbywxid

别名

/api/dbAccountByWxid

/api/db-account-by-wxid

/api/db_account_by_wxid

请求字段

响应字段

2.2.1.11、转发消息

协议信息

同时支持GET和POST

GET /api/forwardmsg?wxid=xxxxxxxxxxx&msgId=xxxxxxxxxxxx POST /api/forwardmsg

别名

/api/forwardMsg

/api/forward-msg

/api/forward_msg

请求字段

这里说明一下,因为前端精度问题,有些大佬可能传递msgId字段时存在精度丢失或自动转字符串的问题,所以这里我将msgId字段设置为了同时支持uint64string两种类型!

2.2.1.12、获取数据库句柄

协议信息

GET /api/dbs

响应字段

map<string, uint64>

2.2.1.13、执行SQL语句

协议信息

同时支持GET和POST

GET /api/execsql?dbName=PublicMsg.db&sql='select * from PublicMsg ORDER BY localId DESC limit 1' (这是一个实际可用的例子,前提是你收到过订阅号消息) POST /api/execsql

别名

/api/execSql

/api/exec-sql

/api/exec_sql

请求字段

可执行的SQL例子:

PublicMsg.db

查询指定公众号的所有文章(本地已接受的) SELECT * FROM PublicMsg WHERE StrTalker=='gh_13508120ed24'

查询指定时间范围的所有订阅号文章(20230115全天的) SELECT * FROM PublicMsg WHERE CreateTime>1705248000 AND CreateTime<1705334399;

分页查询,从第21行开始,累加20条数据进行检索 SELECT * FROM PublicMsg ORDER BY localId DESC limit 20,20;

MicroMsg.db

查询通讯录所有成员(包括好友、群聊组、订阅号等) SELECT * FROM Contact

2.2.1.14、lz4数据解码

提交的数据需要经过Base64 Encode

协议信息

同时支持GET和POST

GET /api/lz4decode?compressContent=xxxxxxxxxxx POST /api/lz4decode

别名

/api/lz4Decode

/api/lz4-decode

/api/lz4_decode

请求字段

响应字段

2.2.1.15、停止程序

协议信息

GET /close

停止 wxbot-sidecar(此命令用来停止http server,并中止程序运行),当以静默方式运行时此命令可以比较方便的用来停止程序

2.2.2、回调注册类

目前已知BUG是部分环境/微信号有登陆后微信崩溃的问题,因为我本地环境均未复现出该问题,所以修复进度较慢,但修复中... 如果您愿意提供程序日志我不胜感激

2.2.2.1、登陆二维码回调(qrcode)

响应字段

2.2.2.2、订阅号消息回调(public-msg)
2.2.2.3、普通消息回调(general-msg)

响应字段

2.2.2.1、websocket协议消息

协议信息

订阅号消息 GET ws://xxxxx/ws/publicMsg

普通消息 GET ws://xxxxx/ws/generalMsg

消息体参考回调响应字段

websocket没什么好说的,基本上第三方库都有直接可用的实现,协议升级后就是一条全双工通道,目前只用来接收同步微信的实时消息,不要发送消息到服务端,服务端不会响应。

2.2.2.2、http协议

需要你自己起一个Http Server服务用来接收微信的实时消息,你自己的Http Server启动之后通过接口注册到wxbot即可

2.2.2.2.1、注册接口

POST /api/syncurl

别名

/api/syncUrl

/api/sync-url

/api/sync_url

请求字段

2.2.2.2.2、获取已注册接口列表

GET /api/syncurl

别名

/api/syncUrl

/api/sync-url

/api/sync_url

2.2.2.2.3、删除接口

DELETE /api/syncurl

别名

/api/syncUrl

/api/sync-url

/api/sync_url

请求字段

2.3、接口使用例子

Windows 所有powershell或者是使用cmd测试发送的例子都可能有编码问题!建议直接用程序测试!

# 发送文本
curl -Method POST -ContentType "application/json" -Body '{"wxid":"47331170911@chatroom", "content": "测试内容\nhello world!"}' http://127.0.0.1:8080/api/sendtxtmsg

# 发送艾特消息
curl -Method POST -ContentType "application/json" -Body '{"wxid":"47331170911@chatroom", "content": "测试内容\nhello world!", "atlist": ["被艾特人的wxid"]}' http://127.0.0.1:8080/api/sendtxtmsg

# 发送图片消息
curl -Method POST -ContentType "application/json" -Body '{"wxid":"47331170911@chatroom", "image": "R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs="}' http://127.0.0.1:8080/api/sendimgmsg

# 发送文件消息
curl -Method POST -ContentType "application/json" -Body '{"wxid":"47331170911@chatroom", "file": "aGVsbG8gd29ybGQ=", "filename": "1.txt"}' http://127.0.0.1:8080/api/sendfilemsg

# 注册普通消息回调
curl -Method POST -ContentType "application/json" -Body '{"url":"http://127.0.0.1:8011", "timeout": 3000, "type": "general-msg"}' http://127.0.0.1:8080/api/syncurl

Linux

# 获取登陆用户信息
curl 127.0.0.1:8080/api/userinfo

# 获取通讯录信息
curl 127.0.0.1:8080/api/contacts

# 发送文本消息
curl -XPOST -H "Content-Type: application/json" -d'{"wxid": "47331170911@chatroom", "content": "测试内容\nHello World"}' 127.0.0.1:8080/api/sendtxtmsg

# 发送图片消息1(使用form-data表单方式提交)
curl -XPOST -F "wxid=47331170911@chatroom" -F "image=@/home/jwping/1.jpg" 127.0.0.1:8080/api/sendimgmsg
# 发送图片消息2(使用json方式提交)
curl -XPOST -H "Content-Type: application/json" -d'{"wxid": "47331170911@chatroom", "image": "R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs="}' 127.0.0.1:8080/api/sendimgmsg

# 发送文件消息1(使用form-data表单方式提交)
curl -XPOST -F "wxid=47331170911@chatroom" -F "file=@/home/jwping/1.txt" 127.0.0.1:8080/api/sendfilemsg
# 发送文件消息2(使用json方式提交)
curl -XPOST -H "Content-Type: application/json" -d'{"wxid": "47331170911@chatroom", "filename": "1.txt", "file": "aGVsbG8gd29ybGQh"}' 127.0.0.1:8080/api/sendfilemsg

# 注册ws回调
# 使用任意程序websocket客户端连接127.0.0.1:8080/ws

# 注册http 普通消息回调(http协议头不能少!)
curl -XPOST -d'{"url": "http://127.0.0.1:8081/callback", "timeout": 6000, "type": "general-msg"}' 127.0.0.1:8080/api/sync-url

# 获取当前已注册的http回调
curl 127.0.0.1:8080/api/sync-url

# 删除一个已注册的http回调
curl -XDELETE -d'{"url": "http://127.0.0.1:8081/callback"}' 127.0.0.1:8080/api/sync-url

3、赞助码

如果觉得本项目对你有帮助,可以打赏一下作者,毕竟开源不易

<img src=https://raw.githubusercontent.com/jwping/wxbot/main/public/wechat_collection.jpg width=40% />              <img src=https://raw.githubusercontent.com/jwping/wxbot/main/public/alipay_collection.jpg width=40% />

5、鉴权

当您在配置文件中开启了鉴权之后则 您后续的每个api请求都需要包含鉴权信息! 这里使用的是Http Basic Authentication,您可以先百度去了解一下它,当然,如果您不想了解也没关系,因为它真的很简单

# 假设您定义一个如下用户:
{
    "user": "user2",
    "password": "321",
    "token": "token321"
}

那么您需要在您后续的每次请求的请求头中加上Authorization字段:Authorization: Basic base64(username:password) 例如用curl命令请求的话,它可能长这样:

curl -H "Authorization: Basic dXNlcjI6MzIx" 127.0.0.1:8080/login -v

# response:
{"code":200,"data":{"token":"token321","user":"user2"},"msg":null}

这里引入了一个新的路由/login,但我并不想将他写到上面的路由列表中,因为它真的没什么用,仅仅是在您登陆成功之后返回一个当前的登陆用户名和token 您在以后每个请求都加上Authorization: Basic dXNlcjI6MzIx这个请求头就可以了!

如果您希望使用cookie的方式,那么您可以在cookie中指定token 例如,您也可以这样做:

curl --cookie "access_token=token321" 127.0.0.1:8080/userinfo -v

如果您不想用设置请求头的方式,那么您也可以在后续的所有请求的cookie中指定access_token字段即可。 实际上cookie也是request header中的一个字段

6、wxbox、可用版本微信安装包等获取

7、交流

7.1、微信

请添加微信:Anshan_PL,备注 wxbot 拉微信交流群

Tips:此群仅限学习和交流,无其他用处

7.2、TG

Android端下载地址: https://telegram.org/android 其他客户端从这个网址找过去

安装后复制下面的链接到tg中打开: https://t.me/+DVigUtfAIOthNmNl

Tips:此TG群同样仅限学习和交流,无其他用处