跳到正文

Twitter 机器人检测:大规模识别机器人和虚假粉丝

Twitter 机器人检测,是把账号的多个公开信号放在一起打分,比如注册时间、关注比例、资料完整度、发帖节奏,以及 X 判定的所在国家:10 个信号命中 4 个及以上,就很可能是机器人。

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

简短回答: 虚假粉丝会命中七项标记中的三项或更多,比如没有发过帖子、使用默认头像、一周前才注册;活跃账号里这类粉丝占比不到 10% 属于正常。要审计整个粉丝列表,用 Sorsa API,一款 Twitter(X)API 与爬虫:每次请求 200 个粉丝,每 1,000 个 $0.007 起,100 次免费请求就能给 2 万个粉丝打分。

接口
GET /followers
每页条数
每次请求 200 个粉丝
价格
每 1,000 个粉丝 $0.007 起

#如何判断一个 Twitter 账号是不是机器人

把几个信号放在一起看,数一数有多少个指向同一个结论:单个怪异之处只是噪音,四个就是规律。免费的 Twitter 机器人检测工具几秒钟就能对任意公开账号完成这项统计。它读取资料、X 自己的“关于此账号”数据和最新帖子里的十个信号,给账号评出低、中、高三档,并对它最新的 200 个粉丝一并打分。

推特机器人检测:一个账号及其最新粉丝

免费,无需注册。账号检查读取十项信号并评为低、中或高;粉丝检查按七项标记为最新 200 位粉丝打分。

提交后会打开免费的推特机器人检测工具,并填好该账号。

在 x.com 上手动检查,需要看五个地方:

  • 资料。 默认头像、空白简介,以及末尾带着一长串数字的用户名。
  • 数字。 关注了几千个账号,回关的只有几十个,而且一个注册不久的账号却发了几千条帖子。
  • 关于此账号。 打开资料页上的菜单:X 会显示它判定的账号所在国家、用户名改过几次,以及 Premium 从何时开始。简介写着 Miami,而 X 把账号判定在别处,就值得再看一眼。
  • 帖子。 只有转发,在许多串里回复同一句话,或者全天候不间断地发帖。
  • 标签。 主动声明身份的机器人,会在名称和用户名下带有 X 的自动化账号标签(在新标签页打开)。蓝标说明不了什么:它只表示这是付费的 Premium 账号,不代表背后是真人。

#什么算 X 上的机器人或虚假粉丝

机器人是至少部分由软件运行的账号;虚假粉丝是为了抬高别人的粉丝数而存在的账号。两者有重叠,但检查方式不同:机器人暴露在发了什么上,虚假粉丝暴露在资料有多空上。

类型是什么表现
自动化账号按计划发帖的软件:提醒、资讯源、天气发帖时间规律,话题单一,常带 X 的“Automated”标签
垃圾机器人大量推送链接、诈骗或回复的自动化账号到处都是同一句回复,只转发,资料几乎空白
虚假粉丝为抬高粉丝数而购买或批量养出来的账号刚注册,没有帖子、没有点赞、没有头像,成批注册
不活跃粉丝停止发帖或只看不发的真人命中一两项标记,注册时间较早
协同账号人或脚本运营大量账号来伪造声势话术雷同,注册时间相近,所在地对不上
  • 自动化账号

    是什么
    按计划发帖的软件:提醒、资讯源、天气
    表现
    发帖时间规律,话题单一,常带 X 的“Automated”标签
  • 垃圾机器人

    是什么
    大量推送链接、诈骗或回复的自动化账号
    表现
    到处都是同一句回复,只转发,资料几乎空白
  • 虚假粉丝

    是什么
    为抬高粉丝数而购买或批量养出来的账号
    表现
    刚注册,没有帖子、没有点赞、没有头像,成批注册
  • 不活跃粉丝

    是什么
    停止发帖或只看不发的真人
    表现
    命中一两项标记,注册时间较早
  • 协同账号

    是什么
    人或脚本运营大量账号来伪造声势
    表现
    话术雷同,注册时间相近,所在地对不上

X 的真实性政策(在新标签页打开)禁止付费换取关注、点赞或浏览量,也禁止反复关注再取关。不活跃粉丝不违反任何规则,所以一份好的审计会把他们和虚假粉丝分开。

#暴露机器人的信号

