使用discord.py调用API查询Steam游戏价格无响应问题求助
从你遇到的情况和给出的代码片段来看,机器人触发!pricecheck后没反应但控制台无报错,大概率是逻辑不完整或Discord权限配置缺失导致的,下面是几个核心排查和修复方向:
1. 补全API响应处理与消息发送逻辑
你给出的代码只完成了API请求的第一步,但没有处理返回数据,也没有调用Discord的消息发送方法——机器人拿到API结果后,得明确告诉它要把内容发到频道里才行。
给你补全后的示例代码:
import requests from discord import Client, Intents # 关键:现在Discord机器人必须启用消息内容意图才能读取用户消息 intents = Intents.default() intents.message_content = True client = Client(intents=intents) @client.event async def on_message(message): # 避免机器人自己响应自己的消息 if message.author == client.user: return if message.content.startswith('!pricecheck'): game = message.content[11:].strip() # 去掉前后空格,防止空查询 if not game: await message.channel.send("请输入要查询的游戏名称哦!") return # 注意:ISteamApps主要是拿应用列表,查价格需要先转用价格接口(示例用App列表接口演示) try: # 补全你的完整API URL api_url = f"https://api.steampowered.com/ISteamApps/GetAppList/v2/" gres = requests.get(api_url) gres.raise_for_status() # 主动抛出HTTP错误(比如404/500),避免静默失败 data = gres.json() # 这里替换成你解析价格的逻辑,比如先找AppID再查价格 # 示例:假设已经拿到了对应游戏的价格 price_result = f"查询到《{game}》的当前价格:¥99" await message.channel.send(price_result) except requests.exceptions.RequestException as e: await message.channel.send(f"查询失败啦:{str(e)}") print(f"API请求错误日志:{e}") # 控制台打印错误,方便排查 except Exception as e: await message.channel.send("查询时出现未知错误") print(f"未知错误日志:{e}") client.run("你的机器人Token")
2. 启用Discord机器人的「消息内容意图」
从Discord.py v2.0开始,机器人必须明确启用消息内容意图才能读取用户发送的消息内容。如果没开,message.content会是空值,自然触发不了startswith('!pricecheck')的判断:
- 登录Discord开发者平台,找到你的机器人应用
- 进入「Bot」页面,在「Privileged Gateway Intents」下开启「Message Content Intent」
- 代码里必须像示例那样初始化
Intents并设置message_content = True
3. 检查代码缩进与事件监听范围
确保if message.content.startswith(...)这段代码完全缩进在on_message函数内部——如果缩进错误,这段逻辑根本不会被触发。另外,不要忘记排除机器人自身的消息(也就是示例里的if message.author == client.user: return),否则可能出现循环触发的问题。
4. 补充异常捕获,定位静默错误
很多“无响应”都是因为代码里有未捕获的异常(比如API返回的JSON格式不对、网络超时),但因为没加异常处理,错误被静默吞掉了。添加try-except块可以把错误打印到控制台,帮你快速定位问题。
额外提示:Steam价格查询的小细节
Steam的ISteamApps接口主要用来获取应用列表,查实际价格需要先通过游戏名称找到对应的AppID,再调用https://store.steampowered.com/api/appdetails?appids={appid}&cc=cn这类价格接口(cc参数指定地区),你可能需要调整API请求的逻辑来实现完整的价格查询功能。
内容的提问来源于stack exchange,提问作者Jarl2.0

