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

调用myetherapi的JSON RPC接口遇403错误及JSONDecodeError求助

解决403 Forbidden与JSON解析错误的问题

首先,咱们拆解下你遇到的两个核心问题:

  • 403响应:这说明服务器直接拒绝了你的请求,通常是因为请求不符合服务器的访问规则(比如反爬机制拦截)。
  • JSONDecodeError:因为403返回的内容根本不是JSON格式(大概率是HTML错误提示页面),所以调用res.json()自然会触发解析报错。

结合你说的「时而能运行时而不行」的情况,大概率是这个API的反爬机制在起作用——比如它会临时限制频繁请求的IP,或者验证请求的User-Agent头(你的请求里没加这个,很容易被识别成非浏览器的脚本请求)。

给你几个具体的修改方案:

1. 添加合法的User-Agent头

很多服务器会拒绝没有User-Agent或者看起来像爬虫的请求,咱们给headers加上一个模拟浏览器的标识:

import requests

url = 'https://api.myetherapi.com/eth'
headers = {
    'content-type': 'application/json',
    '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'
}
payload = {
    "jsonrpc": "2.0",
    "method": "eth_getBalance",
    "params": ["0x7cB57B5A97eAbe94205C07890BE4c1aD31E486A8", "latest"],
    "id": 1
}
# 直接用requests的json参数,不用手动dumps,更简洁且不易出错
res = requests.post(url, json=payload, headers=headers)

# 先检查响应状态码再处理,避免直接解析报错
if res.status_code == 200:
    print(res.json())
else:
    print(f"请求失败,状态码:{res.status_code}")
    # 打印响应文本,查看服务器返回的具体错误内容
    print(res.text)

2. 控制请求频率

如果短时间内多次发起请求,服务器可能会临时封禁你的IP,建议在重复请求之间添加间隔:

import time
# 每次请求后等待1秒,避免触发频率限制
time.sleep(1)

3. 排查IP限制问题

你提到关闭电脑后再运行能成功,可能是因为重启后IP发生了变化(如果是动态IP的话),服务器解除了之前的临时限制。如果是固定IP,可能需要确认该API是否有访问白名单或配额限制。

另外,建议你养成先判断响应状态码的习惯,避免直接调用res.json()导致报错,像上面代码里那样,先检查res.status_code == 200再解析JSON,同时打印res.text能帮你快速定位服务器返回的具体问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:03:56