学习记录技术分享小站

解决Nonebot复读功能无法复读表情包

酷Q倒后,机器人项目迁移到了go-cqhttp,但是复读功能却出现了问题

复读原理

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

@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 函数,到怀疑复读函数,最终才发现,因为每次消息都不一样,根本没进入复读函数

解决Nonebot复读功能无法复读表情包

https://www.yuliu.tech/archives/358/

作者

羽流

发布时间

2020-09-06

许可协议

CC BY-SA 4.0

添加新评论