用 API 核验 Twitter 关注与转发
API 核验 X 上的关注、转发、引用或回复时,会把一个账号与一项操作对照检查,只回答 true 或 false;官方 X API 没有这类检查,只能读取整份列表,每个账号 $0.010。
简短回答: 每种操作各有一项检查:关注、转发、引用、回复或加入 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 Community | Community 和用户名 | 没有接口 |
| 拥有该用户名 | 用户名和他们发布的验证码 | 读取该账号的帖子 |
| 点赞了某条帖子 | 无法检查 | 只有帖子作者能看到点赞者 |
关注了某个账号
- 一次检查需要什么
- 双方的用户名
- 官方 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-follow | follow:true 或 false |
| 转发了你的帖子 | POST /check-retweet | retweet,以及超出最新 100 个之后的 next_cursor |
| 引用了你的帖子 | POST /check-quoted | status:quoted、retweet 或 not_found,并附引用的文字 |
| 回复了你的帖子 | GET /check-comment | commented,以及回复本身 |
| 加入了你的 X Community | POST /check-community-member | is_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 请求头里。
-
获取密钥。 注册后从控制台复制你的 API 密钥。前 100 次请求免费,无需绑卡。
-
检查关注。 把你的用户名作为
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 } -
检查帖子任务。 把帖子链接和参与者的用户名,以 JSON 请求体发给
POST /check-retweet,以查询参数发给GET /check-comment。 -
合并结果。 只有当所有必需的检查都返回 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。
#检查用户是否转发了你的帖子
POST /check-retweet(在新标签页打开) 按从新到旧的顺序,每次扫描帖子的 100 条转发,找到参与者后返回 retweet: true;如果前 100 条里没有,next_cursor 会接着扫描下一个 100 条。
在参与者等待时做的转发检查,比如他们刚在任务页面点下“验证”,转发会排在最新的 100 条里,所以一次请求就能回答。如果有人在一条爆款帖子刚发布时就转发了,位置会更深:下面的循环会沿着 cursor 翻页,直到你设定的上限,上限用完时报告“尚未检查完”,而不是“否”。
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,如果有引用,还会附上引用的文字和日期。有了这段文字,你就能执行诸如最短字数或活动话题标签之类的规则。
{
"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,但没有列出成员或检查成员身份的接口。
#从报名到发奖,核验一次抽奖
一次经过核验的抽奖分三步:收集每个参与者的用户名,对每项必需任务各做一次检查,只给通过全部检查的参与者发奖。
-
收集用户名和验证码。 在报名表单里询问 X 用户名,并给每个参与者一个一次性的短验证码让他们发布,以此证明这个用户名是他们本人的(见下一节)。
-
每项任务检查一次。 可以在报名时检查,得到即时答案,也可以在报名截止后检查;下面的图表会按你的规模选出更便宜的路线。
-
复查,再发奖。 发奖前对获奖者再运行一次
/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 条),查找这个验证码。
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 |
| Community | 1 次请求,$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。
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 reference: Check Follow(在新标签页打开)
- Sorsa API reference: Check Retweet(在新标签页打开)
- Sorsa API reference: Check Quote or Retweet(在新标签页打开)
- Sorsa API reference: Check Comment(在新标签页打开)
- Sorsa API reference: Check Community Membership(在新标签页打开)
- X API pricing(在新标签页打开)
- X API rate limits(在新标签页打开)
- X API: Follows(在新标签页打开)
- X API: Retweets(在新标签页打开)
- X Help Center: Guidelines for Promotions on X(在新标签页打开)
- Engadget: X is officially making likes (mostly) private for everyone(在新标签页打开)