# 怎么每天记录多个国家的 X（推特）趋势

> 一个每天跑一次的任务：读取 10 个国家的 X（推特）趋势榜，把每次快照存进 SQLite。用到的参数、代码、查询语句，以及要花多少钱。

网页版：https://okdata.online/zh/guides/x-trends-by-country/

只用一个接口，每个国家调一次：X 趋势，传 ISO 国家代码。下面的示例把 10 个国家各读一次，共 10 次调用，花费 $0.09；失败的调用不扣费，传了不支持的国家代码也一样。

更新于 2026-11-12

要做的事：按国家、按天记下 X 上都在热什么。X 只展示当下的趋势榜，不保留历史，想要历史只能自己存。每天早上跑一个小任务，读 10 个国家的榜单写进数据库，历史就攒起来了。一个月后就能回答这些问题：哪些话题同时在好几个国家上榜，一个话题在某国榜单上待了几天，某个周二日本在热什么。

最后得到一张 SQLite 表：每个国家、每个名次、每一天一行，带趋势名、X 显示的帖子量（有的话）和一个搜索链接。整个过程不需要 X 开发者账号。

## 分步操作

### 第一步：读一个国家的榜单

调用[X 趋势](https://okdata.online/zh/apis/x/trends/list/)，`country` 填两位 ISO 国家代码：`US`、`GB`、`JP`、`IN`、`BR` 等。不传 `country` 就是全球榜。这里用的不是 WOEID（X 官方 API 用的雅虎地点 ID），而是你本来就熟悉的国家代码。

不是每个国家都有榜单。传了不支持的代码会返回 `invalid_params`，不扣费，返回的 `problems` 里会列出可用的代码。[怎么用 API 获取某个国家的推特趋势](https://okdata.online/zh/answers/x-trends-by-country-api/)里也列了这份清单，大约覆盖二十几个大市场，不提供城市级榜单。

一次调用返回整张榜单，约 30 条趋势，每次 $0.009。没有第二页，`page.has_more` 为 `false`。每条趋势有：

- `rank`：榜单名次，1 是第一。
- `name`：X 显示的趋势名，可能是话题标签，也可能是一个短语。
- `heat`：X 在旁边显示的帖子量；没显示时为 null。
- `url`：这个趋势在 X 上的搜索链接。

```bash
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`，不扣费。同一天的数据永远不会付两次钱。

```python
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 个及以上国家上榜的话题：

```sql
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 帖子搜索](https://okdata.online/zh/apis/x/posts/search/)，`sort=top`，读一页（$0.002）通常就能看出是哪些帖子带起来的。
- **官方渠道。** X 官方 API [按 WOEID 提供趋势](https://docs.x.com/x-api/trends/trends-by-woeid/introduction)，除了国家，还覆盖城市和地区；它的[价格页](https://docs.x.com/x-api/getting-started/pricing)写明按量计费下每次趋势请求 1 美分。需要城市级榜单，或者本来就有 X 开发者账号，就用官方的。

只查一个国家的问题，见[怎么用 API 获取某个国家的推特趋势](https://okdata.online/zh/answers/x-trends-by-country-api/)。趋势加搜索的完整做法在[热搜与趋势](https://okdata.online/zh/solutions/trend-research/)里。

## 示例花费

给 10 个国家的 X 趋势榜各拍一次当天快照：US、GB、JP、IN、BR、DE、FR、ID、MX、TR

| 接口 | 调用次数 | 单价 | 小计 |
|---|---|---|---|
| [X 趋势](https://okdata.online/zh/apis/x/trends/list/) | 10 | $0.009 | $0.09 |
| 合计 | 10 |  | $0.09 |

按本页生成时的价格计算。失败的调用不扣费。

## 在你的 AI 里用（MCP）

先接好 MCP 服务，然后直接说你要什么。智能体会自己找到这些接口、看清价格，再用你的余额调用。

可以这样说：取 US、GB、JP、IN、BR、DE、FR、ID、MX 和 TR 当前的 X 趋势，整理成一张表：国家、排名、趋势名、X 显示的帖子量（有的话）。再告诉我哪些趋势同时出现在多个国家。

```json
{
  "endpoint": "x.trends.list",
  "params": {},
  "idempotency_key": "<新的 UUID>"
}
```

MCP：`https://api.okdata.online/mcp`

## 本指南用到的接口

- [X 趋势](https://okdata.online/zh/apis/x/trends/list/) `x.trends.list`：$0.009/次 · 每页约 30 条榜单

## 更多X（推特）内容

- [X（推特） API](https://okdata.online/zh/apis/x/)
- [怎么按关键词搜 X（推特）帖子并导出](https://okdata.online/zh/guides/x-search-posts-by-keyword/)
- [不开通 X 官方 API，怎么让 AI 智能体实时搜推特？](https://okdata.online/zh/answers/ai-agent-live-x-search/)
- [有没有能让 Claude 读取 TikTok、YouTube 和 X 数据的 MCP 服务？](https://okdata.online/zh/answers/tiktok-youtube-x-mcp-server/)
- [2026 年 X（推特）API 怎么收费？](https://okdata.online/zh/answers/x-api-pricing-2026/)
- [怎么用 API 获取某个国家的推特趋势？](https://okdata.online/zh/answers/x-trends-by-country-api/)
- [智能体超时后重试工具调用，会不会被重复扣费？](https://okdata.online/zh/answers/agent-retry-charged-twice/)
- [Claude 或 AI 智能体怎么读取 x.com 推文链接的内容？](https://okdata.online/zh/answers/ai-agent-read-tweet-from-link/)
- [平台官方 API 和第三方数据接口怎么选（2026）](https://okdata.online/zh/compare/official-apis-vs-data-apis/)
- [怎么选社交媒体数据 API（2026）](https://okdata.online/zh/compare/social-media-data-apis/)
- [热榜接口](https://okdata.online/zh/roles/trends-list/)
- [X 趋势：今日榜单](https://okdata.online/zh/tools/hot-search/x/)

## 资料来源

- [X API pay-per-usage pricing and credits](https://docs.x.com/x-api/getting-started/pricing) (读取于 2026-11-12)
- [X API: Trends by WOEID](https://docs.x.com/x-api/trends/trends-by-woeid/introduction) (读取于 2026-11-12)
