BlogArticles/2024-03/转向Lagrange.Core 解决Sign服务问题.md

59 lines
3.8 KiB
Markdown
Raw Normal View History

2025-08-26 01:34:11 +08:00
---
{
title: "转向Lagrange.Core 解决Sign服务问题",
description: "作者放弃ChronoCat转向Lagrange.Core但在发送消息时遇到阻塞。发现未配置Sign服务器导致登录异常。通过阅读源码自定义SignProvider并硬编码URL后解决问题成功实现消息发送。",
draft: false,
type: "article",
created_at: "2024-03-29T09:50:00+08:00",
published_at: "2024-03-29T10:19:00+08:00",
updated_at: [ "2024-03-29T10:19:00+08:00"],
category: 'Uni',
tags: [ "QQBot" ],
tech_stack: [ "LagrangeCore","C#" ],
tech_stack_percent: [ 50, 50 ],
tech_stack_icon_names: [ "mynaui:letter-l","mdi:language-csharp" ],
tech_stack_theme_colors: [ "#8f71b0","#a179dc" ],
}
---
!!!warning Legacy Article 过时的文章
此文章从旧博客迁移而来,编写时技术水平有限,仅供参考
!!!
## 事件记录
在群U的劝说下放弃了ChronoCat转向了**Lagrange.Core**
初步了解后我发现这东西竟然有Nuget开发包我直呼还有这好事直接对着Api文档开写。
写到发送单对单信息后,开始测试,发现发不出去,就阻塞了,卡在那了,没报错,没异常。
在反复对照调试了30min后向Rosemoe求助。
他一开始也觉得没问题,突然问我,**你配Sign了吗**
我一下子就不懂了
然后他丢给我一个sign的链接 这里就不丢出来了需要的去telegram找
我就愣住了然后就开始看文档看ReadMe 我就发现只有一个地方提到了sign的事 Lagrange.OneBot Appsettings.json里面有一个要求用户填入。
然后我就把链接填到Docker Contianer里的Appsettings.json 重启 但是没用
更不会了突然想起来Docker也有log 我决定对比一下我的请求和Docker log 看看有没有什么报错信息。
然后我就发现一个奇怪的事好像我的请求和log没什么关系
而且log里也有用于登录的二维码 ~~这不扫一下~~
然后我发现我的电脑qq被顶下去了我立刻意识到它成功登录了而我的Api调用登录是不成功的。
这时我才意识到Lagrange.Core 和 Lagrange.OneBot是两个东西关于Lagrange.Core的sign服务配置只在ReadMe.md有提到
> 暂不提供签名 API您可能需要在某个地方找到它并在 BotConfig 继承 SignProvider 类的CustomSignProviderBotConfig
之前ChronoCat使用vnc直接显示qq界面登了就顶符合直觉。
在调用Lagrange.Core时如果没有正确配置sign服务器登录时手机会显示有其他设备登录但是电脑上不顶号。获取到了BotContext甚至有uin字段但是实际是没有登录成功的。
这也解释了为什么Online事件没有正常触发。
#正题 Lagrange.Core sign配置
没办法了,只能试着看源代码了
在这个过程中Rosemoe给了我OneBot sign 服务实现的代码,位置是
> Lagrange.OneBot.Utility.OneBotSigner
大致的读了一下代码关键在于从AppSettings获取了Sign链接然后配合其他的变量发送了一条请求最后返回了一个byte[]
Core下也有类似的代码
> Lagrange.Core.Utility.Sign.LinuxSigner //这里只考虑Linux
但是该文件中 Url是空的并且没有函数给它赋值LinuxSigner继承自SignProvider
SignProvider是BotConfig的一个属性 而BotConfig是Create一个Bot时需要的变量。
看到这,你可能已经明了了
LinuxSigner只有在BotConfig的SignProvider为null时才会被构建所以需要写一个自己的Signer,然后把里面的url填上。
由于LinuxSigner的url是 private const 我不太确定继承能不能使用新的url,我这里直接继承SignProvider为Sign,然后 copy LinuxSigner,修改url,后面可能改成从AppSettings读取。这里先直接硬写了。
然后使用新的SignProvider初始化BotConfig,重新测试,没有问题。