跳到正文

用 API 核验 Twitter 关注与转发

API 核验 X 上的关注、转发、引用或回复时,会把一个账号与一项操作对照检查,只回答 true 或 false;官方 X API 没有这类检查,只能读取整份列表,每个账号 $0.010。

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

简短回答: 每种操作各有一项检查:关注、转发、引用、回复或加入 Community。点赞没有检查,因为自 2024 年 6 月起,只有帖子作者能看到谁点了赞。Sorsa API 用一次请求回答一项检查,POST /check-follow 和另外四个接口,每 1,000 次检查 $1.40 起;你的 100 次免费请求足够做前 100 次。

接口
/check-follow 等 5 个
每项检查
1 次请求
价格
每次检查 $0.0014 起

#在 X 上能核验什么,不能核验什么

X 上有五种操作是公开的,所以 API 可以逐个账号确认:关注、转发、引用、回复和加入 Community。这里的核验指证明某个账号做过某件事,比如关注了你或转发了你的帖子,与 X 的蓝标认证无关。

只想查一对账号的话,免费的 Twitter 关注检查工具可以双向查看一个账号是否关注了另一个,无需写代码。想从一条帖子的转发、回复和引用中抽奖,免费的 X(Twitter)抽奖选取工具会检查每位中奖者是否关注。要检查一次活动的全部参与者,则需要 API。

除点赞外的每项任务都可以证明,但官方 X API 没有一项能直接证明:它只给你一份份列表让你自己去查,而 Community 成员身份根本没有对应的路由。

任务一次检查需要什么官方 X API 的做法
关注了某个账号双方的用户名读取关注列表或粉丝列表
转发了某条帖子帖子链接和用户名读取该帖子的转发者,每页 100 个
引用了某条帖子帖子链接和用户名读取该帖子的引用
回复了某条帖子帖子链接和用户名搜索该帖子的对话
加入了某个 X CommunityCommunity 和用户名没有接口
拥有该用户名用户名和他们发布的验证码读取该账号的帖子
点赞了某条帖子无法检查只有帖子作者能看到点赞者
  • 关注了某个账号

    一次检查需要什么
    双方的用户名
    官方 X API 的做法
    读取关注列表或粉丝列表
  • 转发了某条帖子

    一次检查需要什么
    帖子链接和用户名
    官方 X API 的做法
    读取该帖子的转发者,每页 100 个
  • 引用了某条帖子

    一次检查需要什么
    帖子链接和用户名
    官方 X API 的做法
    读取该帖子的引用
  • 回复了某条帖子

    一次检查需要什么
    帖子链接和用户名
    官方 X API 的做法
    搜索该帖子的对话
  • 加入了某个 X Community

    一次检查需要什么
    Community 和用户名
    官方 X API 的做法
    没有接口
  • 拥有该用户名

    一次检查需要什么
    用户名和他们发布的验证码
    官方 X API 的做法
    读取该账号的帖子
  • 点赞了某条帖子

    一次检查需要什么
    无法检查
    官方 X API 的做法
    只有帖子作者能看到点赞者

X 在 2024 年 6 月 11 日将点赞改为私密:帖子作者仍能看到谁点了赞,其他人看不到(Engadget,引述 X Engineering(在新标签页打开))。把“点赞这条帖子”换成转发、引用或回复;这三种仍然公开,可以检查。

#Sorsa API 的六项检查,每项一次请求

要逐个参与者核验活动任务,可以用 Sorsa API,一款 Twitter(X)API 与爬虫:每项检查是一次请求,回答 true 或 false,每次 $0.0014 起,只用一个 API 密钥,无需 OAuth,所有套餐统一每秒 20 次请求。

五个接口覆盖五种公开操作,第六个请求读取参与者的最新帖子,用来查找归属验证码。

任务Sorsa API 请求返回内容
关注了你的账号POST /check-followfollow:true 或 false
转发了你的帖子POST /check-retweetretweet,以及超出最新 100 个之后的 next_cursor
引用了你的帖子POST /check-quotedstatus:quoted、retweet 或 not_found,并附引用的文字
回复了你的帖子GET /check-commentcommented,以及回复本身
加入了你的 X CommunityPOST /check-community-memberis_member:true 或 false
拥有该用户名POST /user-tweets他们最新的帖子,在其中查找验证码
  • 关注了你的账号

    Sorsa API 请求
    POST /check-follow
    返回内容
    follow:true 或 false
  • 转发了你的帖子

    Sorsa API 请求
    POST /check-retweet
    返回内容
    retweet,以及超出最新 100 个之后的 next_cursor
  • 引用了你的帖子

    Sorsa API 请求
    POST /check-quoted
    返回内容
    status:quoted、retweet 或 not_found,并附引用的文字
  • 回复了你的帖子

    Sorsa API 请求
    GET /check-comment
    返回内容
    commented,以及回复本身
  • 加入了你的 X Community

    Sorsa API 请求
    POST /check-community-member
    返回内容
    is_member:true 或 false
  • 拥有该用户名

    Sorsa API 请求
    POST /user-tweets
    返回内容
    他们最新的帖子,在其中查找验证码

