nonebot2聊天机器人插件4:群聊与戳一戳响应chat 您所在的位置:网站首页 QQ上戳一戳怎么撤回 nonebot2聊天机器人插件4:群聊与戳一戳响应chat

nonebot2聊天机器人插件4:群聊与戳一戳响应chat

2023-08-12 19:17| 来源: 网络整理| 查看: 265

nonebot2聊天机器人插件4:群聊与戳一戳响应chat 1. 插件用途2. 目录结构3. 实现难点与解决方案3.1 随机触发3.2 返回随机信息3.3 禁言用户3.4 json转换3.5 获取用户昵称3.6 异步休眠 4. 代码实现5. 插件配图6. 实际效果7. 下一个插件 该插件涉及知识点:随机触发,返回随机信息,禁言用户,json转换,获取用户昵称,异步休眠 插件合集:nonebot2聊天机器人插件

该系列为用于QQ群聊天机器人的nonebot2相关插件,不保证完全符合标准规范写法,如有差错和改进余地,欢迎大佬指点修正。 前端:nonebot2 后端:go-cqhttp 插件所用语言:python3 前置环境安装过程建议参考零基础2分钟教你搭建QQ机器人——基于nonebot2,但是请注意该教程中的后端版本过旧导致私聊发图异常,需要手动更新go-cqhttp版本。

1. 插件用途

在不使用任意指定命令的情况下,随机对群聊中涉及到的关键词或者针对bot的戳一戳信息进行响应,可以任意自定义触发的逻辑,冷却时间与触发概率,同时,能够在一组配置好的应答中随机选择一个返回。 程序能够配备一个超级用户组,超级用户的发言无视触发概率和冷却时间,必定触发响应的反应,而且对超级用户的响应不会更新冷却时间。 响应可以返回多条信息,并且自定义返回间隔。

2. 目录结构

在plugins文件夹中新建一个文件夹chat,文件夹内目录结构如下:

|-chat |-img |-所有在信息发送中用到的图片 |-__init__.py |-chat.py |-config.py |-response_for_surper_user.py |-response_for_all_time.py |-response_for_common_user.py

其中img为用于存储发送的图片文件的文件夹,chat.py为程序主要代码的位置,config.py用于存储配置项,__init__.py为程序启动位置。 程序首先执行response_for_surper_user.py中针对超级用户的响应,如果没有发现任何可以用于返回的响应,且发言者不是超级用户,再执行response_for_all_time.py中无视cd和触发时间的响应主要是用于禁言那些发送违规信息的用户。 如果这两步都没有返回结果,那么再执行最后的常规响应流程response_for_common_user.py,依次检索代码中所有写好的响应逻辑。

3. 实现难点与解决方案 3.1 随机触发

用于指定触发概率,利用random库生成一个0-99之间的随机数,然后判断大小即可。

from random import randint # 以指定概率p返回True或者False # 用于随机决定是否要回应 # 默认值为配置文件中的默认聊天响应概率 def random_response(p = Config.p_chat_response): return randint(0, 99) } last_notice_response = {} # 初始化时间戳, 初始化为开机时间-cd时间 init_last_response = time() - Config.chat_cd init_last_notice_response = time() - Config.notice_cd for group_id in Config.used_in_group: last_response[group_id] = init_last_response last_notice_response[group_id] = init_last_notice_response # 判断是否过了响应cd的函数,默认使用配置文件中的cd # 如果已经超过了最短响应间隔,返回True def cool_down(group_id, cd = Config.chat_cd): global last_response return time() - last_response[group_id] > cd # 以指定概率p返回True或者False # 用于随机决定是否要回应 # 默认值为配置文件中的默认聊天响应概率 def random_response(p = Config.p_chat_response): return randint(0, 99) } # 初始化 for group_id in Config.used_in_group: poke_ban_list[group_id] = {} # 针对戳一戳 chat_notice = on_notice(priority=Config.priority) @chat_notice.handle() async def handle_first_receive(bot: Bot, event: Event, state: T_State): global last_notice_response global last_notice_nickname global response try: ids = event.get_session_id() except: pass # 如果读取正常没有出错,因为有些notice格式不支持session else: # 如果这是一条群聊信息 if ids.startswith("group"): _, group_id, user_id = event.get_session_id().split("_") # 只对列表中的群使用 if group_id in Config.used_in_group: description = event.get_event_description() values = json.loads(description.replace("'", '"')) # 如果被戳的是机器人 if values['notice_type'] == 'notify' and values['sub_type'] == 'poke' and str( values['target_id']) == Config.bot_id: if user_id in Config.super_uid: await chat_notice.finish("如果是你的话,想戳多少次都可以哦~" + MessageSegment.image(img_path + '坏心思.jpg')) # 如果不在响应cd elif time() - last_notice_response[group_id] >= Config.notice_cd: if randint(0, 99)


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有