跳到正文

Twitter 位置 API:按国家统计粉丝分布

要查看某个 Twitter 账号的粉丝来自哪里,先列出它的粉丝,再查询 X 为每个粉丝标注的国家:随机抽取 1,000 个粉丝,每个国家的占比误差就能控制在约 3 个百分点以内。

  • 更新于
  • 发布于
  • 阅读约 10 分钟

简短回答: 自 2025 年 11 月起,X 在公开资料页上以 “Account based in”(账号所在地)显示这个国家,依据的是账号的 IP 地址推断;简介里的所在地是 X 从不核实的自由文本。用 Sorsa API,先翻页读取 GET /followers,再对抽样的每个粉丝调用 GET /about,每 1,000 个账号 $1.40 起。100 次免费请求无需绑卡。

接口
GET /about
每页条数
每次请求 1 个账号
价格
每 1,000 个账号 $1.40 起

#如何查看某个 Twitter 账号的粉丝来自哪里

X 不会为别人的账号绘制粉丝地图,它自己的数据分析随 X Premium 提供,而且只覆盖订阅者自己的受众。X 在公开资料页上确实会显示的,是它为每个账号标注的国家,免费的推特账号所在地查询工具就是读取单个账号的这个信息。对一批受众重复这个过程,就得到了它的地理分布,数据来自 X 保存的两项公开信息:

  1. 粉丝列表。 任何公开账号的粉丝都可以逐页读取,最新的排在最前。

  2. 每个粉丝的国家。 自 2025 年 11 月起,公开资料页多了一个 About this account 面板,从加入日期处打开,里面有一行 “Account based in”。X 根据账号汇总的 IP 地址填写这一行,这是X 帮助中心的说法(在新标签页打开),而不是账号主人自己填的内容。

在所有粉丝中统计这些国家,得到的占比就是这批受众的地理分布,不论是你自己的账号还是别人的,都能整理成可以导出、可以对比的表格。这个标签是什么意思、什么时候会出错,请阅读 X 上的 “Account based in” 是什么意思。

简介里的所在地是个陷阱。它是可选的自由文本,X 自己的开发者数据字典(在新标签页打开)就警告说它 “may not indicate a valid location”(可能并不代表有效的地点)。用它做出的地图,会丢掉所有留空或写了 “Earth” 的人,再按剩下的人愿意填的内容来统计。

#用 Sorsa API 分六步按国家绘制粉丝分布

Sorsa API 是一款 Twitter(X)API 与爬虫,两项信息都能返回:GET /followers(在新标签页打开) 列出任何公开账号的粉丝,每次请求 200 个;GET /about(在新标签页打开) 每次请求返回 X 为一个账号标注的国家。要按国家统计一批受众,可以用 Sorsa API:一个 API 密钥,不需要 X 开发者账号,每个粉丝的国家每 1,000 个账号 $1.40 起。

一个 100 万粉丝的账号,检查 1,000 个粉丝,每 1,000 次请求 $1.40 1 列出粉丝 GET /followers 每次请求 200 个 $7.00 每个粉丝 ID 2 抽取样本 1,000 个随机 ID 从完整列表中 $0 在你的代码里运行 3 查询国家 GET /about 每次请求 1 个账号 $1.40 1,000 次查询 4 统计占比 每个国家, 误差在 ±3.1 个百分点内 $8.40 总计
四个阶段把粉丝列表变成各国占比。列出粉丝很便宜,每次请求 200 个;真正要估算规模的是国家查询。
  1. 获取密钥。 注册后,在控制台复制你的 API 密钥。新账号送 100 次免费请求,无需绑卡。

  2. 先查一个账号。 把用户名发送给 GET /about。country 字段里保存的就是 “Account based in” 的值。

    Terminal
    curl -G "https://api.sorsa.io/v3/about" \
      -H "ApiKey: YOUR_API_KEY" \
      --data-urlencode "username=lisbon_tile_workshop"
    
    Response200 OK
    {
      "country": "Portugal",
      "source": "Portugal App Store",
      "username_change_count": 1,
      "last_username_change_at": "2019-05-14T09:12:40Z",
      "is_blue_verified": true,
      "premium_start_at": "2024-01-08T17:03:11Z",
      "affiliate_username": null
    }
    
  3. 列出粉丝。 对 GET /followers 翻页,每次把 next_cursor 传回去,直到不再返回。保存每个粉丝的 id:一个 100 万粉丝的账号需要 5,000 次请求。

  4. 随机抽样。 从整份列表中随机挑选 1,000 个 ID,而不是取前几页,因为前几页只有最新的粉丝。

  5. 查询每个国家。 对每个抽中的粉丝,用 user_id 调用 GET /about,速度最高可达每秒 20 次请求。

  6. 统计占比。 按国家对结果分组,把 “Unknown” 和地区名称各自保留为单独的行,再用每个计数除以样本量。

