问答

怎么用 API 获取某个国家的推特趋势?

简短回答

调用 X 趋势接口,传国家代码即可,比如印度尼西亚传 country=ID,不传就是全球趋势。一次调用返回当前约 30 条趋势,带排名和名称,收费 $0.009;每天抓一次、抓一整年共 $3.285。

雅加达的一个社媒团队想每天早上 8 点在群里看到印尼的 X 趋势,好在中午前跟上热点。X 趋势传 country=ID,就能拿到 X 在这个国家展示的趋势榜:排名、趋势名称、X 显示讨论量时的帖子数,以及一个搜索链接。不用查 WOEID,也不用申请 X 开发者账号。

支持的国家

传两位 ISO 国家代码:US、GB、CA、AU、IN、JP、KR、ID、PH、MY、SG、AE、SA、TR、RU、DE、FR、ES、IT、NL、BR、MX、AR。不传 country 就是全球趋势。传了其他代码会返回 invalid_params,不扣费,报错信息里会列出可用的代码。目前不提供城市级趋势。

定时抓取的费用

频率 调用次数 费用
一个国家,每天一次,一整年 365 $3.285
一个国家,每小时一次,30 天 720 $6.48
五个国家,每天一次,30 天 150 $1.35

每天早上跑的脚本

import csv, datetime, os, requests

API = "https://api.okdata.online/v1"
H = {"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"}

def trends(country):
    body = requests.get(f"{API}/x/trends/list", headers=H, params={"country": country}, timeout=60).json()
    if body["code"] != "ok":
        raise RuntimeError(f"{body['code']}: {body['message']}")
    return body["data"]["items"]

today = datetime.date.today().isoformat()
with open("x-trends.csv", "a", newline="", encoding="utf-8") as f:
    w = csv.writer(f)
    for country in ["ID", "MY", "PH"]:
        for t in trends(country):
            w.writerow([today, country, t["rank"], t["name"], t["heat"], t["url"]])

挂到 cron 上每天跑。时间久了,这个文件就是一份按日期存档的趋势记录,以后可以画图分析;X 自己不会帮你保存这些历史。

弄清一个趋势在讲什么

光看趋势名称经常看不懂。把名称传给 X 帖子搜索,用 sort=top 读第一页($0.006),就能看到是哪些帖子把它带起来的。

注意事项

  • X 没有显示讨论量的趋势,heat 是 null。
  • 趋势榜是某一刻的快照,一个话题可能一小时内就上榜又下榜,记得连同时间一起保存。
  • 这里拿到的是各国公开的趋势榜,个性化的为你推荐趋势拿不到。

官方渠道

X 官方 API 按 WOEID 查询趋势,WOEID 是雅虎的地点编号(印尼是 23424846),按量付费下每次请求 0.010 美元。如果你已经有 X 开发者账号,只看一个国家,这样也挺好。要定时看好几个国家又不想申请开发者账号,直接传国家代码更省事。趋势和搜索怎么组合成一套流程,见趋势研究方案。

更新于