nonebot-plugin-send-anything-anywhere icon indicating copy to clipboard operation
nonebot-plugin-send-anything-anywhere copied to clipboard

[Proposal] Support OpenID

Open felinae98 opened this issue 1 year ago • 19 comments

~~又是因为QQ~~

因为某些平台回使用 OpenID,即 Bot 看不到真实的用户 ID 和群号,只能看到 OpenID。对于不同的 Bot,对应同一个用户的 OpenID 是不一样的。这种情况下 auto select bot 功能将直接G,原先的 paltform_target 也需要进行改变。

  1. 新建一个 PlatformTarget 的 mixin 或者基类,作为所有 OpenID 的基类
  2. 在这个基类中记录 BotID,auto select bot 时按照这个 BotID 选择对应机器人

以上改动对于用户(下游开发者)来说应该是无感知的

felinae98 avatar Nov 13 '23 08:11 felinae98

没想明白BotSpecifier设计用于什么 这个botid什么时候被赋值 如果是extract_c2c_message_eventextract_group_at_message_event的话我觉得没必要 因为这两函数只在事件处理时被调用,而Bot Specifier是为了主动消息

现在tx没有给群列表接口所以autoselectbot确实是得寄了 记录botid的方法我觉得不可行

Dreamail avatar Nov 25 '23 16:11 Dreamail

没想明白BotSpecifier设计用于什么 这个botid什么时候被赋值 如果是extract_c2c_message_eventextract_group_at_message_event的话我觉得没必要 因为这两函数只在事件处理时被调用,而Bot Specifier是为了主动消息

现在tx没有给群列表接口所以autoselectbot确实是得寄了 记录botid的方法我觉得不可行

我其实觉得所有的 target 都可以 mixin 这个进去。只要你需要指定 bot 发送就可以用到这个。 像 QQ群这种 openid 与机器人绑定的情况,除了记录 bot_id 没有其他办法吧。

he0119 avatar Nov 26 '23 00:11 he0119

没想明白BotSpecifier设计用于什么 这个botid什么时候被赋值 如果是extract_c2c_message_eventextract_group_at_message_event的话我觉得没必要 因为这两函数只在事件处理时被调用,而Bot Specifier是为了主动消息

现在tx没有给群列表接口所以autoselectbot确实是得寄了 记录botid的方法我觉得不可行

我其实觉得所有的 target 都可以 mixin 这个进去。只要你需要指定 bot 发送就可以用到这个。 像 QQ群这种 openid 与机器人绑定的情况,除了记录 bot_id 没有其他办法吧。

那是要再维护一个list存target么 其他适配器可以直接获取所有target但是QQ没有这个接口 我能想到的就只有收到消息之后把target存起来 但是这个维护的target又只用于发送主动消息,这么看就感觉没有必要

Dreamail avatar Nov 26 '23 01:11 Dreamail

目前 saa 中 target 的设计目标是可以直接通过 send_to(target) 将对应的消息发送到指定的目标(群或频道)中,与具体是哪个机器人发送无关。所以最开始的设计中,是不包含 bot_id 的,因为当时所有的群组信息都与机器人无关。

但是 QQ群 这个 openid 是与 bot_id 绑定的,不同机器人获取到相同群组的 openid 不同,意味着,如果你需要发送到指定 openid 里,必须使用其对应的 bot 发送,不然会发送失败。所以为了支持这种平台,只能让 target 中附带 bot_id,找到对应 openid 的机器人发送。这样可以保持 target 的语义。

那是要再维护一个list存target么

现在 auto select 里已经有一个 list 了呀。

其他适配器可以直接获取所有target但是QQ没有这个接口

是的,所以 QQ 没法使用 auto_select 功能。

我能想到的就只有收到消息之后把target存起来 但是这个维护的target又只用于发送主动消息,这么看就感觉没有必要

bison 的使用场景就是订阅时记录需要主动推送的 target,等有新消息之后,直接通过这个 target 发送到对应平台。不知道你这里说的没必要是什么意思?

he0119 avatar Nov 26 '23 03:11 he0119

主动信息的场景我想到的就是在对方没有发送消息的时候主动发送,如果是这样这时list里并没有保存有对应的botid,则无法推送主动消息

