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

discord.py开发的Discord机器人仅发送旧推特数据不更新如何解决

问题根因
  • 推特数据拉取代码放在全局作用域,仅在程序启动时执行1次,后续24小时循环发送时读取的都是首次拉取存储的covidnum值,不会主动重新请求推特接口获取新数据
  • 原on_message事件中的while循环逻辑存在缺陷:多次发送$QLD指令会启动多个并行的24小时循环,导致重复推送的问题
  • 原推文检索逻辑未设置兜底值,若首次检索不到含关键词的推文会触发变量未定义的报错
修复后代码
import tweepy
import discord
from asyncio import sleep as s

auth = tweepy.OAuthHandler("twitterCodes", "twitterCodes")
auth.set_access_token("twitterCodes", "twitterCodes")
api = tweepy.API(auth)

# 封装为独立函数,每次调用都会重新拉取最新推文
def get_latest_covid_data():
    anna_covid_tweet = api.user_timeline(screen_name="annastaciaMP", count=3, tweet_mode="extended", include_rts=False)
    for info in anna_covid_tweet:
        if "coronavirus" in info.full_text:
            return info.full_text
    # 找不到符合条件的推文时返回兜底提示
    return "今日暂未查询到最新的昆士兰州新冠疫情数据"

# discord bot配置
client = discord.Client()
bottoken = 'discord bot token'
# 新增任务运行状态标记,防止重复启动循环
TASK_RUNNING = False

@client.event
async def on_ready():
    print('Logged in as {0.user}'.format(client))

@client.event
async def on_message(message):
    global TASK_RUNNING
    # 仅当任务未启动且收到QLD指令时才触发
    if message.content.startswith('$QLD') and not TASK_RUNNING:
        TASK_RUNNING = True
        while True:
            # 每次发送前都重新拉取最新数据
            latest_data = get_latest_covid_data()
            await message.channel.send('These are the QLD covid numbers for today!')
            await message.channel.send(latest_data)
            await s(86400)

client.run(bottoken)
关键修改说明
  • 将推特数据拉取逻辑封装为独立函数,每次推送数据前都会调用该函数重新请求接口,确保拿到的是最新数据
  • 新增TASK_RUNNING全局状态标记,避免多次触发指令启动多个并行推送循环
  • 优化推文检索逻辑,无符合条件的推文时返回兜底提示,避免程序运行报错
  • 调整指令触发判断逻辑,从while改为if,避免不必要的逻辑阻塞

内容的提问来源于stack exchange,提问作者JordanLeo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 07:36:02