Skip to content

Latest commit

 

History

History
185 lines (139 loc) · 4.96 KB

File metadata and controls

185 lines (139 loc) · 4.96 KB

本地签名器使用指南

概述

本地签名器(LocalSigner)是一个简化的签名实现,可以在没有外部签名服务器的情况下工作。

⚠️ 重要提示:

  • 这是一个简化实现,使用标准加密算法模拟签名过程
  • 不保证能完全替代真实的签名服务器
  • 真实的签名算法需要逆向工程腾讯客户端,涉及法律和技术风险
  • 可能会导致登录失败或账号风控

使用方法

1. 使用本地签名器

using Lagrange.Core.Common;
using Lagrange.Core.Common.Interface;
using Lagrange.Core.Utility.Sign;

// 创建设备信息
var deviceInfo = BotDeviceInfo.GenerateInfo();

// 创建本地签名器
var localSigner = new LocalSigner(
    deviceId: deviceInfo.Guid.ToByteArray(),
    appVersion: "3.0.6",
    appId: 537234773
);

// 创建 Bot 配置,使用本地签名器
var config = new BotConfig
{
    Protocol = Protocols.Linux,
    CustomSignProvider = localSigner,  // 使用本地签名器
    AutoReconnect = true
};

// 创建 Bot 实例
var bot = BotFactory.Create(config, deviceInfo, keystore);

// 正常使用
await bot.LoginByQrCode();

2. 使用混合签名器(推荐)

混合签名器会优先尝试使用远程签名服务器,失败时自动切换到本地签名:

using Lagrange.Core.Utility.Sign;

// 创建远程签名器(如果有可用的签名服务器)
var remoteSigner = new UrlSigner("http://your-sign-server:8080/sign");

// 创建本地签名器作为备用
var localSigner = new LocalSigner(
    deviceId: deviceInfo.Guid.ToByteArray()
);

// 创建混合签名器
var hybridSigner = new HybridSigner(
    primarySigner: remoteSigner,   // 主签名器
    fallbackSigner: localSigner     // 备用签名器
);

var config = new BotConfig
{
    Protocol = Protocols.Linux,
    CustomSignProvider = hybridSigner,  // 使用混合签名器
    AutoReconnect = true
};

var bot = BotFactory.Create(config, deviceInfo, keystore);

3. 在 Lagrange.OneBot 中使用

修改 appsettings.json:

{
    "SignServerUrl": "",
    "Account": {
        "Uin": 0,
        "Protocol": "Linux"
    }
}

然后在代码中配置:

// 在 HostApplicationBuilderExtension.cs 中修改
public static HostApplicationBuilder ConfigureLagrangeCore(this HostApplicationBuilder builder)
{
    var deviceInfo = // ... 加载设备信息
    
    builder.Services
        .AddSingleton<SignProvider>(services => 
        {
            var config = services.GetRequiredService<IConfiguration>();
            var deviceInfo = services.GetRequiredService<BotDeviceInfo>();
            
            // 创建本地签名器
            var localSigner = new LocalSigner(
                deviceId: deviceInfo.Guid.ToByteArray()
            );
            
            // 如果配置了签名服务器,使用混合模式
            var signServerUrl = config["SignServerUrl"];
            if (!string.IsNullOrEmpty(signServerUrl))
            {
                var remoteSigner = new UrlSigner(signServerUrl);
                return new HybridSigner(remoteSigner, localSigner);
            }
            
            // 否则只使用本地签名器
            return localSigner;
        })
        .AddSingleton((services) => BotFactory.Create(
            new BotConfig
            {
                CustomSignProvider = services.GetRequiredService<SignProvider>()
            },
            // ... 其他参数
        ));
}

工作原理

本地签名器使用以下算法生成签名:

  1. 签名生成:

    • 收集命令名、序列号、消息体、设备ID、时间戳
    • 使用 HMAC-SHA256 生成哈希
    • 返回前 16 字节作为签名
  2. 额外数据生成:

    • 包含序列号、应用ID、时间戳
  3. 令牌生成:

    • 基于命令、序列号和时间戳生成 SHA256 哈希

局限性

⚠️ 本地签名器的局限性:

  1. 不是真实算法: 使用标准加密算法模拟,不是腾讯的真实签名算法
  2. 可能被检测: 腾讯服务器可能检测到签名异常
  3. 账号风险: 可能导致账号被风控、冻结或封禁
  4. 功能受限: 某些功能可能无法正常工作
  5. 不保证成功: 登录和操作可能随时失败

替代方案

如果本地签名器无法正常工作,建议:

  1. 自建签名服务器: 使用 unidbg-fetch-qsign 等项目
  2. 寻找公共服务: 加入社区寻找可用的签名服务器
  3. 使用替代项目: OpenShamrock 或 Chronocat
  4. 等待项目恢复: 关注 Lagrange.Core 的更新

法律声明

⚠️ 重要:

  • 逆向工程和模拟腾讯协议可能违反服务条款
  • 使用风险自负,开发者不承担任何责任
  • 建议仅用于学习和研究目的
  • 请遵守当地法律法规

技术细节

如果你想改进本地签名器,可以:

  1. 研究腾讯的签名算法(需要逆向工程技能)
  2. 参考 unidbg-fetch-qsign 的实现
  3. 分析 QQ 客户端的网络流量
  4. 加入开发社区讨论

贡献

欢迎提交改进建议和代码优化!