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

Discord Bot调用Tenor API报KeyError: 'results'异常问题

故障原因

触发KeyError: 'results'的核心原因是你调用的Tenor v1搜索接口已经停止服务,和discord.py版本、Python依赖无关,所以重装包完全解决不了问题。旧接口下线后不会再返回带results字段的正常搜索响应,你直接读取data['results']自然会报键不存在的错误,这也是功能之前正常、突然失效的原因。

修复步骤

1. 替换为Tenor v2接口

Tenor目前仅支持v2版本的公开API,需要修改get_gif函数的请求地址、参数和返回值解析逻辑,适配新接口的结构:

import requests

def get_gif(searchTerm):
    req_params = {
        "q": searchTerm,
        "key": TenorToken,
        "limit": 1,
        "contentfilter": "medium", # 可选,过滤不适宜内容
        "media_filter": "gif"
    }
    # 替换为v2接口地址
    resp = requests.get("https://g.tenor.com/v2/search", params=req_params, timeout=5)
    resp.raise_for_status() # 接口请求失败时直接抛出HTTP错误
    data = resp.json()
    # v2接口的gif地址存放在media_formats字段下,和v1结构不同
    return data["results"][0]["media_formats"]["gif"]["url"]

如果调用时提示API Key无效,直接去Tenor开发者后台重新生成一个新Key即可,旧的v1 Key有部分不兼容v2接口。

2. 增加异常兜底避免命令崩溃

为了防止个别关键词无搜索结果、接口临时波动导致命令直接报错,给函数加容错逻辑:

def get_gif(searchTerm):
    default_gif = "提前准备好的兜底GIF直链地址" # 比如搜不到结果时默认返回的拥抱图
    try:
        req_params = {
            "q": searchTerm,
            "key": TenorToken,
            "limit": 1,
            "contentfilter": "medium",
            "media_filter": "gif"
        }
        resp = requests.get("https://g.tenor.com/v2/search", params=req_params, timeout=5)
        resp.raise_for_status()
        data = resp.json()
        if data.get("results") and len(data["results"]) > 0:
            return data["results"][0]["media_formats"]["gif"]["url"]
        return default_gif
    except Exception as e:
        print(f"获取GIF失败: {str(e)}")
        return default_gif

3. 可选简化命令逻辑

你现在写的多分支随机选关键词的写法可以简化,不用写一堆if判断:

import random
import discord
from discord.ext import commands

@bot.command(name='umarmen', description="umarmen")
async def umarmen(ctx, *, member):
    keyword_list = [
        "Anime Hug",
        "Anime Hug yuri-yuri",
        "Anime Hugs sweet",
        "Anime Hugs",
        "Anime Hug zero-two",
        "Anime Hug Love"
    ]
    gif_url = get_gif(random.choice(keyword_list))
    embed = discord.Embed(description=f'{ctx.message.author.display_name} Umarmt dich {member}')
    embed.set_image(url=gif_url)
    await ctx.send(embed=embed)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 20:27:24