如何实现Discord Bot每小时自动发送天气计算结果?
解决Discord Bot自动发送天气计算结果的问题
你的代码目前有几个关键问题,导致无法成功发送消息到Discord:discord.py是事件驱动的库,不能在客户端初始化后直接调用send()方法——此时客户端还未连接到Discord服务器,也没有指定要发送到哪个频道。另外,现在的discord.py版本需要配置intents才能正常运行。
下面是修正后的完整实现方案,包含每小时自动发送天气结果的逻辑:
步骤1:修正基础代码结构
首先,我们需要利用on_ready事件确保客户端准备就绪后再执行操作,同时配置必要的intents:
import discord from discord.ext import tasks import Secret # 假设你的TOKEN存在这里 # 配置intents:至少需要启用消息内容意图,才能发送消息 intents = discord.Intents.default() intents.message_content = True # 初始化客户端,传入intents client = discord.Client(intents=intents) # 你的天气计算函数,这里用示例代替 def calculate_weather(): return "temp is 25°C, sunny" # 定义每小时执行的任务 @tasks.loop(hours=1) async def send_weather_update(): # 替换成你要发送的频道ID(注意是整数) channel = client.get_channel(123456789012345678) if channel: weather_result = calculate_weather() await channel.send(weather_result) print("天气更新已发送") else: print("未找到目标频道,请检查频道ID是否正确") # 客户端就绪后启动定时任务 @client.event async def on_ready(): print(f'已登录为 {client.user}') # 启动定时任务,立即执行一次,之后每小时执行 send_weather_update.start() # 运行客户端 client.run(Secret.BOT_TOKEN)
关键说明:
- Intents配置:从discord.py v2.0开始,必须显式启用
message_content意图才能发送/读取消息。你需要在Discord开发者门户的Bot页面中开启"Message Content Intent"权限。 - 频道ID获取:打开Discord的开发者模式(用户设置→高级→开发者模式),右键点击目标频道,选择"复制ID",替换代码中的
123456789012345678。 - 定时任务:使用
tasks.loop装饰器可以轻松实现每小时执行的逻辑,start()方法会在客户端就绪后启动任务,默认第一次执行会有延迟,如果你想立即执行,可以在on_ready里先手动调用一次await send_weather_update()。 - 异步操作:discord.py的所有IO操作(比如发送消息)都需要用
async/await语法,这是你原代码缺失的重要部分。
调试提示:
如果运行后没有发送消息,先检查:
- Bot是否已经加入了目标服务器,并且拥有发送消息的权限
- 频道ID是否正确(确保是整数,不是字符串)
- Discord开发者门户中是否启用了对应的intents
内容的提问来源于stack exchange,提问作者sapiron
相关产品推荐
相关产品推荐

