使用Tkinter调用ChatGPT遇JSONDecodeError及Cloudflare拦截求助
解决调用ChatGPT API时的Cloudflare拦截与JSON解码错误
问题本质
你遇到的json.decoder.JSONDecodeError不是API密钥的问题,而是请求被Cloudflare安全拦截了——API返回的不是预期的JSON数据,而是一段拦截提示的HTML代码,导致JSON解析直接失败。
初学者友好的解决步骤
确认API端点正确
必须使用OpenAI官方的API接口地址,比如调用GPT-3.5/4聊天接口的地址是https://api.openai.com/v1/chat/completions,别用ChatGPT网页版的地址(网页版有严格的反爬验证)。添加浏览器风格的User-Agent请求头
Cloudflare会识别请求的客户端身份,脚本默认的请求头很容易被判定为机器人。在你的请求头里加上一个模拟浏览器的标识,示例代码:headers = { "Authorization": "Bearer 你的API密钥", "Content-Type": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" }检查请求数据格式
确保发送给API的JSON数据符合官方要求,比如聊天接口的正确格式:payload = { "model": "gpt-3.5-turbo", # 注意模型名字别写错 "messages": [{"role": "user", "content": "你要问的问题"}] }格式错误不仅会导致请求失败,也可能触发安全拦截。
控制请求频率
短时间内频繁发送请求会触发限流或拦截,每次请求后可以加1-2秒的延迟:import time # 发送请求后 time.sleep(1)检查网络代理(如果需要)
若你所在地区无法直接访问OpenAI API,要配置正确的代理。用requests库的话,示例代码:proxies = { "http": "http://你的代理地址:端口", "https": "http://你的代理地址:端口" } response = requests.post(API地址, headers=headers, json=payload, proxies=proxies)添加异常捕获,避免程序崩溃
在代码里先检查响应状态码,再解析JSON,提前发现拦截问题:import requests import json response = requests.post(API地址, headers=headers, json=payload) if response.status_code != 200: print(f"请求失败,状态码:{response.status_code}") print("返回内容:", response.text) # 可以直接看到是不是拦截页面 else: try: result = response.json() # 处理返回的聊天内容 print(result["choices"][0]["message"]["content"]) except json.JSONDecodeError: print("解析失败,返回的不是有效JSON数据") print("返回内容:", response.text)
内容的提问来源于stack exchange,提问作者F_Sh
相关产品推荐
相关产品推荐