下面的脚本会完整执行这六步,并打印每个国家的占比及其误差范围。返回 429 状态表示一秒内超过了 20 次请求,所以脚本会等待并重试;返回 403 表示密钥缺失或请求额度已用完。

import random
import time
from collections import Counter
from math import sqrt

import requests

API = "https://api.sorsa.io/v3"
HEADERS = {"ApiKey": "YOUR_API_KEY"}


def follower_ids(username):
    """Every follower's ID, 200 per request, newest first."""
    ids, params = [], {"username": username}
    while True:
        r = requests.get(f"{API}/followers", headers=HEADERS, params=params)
        r.raise_for_status()
        page = r.json()
        ids += [u["id"] for u in page.get("users", [])]
        cursor = page.get("next_cursor")
        if not cursor:
            return ids
        params["next_cursor"] = cursor


def country(user_id):
    """The country X assigns to one account, or Unknown."""
    r = requests.get(f"{API}/about", headers=HEADERS,
                     params={"user_id": user_id})
    if r.status_code == 429:  # over 20 requests in a second
        time.sleep(1)
        return country(user_id)
    if not r.ok:
        return "Unknown"
    return r.json().get("country") or "Unknown"


def geography(username, sample_size=1000):
    ids = follower_ids(username)
    sample = random.sample(ids, min(sample_size, len(ids)))
    counts = Counter()
    for user_id in sample:
        counts[country(user_id)] += 1
        time.sleep(0.05)  # one lookup at a time stays under 20 per second
    n = len(sample)
    for name, k in counts.most_common(15):
        p = k / n
        margin = 1.96 * sqrt(p * (1 - p) / n)
        print(f"{name:<24} {p:6.1%}  +/- {margin:.1%}")


geography("lisbon_tile_workshop")

如果你手上已经有一份名单,比如导出的 Twitter 粉丝,或客户账号名的 CSV,可以跳过第 3 步,直接把这些 ID 或用户名发送给 GET /about。

#X 在账号上保存位置的三个地方

一个 X 账号可以带有三种位置信息,其中只有一种来自 X 本身:“Account based in” 的国家。统计受众地理分布时就该用这一种,因为它是唯一由 X 设置的,也是唯一每个账号只有一个答案的。

只有 “Account based in” 来自 X。简介所在地和帖子地点,都是其主人想添加什么就是什么。

下表说明了每个信号由谁设置,以及 API 在哪里读取。

