如何让Discord Bot每次执行命令时重新获取JSON数据?
解决Discord Bot命令执行时重复显示旧JSON数据的问题
嘿,我懂你遇到的这个困扰——这基本是因为你把获取JSON数据的代码放在了Bot的全局初始化环节,也就是Bot接入服务器的时候只执行了一次,之后所有命令调用都在复用那次缓存的旧数据。要搞定这个问题,核心思路就是每次执行命令时重新触发数据获取逻辑。
下面给你具体的实现方案:
1. 把数据获取逻辑封装成独立函数
别再把requests.get()这类获取数据的代码写在全局作用域里了,把它写成一个专门的函数,比如fetch_latest_data(),这样每次需要最新数据时就能直接调用它。
示例代码:
import requests import discord from discord.ext import commands bot = commands.Bot(command_prefix='!', intents=discord.Intents.all()) # 封装数据获取函数,每次调用都会重新请求最新数据 def fetch_latest_data(): try: response = requests.get("你的目标API/JSON数据地址") response.raise_for_status() # 捕获HTTP请求错误(比如404、500) return response.json() except Exception as e: print(f"获取最新数据失败: {e}") return None # 获取失败时返回None,方便后续做容错处理 # 在命令函数里每次调用获取数据的函数 @bot.command(name='status') async def status(ctx): latest_data = fetch_latest_data() if latest_data is None: await ctx.send("抱歉,暂时无法获取最新状态数据") return # 处理并发送最新数据,这里根据你的JSON结构调整字段 await ctx.send(f"当前最新状态: {latest_data['status']}") bot.run("你的Bot Token")
2. 为什么之前的写法会失效?
给你举个反例,如果你之前是这么写的:
# 错误示例:全局初始化时只获取一次数据 old_data = requests.get("你的目标API地址").json() @bot.command(name='status') async def status(ctx): await ctx.send(f"当前状态: {old_data['status']}")
这种情况下old_data只会在Bot启动时被赋值一次,之后不管目标网站的JSON数据怎么更新,old_data都不会变化,自然每次执行命令都显示旧内容。
3. 可选优化:添加缓存机制(按需使用)
如果你的目标API有请求频率限制,或者不想每次命令都发起网络请求,可以加个简单的缓存逻辑——记录上次获取数据的时间,超过设定间隔才重新请求:
import time last_fetch_time = 0 cached_data = None CACHE_DURATION = 60 # 缓存60秒,可根据需求调整 def fetch_latest_data(): global last_fetch_time, cached_data current_time = time.time() # 如果缓存未过期且存在有效数据,直接返回缓存 if current_time - last_fetch_time < CACHE_DURATION and cached_data is not None: return cached_data # 否则重新获取最新数据 try: response = requests.get("你的目标API/JSON数据地址") response.raise_for_status() cached_data = response.json() last_fetch_time = current_time return cached_data except Exception as e: print(f"获取数据失败: {e}") return cached_data # 获取失败时返回旧缓存(如果有的话)
这样既保证了数据不会过于陈旧,又能减少不必要的网络请求。
内容的提问来源于stack exchange,提问作者nori
相关产品推荐
相关产品推荐

