Well2333 / nonebot-plugin-bilichat

一个通过 OpenAI 来对b站视频进行总结的多功能 B站解析插件
GNU Affero General Public License v3.0
240 stars 12 forks source link

Bug: 关于人机模式的一个问题 #256

Closed STESmly closed 1 month ago

STESmly commented 1 month ago

操作系统

Windows

Python 版本

3.9.10

NoneBot 版本

2.3.3

Bilichat 版本

描述问题

就是我看佬的插件里面有人机合一的代码,于是我就试着自己改了一下,加了个关于私聊的伪造代码如下 @register_event class PrivateMessageSentEvent(PrivateMessageEvent): """私聊消息里自己发送的消息"""

post_type: Literal["message_sent"]
message_type: Literal["private"]

@overrides(Event)
def get_type(self) -> str:
    """伪装成message类型。"""
    return "message"

但我在加了之后发现,不管bot对任何人私聊,event里面得到的userid和selfid都是bot的自身的id 所以在默认send的时候都只会send到bot自己对自己的私聊里面 只能使用await bot.send_private_msg(user_id=event.target_id,message=messgae)去发送到对象私聊窗口里面 所以怎么改才让触发人机合一时,默认的xx.send也能发送到正确的私聊窗口里面

插件的配置项

截图或日志

Well2333 commented 1 month ago
  1. bilichat最新版仅支持Python 3.10+,如果项目出现任何问题,3.9.10 将不会收到任何推送更新。
  2. 请提供详细的日志,至少为debug等级,包括收到消息后至发送响应后的全部内容,您可以使用 Matcha 以避免真实聊天信息泄露。
STESmly commented 1 month ago
  1. bilichat最新版仅支持Python 3.10+,如果项目出现任何问题,3.9.10 将不会收到任何推送更新。
  2. 请提供详细的日志,至少为debug等级,包括收到消息后至发送响应后的全部内容,您可以使用 Matcha 以避免真实聊天信息泄露。

1.我并未pip bilichat插件,仅download了v11_selfmsg_hook.py

STESmly commented 1 month ago
  1. bilichat最新版仅支持Python 3.10+,如果项目出现任何问题,3.9.10 将不会收到任何推送更新。
  2. 请提供详细的日志,至少为debug等级,包括收到消息后至发送响应后的全部内容,您可以使用 Matcha 以避免真实聊天信息泄露。

2.这是(在robot to robot的私聊)日志10-02

23:56:46 [SUCCESS] nonebot | OneBot V11 3791398858 | [message_sent.private.friend]: Message 1761522775 from 3791398858 '测试'
10-02 23:56:46 [DEBUG] nonebot | Checking for matchers in priority 1...
10-02 23:56:46 [INFO] nonebot | Event will be handled by Matcher(type='message', module=src.plugins.词库的执行示例, lineno=246)
10-02 23:56:46 [DEBUG] nonebot | Running Matcher(type='message', module=src.plugins.词库的执行示例, lineno=246)
10-02 23:56:46 [DEBUG] nonebot | Running handler Dependent(call=_)
10-02 23:56:46 [INFO] nonebot | Matcher(type='message', module=src.plugins.词库的执行示例, lineno=246) running complete
10-02 23:56:46 [INFO] nonebot | Event will be handled by Matcher(type='message', module=src.plugins.测试, lineno=75)
10-02 23:56:46 [DEBUG] nonebot | Running Matcher(type='message', module=src.plugins.测试, lineno=75)
10-02 23:56:46 [DEBUG] nonebot | Running handler Dependent(call=_)
10-02 23:56:46 [DEBUG] nonebot | OneBot V11 | Calling API send_msg
10-02 23:56:46 [INFO] nonebot | Matcher(type='message', module=src.plugins.测试, lineno=75) running complete
10-02 23:56:46 [DEBUG] nonebot | Stop event propagation
10-02 23:56:46 [DEBUG] nonebot | Checking for matchers completed
10-02 23:56:46 [SUCCESS] nonebot | OneBot V11 3791398858 | [message_sent.private.friend]: Message 1743277620 from 3791398858 '37913988583791398858'
10-02 23:56:46 [DEBUG] nonebot | Checking for matchers in priority 1...
10-02 23:56:46 [INFO] nonebot | Event will be handled by Matcher(type='message', module=src.plugins.词库的执行示例, lineno=246)
10-02 23:56:46 [DEBUG] nonebot | Running Matcher(type='message', module=src.plugins.词库的执行示例, lineno=246)
10-02 23:56:46 [DEBUG] nonebot | Running handler Dependent(call=_)
10-02 23:56:46 [INFO] nonebot | Matcher(type='message', module=src.plugins.词库的执行示例, lineno=246) running complete
10-02 23:56:46 [DEBUG] nonebot | Stop event propagation
10-02 23:56:46 [DEBUG] nonebot | Checking for matchers completed
STESmly commented 1 month ago
  1. bilichat最新版仅支持Python 3.10+,如果项目出现任何问题,3.9.10 将不会收到任何推送更新。
  2. 请提供详细的日志,至少为debug等级,包括收到消息后至发送响应后的全部内容,您可以使用 Matcha 以避免真实聊天信息泄露。