每项检查都接受用户名、数字用户 ID 或个人主页链接来指定参与者,帖子则用链接或纯 ID。返回的内容不只是“是”或“否”:还有引用的文字、回复本身,以及参与者账号受保护时,关注、转发和引用检查中的 user_protected 标记。你自己的 X 账号完全不参与,所以任何活动都不会让它承担风险。

#四步检查一个参与者

检查一个参与者,每项任务一次请求。下面的例子检查关注、转发和回复,这是最常见的抽奖规则,密钥放在 ApiKey 请求头里。

  1. 获取密钥。 注册后从控制台复制你的 API 密钥。前 100 次请求免费,无需绑卡。

  2. 检查关注。 把你的用户名作为 username_1,参与者的用户名作为 username_2。

    Terminal
    curl -X POST "https://api.sorsa.io/v3/check-follow" \
      -H "ApiKey: YOUR_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{"username_1": "lumenharbor_labs",
           "username_2": "maya_quest_runner"}'
    
    Response200 OK
    {
      "follow": true,
      "user_protected": false
    }
    
  3. 检查帖子任务。 把帖子链接和参与者的用户名,以 JSON 请求体发给 POST /check-retweet,以查询参数发给 GET /check-comment。

  4. 合并结果。 只有当所有必需的检查都返回 true 时,才把参与者标为合格,并保留每个答案作为记录。

    import requests
    
    BASE = "https://api.sorsa.io/v3"
    HEADERS = {"ApiKey": "YOUR_API_KEY"}
    BRAND = "lumenharbor_labs"
    POST = "https://x.com/lumenharbor_labs/status/2115459618305512658"
    
    
    def call(method, path, **kwargs):
        r = requests.request(method, BASE + path, headers=HEADERS,
                             timeout=20, **kwargs)
        r.raise_for_status()
        return r.json()
    
    
    def verify_entrant(handle):
        follow = call("POST", "/check-follow",
                      json={"username_1": BRAND, "username_2": handle})
        retweet = call("POST", "/check-retweet",
                       json={"tweet_link": POST, "username": handle})
        reply = call("GET", "/check-comment",
                     params={"tweet_link": POST, "username": handle})
        result = {
            "handle": handle,
            "follow": follow["follow"],
            "retweet": retweet["retweet"],
            "reply": reply["commented"],
            "protected": follow.get("user_protected", False),
        }
        result["eligible"] = all(
            result[k] for k in ("follow", "retweet", "reply"))
        return result
    
    
    print(verify_entrant("maya_quest_runner"))
    

三项检查,三次请求:核验这个参与者的花费最低为 $0.0042。403 表示密钥缺失或请求额度已用完。429 表示同一秒内发出了超过 20 次请求:等一秒再重发。失败的请求从不收费。

#检查一个 X 账号是否关注了另一个

POST /check-follow(在新标签页打开) 回答第二个账号是否关注了第一个:username_1 是应被关注的账号,username_2 是你要检查的账号,无论哪一方有多少粉丝,一次请求就返回 true 或 false 的 follow。

每一方只需提供一个标识:用户名、数字 ID(user_id_1、user_id_2)或个人主页链接(user_link_1、user_link_2)。答案只覆盖一个方向,所以互关需要把双方对调再调用两次。当 user_protected 为 true 时,被检查的账号是受保护账号:它的关注不公开,任何外部服务都无法确认。

官方 X API 没有能回答一对账号关系的接口。它的路线是读取整份列表:GET /2/users/:id/following 每页最多返回 1,000 个账号,按 X 的按量付费价目表(在新标签页打开)中 Following/Followers: Read 的标准,每个账号 $0.010。一个关注了 800 个账号的参与者,这样检查最多要花 $8,而读取你自己 5 万粉丝的列表,每拉一次就是 $500。

官方 X API 读取整个列表 GET /2/users/:id/following 翻页直到找到 每页 1,000 个账号 找到与否 每个账号 $0.010 需要先有获批的开发者账号、应用及其令牌。 Sorsa API 一次请求 POST /check-follow {"follow": true} 每次检查 $0.0014 起,一个 API 密钥,无需 OAuth
官方 X API 只能靠读取列表来回答“A 是否关注了 B?”;Sorsa API 一次请求就能回答。

