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
相关产品推荐
相关产品推荐