这是robot to user的私聊10-02 23:57:25

 [SUCCESS] nonebot | OneBot V11 3791398858 | [message_sent.private.friend]: Message 1682246714 from 3791398858 '测试'
10-02 23:57:25 [DEBUG] nonebot | Checking for matchers in priority 1...
10-02 23:57:25 [INFO] nonebot | Event will be handled by Matcher(type='message', module=src.plugins.词库的执行示例, lineno=246)
10-02 23:57:25 [DEBUG] nonebot | Running Matcher(type='message', module=src.plugins.词库的执行示例, lineno=246)
10-02 23:57:25 [DEBUG] nonebot | Running handler Dependent(call=_)
10-02 23:57:25 [INFO] nonebot | Matcher(type='message', module=src.plugins.词库的执行示例, lineno=246) running complete
10-02 23:57:25 [INFO] nonebot | Event will be handled by Matcher(type='message', module=src.plugins.测试, lineno=75)
10-02 23:57:25 [DEBUG] nonebot | Running Matcher(type='message', module=src.plugins.测试, lineno=75)
10-02 23:57:25 [DEBUG] nonebot | Running handler Dependent(call=_)
10-02 23:57:25 [DEBUG] nonebot | OneBot V11 | Calling API send_msg
10-02 23:57:25 [INFO] nonebot | Matcher(type='message', module=src.plugins.测试, lineno=75) running complete
10-02 23:57:25 [DEBUG] nonebot | Stop event propagation
10-02 23:57:25 [DEBUG] nonebot | Checking for matchers completed
10-02 23:57:25 [SUCCESS] nonebot | OneBot V11 3791398858 | [message_sent.private.friend]: Message 455524326 from 3791398858 '37913988583791398858'
10-02 23:57:25 [DEBUG] nonebot | Checking for matchers in priority 1...
10-02 23:57:25 [INFO] nonebot | Event will be handled by Matcher(type='message', module=src.plugins.词库的执行示例, lineno=246)
10-02 23:57:25 [DEBUG] nonebot | Running Matcher(type='message', module=src.plugins.词库的执行示例, lineno=246)
10-02 23:57:25 [DEBUG] nonebot | Running handler Dependent(call=_)
10-02 23:57:25 [INFO] nonebot | Matcher(type='message', module=src.plugins.词库的执行示例, lineno=246) running complete
10-02 23:57:25 [DEBUG] nonebot | Stop event propagation
10-02 23:57:25 [DEBUG] nonebot | Checking for matchers completed
STESmly commented 1 month ago
  1. bilichat最新版仅支持Python 3.10+,如果项目出现任何问题,3.9.10 将不会收到任何推送更新。
  2. 请提供详细的日志,至少为debug等级,包括收到消息后至发送响应后的全部内容,您可以使用 Matcha 以避免真实聊天信息泄露。

