获取QQSign参数通过Unidbg,开放HTTP API。unidbg-fetch-sign最低从QQ8.9.33(不囊括)开始支持,TIM不支持。
- 公共API具有高风险可能
- 请使用与协议对应版本的libfekit.so文件
- QSign基于Android平台,其它平台Sign计算的参数不同,不互通(例如:IPad)。
- 不支持载入Tim.apk的so文件。
-
系统安装jdk或者jre,版本1.8或以上。如果报错找不到类,请尝试1.8或略靠近1.8的版本
-
解压后cd到解压目录,配置config.json文件。
其中protocol
中的参数可以从protocol-versions获取!
{ // 复制这里的话,请把注释删除
"server": {
"host": "0.0.0.0",
"port": 8080
},
// 注册实例的密钥
"key": "114514",
// 实例重载间隔(目前没有用)
// i>=20 i<=50
"reload_interval": 40,
"protocol": {
"qua": "V1_AND_SQ_8.9.63_4194_YYB_D",
// version和code可以从qua中提取
"version": "8.9.63",
"code": "4194"
},
"unidbg": {
// 启用Dynarmic,它是一个开源的动态ARM指令集模拟器
// 有时候会出现https://github.com/fuqiuluo/unidbg-fetch-qsign/issues/52
"dynarmic": false,
"unicorn": true,
"debug": false
}
}
bash bin/unidbg-fetch-qsign --basePath=txlib/8.9.63
- 注意:你需要手动从apk安装包的
lib/arm64-v8a
目录中提取出libfekit.so、libQSec.so文件并存放至一个文件夹,然后使用--basePath
指定该文件夹的绝对路径
,结构例如:
- your_dir
- libfekit.so
- libQSec.so
- config.json
- dtconfig.json
dtconfig.json
是FEBound.java内数据的热更新版本,每个版本的QQ不同,可自行从com.tencent.mobileqq.dt.model.FEBound
逆向得到。
--basePath=
/home/your_dir
1.先到txlib/8.9.63中确认Config文件中端口是否存在矛盾,可用10010等端口并保存
2.同上解压文件,在项目根目录:
- your_dir
- bin
- lib
- txlib
3.该位置执行命令:
./bin/unidbg-fetch-qsign --basePath=txlib/8.9.63
命令行最后一行会给出签名服务器地址:http://127.0.0.1:xxxxx
(本地签名服务器,网络签名服务器同理)
4.将该地址填入go-cqhttp的config中sign-server
配置项(已成功案例来自于KomeiDiSanXian的1.1.3dev版本:https://github.com/Mrs4s/go-cqhttp/actions/runs/5504923059)
此Docker image相关提问请到:xzhouqd/unidbg-fetch-qsign 提交issue
直接使用openjdk11启动服务
version: '2'
services:
qsign:
image: openjdk:11.0-jdk
environment:
TZ: Asia/Shanghai
restart: always
working_dir: /app
# 按需修改相关参数
command: bash bin/unidbg-fetch-qsign --port=8080 --count=1 --library=txlib/8.9.63 --android_id=someandroidid
volumes:
# 当前目录放置qsign的解压包
- ./unidbg-fetch-qsign:/app
# 当前目录放置txlib
- ./txlib:/app/txlib
ports:
# 按需调整宿主机端口
- 8901:8080
环境配置:
x86
Ubuntu 22.04.1
openjdk version "19.0.2"
在root家目录操作
机器人:
Yunzai-Bot
icqq 0.4.8
这里以1.1.0为例,记得改下载连接,慢的话可以传上去或者用代理
https://github.com/fuqiuluo/unidbg-fetch-qsign/releases
wget https://github.com/fuqiuluo/unidbg-fetch-qsign/releases/download/1.1.0/unidbg-fetch-qsign-1.1.0.zip
# 没装unzip的话
apt install unzip
# 解压,注意文件名
unzip unidbg-fetch-qsign-1.1.0.zip
这里 clone 了整个 unidbg-fetch-qsign 项目,之后按需复制
git clone https://github.com/fuqiuluo/unidbg-fetch-qsign.git
# 复制txlib,注意目录
cp -r unidbg-fetch-qsign/txlib unidbg-fetch-qsign-1.1.0/
检查 java
java -version
# 没装的话
apt install openjdk-19-jdk
查看端口占用
netstat -lntp
releases 1.1.0 在这时可以直接运行,注意修改参数,这里使用绝对路径
/root/unidbg-fetch-qsign-1.1.0/bin/unidbg-fetch-qsign --host=127.0.0.1 --port=8901 --count=2 --library=/root/unidbg-fetch-qsign-1.1.0/txlib/8.9.63 --android_id=我自己填的是device.json里面的参数
releases 1.1.3 最好修改 txlib/8.9.63/config.json 文件,之后执行
/root/unidbg-fetch-qsign-1.1.3/bin/unidbg-fetch-qsign --basePath=/root/unidbg-fetch-qsign-1.1.3/txlib/8.9.63
测试可以正常运行,ctrl+c结束
新建文件
vi /etc/systemd/system/qsign.service
#========在qsign.service文件中输入以下内容========
#========注意更改Service参数,要用绝对路径========
[Unit]
Description=unidbg-fetch-qsign
After=network.target
[Service]
ExecStart=这里输入之前前台运行测试成功的命令
[Install]
WantedBy=multi-user.target
#================
重载与启动
#重载服务,每次修改都要
sudo systemctl daemon-reload
#启动qsign
sudo systemctl start qsign
#查看端口情况,可见已在指定的port开启服务
netstat -lntp
#以下数条可按需执行
#启动
sudo systemctl start qsign
#停止
sudo systemctl stop qsign
#重启
sudo systemctl restart qsign
#设置开机启动
sudo systemctl enable qsign
#禁用开机启动
sudo systemctl disable qsign
#查看运行状态
sudo systemctl status qsign
- fix-protocol-version:基于mirai的qsign api对接。
# http://127.0.0.1:8080/custom_energy?uin=[QQ]&salt=[SALT HEX]&data=[DATA]
参数名 | 意义 | 例子 |
---|---|---|
UIN | Bot的QQ号 | 114514 |
非专业人员勿用。
# http://127.0.0.1:8080/sign?uin=[UIN]&qua=[QUA]&cmd=[CMD]&seq=[SEQ]&buffer=[BUFFER]
参数名 | 意义 | 例子 |
---|---|---|
UIN | Bot的QQ号 | 114514 |
QUA | QQ User-Agent,与QQ版本有关 | V1_AND_SQ_8.9.63_4188_HDBM_T |
CMD | 指令类型,CMD有很多种,目前登录、发信息均需要sign | wtlogin.login |
SEQ | 数据包序列号,用于指示请求的序列或顺序。它是一个用于跟踪请求的顺序的数值,确保请求按正确的顺序处理 | 2333 |
BUFFER | 数据包包体,不需要长度,将byte数组转换为HEX发送 | 020348010203040506 |
POST的支持
如果buffer过长,会超出get请求方式的长度上限,因此sign的请求也支持POST的方式。
请求头 Content-Type: application/x-www-form-urlencoded
POST的内容:"uin=" + uin + "&qua=" + qua + "&cmd=" + cmd + "&seq=" + seq + "&buffer=" + buffer
下面这个只是个例子
# http://127.0.0.1:8080/energy?version=[VERSION]&uin=[UIN]&guid=[GUID]&data=[DATA]
参数名 | 意义 | 例子 |
---|---|---|
VERSION | 注意!这里的VERSION指的不是QQ的版本号,而是SDK Version,可以在QQ安装包中找到此信息 | 6.0.0.2549 |
UIN | Bot的QQ号 | 114514 |
GUID | 登录设备的GUID,将byte数组转换为HEX发送,必须是32长度的HEX字符串 | ABCDABCDABCDABCDABCDABCDABCDABCD |
DATA | QQ发送登录包的CmdId和SubCmdId,例子中810是登陆CmdId,9是SubCmdId | 810_9 |
- 由于项目的特殊性,我们可能
随时删除本项目且不会做出任何声明
- 昵称:[咖啡] QQ:1456****68