问答

平台改版或者数据源挂了,社媒数据接口会怎样?

简短回答

靠谱的接口会把故障挡在你的代码之外:有备用数据源就自动切过去;所有数据源都失败时返回一个不扣费的错误;字段保持不变。在 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")

该问服务商的四个问题

  1. 平台改版后,你们一般会停多久?我怎么知道?
  2. 故障期间失败的调用收不收钱?
  3. 我依赖的接口有没有备用数据源?
  4. 换数据源以后,字段名会不会变?

X 帖子搜索、YouTube 视频评论这些接口都遵循同样的规则。哪些错误码扣费、哪些值得重试,完整列表见错误码。

更新于