如何让Python编写的Discord Bot每分钟自动编辑自身消息?
实现Discord Bot每分钟自动更新服务器状态消息
原脚本
import os import discord import requests import time import datetime class MyClient(discord.Client): async def on_ready(self): await client.change_presence(activity=discord.Activity(type=0, name='HIDDENSTATUS')) print('Logged on as {0}!'.format(self.user)) async def on_message(self, message): msglower = message.content.lower() channelStatusSV = client.get_channel(HIDDENCHANNELID) if msglower == '!refresh': standard = formated_info('HIDDENIP', '36963', 'ok') messageStandard = await channelStatusSV.fetch_message(HIDDENMESSAGEID) await messageStandard.edit(content=standard) client = MyClient() client.run('HIDDENTOKEN')
需求说明
原脚本仅支持通过!refresh指令手动触发更新游戏服务器状态消息,需要修改为每分钟自动获取服务器信息并更新消息。
修改后的完整代码
import os import discord import requests import time import datetime import asyncio # 新增:用于异步等待,避免阻塞Bot事件循环 class MyClient(discord.Client): async def on_ready(self): await client.change_presence(activity=discord.Activity(type=0, name='HIDDENSTATUS')) print('Logged on as {0}!'.format(self.user)) # Bot上线后立即启动自动更新任务 self.loop.create_task(self.auto_refresh_status()) async def on_message(self, message): msglower = message.content.lower() if msglower == '!refresh': # 调用公共更新方法,保留手动触发功能 await self.update_server_status() async def auto_refresh_status(self): # 无限循环,每分钟执行一次状态更新 while True: await self.update_server_status() await asyncio.sleep(60) # 异步等待60秒,不会阻塞Bot其他操作 async def update_server_status(self): # 抽离公共更新逻辑,同时支持手动和自动触发 channelStatusSV = self.get_channel(HIDDENCHANNELID) standard = formated_info('HIDDENIP', '36963', 'ok') messageStandard = await channelStatusSV.fetch_message(HIDDENMESSAGEID) await messageStandard.edit(content=standard) print(f"[{datetime.datetime.now()}] 服务器状态已自动更新") client = MyClient() client.run('HIDDENTOKEN')
关键修改说明
- 新增
asyncio依赖:必须使用asyncio.sleep()替代time.sleep(),后者会阻塞Discord Bot的事件循环,导致Bot无法响应指令或维持心跳连接。 - 抽离公共更新方法:将原手动更新的逻辑封装到
update_server_status()中,避免代码重复,手动指令和自动任务可共用同一逻辑。 - 启动定时任务:在
on_ready()方法中通过self.loop.create_task()启动异步定时任务,Bot上线后立即开始自动更新流程。 - 循环定时执行:
auto_refresh_status()通过无限循环+异步等待,实现每分钟自动执行一次状态更新。
内容的提问来源于stack exchange,提问作者Márcio Evangelista
相关产品推荐
相关产品推荐