#检查用户是否转发了你的帖子

POST /check-retweet(在新标签页打开) 按从新到旧的顺序,每次扫描帖子的 100 条转发,找到参与者后返回 retweet: true;如果前 100 条里没有,next_cursor 会接着扫描下一个 100 条。

在参与者等待时做的转发检查,比如他们刚在任务页面点下“验证”,转发会排在最新的 100 条里,所以一次请求就能回答。如果有人在一条爆款帖子刚发布时就转发了,位置会更深:下面的循环会沿着 cursor 翻页,直到你设定的上限,上限用完时报告“尚未检查完”,而不是“否”。

你的推文的转发,最新在前 更早 请求 1 转发 1 到 100 请求 2 转发 101 到 200 请求 3 转发 201 到 300 … next_cursor next_cursor 1 分钟前转发 在请求 1 中找到 发布时转发 在请求 3 中找到 出现 retweet: true 即停止。next_cursor 为空且 retweet: false 表示没有转发。
几分钟前的转发在第一次请求中就能找到;大帖子发布当天的转发,每多 100 条转发就多一次请求。
Python
def retweeted(post, handle, max_pages=10):  # 10 pages = 1,000 retweets
    body = {"tweet_link": post, "username": handle}
    for _ in range(max_pages):
        page = call("POST", "/check-retweet", json=body)
        if page["retweet"]:
            return "yes"
        if not page.get("next_cursor"):
            return "no"
        body["next_cursor"] = page["next_cursor"]
    return "not checked yet"

官方 X API 通过 GET /2/tweets/:id/retweeted_by 读取同一份列表:每页 100 个账号,每个 $0.010,每个应用每 15 分钟 75 次请求,也就是每个窗口最多拉取 7,500 个转发者(X API 速率限制(在新标签页打开))。

#核验引用、回复和 Community 加入

另外三项检查覆盖活动的其余部分:POST /check-quoted(在新标签页打开) 区分引用和普通转发,GET /check-comment(在新标签页打开) 返回参与者的回复本身,POST /check-community-member(在新标签页打开) 回答他们是否加入了你的 X Community。

/check-quoted 返回的 status 为 quoted、retweet(只转发、没有评论)或 not_found,如果有引用,还会附上引用的文字和日期。有了这段文字,你就能执行诸如最短字数或活动话题标签之类的规则。

Response200 OK
{
  "status": "quoted",
  "date": "2026-10-28 15:21:47",
  "text": "Joined the Lumen Harbor beta. The queue tool is quick #LumenBeta",
  "user_protected": false
}

/check-comment 以查询参数接收帖子的 tweet_link 和参与者,当 commented 为 true 时返回完整回复:它的 full_text、created_at 和互动数,因此纯表情或复制来的回复可以按你的规则判为不合格。想一次读取一条帖子下的全部回复,请看如何查看 X 上的评论。

/check-community-member 接收 community_id 或 community_link(都既可以填数字 ID,也可以填完整的 x.com/i/communities/ 网址)以及参与者,返回 is_member。官方 X API 可以按 ID 查询或搜索某个 Community,但没有列出成员或检查成员身份的接口。

#从报名到发奖,核验一次抽奖

一次经过核验的抽奖分三步:收集每个参与者的用户名,对每项必需任务各做一次检查,只给通过全部检查的参与者发奖。

  1. 收集用户名和验证码。 在报名表单里询问 X 用户名,并给每个参与者一个一次性的短验证码让他们发布,以此证明这个用户名是他们本人的(见下一节)。

  2. 每项任务检查一次。 可以在报名时检查,得到即时答案,也可以在报名截止后检查;下面的图表会按你的规模选出更便宜的路线。

  3. 复查,再发奖。 发奖前对获奖者再运行一次 /check-follow,因为有些参与者报名后会取消关注,然后只从通过全部检查的参与者中抽取。

    什么时候检查? 参与者还在等 任务按钮、报名表单 每个任务一次检查 /check-follow, /check-retweet … 各一次请求;刚发的转发 会排在最新 100 条之中 报名截止后 抽奖开奖、空投名单 数百名 参与者: 每个任务检查一次 每位参与者 数千名 每份列表只拉取一次, 匹配账号 ID 发放前,再用一次 /check-follow 复核每位获奖者的关注
    报名时检查可即时得到答案;对几千人的已截止活动,把每份列表拉一遍再匹配 ID。