来自三处公开位置的十个信号,能把大多数机器人和真人区分开:资料、X 的“关于此账号”面板,以及账号最新的帖子。每个信号都只有和其他信号放在一起才有意义,下表也列出了还有谁会命中它。

资料 GET /info-batch 每次请求 100 个账号 1 资料设置 2 关注数对比粉丝数 3 账号年龄对比受众 4 发帖节奏 关于此账号 GET /about X 自己对该账号的记录 5 所在地 6 用户名更改 7 Premium 时间 显示在 x.com 上 每个公开资料页 最新推文 POST /user-tweets 每次请求 20 条推文 8 发帖时段 9 内容构成 10 AI 标签 单个账号值得留意的信号 0 或 1:低 真人也会触发一项 2 或 3:中 查看被标记的信号 4 或以上:高 很可能是机器人或假号
十个信号,三个来源。有两三个值得留意,账号就有嫌疑;有四个及以上,就很可能是机器人。
信号在哪里看什么情况下值得留意还有谁会命中
资料完整度资料三项中占两项:默认头像、空白简介、用户名末尾有六位及以上数字从没设置过资料的普通人
关注数与粉丝数资料关注 1,000 个以上,回关的不到 1/20新账号、只看新闻的读者
账号年龄与受众资料注册不满六个月,粉丝却有 1 万以上突然爆红的人
发帖节奏资料注册以来平均每天发 50 条以上新闻编辑部、现场直播的人
所在地关于此账号X 判定的国家与简介里的所在地或 App Store 地区不同出差的人、VPN 用户、外派人员
用户名变更关于此账号改过三次及以上,或粉丝 1 万以上的账号最近 90 天内改过一次品牌改名
Premium 开通时间关于此账号注册一周内就买了 Premium为了发长视频才注册的创作者
发帖时段最新帖子最活跃的七个小时,在账号声称所在的每个国家都是夜里上夜班的人、定时发帖工具
内容构成最新帖子转发占 80% 以上,回复占 90% 以上,或自己发的帖子 90% 以上带链接内容整理者、链接订阅号
AI 标签最新帖子最新帖子里有一半或更多带“Made with AI”标签公开标注 AI 作品的艺术家
  • 资料完整度

    在哪里看
    资料
    什么情况下值得留意
    三项中占两项:默认头像、空白简介、用户名末尾有六位及以上数字
    还有谁会命中
    从没设置过资料的普通人
  • 关注数与粉丝数

    在哪里看
    资料
    什么情况下值得留意
    关注 1,000 个以上,回关的不到 1/20
    还有谁会命中
    新账号、只看新闻的读者
  • 账号年龄与受众

    在哪里看
    资料
    什么情况下值得留意
    注册不满六个月,粉丝却有 1 万以上
    还有谁会命中
    突然爆红的人
  • 发帖节奏

    在哪里看
    资料
    什么情况下值得留意
    注册以来平均每天发 50 条以上
    还有谁会命中
    新闻编辑部、现场直播的人
  • 所在地

    在哪里看
    关于此账号
    什么情况下值得留意
    X 判定的国家与简介里的所在地或 App Store 地区不同
    还有谁会命中
    出差的人、VPN 用户、外派人员
  • 用户名变更

    在哪里看
    关于此账号
    什么情况下值得留意
    改过三次及以上,或粉丝 1 万以上的账号最近 90 天内改过一次
    还有谁会命中
    品牌改名
  • Premium 开通时间

    在哪里看
    关于此账号
    什么情况下值得留意
    注册一周内就买了 Premium
    还有谁会命中
    为了发长视频才注册的创作者
  • 发帖时段

    在哪里看
    最新帖子
    什么情况下值得留意
    最活跃的七个小时,在账号声称所在的每个国家都是夜里
    还有谁会命中
    上夜班的人、定时发帖工具
  • 内容构成

    在哪里看
    最新帖子
    什么情况下值得留意
    转发占 80% 以上,回复占 90% 以上,或自己发的帖子 90% 以上带链接
    还有谁会命中
    内容整理者、链接订阅号
  • AI 标签

    在哪里看
    最新帖子
    什么情况下值得留意
    最新帖子里有一半或更多带“Made with AI”标签
    还有谁会命中
    公开标注 AI 作品的艺术家

