使用discord.py开发Discord机器人调用Tenor API遇401错误求助
解决Tenor API调用401未授权错误
401错误本质是API服务器拒绝了你的身份验证请求,结合你的代码和Tenor API的使用规则,常见原因和排查步骤如下:
常见原因及排查
1. 环境变量未正确加载API密钥
你的代码用os.getenv("API_KEY")获取密钥,但如果环境变量没配置到位,这个值会是None,直接导致401。
- 排查:在
get_gif函数开头加一行print(key),运行后看控制台输出是否是你的真实API密钥。 - 修复:
- 如果用
.env文件,确保安装了python-dotenv,并且在代码开头调用load_dotenv()加载环境变量; - 直接在服务器/运行环境中手动设置
API_KEY环境变量。
- 如果用
2. API密钥未启用Tenor API权限
在Google Cloud创建密钥后,需要手动启用Tenor API服务,否则密钥无法访问该API:
- 打开Google Cloud控制台,搜索“Tenor API”,确认服务状态为「已启用」;
- 如果是未启用状态,点击「启用」按钮,等待几分钟后重新测试。
3. API密钥设置了不符合当前环境的限制
如果你的密钥配置了IP白名单、HTTP引用限制等,而机器人的运行环境不符合这些限制,会被拒绝访问:
- 进入Google Cloud的「API和服务」→「凭据」页面,找到你的API密钥;
- 查看「密钥限制」部分,暂时移除所有限制(测试用),重新调用API,如果能成功,再根据实际运行环境配置合理的限制。
4. API端点或参数格式问题
虽然你的代码看起来参数格式没问题,但可以确认:
- Tenor API的v1端点
https://g.tenor.com/v1/search是有效的; - 参数
key的拼写正确,没有写成api_key之类的错误名称。
额外代码优化建议
你的gif命令只能接收单个关键词,用户输入多词搜索会失效,可以改成用*args接收所有参数:
@commands.command(name="gif", aliases=["gf"]) async def gif(self, ctx, *args): search_query = " ".join(args) await ctx.send(await self.get_gif(search_query))
内容的提问来源于stack exchange,提问作者Keigratz
相关产品推荐
相关产品推荐