参与者达到几千人时,列表路线更划算:GET /followers(在新标签页打开) 每页返回 200 个粉丝,POST /retweeters(在新标签页打开) 每页返回 20 个转发者,从新到旧排列,所以 1 万个转发者只需 500 次请求,而不是 1 万次检查。导出 Twitter 粉丝的指南里有粉丝列表的 cursor 循环;两份列表用账号 id 来匹配,它不会因用户名更改而变化。

X 自己的X 促销活动指南(在新标签页打开)要求主办方排除多账号参与和重复的相同帖子,并提醒公开搜索可能不会显示所有参与记录。按用户名逐个检查参与者可以避开这个缺口,因为检查从不依赖搜索;下面的归属验证码和资料过滤,则用来挡住借来的账号和一次性账号。

#在发奖前拦住虚假用户名和机器人

两项低成本的检查,可以把借来的用户名和机器人农场挡在发奖之外:用 POST /user-tweets(在新标签页打开) 读取的归属验证码,以及通过 GET /info-batch(在新标签页打开) 做的资料过滤,每次请求处理 100 个参与者。

归属验证码之所以有效,是因为只有账号的主人才能用它发帖:给每个参与者一个类似 LUMEN-7Q4K 的验证码,然后读取他们的最新帖子(每次请求最多 20 条),查找这个验证码。

Python
from datetime import datetime, timedelta, timezone

CUTOFF = datetime.now(timezone.utc) - timedelta(days=30)


def owns_handle(handle, code):
    page = call("POST", "/user-tweets", json={"username": handle})
    return any(code in t["full_text"] for t in page.get("tweets", []))


def looks_real(user):
    joined = datetime.fromisoformat(
        user["created_at"].replace("Z", "+00:00"))
    return (joined < CUTOFF and user["tweets_count"] >= 10
            and user["followers_count"] >= 5)


def real_entrants(handles):
    keep = []
    for i in range(0, len(handles), 100):
        batch = {"usernames": handles[i:i + 100]}
        users = call("GET", "/info-batch", params=batch)["users"]
        keep += [u["username"] for u in users if looks_real(u)]
    return keep

上面的过滤会剔除注册不满 30 天、帖子少于 10 条或粉丝少于 5 个的账号;数字可以按你的受众调整。用户资料每 1,000 份 $0.014 起,所以过滤 1 万个参与者最低只需 $0.14。想更深入地给可疑名单打分,Twitter 机器人检测指南介绍了区分机器人和真人的各种信号。

须知

把“没有做”和“无法检查”区分开。429、超时,或者达到上限的转发循环,意味着该参与者尚未检查完,而不是没有通过。记录这个状态,稍后重试,只有在明确得到 false 时才拒绝参与者。

#核验一次活动要花多少钱

在 Sorsa API 上核验一次活动,每个参与者的每项任务一次请求,每次 $0.0014 起;在官方 X API 上,同样的证明意味着读取整份列表,每个账号 $0.010,每条帖子 $0.005。

逐项任务来看,Sorsa API 一列始终是一次请求,而官方 X API 一列随读取的每份列表增长,Community 成员身份则根本没有对应条目。

任务Sorsa API官方 X API 路线与价格
关注1 次请求,$0.0014 起读取粉丝或关注列表,每个账号 $0.010
转发报名时 1 次请求,$0.0014 起读取 retweeted_by,每个账号 $0.010,每 15 分钟 75 次请求
引用1 次请求,$0.0014 起读取引用帖子,每条帖子 $0.005
回复1 次请求,$0.0014 起搜索该对话,每条帖子 $0.005
Community1 次请求,$0.0014 起没有接口
归属验证码1 次请求,$0.0014 起读取该用户的帖子,至少 5 条:$0.025
  • 关注

    Sorsa API
    1 次请求,$0.0014 起
    官方 X API 路线与价格
    读取粉丝或关注列表,每个账号 $0.010
  • 转发

    Sorsa API
    报名时 1 次请求,$0.0014 起
    官方 X API 路线与价格
    读取 retweeted_by,每个账号 $0.010,每 15 分钟 75 次请求
  • 引用

    Sorsa API
    1 次请求,$0.0014 起
    官方 X API 路线与价格
    读取引用帖子,每条帖子 $0.005
  • 回复

    Sorsa API
    1 次请求,$0.0014 起
    官方 X API 路线与价格
    搜索该对话,每条帖子 $0.005
  • Community

    Sorsa API
    1 次请求,$0.0014 起
    官方 X API 路线与价格
    没有接口
  • 归属验证码

    Sorsa API
    1 次请求,$0.0014 起
    官方 X API 路线与价格
    读取该用户的帖子,至少 5 条:$0.025