三个“关于此账号”信号,是大多数指南都略过的部分。X 在每个公开资料页的“关于此账号”下都会显示它们:X 判定的账号所在国家、用户名改过几次,以及 Premium 从何时开始。这个国家代表什么、从哪里来,请看 X 上的“账号所在地”是什么意思。

数一数值得留意的信号:没有或只有一个算低,两三个算中,四个及以上算高。这和 Twitter 机器人检测工具显示的档位一致,所以按这张表写出的脚本,和免费工具对每个账号的结论都相同。

#如何找出任意账号的虚假粉丝

用每个粉丝自己的资料,按七项标记给他打分,再看看起来像虚假粉丝的占比:命中三项及以上,很可能是虚假粉丝;命中两项,通常是不活跃的真人;命中一项或没有,就是真实粉丝。七项标记全部来自 GET /followers 为每个粉丝返回的字段:

  • 最近 30 天内注册,看 created_at。
  • 关注 1,000 个以上,回关的不到 1/20,看 followings_count 和 followers_count。
  • 没有帖子:tweets_count 为 0。
  • 没有点赞:favourites_count 为 0。
  • 默认头像:profile_image_url 指向 X 的默认图片。
  • 简介为空:description 为空白。
  • 名字加数字的用户名:username 末尾有六位及以上数字。
一个粉丝,GET /followers 的返回 @dana_k_2042719983,检查于 2026 年 11 月 2 日 字段 值 标记 created_at 2026-10-24 标记 9 天前加入 followings_count 2,140 / 12 / followers_count 标记 关注 1,000+, 回关者少 tweets_count 0 标记 没有推文 favourites_count 37 无 有点赞过的推文 profile_image_url …/default_profile… 标记 默认头像 description "Crypto | NFTs | DM…" 无 有简介 username …2042719983 标记 以十位数字结尾 7 项标记中占 5 项:像假号 满 3 项标记算假号,2 项算不活跃,1 项或无算真实。
一个粉丝命中七项中的五项。三项就足以算作虚假粉丝;买来的粉丝通常会命中四五项。

要盯的是“看起来像虚假粉丝”的占比,我们这样解读它:

看起来像虚假粉丝的占比通常意味着什么
不到 10%活跃账号的正常水平:机器人会关注热门账号来伪装成真人
10% 到 30%值得细看;和同一领域、规模相近的账号对比
超过 30%买来的粉丝或一波机器人潮,尤其是很多粉丝在相同的几周内注册 X
  • 不到 10%

    通常意味着什么
    活跃账号的正常水平:机器人会关注热门账号来伪装成真人
  • 10% 到 30%

    通常意味着什么
    值得细看;和同一领域、规模相近的账号对比
  • 超过 30%

    通常意味着什么
    买来的粉丝或一波机器人潮,尤其是很多粉丝在相同的几周内注册 X

这些档位是我们对七项标记的解读,不是 X 发布的规则。注册日期能消除大部分疑虑:X 把粉丝按最新在前排列,而买来的粉丝是成批到达的,所以一次购买会在列表顶部表现为一群刚注册的新账号。

最新 200 个粉丝的注册 X 时间 示例账号,审计于 2026 年 11 月 2 日 108 加入已超过 一年: 较早、 分布分散的 受众 5 11 月 4 12 月 6 1 月 5 2 月 4 3 月 6 4 月 5 5 月 3 6 月 4 7 月 5 8 月 4 9 月 41 10 月 2025 2026 一个月内加入 41 个 其余每月 3 到 6 个
一次示例审计:最新的 200 个粉丝里,有 41 个在同一个月注册 X。这样的尖峰,就是买来的一批粉丝的样子。

须知

不活跃不等于虚假。很多真人关注了账号之后从不发帖、点赞,也不填简介,所以会命中两项标记。要把他们单独计算:如果把他们和虚假粉丝混在一起,受众更老、更安静的账号就会被误报成两倍的风险。

#用 Python 审计每一个粉丝

