问答
平台改版或者数据源挂了,社媒数据接口会怎样?
简短回答
靠谱的接口会把故障挡在你的代码之外:有备用数据源就自动切过去;所有数据源都失败时返回一个不扣费的错误;字段保持不变。在 okdata 上,上游失败会返回一个不扣费、可以重试的错误,一小时后重试只付正常价格,比如 X 搜索每次 $0.006。
平台一直在变。抖音换请求签名,接口说下线就下线,开源工具一停就要等人来修。付费的数据接口并不能让这些事消失,你买的是有人替你处理。所以问任何一家服务商,关键是:他们处理的这段时间,你这边看到的是什么。
出故障时 okdata 怎么做
- 切换数据源。 每个接口的数据源有固定顺序。有不止一个来源的接口,遇到上游失败、过载或超时,会先切到下一个来源,你这边感觉不到。
- 失败不收费。 所有来源都失败时,返回
upstream_failed(502)或upstream_busy(503),charged: false,retry: "yes"。一次失败的抖音搜索不花钱,重试时照常 $0.02。 - 字段不变。 每个来源都映射到同一套对象上。某个来源填不了的字段为 null,
meta.unavailable会说明原因,你的解析代码不会因此出错。 - 状态可查。
GET https://api.okdata.online/v1/catalog/status不需要 key,会列出暂停的接口;状态页上也能看到。
有一个限制:翻页用的 cursor 属于签发它的那个数据源。如果翻到一半那个来源挂了,下一页也会失败,不扣费;等一会儿重试,或者从第一页重新开始。
能扛过故障的任务
import os, time, requests
H = {"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"}
status = requests.get("https://api.okdata.online/v1/catalog/status", timeout=30).json()["data"]
paused = [e["id"] for e in status["endpoints"] if e["status"] != "available"]
if "x.posts.search" in paused:
raise SystemExit("X 搜索暂停中,稍后再试")
def call(path, **params):
for attempt in range(5):
body = requests.get(f"https://api.okdata.online{path}", headers=H, params=params, timeout=90).json()
if body["code"] == "ok":
return body
if body.get("retry") != "yes": # not_found、invalid_params:不要重试
raise RuntimeError(f"{body['code']}: {body['message']}")
time.sleep(body.get("retry_after_seconds") or 2 ** attempt * 5)
raise RuntimeError("仍然失败,去看状态页")
posts = call("/v1/x/posts/search", query="你的品牌", sort="latest")
该问服务商的四个问题
- 平台改版后,你们一般会停多久?我怎么知道?
- 故障期间失败的调用收不收钱?
- 我依赖的接口有没有备用数据源?
- 换数据源以后,字段名会不会变?
X 帖子搜索、YouTube 视频评论这些接口都遵循同样的规则。哪些错误码扣费、哪些值得重试,完整列表见错误码。
更新于