You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 02:05:18