信号由谁设置内容API 在哪里读取
Account based inX,依据汇总的 IP 地址一个国家,或账号主人选择显示的一个地区Sorsa API 的 GET /about 返回的 country;官方 X API 中没有
简介所在地账号主人,自由文本一座城市、一句玩笑,或者什么也没有两个 API 中每份用户资料上的 location
帖子上的地点作者,逐条帖子设置一个有名称的区域或场所只出现在作者标注了地点的帖子上
  • Account based in

    由谁设置
    X,依据汇总的 IP 地址
    内容
    一个国家,或账号主人选择显示的一个地区
    API 在哪里读取
    Sorsa API 的 GET /about 返回的 country;官方 X API 中没有
  • 简介所在地

    由谁设置
    账号主人,自由文本
    内容
    一座城市、一句玩笑,或者什么也没有
    API 在哪里读取
    两个 API 中每份用户资料上的 location
  • 帖子上的地点

    由谁设置
    作者,逐条帖子设置
    内容
    一个有名称的区域或场所
    API 在哪里读取
    只出现在作者标注了地点的帖子上

官方 X API 对账号只提供简介所在地:它的用户对象里有手工输入的 location,没有国家字段。在那里读取粉丝,按 X 的按量付费价目表(在新标签页打开)每个 $0.010,所以 100 万粉丝的列表要 $10,000,得到的仍然是自由文本。

帖子上的地点回答的是另一个问题:某条内容是在哪里发的,而不是账号设在哪里。只有作者在应用里打开位置功能并添加地点之后,帖子才会带上它,X 帮助中心有说明(在新标签页打开),所以多数帖子没有地点。要查找来自某座城市的帖子,可以使用 Twitter 搜索运算符指南里的 near: 和 within: 运算符。

#需要检查多少个粉丝

随机抽取 1,000 个粉丝,每个国家的占比在 95% 的把握下误差约在 3.1 个百分点以内,不论账号有 5 万还是 5000 万粉丝。误差取决于你检查了多少个粉丝,而不是账号有多少粉丝,这就是对大账号来说抽样优于全量普查的原因。

某国家占比在 95% 置信度下的误差,按检查的粉丝数 400 个粉丝 ±4.9 个百分点 1,000 个粉丝 ±3.1 个百分点 2,000 个粉丝 ±2.2 个百分点 5,000 个粉丝 ±1.4 个百分点 1 万个粉丝 ±1.0 个百分点
检查 1,000 个粉丝而不是 400 个,误差从 4.9 降到 3.1 个百分点。超过 5,000 个之后,每多检查一个粉丝,收益都很小。

下面的误差范围针对简单随机抽样,置信度为 95%。占受众约一半的国家误差范围最宽;较小的国家反而能估得更准。

检查的粉丝数50% 占比的误差10% 占比的误差
400±4.9 个百分点±2.9 个百分点
1,000±3.1 个百分点±1.9 个百分点
2,000±2.2 个百分点±1.3 个百分点
5,000±1.4 个百分点±0.8 个百分点
全部粉丝无无
  • 400

    50% 占比的误差
    ±4.9 个百分点
    10% 占比的误差
    ±2.9 个百分点
  • 1,000

    50% 占比的误差
    ±3.1 个百分点
    10% 占比的误差
    ±1.9 个百分点
  • 2,000

    50% 占比的误差
    ±2.2 个百分点
    10% 占比的误差
    ±1.3 个百分点
  • 5,000

    50% 占比的误差
    ±1.4 个百分点
    10% 占比的误差
    ±0.8 个百分点
  • 全部粉丝

    50% 占比的误差
    无
    10% 占比的误差
    无

有两条规则能保证样本可靠。要从整份粉丝列表中抽取,因为前几页只有最新的粉丝。样本量要和问题匹配:1,000 个足以分辨 30% 的市场和 20% 的市场,而要分辨 6% 的国家和 4% 的国家,则需要约 5,000 个。

须知

最新的粉丝反映的是近期增长,而不是整体受众。这个差异本身就有用:把最新 1,000 个粉丝的国家,与整份列表中随机抽取的 1,000 个对比,一旦某个意料之外的国家突然冒出一大块,立刻就能看出来。这样的突增常常是买来粉丝的迹象,推特机器人检测有深入讲解。

#按国家统计一批受众要花多少钱