粉丝审计会翻遍一个账号的整个粉丝列表,并按七项标记给每份资料打分。做这件事用 Sorsa API:GET /followers 每次请求返回 200 个粉丝,并带上标记需要的所有字段,每 1,000 个 $0.007 起,所以一个 5 万粉丝的账号 $0.35 起。从拿到密钥到出报告,一共五步。

  1. 拿到密钥。 注册后,在控制台里复制你的 API 密钥。前 100 次请求免费。

  2. 请求第一页。 把用户名发送给 GET /followers(在新标签页打开),并在 ApiKey 请求头里带上密钥。最新的粉丝排在最前面。

    Terminal
    curl -G "https://api.sorsa.io/v3/followers" \
      -H "ApiKey: YOUR_API_KEY" \
      --data-urlencode "username=gulfcoast_wire_news"
    
    Response200 OK
    {
      "users": [
        {
          "id": "1981374420583055360",
          "username": "dana_k_2042719983",
          "display_name": "Dana K",
          "description": "Crypto | NFTs | DM for promo",
          "location": "",
          "created_at": "2026-10-24T03:12:51Z",
          "followers_count": 12,
          "followings_count": 2140,
          "tweets_count": 0,
          "favourites_count": 37,
          "media_count": 0,
          "profile_image_url": "https://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png",
          "verified": false,
          "protected": false
        },
        {
          "id": "1204958817730289664",
          "username": "harborlight_reads",
          "display_name": "Harborlight Reads",
          "description": "Coastal history, one book at a time.",
          "location": "Mobile, Alabama",
          "created_at": "2019-12-12T15:40:02Z",
          "followers_count": 3871,
          "followings_count": 512,
          "tweets_count": 9420,
          "favourites_count": 18233,
          "media_count": 611,
          "profile_image_url": "https://pbs.twimg.com/profile_images/1204961/h.jpg",
          "verified": false,
          "protected": false
        }
      ],
      "next_cursor": "1849212213712385091"
    }
    
  3. 给每份资料打分。 数出每个粉丝命中的七项标记,把他归入“看起来像虚假粉丝”“看起来不活跃”或“看起来是真人”。

  4. 沿着游标翻页。 游标是每一页返回的书签:把 next_cursor 作为参数发回去,直到返回的某一页不再带它,列表就读完了。

  5. 跑完整个审计。 下面的脚本对任意账号完成第 2 步到第 4 步,并输出三个占比、注册最集中的月份和五个示例。传入 max_pages=1,就只给最新的 200 个粉丝打分,和免费检测工具一样。

    import re
    import time
    from collections import Counter
    from datetime import datetime, timezone
    
    import requests
    
    API = "https://api.sorsa.io/v3"
    HEADERS = {"ApiKey": "YOUR_API_KEY"}
    NOW = datetime.now(timezone.utc)
    
    
    def flags(user):
        """The seven fake-follower flags of one profile."""
        joined = datetime.fromisoformat(user["created_at"].replace("Z", "+00:00"))
        following = user["followings_count"]
        photo = user.get("profile_image_url") or ""
        found = []
        if (NOW - joined).days < 30:
            found.append("joined in the last 30 days")
        if following >= 1000 and user["followers_count"] * 20 < following:
            found.append("follows 1,000+, few follow back")
        if user["tweets_count"] == 0:
            found.append("no posts")
        if user["favourites_count"] == 0:
            found.append("no likes")
        if not photo or "default_profile" in photo:
            found.append("default photo")
        if not (user.get("description") or "").strip():
            found.append("empty bio")
        if re.search(r"\d{6,}$", user["username"]):
            found.append("name-and-digits handle")
        return found
    
    
    def audit(username, max_pages=None):
        """Score every follower of one account, 200 per request."""
        params, pages = {"username": username}, 0
        groups, months, examples = Counter(), Counter(), []
        while True:
            r = requests.get(f"{API}/followers", headers=HEADERS, params=params)
            if r.status_code == 429:  # over 20 requests in one second
                time.sleep(1)
                continue
            r.raise_for_status()
            page = r.json()
            for user in page["users"]:
                found = flags(user)
                n = len(found)
                group = "fake" if n >= 3 else "inactive" if n == 2 else "real"
                groups[group] += 1
                months[user["created_at"][:7]] += 1
                if group == "fake" and len(examples) < 5:
                    examples.append((user["username"], found))
            pages += 1
            cursor = page.get("next_cursor")
            if not cursor or pages == max_pages:
                break
            params["next_cursor"] = cursor
        total = sum(groups.values())
        for group in ("fake", "inactive", "real"):
            print(f"looks {group}: {groups[group]} ({groups[group] / total:.0%})")
        month, count = months.most_common(1)[0]
        print(f"busiest join month: {month}, {count / total:.0%} of followers")
        for handle, found in examples:
            print(f"  @{handle}: {', '.join(found)}")
    
    
    audit("gulfcoast_wire_news")
    

