Discord Bot API命令本地运行正常但部署Heroku后失效如何解决?
Discord Bot汇率命令Heroku部署失败解决方法
1 优先排查依赖配置
这是最常见的问题,Heroku会自动根据项目根目录的requirements.txt安装依赖,你本地环境已经安装了requests库,但如果没写到配置文件里,部署后运行会直接抛出模块不存在错误,命令无法执行。
请确认requirements.txt包含以下内容(版本号可匹配你本地使用的版本):
discord.py>=2.0.0 requests>=2.28.0
修改后重新提交代码部署即可。
2 检查Procfile配置
Discord Bot属于后台worker进程,不需要对外提供web服务,你的Procfile必须配置为worker启动,不能用web进程,否则Heroku会因为进程没监听端口,超时后自动杀掉进程,导致所有命令无响应:
worker: python 你的主程序文件名.py
部署后到Heroku应用后台的资源页,确认worker进程处于开启状态。
3 增加异常捕获定位具体问题
你现有代码没有任何错误处理逻辑,一旦API请求超时、返回异常、JSON结构变动,都会直接崩溃无法看到具体原因,可按如下方式修改代码增加错误日志:
@bot.command() async def doviz(ctx): try: # 增加超时参数避免请求长时间卡住 resp = requests.get('https://api.genelpara.com/embed/doviz.json', timeout=10) # 校验请求状态码是否正常 resp.raise_for_status() results = resp.json() usd_satis = results['USD']['satis'] eur_satis = results['EUR']['satis'] gbp_satis = results['GBP']['satis'] embed = discord.Embed(title="Kur Fiyatları", description="Empty") embed.add_field(name="USD: ", value=f"{usd_satis}") embed.add_field(name="EUR: ", value=f"{eur_satis}") embed.add_field(name="GBP: ", value=f"{gbp_satis}") await ctx.send(embed=embed) except Exception as e: # 错误信息会输出到Heroku日志面板 print(f"汇率查询错误: {str(e)}") await ctx.send(f"查询失败,错误信息:{str(e)}")
修改部署后调用一次命令,到Heroku应用后台的日志页面查看具体报错:
- 若为模块不存在错误:回到第一步补全依赖即可
- 若为网络连接错误:可确认当前使用的汇率API是否屏蔽了Heroku的IP段,更换其他公开汇率API即可
- 若为键值不存在错误:说明API返回的JSON结构发生了调整,对应修改解析逻辑即可
内容的提问来源于stack exchange,提问作者Midoss
相关产品推荐
相关产品推荐

