关于本项目
- 由道无涯i开发的一个基于 Lsposed(Non-Riru) 实现的QQ机器人框架
- 我确信,这是目前安卓端上功能最全最完整的一个机器人框架
- 目前并没有对外开放,毕竟机器人框架这种东西比较容易火,容易被黑灰产非法利用
- 接口文档已趋于完善,机器人框架正式开发完毕
如果你想拥有一个这样的机器人,但困于编程知识储备不足,可联系 道无涯 按需定制,具体可移步 软件|源码定制 页
同类项目
- Telegram:道无涯自用Telegram机器人框架接口文档
- 微信:道无涯自用微信机器人框架接口文档
框架更新情况
- 截止至2025.10.17,目前适配QQ最新版本(9.2.20.30025)(2025.9.26发布版)
插件功能一览
当然,这并不单纯是一个机器人框架,还是一个QQ多功能插件,下面是所有的功能预览图。
请求与响应
目前支持 GET 和 POST 两种请求方式
GET 请求
GET 请求的 URL 由以下部分组成:
http://<host>:<port>/<endpoint>?<params>
链接中的含义如下:
<host>
:IP 地址,例127.0.0.1
<port>
:API 端口,默认为5700
<endpoint>
:API 端点,例send_text_msg
<params>
:GET 请求的参数,例param1=value1¶m2=value2
POST 请求
POST 请求的 URL 由以下部分组成:
http://<host>:<port>/<endpoint>
链接中的含义如下:
<host>
:IP 地址,例127.0.0.1
<port>
:API 端口,默认为5701
<endpoint>
:API 端点,例send_text_msg
- POST请求的Content-type为application/json
{
"qq": "942001860",
"text": "你好,道无涯!",
"atQqArr": [],
"chatType": 1
}
raw示例
POST http://127.0.0.1:5700/endpoint HTTP/1.1
Content-Type: application/json;charset=utf-8
{"param1": "", "param2": ""}
响应
响应格式为 JSON
如果下面的接口是获取值的,那么返回值会放在message
字段里,没有返回值则返回常规提示性的字符串
{
"result": "success", // 状态,success 为成功,error为失败
"message": "文本消息发送成功!", // 返回结果示例
}
事件与消息上报
上报时,插件将作为客户端,对接端作为服务器,插件向对接端发起POST请求进行数据传输
- 上报方式(method):
POST
- 上报链接(url):
http://ip:port/wxBot
,ip和port为对接端的 - 上报体(body):所有上报必定包含字段
post_type
用这个post_type
的值去区分各种事件与消息的上报类型,目前设定的post_type
值有三种:
post_type | 说明 |
---|---|
message | 消息事件 |
group_increase | 群成员增加事件 |
group_decrease | 群成员减少事件 |
message(消息事件)
- post_type为
message
时代表是消息事件 - 消息事件又以字段
message_type
作为区分,值分别有:
message_type | 说明 |
---|---|
group | 群消息 |
private | 私聊消息 |
group(群消息)
群消息字段包含六种:
字段 | 说明 |
---|---|
groupId | 目标群聊的QQ群号 |
atQqList | 消息所@的群成员,例:[{"uin": "xxx". "uid": "xxx"}] |
uin | 发送消息的群成员的uin |
uid | 发送消息的群成员的uid |
content | 消息内容 |
msgId | 消息ID |
private(私聊消息)
私聊消息字段包含四种:
字段 | 说明 |
---|---|
uin | 发送消息的好友的uin |
uid | 发送消息的好友的uid |
content | 消息内容 |
msgId | 消息ID |
group_increase(群成员增加事件)
- post_type为
group_increase
时代表群成员增加了,也就是意味着有新成员加入群聊了 - 群成员增加事件有四个字段:
字段 | 说明 |
---|---|
groupId | 群成员增加群聊的QQ群号 |
uin | 新增群成员的uin |
uid | 新增群成员的uid |
nickName | 新增群成员的QQ昵称 |
group_decrease(群成员减少事件)
- post_type为
group_decrease
时代表群成员减少了,也就是意味着有成员退出群聊了 - 群成员减少事件有三个字段:
字段 | 说明 |
---|---|
groupId | 群成员减少群聊的QQ群号 |
退群成员的uin或者uid(uin为null则为uid) | |
nickName | 退群成员的QQ昵称 |
消息相关接口
发送文本消息
该接口用于发送文本消息。
API 端点(POST
)
/send_text_msg
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
string |
是 | 目前群或人的uin或者uid | |
text | string |
是 | 消息内容 |
atQqArr | array |
是 | 要@的人的uin或者uid |
chatType | int |
是 | 消息类型,1为私聊消息,2为群聊消息 |
发送图片消息
该接口用于发送图片消息。
API 端点(POST
)
/send_image_msg
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
string |
是 | 目前群或人的uin或者uid | |
image | string |
是 | 图片,可以是本地路径或者是url链接,如果是url则默认以jpg格式发送 |
isRaw | boolean |
是 | 是否发送原图 |
chatType | int |
是 | 消息类型,1为私聊消息,2为群聊消息 |
发送引用回复图片消息
该接口用于对某条消息进行引用并发送图片。
API 端点(POST
)
/send_reply_image_msg
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
msgId | string |
是 | 引用的消息ID |
string |
是 | 目前群或人的uin或者uid | |
image | string |
是 | 图片,可以是本地路径或者是url链接,如果是url则默认以jpg格式发送 |
isRaw | boolean |
是 | 是否发送原图 |
chatType | int |
是 | 消息类型,1为私聊消息,2为群聊消息 |
发送引用回复文本消息
该接口用于对某条消息进行引用并发送文本。
API 端点(POST
)
/send_reply_text_msg
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
msgId | string |
是 | 引用的消息ID |
string |
是 | 目前群或人的uin或者uid | |
text | string |
是 | 消息内容 |
atQqArr | array |
是 | 要@的人的uin或者uid |
chatType | int |
是 | 消息类型,1为私聊消息,2为群聊消息 |
发送文本图片消息
该接口用于发送文图一体的消息。
API 端点(POST
)
/send_text_image_msg
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
string |
是 | 目前群或人的uin或者uid | |
text | string |
是 | 消息内容 |
image | string |
是 | 图片,可以是本地路径或者是url链接,如果是url则默认以jpg格式发送 |
isRaw | boolean |
是 | 是否发送原图 |
atQqArr | array |
是 | 要@的人的uin或者uid |
chatType | int |
是 | 消息类型,1为私聊消息,2为群聊消息 |
发送文本图片文本消息
该接口用于发送文图文一体的消息。
API 端点(POST
)
/send_text_image_text_msg
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
string |
是 | 目前群或人的uin或者uid | |
text | string |
是 | 消息内容 |
text1 | string |
是 | 消息内容1 |
image | string |
是 | 图片,可以是本地路径或者是url链接,如果是url则默认以jpg格式发送 |
isRaw | boolean |
是 | 是否发送原图 |
atQqArr | array |
是 | 要@的人的uin或者uid |
chatType | int |
是 | 消息类型,1为私聊消息,2为群聊消息 |
发送视频消息
该接口用于发送视频消息。
API 端点(POST
)
/send_video_msg
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
string |
是 | 目前群或人的uin或者uid | |
video | string |
是 | 视频,可以是本地路径或者是url链接,如果是url则默认以mp4格式发送 |
chatType | int |
是 | 消息类型,1为私聊消息,2为群聊消息 |
发送文件消息
该接口用于发送文件消息。
API 端点(POST
)
/send_file_msg
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
string |
是 | 目前群或人的uin或者uid | |
file | string |
是 | 任意类型文件,可以是本地路径或者是url链接 |
ext | string |
否 | 文件后缀(例如.js 与.txt )或者文件名(例如a.js 与b.txt ),如果是文件后缀则发送时将自动生成随机时间戳文件名发送(例如hook_16822454545.js )。当file为本地路径时此字段不需要填,为url链接则必须填 |
chatType | int |
是 | 消息类型,1为私聊消息,2为群聊消息 |
发送语音消息
该接口用于发送语音消息。
API 端点(POST
)
/send_voice_msg
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
string |
是 | 目前群或人的uin或者uid | |
voice | string |
是 | 语音文件,可以是本地路径或者是url链接,必须为*.slk 或者*.wav 或者*.mp3 类型文件 |
duration | int |
是 | 语音文件的时长(毫秒),用于显示在QQ界面语音的长度,可以是虚假的值,大于0即可 |
chatType | int |
是 | 消息类型,1为私聊消息,2为群聊消息 |
群聊管理相关接口
获取群成员信息
该接口用于获取指定群的所有群成员的信息,返回对象型数组。例:
[
{
"index":0, // 下标索引
"friendnick":"道无涯", // 昵称
"role":"群主", // 身份:群主、管理员、群员
"join_time":1760684247, // 加群时间
"last_sent_time": 1760684447, // 上次活跃时间
"uin":"942001860",
"uid":"u_xxxxxxxx"
}
]
API 端点(GET
)
/get_group_member_info
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
groupId | string |
是 | QQ群号码 |
设置群成员禁言
该接口用于对指定群成员进行禁言
API 端点(GET
)
/ban_group_member
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
groupId | string |
是 | QQ群号码 |
string |
是 | 目前群员的uin或者uid | |
bseconds | int |
是 | 禁言秒数,0为解除禁言,禁言秒数不能超过29天23时59秒 |
踢出群聊
该接口用于将指定群成员踢出群聊
API 端点(GET
)
/kick_group_member
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
groupId | string |
是 | QQ群号码 |
string |
是 | 目前群员的uin或者uid | |
isBlack | boolean |
是 | 是否加入黑名单 |
撤回消息
该接口用于对消息进行撤回,不局限于群消息,也可以是私聊消息
API 端点(GET
)
/delete_msg
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
msgId | string |
是 | 撤回的消息ID |
string |
是 | 撤回的消息所在聊天。如果在群聊,那这个填的是群聊号码(而不是发送人),如果是私聊,那就是填自己的uid或者uin | |
chatType | int |
是 | 消息类型,1为私聊消息,2为群聊消息 |
群签到
该接口用于踢出指定群成员
API 端点(GET
)
/group_sign
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
groupId | string |
是 | QQ群号码 |
账号等其它相关接口
获取登录信息
该接口用于获取当前账号的登录信息
API 端点(GET
)
/get_login_info
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
index | int |
是 | 0(uin)、1(昵称) |
获取QQ头像
该接口用于获取指定wxid的微信头像,返回头像的Base64数据
API 端点(GET
)
/get_avatar
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
uin | string |
是 | 目标人的uin |
根据uid获取uin
该接口用于根据uid获取uin
API 端点(GET
)
/uid_to_uin
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
text | string |
是 | uid的文本值 |
根据uin获取uid
该接口用于根据uin获取uid
API 端点(GET
)
/uin_to_uid
参数
字段 | 类型 | 必须 | 说明 |
---|---|---|---|
text | string |
是 | uin的文本值 |
清空缓存目录
该接口用于清空发送的缓存目录
至于所谓的缓存目录,对于上面的发图、发视频、发文件、发语音来说,发送的时候都会将要发送的目标先复制到该缓存目录再进行发送,因为如果直接指定路径的话有时候会没权限。
/storage/emulated/0/Android/data/com.tencent.mobileqq/cache/share/*
API 端点(GET
)
/clear_send_cache
简述搭建与使用
- 事先需要准备一部安卓机,需要刷机过且已安装Lsposed框架,因为机器人相关功能被开发成Xposed模块,需要基于Lsposed去运作
- 安装 本插件 并在Lsposed中启用,作用域是系统框架与QQ,勾选后重启系统
- 根据接口文档编写对接代码,接口仅支持Http
- 将对接代码部署到本机(推荐),如果不部署到本机也可以部署到局域网的其它设备,例如电脑上。我一般的话,开发的时候方便调试就部署在电脑,实际用的时候直接部署在本机
- 那么,如何部署在本机?我是用的是Linux Deploy,当然也可以选择termux。需要记住部署的端口,注意启动的ip地址最好设置成127.0.0.1,不要用ipv4
- 我全套写的是Http协议,设置的回调端口是1234,而我是直接部署在本机。故在模块的设置页面我需要设置回调的HTTP地址为:
http://127.0.0.1:1234
- 不建议用ipv4地址,因为用127.0.0.1的话即使换个网络,比如切换数据也能直接使用,而无需再修改ip地址
- 至此,整个流程完成!
具体运作
- 我感觉我玩的挺花的,毕竟目前还没有人像我这么结合地去搞机器人
- 我用的方案是:Linux Deploy+Tasker+本插件
Linux Deploy
- 用于在 Android 设备上快速部署和运行完整的 Linux 操作系统环境
- 主要用于部署已经编写好的对接代码,如果不想直接部署在安卓机上,也可以选择部署在局域网的设备上
- 在Linux上安装个宝塔面板,无论你的对接代码是Java、Python、Php、Node.js等都能快速部署
- 我是用Node.js写的,在宝塔的Node版本管理器上安装个稳定版的Node.js,再安装下PM2模块去启动项目即可,PM2会自动守护应用进程,当应用崩溃或异常退出时,自动重启以保证服务持续运行
- 不能部署到云服务器上,除非再内网穿透,不过这样只会更麻烦,非常不建议
- 故推荐直接在本机上部署,这样即使外出了,只要有网络,机器人也不会噶
Tasker
- 一款功能强大的 Android 自动化工具应用,允许用户通过设定任务和触发条件,自动执行任务
- 这东西我高中的时候就在玩了,是真的好用,用它去触发定时任务
- 定时任务为什么不用cron或者schedule库呢?因为这始终不是运行在真实服务器,是运行在容器里的,如果手机息屏了,容器的活动就可能被限制了,定时凌晨4点的执行可能会到七八点才触发,甚至到亮屏才触发
- Tasker的存活能力很强,能在我用过的应用中排第一,任务执行基本百分百准点,误差就几秒,即使手机是在完全息屏的情况下
- 如何联动呢?在代码里编写好接口,在Tasker里定时执行http去触发这个接口
- 下面是个使用示例
由于我的服务器配置不太好,经常会死机,于是写了每5分钟检测一次服务器是否存活的代码配合Tasker,如果服务器挂掉了,机器人就会发送信息给我QQ大号提醒我重启下服务器
后台保活
- 对于小米系统,有个
夜间休眠省电
的选项是默认开启的,需要关闭,否则夜间的时候机器人的运作会受到影响 - 除此之外,应用权限里的
自启动
省电策略无限制
都可以开启 - 另外模块内部已经对QQ进行消息管道保活hook,能保证信息的及时接收
已实现的功能
- 群里很多人问我机器人用的什么框架,但是我知道他们问的其实是机器人功能方面的实现
- 用什么框架其实都一样,毕竟不会给你直接提供这些花里胡哨的东西(一些定制的框架除外),机器人框架只是提供了快捷发送与监听消息的基本能力
- 具体的功能都是要自己去编写对接代码去扩展实现的,花里胡哨的程度还得看自己的想法
爬虫相关
- 每日7点自动爬取某公众号文章的新闻发送至群聊
- 每日12点、18点、21点自动爬取三个主流论坛的热点文章信息至群聊
- 抖音视频解析去水印,在群内发送
抖音视频的分享链接
就会触发自动解析去水印并发送处理后的视频至群聊 - 博客检索,在群内发送
/博客检索 指定关键词
就会触发自动发送道无涯博客包含指定关键词的文章至群聊
作图相关
- 说明:用已经制作好的模板对QQ头像进行动图或静图合成
- 触发方式:群里发送
作图
可获取触发指令
HttpBox工具
- 说明:通过raw可一键生成Http协议代码,节省开发时间,方便程序员调试,支持八大平台
- 触发方式:群里发送
/httpbox
可获取触发指令说明
群管理相关
- 自动审核入群申请,人机验证
- 每日0点自动踢出群最后发言末n成员
- 自动监测(200+群聊)关键词(道无涯自用,接单先人一步[手动狗头.jpg])
AI问答相关
由于经费问题,没有对外开放,仅道无涯个人使用
- 对接ChatGPT,使用AI进行知识问答。触发方式:群内发送
/ai 问答内容
- 搭建知识库并投喂autojs文档数据,再对接AI,实现精确问答。触发方式:群内发送
/aj 问答内容
生图相关
由于经费问题,没有对外开放,仅道无涯个人使用
- 对接ComfyUI,可进行图生图,文生图等
其它
可扩展的玩法太多了,暂时还没有什么新奇的玩法点子,有空了再开发补充~