如何让Discord Bot从短语列表随机选内容发送给指定用户?附故障代码
问题修复方案
原代码存在的问题
- 重复定义
on_message事件,后定义的事件会直接覆盖前一个,导致&hello指令完全失效 - 没有导入
random模块,调用random.choice时会直接抛出模块不存在的错误 - 短语列表仅在匹配到指定用户ID的分支内定义,当触发事件的用户不是目标用户时,
list变量未定义,执行发送逻辑时会报错 - 使用
list作为变量名,会覆盖Python内置的列表类型,属于不规范的命名习惯 - 发送消息的逻辑没有缩进在匹配指定用户ID的分支内,不管是不是目标用户都会尝试发送消息,不符合业务需求
修复后可用代码
import discord import os import random # 新增导入random模块 client = discord.Client() @client.event async def on_ready(): print('We are live as {0.user}'.format(client)) # 合并两个on_message事件,避免覆盖 @client.event async def on_message(message): if message.author == client.user: return # 原&hello指令逻辑 if message.content.startswith('&hello'): await message.channel.send('Hello There') return # 目标用户匹配逻辑 target_user_id = 295365551499247618 if message.author.id == target_user_id: # 避免和内置类型重名,修改变量名为phrase_list phrase_list = ["Oye callate","Quien te pregunto", "A nadie le importa", "Muerete", "Vete pa la pinga","Callate"] # 发送逻辑缩进在分支内,仅匹配到目标用户才发送 await message.channel.send(random.choice(phrase_list)) client.run('TOKEN')
额外注意事项
如果你使用的是discord.py v2.0及以上版本,需要额外添加意图(Intents)配置,开启消息内容读取权限,否则on_message事件无法正常触发。
不要把机器人TOKEN硬编码在代码里,建议通过环境变量读取,避免泄露。
内容的提问来源于stack exchange,提问作者Juan Ramon Mendoza Botello
相关产品推荐
相关产品推荐