返回 401 或 403,说明密钥缺失、有误或请求额度已用完;返回 429,说明 1 秒内发了超过 20 次请求,Python 脚本会等待 1 秒后重试。同一个账号的各页只能依次读取,因为每一页都要用到上一页的游标;多个账号则可以并行审计,每个密钥最高 20 次请求/秒。想把资料本身存成文件,请看如何导出 Twitter 粉丝到 CSV。

不写代码,直接给响应打分

把任意一页 GET /followers 的 JSON 粘贴到下面,可以来自上面的 curl 请求,也可以来自 API Playground,页面会在你的浏览器里按同样的七项标记给它打分。

一页最多包含 200 位粉丝。要给更多粉丝打分,请把多页粘贴为一个 JSON 数组: [page1, page2].

示例:@gulfcoast_wire_news 最新的 200 位粉丝

17% 疑似虚假

  • 疑似虚假 34 17%
  • 疑似不活跃 30 15%
  • 看起来真实 136 68%

41 位在最近 30 天内加入 X。加入最集中的月份:2026 年 10 月,占这些粉丝的 21%。

被标记的示例

  • @dana_k_2042719983 最近 30 天内加入, 关注 1,000+, 回关者少, 无帖子, 默认头像, 名字加数字的用户名
  • @mira_lopez_88310274 最近 30 天内加入, 无帖子, 无点赞, 默认头像, 简介为空, 名字加数字的用户名
  • @gainsdaily_alerts_x 最近 30 天内加入, 关注 1,000+, 回关者少, 无帖子, 简介为空
  • @t_ward_4471902366 无帖子, 无点赞, 默认头像, 名字加数字的用户名

打分在你的浏览器中运行;粘贴的内容不会离开本页。

#每 100 个一批,审查一份账号名单

要筛查一份创作者、合作方或回复账号的名单,可以通过 GET /info-batch(在新标签页打开) 每次读取 100 份资料,再从 GET /about(在新标签页打开) 补上每个账号的“关于此账号”数据。下面的脚本会算出十个信号中的六个,并把 X 判定的国家和简介里的所在地并排输出,方便快速浏览。

“关于此账号”这部分,正是官方 X API 的短板:它的用户对象有自由填写的所在地,但没有国家、没有用户名历史,也没有 Premium 开通日期,其数据字典(在新标签页打开)里写得很清楚。Sorsa API 的 GET /about 则返回 country、username_change_count、last_username_change_at、premium_start_at,以及 source 里的 App Store 地区。

Python
from datetime import datetime, timezone

import requests

API = "https://api.sorsa.io/v3"
HEADERS = {"ApiKey": "YOUR_API_KEY"}
NOW = datetime.now(timezone.utc)


def when(stamp):
    return datetime.fromisoformat(stamp.replace("Z", "+00:00"))


def profiles(handles):
    """Profiles of up to 100 accounts per request."""
    for i in range(0, len(handles), 100):
        r = requests.get(f"{API}/info-batch", headers=HEADERS,
                         params={"usernames": handles[i:i + 100]})
        r.raise_for_status()
        yield from r.json()["users"]


def about(handle):
    """X's About this account data: country, renames, Premium."""
    r = requests.get(f"{API}/about", headers=HEADERS,
                     params={"username": handle})
    r.raise_for_status()
    return r.json()


def signals(p, a):
    age = max((NOW - when(p["created_at"])).days, 1)
    fans, follows = p["followers_count"], p["followings_count"]
    photo = p.get("profile_image_url") or ""
    setup = [not photo or "default_profile" in photo,
             not (p.get("description") or "").strip(),
             p["username"][-6:].isdigit()]
    renamed = a.get("last_username_change_at")
    premium = a.get("premium_start_at")
    return {
        "profile setup": sum(setup) >= 2,
        "follow ratio": follows >= 1000 and fans * 20 < follows,
        "young, big audience": age < 183 and fans >= 10000,
        "50+ posts a day": p["tweets_count"] / age >= 50,
        "username changes": (a.get("username_change_count") or 0) >= 3
        or (bool(renamed) and (NOW - when(renamed)).days < 90
            and fans >= 10000),
        "Premium in week one": bool(premium)
        and (when(premium) - when(p["created_at"])).days < 7,
    }


