本地签名器(LocalSigner)是一个简化的签名实现,可以在没有外部签名服务器的情况下工作。
- 这是一个简化实现,使用标准加密算法模拟签名过程
- 不保证能完全替代真实的签名服务器
- 真实的签名算法需要逆向工程腾讯客户端,涉及法律和技术风险
- 可能会导致登录失败或账号风控
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();混合签名器会优先尝试使用远程签名服务器,失败时自动切换到本地签名:
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);修改 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>()
},
// ... 其他参数
));
}本地签名器使用以下算法生成签名:
-
签名生成:
- 收集命令名、序列号、消息体、设备ID、时间戳
- 使用 HMAC-SHA256 生成哈希
- 返回前 16 字节作为签名
-
额外数据生成:
- 包含序列号、应用ID、时间戳
-
令牌生成:
- 基于命令、序列号和时间戳生成 SHA256 哈希
- 不是真实算法: 使用标准加密算法模拟,不是腾讯的真实签名算法
- 可能被检测: 腾讯服务器可能检测到签名异常
- 账号风险: 可能导致账号被风控、冻结或封禁
- 功能受限: 某些功能可能无法正常工作
- 不保证成功: 登录和操作可能随时失败
如果本地签名器无法正常工作,建议:
- 自建签名服务器: 使用 unidbg-fetch-qsign 等项目
- 寻找公共服务: 加入社区寻找可用的签名服务器
- 使用替代项目: OpenShamrock 或 Chronocat
- 等待项目恢复: 关注 Lagrange.Core 的更新
- 逆向工程和模拟腾讯协议可能违反服务条款
- 使用风险自负,开发者不承担任何责任
- 建议仅用于学习和研究目的
- 请遵守当地法律法规
如果你想改进本地签名器,可以:
- 研究腾讯的签名算法(需要逆向工程技能)
- 参考 unidbg-fetch-qsign 的实现
- 分析 QQ 客户端的网络流量
- 加入开发社区讨论
欢迎提交改进建议和代码优化!