Discord前缀命令机器人JSON解码错误求助:Expecting value报错
问题分析与解决方法
错误原因
你遇到的Expecting value: line 1 column 1 (char 0) JSON解码错误,本质是请求返回的内容不是有效的JSON格式,常见触发场景:
- 请求被目标API的反爬机制拦截,返回了Cloudflare验证页面、HTML错误页这类非JSON内容
- 未携带必要请求头(比如User-Agent),API拒绝请求并返回错误文本
- 网络波动导致响应为空,没有任何可解析的内容
解决步骤
- 排查实际响应内容:在解析JSON前,打印响应的状态码和原始文本,确认返回的到底是什么
- 添加请求头模拟正常访问:给请求加上浏览器类型的User-Agent,避免被反爬拦截
- 优化重试逻辑:每次失败后添加延迟,防止频繁请求被API封禁
- 校验响应状态码:只有当请求成功(状态码200)时再尝试解析JSON
优化后的代码
import requests import time from discord.ext import commands @bot.command(pass_context=True) async def roulette(ctx: any): roulette = False # 模拟浏览器的请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } while not roulette: try: bloxflip = requests.get('https://api.bloxflip.com/games/roulette', headers=headers) # 打印状态码和响应内容,用于排查问题 print(f"状态码: {bloxflip.status_code}") print(f"响应内容: {bloxflip.text[:500]}") # 只打印前500字符避免刷屏 # 只有状态码200时才解析JSON if bloxflip.status_code == 200: data = bloxflip.json() roulette = True # 这里可以添加后续处理逻辑,比如使用data变量 print("API请求成功") else: print(f"请求失败,状态码: {bloxflip.status_code}") time.sleep(2) # 失败后延迟2秒再重试 except requests.exceptions.JSONDecodeError as e: print(f"JSON解码失败: {e}") time.sleep(2) except requests.exceptions.RequestException as e: print(f"请求异常: {e}") time.sleep(2)
内容的提问来源于stack exchange,提问作者saab
相关产品推荐
相关产品推荐

