discord.py运行报错Message对象无法被解释为整数问题求助
问题修复说明
错误原因
- 你在
create命令内部嵌套定义了多个on_message事件,discord.py的on_message是全局事件监听器,后定义的会直接覆盖之前的声明,完全不符合多步收集用户输入的使用场景。 on_message事件的入参永远是Message类型对象,你给参数加的time:int类型标注没有实际转换效果,程序拿到的仍然是完整的消息实例,你直接把该对象传入range()方法,就触发了TypeError: 'Message' object cannot be interpreted as an integer报错。- 你的测试代码直接传入整数给
range,当然可以正常运行,但实际场景没有提取用户输入的文本内容转成整数,自然报错。
正确实现方案
使用discord.py内置的wait_for方法等待特定用户的回复,不会污染全局事件,代码如下:
import os from dotenv import load_dotenv from discord.ext import commands TOKEN = 'my token here' client = commands.Bot(command_prefix="'", description='Hey, I\'m MyBot') @client.event async def on_ready(): print('We have logged in as {0.user}'.format(client)) @client.command() async def create(ctx): if ctx.author == client.user: return # 询问事件名称 await ctx.send('What is the name for your event: ') # 等待当前触发命令的用户回复,超时时间设为30秒可以按需调整 name_msg = await client.wait_for('message', check=lambda m: m.author == ctx.author and m.channel == ctx.channel, timeout=30) event_name = name_msg.content # 询问提醒时间 await ctx.send('When you want to be reminded (input number): ') time_msg = await client.wait_for('message', check=lambda m: m.author == ctx.author and m.channel == ctx.channel, timeout=30) # 提取消息内容转成整数,加异常处理避免用户输入非数字的情况 try: remind_time = int(time_msg.content) except ValueError: await ctx.send("Please input a valid number") return # 你的循环逻辑 for x in range(remind_time): await ctx.send(x) await ctx.send(f"Event {event_name} created successfully") @client.event async def on_message(message): await client.process_commands(message) username = str(message.author).split('#')[0] user_message = str(message.content) channel = str(message.channel.name) print(f'{username}:{user_message} ({channel})') if message.author == client.user: return client.run(TOKEN)
补充说明
- 代码中加了30秒超时限制,你可以按需调整,也可以加异常处理捕获超时情况。
- 新增了用户输入非数字的异常处理,避免程序异常退出。
内容的提问来源于stack exchange,提问作者bajel21
相关产品推荐
相关产品推荐