for p in profiles(["gulfcoast_wire_news", "harborlight_reads"]):
    a = about(p["username"])
    hits = [name for name, hit in signals(p, a).items() if hit]
    print(f"@{p['username']}: {len(hits)} of 6 {hits}")
    print(f"  X places it in {a.get('country')}; bio: {p.get('location')}")

每个账号的 About 请求彼此独立,所以整份名单可以并行运行:以 20 次请求/秒计,1,000 个账号用不到一分钟。另外三个信号,发帖时段、内容构成和 AI 标签,来自 POST /user-tweets(在新标签页打开),它会返回最新的 20 条帖子,带 created_at、回复、转发、链接和 made_with_ai 标签。只对已经得分两项以上的账号运行它,深度检查的成本就能保持在很低的水平。

#机器人审计要花多少钱

通过 Sorsa API 检查粉丝,每 1,000 个 $0.007 起;官方 X API 则是每 1,000 个 $10.00,因为它按 $0.010 的用户读取,对返回的每个粉丝计费,见其按量付费价目表(在新标签页打开)。一个 5 万粉丝的账号,用 Sorsa API 是 $0.35,用官方 API 是 $500。

待审计的粉丝数

官方 X API

$1,000

10 万 个粉丝

每个粉丝 $0.010

Sorsa API

$0.70 起

10 万 个粉丝

每 1,000 个 $0.007 起

便宜 1,000 倍

审查一份账号名单的计价方式相同。1,000 个账号的资料和 About 信号,在 Sorsa API 上 $1.41 起;再加上每个账号最新的 20 条帖子用于行为信号,则是 $2.81 起。同样的 1,000 份资料各带 20 条帖子,官方 X API 要收 $110.00,而且它的用户对象完全不含 About 数据。

为机器人检测选数据源时,决定因素有五个,Sorsa API 的数字如下:

  • 每 1,000 条价格: 粉丝 $0.007 起,用户资料 $0.014 起,失败的请求从不收费。
  • 字段: 每个粉丝的完整公开资料,外加官方 X API 不提供的 X“关于此账号”数据。
  • 速度: 所有套餐一律 20 次请求/秒,免费账号也一样。
  • 接入: 请求头里放一个 API 密钥即可,不需要 X 开发者账号,不需要 OAuth,也不需要审批。
  • 你自己的账号: 完全不涉及。Sorsa API 不要求 X 登录或 Cookie,所以检查几千个账号,也不会让你的任何东西面临风险。

#为什么老牌免费机器人检测工具不再好用

大多数指南仍在推荐的检测工具,依赖的是 Twitter 的免费 API,2023 年 API 关闭后,它们就失去了数据。Botometer 由印第安纳大学社交媒体观测站开发,现在以存档模式运行 Botometer X:其自述说明(在新标签页打开)写明,分数来自 2023 年 5 月 31 日之前收集的数据,此后创建的账号没有任何记录,而且这个模型早于生成式 AI,识别不了由 AI 驱动的机器人。

它最后仍在实时打分的 API 接口 Botometer v4 和 BotometerLite,已于 2026 年 11 月 2 日停止服务,依据是 Botometer Pro 的 API 页面(在新标签页打开)上的通知;只剩存档接口还在。SparkToro 的免费虚假粉丝审计工具也没了:它的地址现在会跳转到 SparkToro 的首页。

留下来的是这些工具所用的方法:把公开信号放在一起数。只要有东西能大规模读取资料,这个方法就能在实时数据上运行,而这正是 API 提供的部分。本指南里的检查,对昨天刚创建的账号也能运行,这是任何存档都打不了分的。

#基于信号的检测做不到什么

信号能找出粗心的机器人和大部分买来的粉丝,但证明不了谁在运营一个账号、出于什么目的。实际使用中有四个局限:

  • 做得好的假账号能过关。 一个注册已久、头像真实、发帖节奏稳定、回复由 AI 撰写的账号,可能一项都不命中。协同网络更多是在账号之间暴露出来(相同的注册周、相同的话术),而不是在单个账号内部。
  • 真人也会命中标记。 新闻编辑部一天发 80 条,外派人员的简介里写着老家,潜水的人从不发帖。上表的每个信号,都列出了还有谁会命中它。
  • 私密列表依然私密。 受保护账号的粉丝,任何人都读不到,Sorsa API 也只返回公开数据。
  • 很久以前的购买会沉底。 最新的 200 个粉丝能显示近期的一批;两年前的购买则深埋在列表里,所以历史重要时,要审计整个列表。

