向所有维护过签名服务器的前辈们致敬,是你们让协议库又延续了至少几个月的寿命,感恩。

如果你追求稳定,请尽量迁移到基于官方客户端开发的项目,例如 OpenShamrock

为了继续苟且偷生,且部分资源或仓库应版权方要求已经删库,故本文章不会直接贴出部分资源或仓库的链接,请自行寻找。

前言

从 2023 年开始,腾讯官方就一直在对 Bot 社区进行打压围堵,导致许多 Bot 用户无法继续使用 Bot。

而在公开签名服务后,其中很多像我一样的用户依靠这些服务为 Bot 续命。

在连续折腾了几天后,我决定写下这一篇文章,为还想继续使用协议库方式登陆的用户们指一条还算明确的路。

开始

本文章将假设你:

  • 已经在使用 Miraigo-cqhttp
  • 已经配置好了 Java 环境(推荐 Java 11)
  • 知道你所使用的系统该如何编写和运行脚本

开始使用

目前 Mirai 和 go-cqhttp 都已经支持了使用外置签名服务进行签名操作。

如果您使用的是 Mirai,可以参考如何使用插件式签名服务器。

使用外置签名服务

本章将假设:

  • 你已获取到 fuqiuluo/unidbg-fetch-qsign 相关的可执行文件
  • 你要将 Bot 和签名服务器配置在同一台设备上
  • 你将要使用的协议版本是 8.9.78,并且你已经拥有相关的文件

由于版权方要求,该仓库已经被删除且不再更新,故将不在此处贴出对应链接。如果您没有相关文件,请自行寻找。

配置签名服务器

解压 unidbg-fetch-qsign 至你可以访问的目录,然后在根目录下新建 start.sh(Linux) 或 start.bat(Windows)。在脚本中输入以下内容:

start.sh

#!/bin/bash
java -cp "$CLASSPATH:./lib/*" MainKt --basePath="txlib/8.9.78"

start.bat

java -cp .\lib\* MainKt --basePath="txlib/8.9.78"

其中 basePath 参数中的 8.9.78 就是你将要使用的协议版本。

在使用该协议版本前,请先前往 txlib 文件夹检查是否存在该文件夹且该文件夹内是否包含 config.jsondtconfig.jsonlibfekit.so 以及 libQSec.so(非必须)文件,否则该协议版本无效,不能被用于启动签名服务。

之后我们打开 txlib/8.9.78/config.json 这个文件,修改签名服务器的配置:

{
  "server": {
    // `server.host`:签名服务器监听地址,如果不想暴露给公网可以改成 127.0.0.1
    "host": "0.0.0.0",
    // `server.port`:签名服务器监听端口
    "port": 8080
  },
  // 以下两项设置 `share_token` 和 `count` 是用于一个签名服务器对应多个客户端时的配置。
  // `share_token`:用于控制当多个客户端连接至签名服务器时,客户端之间是否共用一个 token。
  "share_token": false,
  // `count`:用于控制最大客户端数量(假设一个客户端只有一个实例)。如果只有一个客户端,则控制一个客户端的最大实例数量。
  "count": 1,
  // 以上两者不会对账号安全性做出影响,在老版本的签名服务器中没有以上两个设置项。
  // `key`:连接至签名服务器时的鉴权用 key
  "key": "114514", 
  // `auto_register`:实例连接到服务器后是否自动注册
  "auto_register": true,
  // `protocol` 内的参数是自动生成的,请勿随意改动
  "protocol": {
    "package_name": "com.tencent.mobileqq", // 老版本的签名服务器无此参数
    "qua": "V1_AND_SQ_8.9.78_4548_YYB_D",
    "version": "8.9.78",
    "code": "4548"
  },
  "unidbg": {
    // `unidbg.dynarmic`:高并发请启用,但请注意控制实例数量,否则会导致内存爆炸
    "dynarmic": true,
    // `unidbg.unicorn`:未明写其作用,个人推测开启后会使用原生方法调用相关方法从而减少内存占用
    "unicorn": false,
    // `unidbg.kvm`:未明写其作用,开启后会降低内存占用
    "kvm": false,
    // `unidbg.debug`:开启后会显示详细日志,不是需要排错的话建议关闭
    "debug": false
  },
  // `black_list`:黑名单账号,在该列表中的账号将无法使用此签名服务
  // 此设置项在旧版签名服务器中无效
  "black_list": [
    1008611
  ]
}

调整完配置之后保存文件,记下 server.porttoken 两个参数,稍后我们将会使用它。

