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