在 Sorsa API 上,用 1,000 个粉丝的样本统计一个 100 万粉丝的受众,成本是 $8.40 起:列出所有粉丝 $7.00,1,000 个国家查询 $1.40。如果改为检查每个粉丝,则要 $1,407 起。官方 X API 光是粉丝列表就收 $10,000,而且它的数据里没有可统计的国家。

账号的粉丝数
要检查的粉丝数
$10,000
官方 X API
仅粉丝列表就按每位粉丝 $0.010 计费。其数据没有国家字段,只有用户手写的简介所在地。
低至 $8.40
Sorsa API
已列出每位粉丝,然后从 X 的“账号所在地区”读取 1,000 个国家。各国占比误差在 ±3.1 个百分点内。

这 1,000 次国家查询需要约 50 秒(每秒 20 次请求)。价格按每 1,000 次请求 $1.40 计算。

选择受众规模和要检查的粉丝数。误差按占受众一半的国家计算。

对大账号来说,样本的花费与列出粉丝相比几乎可以忽略,而列出粉丝的花费与全量普查相比又几乎可以忽略。下面 Sorsa API 的价格用的是它的最低费率,每 1,000 次请求 $1.40。

粉丝数Sorsa API,检查 1,000 个Sorsa API,检查每个粉丝官方 X API,仅列出粉丝
1 万$1.47 起$14.07 起$100
10 万$2.10 起$140.70 起$1,000
100 万$8.40 起$1,407 起$10,000
1000 万$71.40 起$14,070 起$100,000
  • 1 万

    Sorsa API,检查 1,000 个
    $1.47 起
    Sorsa API,检查每个粉丝
    $14.07 起
    官方 X API,仅列出粉丝
    $100
  • 10 万

    Sorsa API,检查 1,000 个
    $2.10 起
    Sorsa API,检查每个粉丝
    $140.70 起
    官方 X API,仅列出粉丝
    $1,000
  • 100 万

    Sorsa API,检查 1,000 个
    $8.40 起
    Sorsa API,检查每个粉丝
    $1,407 起
    官方 X API,仅列出粉丝
    $10,000
  • 1000 万

    Sorsa API,检查 1,000 个
    $71.40 起
    Sorsa API,检查每个粉丝
    $14,070 起
    官方 X API,仅列出粉丝
    $100,000

时间也是同样的分法。所有 Sorsa API 套餐都是每秒 20 次请求,1,000 次国家查询不到一分钟就能完成,而检查一个大账号的全部 100 万粉丝,按这个速率在一个密钥上要约 14 小时。在 Starter 套餐每 1,000 次请求 $4.90 的价格下,100 万粉丝的样本要 $29.40。

#如何解读结果

国家表的质量,取决于你把哪些行排除在外。有五件事决定了怎么解读它:

  • Unknown。 X 对部分账号不显示国家,包括带灰色认证标记的政府账号,而 X 的数据太少时,Sorsa API 会返回 “Unknown”。把它作为单独的一行报告;新粉丝中 Unknown 占比很高,往往意味着账号是刚注册或长期闲置的。
  • 地区。 X 允许账号主人显示一个大的地区而不是国家。这些行保持原样,不要去猜是哪个国家。
  • VPN 与出行。 这个标签跟随账号连接的位置,所以 VPN 或长途出行都可能让它变动。X 怀疑使用 VPN 时,会在面板上加警告。在 1,000 个粉丝里,这只是噪声;对单个账号来说,把标签当作线索,而不是证据。
  • 随时间变化。 标签会随着人的移动而变,粉丝也有来有走。给每张地图标注日期,并用同样的样本量重复,才能对比不同月份。
  • 看占比,而不是看人。 把国家报告为受众的百分比。对一千个粉丝做国家表是市场研究;按国家列出具名的人,则不是这个方法的用途。