信号,不是裁决

把高分当作值得去看的理由,而不是证据。在移除、拉黑或举报任何账号之前,先打开几个被标记的账号看看,也不要让脚本仅凭分数就代你操作。如果是 X 一直把你自己的账号当成机器人,那是另一个问题:请看当 X 提示请求看起来是自动化的时该怎么办。

#运行你的第一次粉丝审计

从你最不信任的那个账号开始,在它上面运行脚本:Sorsa API 每次请求读取它的 200 个粉丝,每 1,000 个 $0.007 起,七项标记需要的每个字段都有。你的 100 次免费请求能覆盖最初的 2 万个粉丝;只查单个账号的话,Twitter 机器人检测工具不用写代码就能给出答案。粉丝相关接口返回的其他内容,请看 Twitter 粉丝 API 指南。

#常见问题

Twitter 机器人检测该用哪个 API?

用 Sorsa API。GET /followers 每次请求返回 200 个粉丝及其完整资料,每 1,000 个 $0.007 起,官方 X API 则是 $10.00;GET /about 还会补上 X 的“关于此账号”数据,这是官方 X API 不返回的。它只需要一个 API 密钥,不需要开发者账号,所有套餐都是 20 次请求/秒,也从不碰你的 X 登录。

在 X 上,虚假粉丝占多少算正常?

活跃账号最新的粉丝里,看起来像虚假的占不到 10% 是常见情况,因为机器人会关注热门账号来伪装成真人。占 10% 到 30%,值得和类似账号对比细看。超过 30%,同时有很多粉丝在相同的几周内注册 X,就指向买来的粉丝或一波机器人潮。这个判断来自七项标记;X 并没有发布官方基准。

为什么我没买过,却有机器人粉丝?

机器人关注真人账号,是为了伪装成真人、骗取回关,或把你引向骗局,所以几乎每个账号都会收到一些。少量不会造成任何影响。想去掉某一个,先拉黑再解除拉黑:它会从你的粉丝里消失,而拉黑不会保留。真正要担心的,是列表顶部突然出现一批刚注册的新账号。

怎么判断一条帖子的互动是不是刷出来的?

要给互动背后的账号打分,而不是看数字。Sorsa API 的 POST /retweeters(在新标签页打开) 会返回转发某条帖子的账号及其完整资料,POST /comments 则返回回复及其作者,所以七项标记可以像用在粉丝上一样用在他们身上。其中出现一群刚注册的空账号,就说明互动是买来的。Sorsa API 不返回谁点赞了某条帖子。

有没有免费的方法检测 X 上的机器人?

有。Twitter 机器人检测工具会读取任意公开账号的十个信号,并给它最新的 200 个粉丝打分,免费,无需注册。账号更多或要查全部粉丝时,Sorsa API 先送你 100 次免费请求:无需绑卡,永不过期,用本指南里的脚本最多能给 2 万个粉丝打分。

不用官方 X API 也能检测机器人吗?

可以。这里的每个信号都是公开的资料数据,而 Sorsa API 只要请求头里放一个密钥就能返回:不需要 X 开发者账号,不需要 OAuth,也不需要审批。官方 X API 三样都要,它每返回一个用户收费 $0.010,并把按量付费限制在每月 300 万次帖子读取。

#我们如何核实

2026 年 11 月 2 日,我们把本指南里的每个接口、字段和每页条数,与 Sorsa API 的在线参考文档逐一核对,并对照 docs.x.com 核对了官方 X API 的价格和用户字段。我们读了 Botometer 的说明及其 API 页面、X 帮助中心关于自动化标签和真实性的页面,并顺着 SparkToro 旧审计工具的地址,看了它现在跳转到哪里。七项标记、十个信号及其阈值,与免费的 Twitter 机器人检测工具所用的完全一致;示例里的账号都是虚构的。

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

更新内容
  • 全文重写:十个信号及其来源,把 X 的“关于此账号”数据当作信号,Python 和 Node.js 的七项标记粉丝审计,免代码的响应评分器,与官方 X API 的每 1,000 条成本对比,以及 Botometer 将于 2026 年 11 月停止服务。
  • 首次发布。