复读原理

首先复读功能实现原理非常简单,创建这样一个类

@dataclass class Record:
     last_msg: str
     last_user_id: int
     repeat_count: int = 0

每次收到新消息都和last_msg做对比,如果一致,repeat_count增加1,当repeat_count达到一定数量时触发复读。

但是在我用GO-CQHTTP后,表情包无法复读。

问题原因

排查了一下午,最终发现,即使是同一个表情包,但发的人不同,最后的CQ码也不同

  • Person1:

[CQ:image,file=ba2421b1f29116ff7f7e1afbb2927cd3.image,url=http://gchat.qpic.cn/gchatpic_new/2544547198/1013258198-2232641901-BA2421B1F29116FF7F7E1AFBB2927CD3/0?term=2]

  • Person2:

[CQ:image,file=ba2421b1f29116ff7f7e1afbb2927cd3.image,url=http://gchat.qpic.cn/gchatpic_new/835291398/1013258198-3218374199-BA2421B1F29116FF7F7E1AFBB2927CD3/0?term=2]

仔细对比发现,缓存文件file相同,但url的值并不一样。

这就导致了每次收到的即使是同一个表情包,但CQ码都不同,从而repeat_count清零,无法复读。

解决方法

问题找到了,那解决方法也简单,去掉url这部分内容就好了。

# 首先判断是不是图片消息
if "[CQ:image" in session.msg:
    # 查找url所在下标
    index = session.msg.find("url=")
    if index != -1:
        msg = session.msg[:index - 1] + "]"
else:
    msg = session.msg

我的方法可能比较初级(Python菜B),应该有更好的办法可以用。

这个问题很坑爹了,我找了一个下午,从怀疑 IntentCommand 函数,到怀疑复读函数,最终才发现,因为每次消息都不一样,根本没进入复读函数。