这样解读之后,这张表能回答实际的问题。付钱请创作者做面向某个市场的推广之前,先看看他的粉丝里实际位于那个市场的占多少。对竞争对手跑同样的地图,看看他们触达了哪些你没有触达的市场,这是 Twitter 竞品分析的一部分。还能用来安排发帖时间:受众分布在美国和欧洲的话,两地相差六到九个小时,所以只选一个发帖时间会错过一部分人。每季度对自己的账号重复一次这张地图,就能看出增长来自哪里。

#绘制你的第一份国家分布

要知道任何 X 账号的粉丝在哪里,可以用 GET /followers 列出他们,抽样 1,000 个,再从 GET /about 读取每个人的国家。在 Sorsa API 上,这样统计一个 100 万粉丝的受众成本是 $8.40 起,每个国家的占比误差在约 3 个百分点以内。先用 100 次免费请求开始:在一个你熟悉的、粉丝不到 2,000 的账号上,用 sample_size=90 运行脚本,检查表格看起来是否正确。

#常见问题

我怎么知道自己的 Twitter 粉丝来自哪里?

随 X Premium 提供的 X Analytics,能给出你自己受众的国家视图。如果想要可以导出的精确占比,或者没有 Premium,可以列出你的粉丝,查询每个人(或随机抽取的 1,000 个人)的 “Account based in” 国家。Sorsa API 的 GET /about 返回这个国家,每 1,000 个账号 $1.40 起,前 100 次查询免费。

要获取 Twitter 粉丝的国家,该用哪个 API?

用 Sorsa API。GET /followers 列出任何公开账号的粉丝,每次请求 200 个,每 1,000 个 $0.007 起;GET /about 返回 X 为每个粉丝标注的国家,每 1,000 个账号 $1.40 起。它只需要一个 API 密钥,不需要开发者账号或 OAuth,所有套餐都是每秒 20 次请求,也从不接触你的 X 登录信息。

官方 X API 会返回账号的国家吗?

不会。官方 X API 的用户对象有一个 location 字段,保存的是账号主人输入的任何内容,X 的文档说它可能不是有效的地点,而且没有 “Account based in” 国家这个字段。在那里读取粉丝,每个 $0.010。Sorsa API 的 GET /about 返回 X 为任何公开账号显示的国家,每次请求一个账号。

Twitter 会显示账号的确切位置吗?

不会。X 显示的是国家或大的地区,绝不会是城市、街道或实时位置,它也不公布任何 IP 地址。这个标签来自账号汇总的 IP 地址,所以出行或 VPN 都可能让它变动。只有作者主动标注了地点,帖子才会带上,所以仅凭一个用户名,无法追溯到某个地址。

我能看到别人的粉丝来自哪些国家吗?

可以,对任何公开账号都行。X Analytics 只覆盖你自己的账号,而用你的 X 账号登录的工具,也只能统计你自己的粉丝。列出一个公开账号的粉丝,再读取每个人的 “Account based in” 国家,对创作者、竞争对手和品牌的做法都一样。受保护账号的粉丝列表是私密的,所以没有人能统计它们。

#我们如何核实

2026 年 11 月 2 日,我们阅读了线上 Sorsa API 参考文档中的 /about 和 /followers 条目、X 帮助中心关于国家设置和帖子位置的文章,以及 docs.x.com 上的用户字段和价格。请求和响应依据该参考文档;文中的账号名是虚构的。误差范围是简单随机抽样的 95% 置信区间,成本使用 Sorsa API 的最低费率,每 1,000 次请求 $1.40。

Sorsa API 团队撰写。 我们开发和运营 Sorsa API,这是只读的 Twitter/X API 与爬虫,2022 年起运行于生产环境(前身为 TweetScout API),累计处理请求超 60 亿次。 关于 Sorsa API

更新内容
  • 从头重写:带误差范围的抽样、与官方 X API 对比的成本规划器、全新的 Python 和 Node.js 流程,并对照 X 帮助中心和 docs.x.com 核实了相关事实。
  • 首次发布。