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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:27:16