然后,运行 start.shstart.bat 启动签名服务器。此时打开浏览器访问签名服务器(在本例中,签名服务器的地址是 http://127.0.0.1:28080),你应该会看到类似下面的内容:

{
    "code": 0,
    "msg": "IAA 云天明 章北海",
    "data": {
        "version": "1.1.9",
        "protocol": {
            "qua": "V1_AND_SQ_8.9.78_4548_YYB_D",
            "version": "8.9.78",
            "code": "4548"
        }
    }
}

如果你没有看到类似上面的内容或浏览器出现错误提示,请检查你的服务器配置和连接地址。

关于协议版本:目前对于绝大多数账号来说 8.9.78 及以上的版本才可以正常登陆,但这些版本文件并没有经过验证,可能存在不稳定的现象。如果你需要更新的协议版本,请自行逆向官方客户端获取。

配置 Bot 客户端

本章将分成两个部分:Mirai 和 go-cqhttp。

配置 Mirai

下载 fix-protocol-version 插件,将其放在 Mirai 根目录的 plugins 文件夹内(如果可以,请搭配 mirai-login-solver-sakuramirai-device-generator 使用),然后启动一次 Mirai,让插件生成对应的配置文件。

接下来,退出 Mirai,打开 Mirai 根目录下的 KFCFactory.json 文件,将其修改成类似下面的内容:

{
    // 此处的 `8.9.78` 应当是你准备使用的协议版本。
    // fix-protocol-version 支持连接多个签名服务器,因此你可以复制本节内容并
    // 稍加修改后即可使用另一个支持不同版本的签名服务器。
    "8.9.78": {
        // 请注意修改 `base_url` 中的端口号
        "base_url": "http://127.0.0.1:8080",
        // 请不要修改这一项
        "type": "fuqiuluo/unidbg-fetch-qsign",
        // 填入你刚才在配置文件中定义的 key
        "key": "114514"
    }
}

然后将协议版本对应的 android_phone.jsonandroid_pad.json 两个文件复制到 Mirai 根目录(可按需复制),启动 Mirai,如果没有问题此时你的 Bot 应当已经成功登陆并且可以正常收发消息了。

配置 go-cqhttp

对于 go-cqhttp,我建议使用 Actions 构建版本,正式版本并不支持加载自定义的客户端信息,并且 go-cqhttp 的客户端信息来源是写死的,使用并不方便。

更新完 go-cqhttp 后,启动一次 go-cqhttp 以更新配置文件。

然后,退出 go-cqhttp,打开 config.yml,找到 account.sign-servers 一节,修改其内容:

# go-cqhttp 自带的注释已经很详细了,我想我不需要再写什么了吧?
# ...
  # 数据包的签名服务器列表,第一个作为主签名服务器,后续作为备用
  # 兼容 https://github.com/fuqiuluo/unidbg-fetch-qsign
  # 如果遇到 登录 45 错误, 或者发送信息风控的话需要填入一个或多个服务器
  # 不建议设置过多,设置主备各一个即可,超过 5 个只会取前五个
  # 示例:
  # sign-servers: 
  #   - url: 'http://127.0.0.1:8080' # 本地签名服务器
  #     key: "114514"  # 相应 key
  #     authorization: "-"   # authorization 内容, 依服务端设置
  #   - url: 'https://signserver.example.com' # 线上签名服务器
  #     key: "114514"  
  #     authorization: "-"   
  #   ...
  # 
  # 服务器可使用docker在本地搭建或者使用他人开放的服务
  sign-servers: 
    - url: 'http://127.0.0.1:8080'  # 主签名服务器地址, 必填
      key: '114514'  # 签名服务器所需要的apikey, 如果签名服务器的版本在1.1.0及以下则此项无效
      authorization: '-'   # authorization 内容, 依服务端设置,如 'Bearer xxxx'
# ...

然后进入 data/versions 文件夹,将 android_phone.jsonandroid_pad.json 分别改名为 1.json6.json 复制进该文件夹中(可按需复制)。如果你在 go-cqhttp 的启动参数中添加了 -update-protocol 项目,请删除它。

然后启动 go-cqhttp,如果没有问题此时你的 Bot 应当已经成功登陆并且可以正常收发消息了。

如果你想的话,可以在 go-cqhttp 的配置文件的 account 一节中找到更多关于签名服务器的配置项,这些项目提供了更为精细的客户端行为调整,调整得当的话可能可以让你的 Bot 运行得更稳定。

使用 Mirai 插件

本章节参考的是 Mirai 论坛中的 这篇帖子,向楼主致敬。

原帖 下载好插件后按照其使用说明安装,安装完毕后直接启动 Mirai 即可。

如果需要更新协议版本,可自行获取对应文件后放置在 txlib 文件夹下,然后使用 /qsign <version> 指令切换协议版本。

善后

在 OneBot 平台上使用 Mirai 插件

对于不得已已经迁移至官方实现的用户可以尝试使用 MrXiaoM/Overflow 转译框架。

由于该项目还在缓慢开发中,存在 Bug 和不稳定等问题,建议测试后再放入生产环境中使用。如果遇到了问题也欢迎到 issue 与开发者反馈。

使用 酷Q 插件

酷Q 早在 2020 年 7 月就已经终止了服务,由于 酷Q 本身闭源,且 Coxxs 并未公布 *.cpk 的加载逻辑,因此目前所有的社区第三方实现都不支持直接加载 *.cpk 文件。

如果你手上正好有 酷Q 插件的原始 *.dll 和原始 *.json 文件,不妨试试下面几个项目:

super1207/MiraiCQ

此项目同时支持 Mirai HTTP APIOneBot v11 实现,并可通过 wine 适配 Linux。

仓库地址:https://github.com/super1207/MiraiCQ

对于某些插件,可能会依赖 酷Q 自己提供的库,此时可寻找对应的库文件并将其放入 bin 文件夹内。

debumori-osc/Another-Mirai-Native

此项目仅支持 Mirai HTTP API

项目地址:https://github.com/debumori-osc/Another-Mirai-Native

本项目拥有和原 酷Q 近似的用户界面,并在其基础上添加了插件调试功能(类似于 Koishi 的沙盒功能),可以让插件开发者方便地测试自己的插件。

本项目同时提供开发者已打包好的运行环境,可在 debumori-osc/another-mirai-native-release 下载。

iTXTech/mirai-native

此项目仅支持 Mirai 环境,并且只支持 32 位的 Java。

项目地址:https://github.com/iTXTech/mirai-native

本项目是最早的在 Mirai 上支持 酷Q 插件的项目,但已经很久没有新的更新了。

结语

其实腾讯官方在最近向开发者开放了 Bot 开发(文档),但是就 Mirai 论坛用户的使用反馈 来看,目前这个 Bot 不仅审核严格、功能稀少,连 SDK 更新也不频繁。

所以我个人认为,除非万不得已,还是继续使用第三方实现吧。

愿我们能在更开放的平行世界里相遇。