这是robot to user的私聊10-02 23:57:25 [SUCCESS] nonebot | OneBot V11 3791398858 | [messagesent.private.friend]: Message 1682246714 from 3791398858 '测试' 10-02 23:57:25 [DEBUG] nonebot | Checking for matchers in priority 1... 10-02 23:57:25 [INFO] nonebot | Event will be handled by Matcher(type='message', module=src.plugins.词库的执行示例, lineno=246) 10-02 23:57:25 [DEBUG] nonebot | Running Matcher(type='message', module=src.plugins.词库的执行示例, lineno=246) 10-02 23:57:25 [DEBUG] nonebot | Running handler Dependent(call=) 10-02 23:57:25 [INFO] nonebot | Matcher(type='message', module=src.plugins.词库的执行示例, lineno=246) running complete 10-02 23:57:25 [INFO] nonebot | Event will be handled by Matcher(type='message', module=src.plugins.测试, lineno=75) 10-02 23:57:25 [DEBUG] nonebot | Running Matcher(type='message', module=src.plugins.测试, lineno=75) 10-02 23:57:25 [DEBUG] nonebot | Running handler Dependent(call=_) 10-02 23:57:25 [DEBUG] nonebot | OneBot V11 | Calling API send_msg 10-02 23:57:25 [INFO] nonebot | Matcher(type='message', module=src.plugins.测试, lineno=75) running complete 10-02 23:57:25 [DEBUG] nonebot | Stop event propagation 10-02 23:57:25 [DEBUG] nonebot | Checking for matchers completed 10-02 23:57:25 [SUCCESS] nonebot | OneBot V11 3791398858 | [messagesent.private.friend]: Message 455524326 from 3791398858 '37913988583791398858' 10-02 23:57:25 [DEBUG] nonebot | Checking for matchers in priority 1... 10-02 23:57:25 [INFO] nonebot | Event will be handled by Matcher(type='message', module=src.plugins.词库的执行示例, lineno=246) 10-02 23:57:25 [DEBUG] nonebot | Running Matcher(type='message', module=src.plugins.词库的执行示例, lineno=246) 10-02 23:57:25 [DEBUG] nonebot | Running handler Dependent(call=) 10-02 23:57:25 [INFO] nonebot | Matcher(type='message', module=src.plugins.词库的执行示例, lineno=246) running complete 10-02 23:57:25 [DEBUG] nonebot | Stop event propagation 10-02 23:57:25 [DEBUG] nonebot | Checking for matchers completed

都是使用的默认发送消息的的xx.send,而非使用await bot.send_private_msg(user_id=event.target_id,message=messgae) 现象为,不管发送的私聊对象是谁,xx.send只会send消息到bot对自己的私聊里面

STESmly commented 1 month ago

很抱歉提的issue是bug,因为毕竟是我自己加的私聊人机合一的代码(虽然是根据套模版的)(doge)

Well2333 commented 1 month ago

个人认为可能是hook的字段中关于target的字段出现问题了,这可能与你所使用的bot客户端有关。 如果可以修改插件源代码,可以尝试在event中定位正确的字段名,并覆盖到hook模型的target上。 关于如何覆盖,可以参考Python内置功能 property 或 pydantic 校验器 validator 进行对某一类属性的逻辑化修改(而不是返回固定值)。

STESmly commented 1 month ago

个人认为可能是hook的字段中关于target的字段出现问题了,这可能与你所使用的bot客户端有关。 如果可以修改插件源代码,可以尝试在event中定位正确的字段名,并覆盖到hook模型的target上。

那我还是做userid==selfid判断用await bot.send_private_msg(user_id=event.target_id,message=messgae)吧(),谢谢了