QQ的被动消息时间限制是5分钟,主动消息每天限制4条 这么看的话,存botid的使用场景那就只有被动消息但是超时回复 所以我觉得没有很大必要(

主动发送消息也需要自己构造一个target吧,那还得插件开发者自己制定bot吗? 能拿到target实例的地方应该只有matcher?

如果是要实现开发者不关心由哪个bot发出的话,那就不应该是让target直接继承BotSpecifier

~~但如果需要适配的话我抽空把这个feat完善了~~

Dreamail avatar Nov 26 '23 04:11 Dreamail

如果是要实现开发者不关心由哪个bot发出的话,那就不应该是让target直接继承BotSpecifier

继承的原因不是开发者关不关心的问题,而是我上面所说的 不同机器人获取到相同群组的 openid 不同

https://bot.q.qq.com/wiki/develop/api-v2/dev-prepare/unique-id.html 举例

不同 bot 在单聊场景,获取到的用户唯一识别 openid 不一样,称为 user_openid 不同 bot 在群聊场景,获取到的群唯一识别号 openid 不一样,称为 group_openid 相同 bot 在不同的群,获取到同一个用户在群内的唯一识别号 openid 不一样,称为 member_openid

he0119 avatar Nov 26 '23 05:11 he0119

如果是要实现开发者不关心由哪个bot发出的话,那就不应该是让target直接继承BotSpecifier

继承的原因不是开发者关不关心的问题,而是我上面所说的 不同机器人获取到相同群组的 openid 不同

https://bot.q.qq.com/wiki/develop/api-v2/dev-prepare/unique-id.html 举例 不同 bot 在单聊场景,获取到的用户唯一识别 openid 不一样,称为 user_openid 不同 bot 在群聊场景,获取到的群唯一识别号 openid 不一样,称为 group_openid 相同 bot 在不同的群,获取到同一个用户在群内的唯一识别号 openid 不一样,称为 member_openid

我知道这个,但是主动发送就需要构造target实例,但是构造target实例就需要botid,为开发者免去选择bot不是saa所要做的么

https://github.com/MountainDash/nonebot-plugin-send-anything-anywhere/pull/124 我想的实现是这样,而不是在target上用botid区分target

Dreamail avatar Nov 26 '23 06:11 Dreamail

那我请问你们打算如何实现openid的auto select bot

Dreamail avatar Nov 26 '23 06:11 Dreamail

我知道这个,但是主动发送就需要构造target实例,但是构造target实例就需要botid,为开发者免去选择bot不是saa所要做的么

#124 我想的实现是这样,而不是在target上用botid区分target

你可以理解为,脱离了 bot_id 的 openid 是没法唯一确定一个群的。如果遇到相同 openid 但是 bot_id 不同的情况,它们对应的群很有可能是不同的群。

he0119 avatar Nov 26 '23 06:11 he0119

我知道这个,但是主动发送就需要构造target实例,但是构造target实例就需要botid,为开发者免去选择bot不是saa所要做的么

#124 我想的实现是这样,而不是在target上用botid区分target

你可以理解为,脱离了 bot_id 的 openid 是没法唯一确定一个群的。如果遇到相同 openid 但是 bot_id 不同的情况,它们对应的群很有可能是不同的群。

那就直接在BOT_CACHE里存,还加个botid干嘛

Dreamail avatar Nov 26 '23 09:11 Dreamail

从功能上来说: 在使用 OpenID 的场景下,原来 auto_select_bot 的功能肯定是用不了了的——一个 OpenID 只对一个 bot 有效,那么通过这个 OpenID 只能选择这个 bot,其他 bot 都发送不到这个 OpenID。但是,这里想尽可能保证 QQ Platform 的使用和其它 Platform 一致,需要保证新的 OpenID PlatformTarget 既可以序列化反序列化,也可以实现 auto select 的方法(但是退化为只选择那个 Bot) 从语义上来说: OpenID 是和 bot id 强绑定的,脱离了 bot id 的 OpenID 是不完整的。

如果直接存在 BOT_CACHE 里,那么重启就没了,之前获取到的 OpenIDTarget 就找不到这个 OpenID 到底属于哪个 bot 了,自然就发不出去了。而且 OpenID 不是 bot 之外的用户可以获取的,所以单独通过 OpenID 构造 Target 并不是设计目标。我们希望上层开发者把 Target 当作一个可序列化的黑盒,通过 extract_target() 获取,不需要用户构造(特别是 OpenID 这种场景下)

felinae98 avatar Nov 27 '23 11:11 felinae98

那我大概懂了,抽空我把extract_target()完善了(要加个bot参数但是其他adapter并不需要这个参数🤔 是打算全部adapter都实现BotSpecifier还是只有QQ

Dreamail avatar Nov 27 '23 14:11 Dreamail

现在也就QQ适配器 需要这玩意应该

AzideCupric avatar Nov 27 '23 14:11 AzideCupric

现在也就QQ适配器 需要这玩意应该

那我就只给adapter-qq写 look forward to my pr plz

Dreamail avatar Nov 27 '23 15:11 Dreamail

那我大概懂了,抽空我把extract_target()完善了(要加个bot参数但是其他adapter并不需要这个参数🤔 是打算全部adapter都实现BotSpecifier还是只有QQ

这个隔壁 PR 已经做了(指 #121

felinae98 avatar Nov 27 '23 15:11 felinae98

那我大概懂了,抽空我把extract_target()完善了(要加个bot参数但是其他adapter并不需要这个参数🤔 是打算全部adapter都实现BotSpecifier还是只有QQ

这个隔壁 PR 已经做了(指 #121

所以现在adapter-qq到底谁在维护(((( pr这么多越看越乱orz

(其实我pr之前就做好了捏,然后我没理解你们的设计目的然后rebase掉了那个commit

Dreamail avatar Nov 27 '23 21:11 Dreamail

目前是 main <- #105 <- #121,可以在 #121 的基础上做下一步的事情

felinae98 avatar Nov 28 '23 01:11 felinae98

目前是 main <- #105 <- #121,可以在 #121 的基础上做下一步的事情

这么说我pr没打算合了么(

Dreamail avatar Nov 28 '23 04:11 Dreamail

(一样样来)

felinae98 avatar Nov 28 '23 05:11 felinae98