怎么每天记录多个国家的 X(推特)趋势
只用一个接口,每个国家调一次:X 趋势,传 ISO 国家代码。下面的示例把 10 个国家各读一次,共 10 次调用,花费 $0.09;失败的调用不扣费,传了不支持的国家代码也一样。
更新于
要做的事:按国家、按天记下 X 上都在热什么。X 只展示当下的趋势榜,不保留历史,想要历史只能自己存。每天早上跑一个小任务,读 10 个国家的榜单写进数据库,历史就攒起来了。一个月后就能回答这些问题:哪些话题同时在好几个国家上榜,一个话题在某国榜单上待了几天,某个周二日本在热什么。
最后得到一张 SQLite 表:每个国家、每个名次、每一天一行,带趋势名、X 显示的帖子量(有的话)和一个搜索链接。整个过程不需要 X 开发者账号。
分步操作
第一步:读一个国家的榜单
调用X 趋势,country 填两位 ISO 国家代码:US、GB、JP、IN、BR 等。不传 country 就是全球榜。这里用的不是 WOEID(X 官方 API 用的雅虎地点 ID),而是你本来就熟悉的国家代码。
不是每个国家都有榜单。传了不支持的代码会返回 invalid_params,不扣费,返回的 problems 里会列出可用的代码。怎么用 API 获取某个国家的推特趋势里也列了这份清单,大约覆盖二十几个大市场,不提供城市级榜单。
一次调用返回整张榜单,约 30 条趋势,每次 $0.009。没有第二页,page.has_more 为 false。每条趋势有:
rank:榜单名次,1 是第一。name:X 显示的趋势名,可能是话题标签,也可能是一个短语。heat:X 在旁边显示的帖子量;没显示时为 null。url:这个趋势在 X 上的搜索链接。
curl -G "https://api.okdata.online/v1/x/trends/list" \
-H "Authorization: Bearer $OKDATA_API_KEY" \
-d country=JP
第二步:每天跑的任务,顺便存起来
下面的脚本把每个国家读一次,追加写进 x_trends.db。每个请求都带一个由国家和日期拼成的 Idempotency-Key。同一天里 cron 触发了两次,或者任务崩了你又重跑一遍,24 小时内的第二次请求会直接拿回存好的榜单,meta.replayed 为 true,不扣费。同一天的数据永远不会付两次钱。
import datetime
import os
import sqlite3
import requests
API = "https://api.okdata.online/v1/x/trends/list"
KEY = os.environ["OKDATA_API_KEY"]
COUNTRIES = ["US", "GB", "JP", "IN", "BR", "DE", "FR", "ID", "MX", "TR"]
db = sqlite3.connect("x_trends.db")
db.execute("""CREATE TABLE IF NOT EXISTS trends (
day TEXT, country TEXT, rank INTEGER, name TEXT, heat INTEGER, url TEXT, fetched_at TEXT,
PRIMARY KEY (day, country, rank))""")
day = datetime.date.today().isoformat()
for country in COUNTRIES:
headers = {"Authorization": f"Bearer {KEY}", "Idempotency-Key": f"x-trends-{country}-{day}"}
try:
body = requests.get(API, headers=headers, params={"country": country}, timeout=60).json()
except requests.RequestException as err:
print(country, "network error:", err) # 稍后重跑;同一个 key 不会重复扣费
continue
if body["code"] != "ok":
print(country, body["code"], body["message"]) # 失败的调用不扣费
continue
rows = [(day, country, t["rank"], t["name"], t["heat"], t["url"], body["meta"]["fetched_at"])
for t in body["data"]["items"]]
db.executemany("INSERT OR REPLACE INTO trends VALUES (?, ?, ?, ?, ?, ?, ?)", rows)
db.commit()
print(country, len(rows), "trends")
用 cron 定时跑,比如 0 7 * * * 就是每天早上 7 点。10 个国家每天一次,跑 30 天是 300 次调用,$2.70。想抓变化更快的话题,可以每隔几小时跑一次,同时把 key 和 day 这一列改成带小时的格式。
第三步:拿存档回答问题
攒了几天数据之后,用普通 SQL 就能回答有用的问题。比如同一天在 3 个及以上国家上榜的话题:
SELECT day, name, COUNT(DISTINCT country) AS countries, MIN(rank) AS best_rank
FROM trends
GROUP BY day, name
HAVING countries >= 3
ORDER BY day DESC, countries DESC;
某个话题在某国榜单上待了几天:SELECT country, name, COUNT(*) FROM trends GROUP BY country, name ORDER BY 3 DESC。
注意事项
- 榜单只是一个瞬间。 趋势几个小时就会换一批。像脚本里那样把
meta.fetched_at一起存下,才知道每一行对应的是哪个时刻。 - 同一件事,各国叫法不同。 同一个新闻在日本和巴西会用不同的词上榜。跨国比较时,先把趋势名翻译或归一化再分组。
heat经常是 null。 X 只给部分趋势显示帖子量。能稳定横向比较的字段是名次。- 只有公开榜单。 个性化的“为你推荐”趋势拿不到。
- 想知道趋势在说什么。 把趋势名传给X 帖子搜索,
sort=top,读一页($0.002)通常就能看出是哪些帖子带起来的。 - 官方渠道。 X 官方 API 按 WOEID 提供趋势,除了国家,还覆盖城市和地区;它的价格页写明按量计费下每次趋势请求 1 美分。需要城市级榜单,或者本来就有 X 开发者账号,就用官方的。
只查一个国家的问题,见怎么用 API 获取某个国家的推特趋势。趋势加搜索的完整做法在热搜与趋势里。
示例花费
给 10 个国家的 X 趋势榜各拍一次当天快照:US、GB、JP、IN、BR、DE、FR、ID、MX、TR
| 接口 | 调用次数 | 单价 | 小计 |
|---|---|---|---|
| X 趋势 | 10 | $0.009 | $0.09 |
| 合计 | 10 | $0.09 |
按本页生成时的价格计算。失败的调用不扣费。
在你的 AI 里用(MCP)
先接好 MCP 服务,然后直接说你要什么。智能体会自己找到这些接口、看清价格,再用你的余额调用。
可以这样说取 US、GB、JP、IN、BR、DE、FR、ID、MX 和 TR 当前的 X 趋势,整理成一张表:国家、排名、趋势名、X 显示的帖子量(有的话)。再告诉我哪些趋势同时出现在多个国家。
智能体第一次调用 call 工具时发送的内容
{
"endpoint": "x.trends.list",
"params": {},
"idempotency_key": "<新的 UUID>"
}