举个例子:1 万个参与者,你的账号有 5 万粉丝,活动要求关注、转发、引用、回复和加入 Community,另外还有归属验证码、资料过滤,以及发奖前的关注复查。这样每个参与者要做 7 项检查,整次活动在 Sorsa API 上最低 $98,按每秒 20 次请求大约需要一个小时。同一场活动走官方 X API(不含它无法执行的 Community 检查)约为 $1,550:两次拉取你的粉丝列表各 $500,转发者 $100,引用和回复 $100,为归属验证码读取时间线 $250,资料 $100。

10K
50K
要核验的任务
$1,550
官方 X API
你的粉丝列表、转发用户和用户资料各按 $0.010 计,帖子按 $0.005 计。没有社群核验,所以不计入。
低至 $98
Sorsa API
每 1,000 次请求 $1.40;Pro 费率 $1.99 时为 $139。

7 次检查/参与者,约 58 分钟可处理完所有参与者,每秒 20 次请求。

设置参与者人数、你的粉丝数和任务;两个合计金额会随之变化。

Sorsa API 按请求计费,而不是按账号,失败的请求从不收费。每 1,000 次请求的费率,从 Starter 的 $4.90 到最大套餐的 $1.40。

#免费跑完你的前 100 次检查

要为每个参与者核验关注、转发、引用、回复和 Community 加入,可以用 Sorsa API:每项检查一次请求,$0.0014 起,所有套餐统一每秒 20 次请求,整个流程中不需要你的任何 X 登录。领取 100 次免费请求,对一条测试帖子跑完上面的四个步骤,并在活动开始前加上归属验证码。如果需要整份粉丝和关注列表,Twitter 粉丝 API指南里的列表路线会讲得更深。

#常见问题

核验 Twitter 关注和转发,哪个 API 最好?

Sorsa API:它用一次请求分别检查关注、转发、引用、回复和 Community 成员身份,每次检查 $0.0014 起,通过一个 API 密钥完成,无需 OAuth 或 X 开发者账号。评判任何方案都可以看四点:对每个参与者能否直接给出是或否、每次检查的价格、速率限制,以及覆盖的操作。Sorsa API 四点都满足:一次调用,每 1,000 次检查 $1.40,所有套餐统一每秒 20 次请求,共六项检查。

能在 X 上核验点赞吗?

不能。自 2024 年 6 月起,X 只向帖子作者显示谁点了赞,所以公开数据 API 无法确认某个参与者点过赞,Sorsa API 也不返回点赞。请改为让参与者转发、引用或回复:这三种都保持公开,Sorsa API 各用一次请求检查。

参与者的账号是私密账号会怎样?

受保护账号的关注和转发都不公开,所以任何外部检查都无法确认。遇到这种情况,Sorsa API 的关注、转发和引用检查会返回 user_protected: true。请在规则里写明参与者在抽奖期间需要公开账号,然后让参与者切换,或按规则拒绝该次参与。

有免费的方式核验 Twitter 关注和转发吗?

有。免费的 Twitter 关注检查工具可以显示一个账号是否关注了另一个,免费的抽奖选取工具会检查每位中奖者的关注。想通过 API 检查每个参与者,Sorsa API 的 100 次免费请求可以做 100 次检查,无需绑卡,也永不过期,足够在选定套餐之前测试一整套活动流程。

核验任务需要 X 开发者账号或 OAuth 吗?

用 Sorsa API 不需要:请求头 ApiKey 里的一个密钥就能读取 X 公开数据,不需要 X 开发者账号、应用、OAuth 流程,也不需要你的参与者登录。官方 X API 在第一次读取之前,要求先有获批的开发者账号、Project 和 App,以及它们的密钥和令牌(X API: Retweets(在新标签页打开))。

#我们如何核实

2026 年 11 月 2 日,我们把本指南中的每个接口、参数和响应字段,与线上的 Sorsa API 参考文档(45 个接口)以及五项检查、/user-tweets、/info-batch 和 /retweeters 的文档页面做了比对;请求和响应使用演示账号。官方 X API 的价格、速率限制和接口来自 docs.x.com,X 的促销规则来自其帮助中心,均在同一天查阅。活动成本是我们根据两份价目表自行计算的。

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

更新内容
  • 全文重写:六项检查附请求与响应,从报名到发奖的抽奖流程,归属验证码与资料过滤,对照今天查到的官方 X API 价目表计算一次活动的成本,并合并了抽奖核验页面。
  • 首次发布。