You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用JSON接口遇HTTP Error 403,求解决写入Google Sheet问题

解决API请求403 Forbidden并写入Google Sheet的方案

问题根源

目标API服务器拦截了urllib.request.urlopen的默认请求——因为它的请求头缺少User-Agent标识,被判定为非合法客户端请求。而你之前用requests库能成功,是因为requests会自动添加默认的User-Agent,通过了服务器验证。

解决方案

方案1:给urllib请求添加User-Agent头

修改请求代码,手动添加模拟浏览器的请求头,让服务器识别为合法请求:

import json
from urllib.request import urlopen, Request
import gspread

gc = gspread.service_account(filename='creds.json')
sh = gc.open_by_key('1-1aiGMn2yUWRlh_jnIebcMNs-6phzUNxkktAFH7uY9o')
worksheet = sh.sheet1

url = 'https://api.chucknorris.io/jokes/random'

# 构造带User-Agent的请求
req = Request(
    url,
    headers={'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'}
)

response = urlopen(req)
data_json = json.loads(response.read())

result = []
for key in data_json:
    result.append([key, data_json[key] if not isinstance(
        data_json[key], list) else ",".join(map(str, data_json[key]))])
worksheet.update('a1', result)

方案2:改用requests库(更简洁)

既然已经验证requests能正常访问API,直接复用该库的逻辑,代码更简洁易维护:

import json
import requests
import gspread

gc = gspread.service_account(filename='creds.json')
sh = gc.open_by_key('1-1aiGMn2yUWRlh_jnIebcMNs-6phzUNxkktAFH7uY9o')
worksheet = sh.sheet1

url = 'https://api.chucknorris.io/jokes/random'

# 使用requests请求API,自动处理请求头
req = requests.get(url, verify=False)
data_json = req.json()  # 直接解析JSON响应,无需手动load

result = []
for key in data_json:
    result.append([key, data_json[key] if not isinstance(
        data_json[key], list) else ",".join(map(str, data_json[key]))])
worksheet.update('a1', result)

说明

  • 两种方案都能解决403问题,方案2更推荐,因为requests库的API更友好,后续扩展也更方便。
  • 如果API服务器要求严格,可能需要调整User-Agent的值,你可以从浏览器的请求头中复制真实的User-Agent字符串替换。

内容的提问来源于stack exchange,提问作者Anthony Madle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 06:40:18