在 Galxe、Zealy 和 TaskOn 上验证 X(Twitter)任务
Galxe、Zealy 和 TaskOn 通过各自与 X 的连接来检查 X 任务,而且要花钱:Galxe 每确认一次关注或转发消耗 10 点额度,Zealy 则在每个 X 操作上另加 1 到 3 点领取额度。
简短回答: 想要更多次检查,或平台没有的任务(比如加入社群),每个平台都有一种 API 任务,会把参与者的 X 账号发到你的服务器,并等待 5 到 10 秒来获取是或否的回答。用 Sorsa API 来回答它:每个任务一次请求,每次检查 $0.0014 起,100 次免费请求可覆盖你的前 100 次检查。
- 接口
POST /check-follow- 每个任务 1 次请求
- 价格
- 每次检查 $0.0014 起
#Galxe、Zealy 和 TaskOn 如何验证 X 任务
三个平台都通过参与者连接的 X 账号来检查 X 任务,而且各自以自己的方式限制这些检查:Galxe 用验证额度,Zealy 用付费套餐和领取额度,TaskOn 则只提供固定的任务类型。
任务上线之前,免费的 Twitter 关注关系检查可以双向查看一个账号是否关注了另一个,所以你可以手动测试自己的关注任务。下表对比了各平台自带的能力。
| Galxe | Zealy | TaskOn | |
|---|---|---|---|
| 原生 X 任务 | 关注、转发、引用、带关键词发帖 | 关注、发帖、回复、转发、点赞、引用、Space | 关注、转发、点赞、带话题标签或 @ 提及的引用、发帖 |
| 操作是否经过确认? | 只有开启 Authentic Verification 才会确认;默认点一下就算 | 是,来自已连接的账号 | 是,来自已连接的账号 |
| X 检查的成本 | 每次检查 10 点额度,需要 Rewards Hub 2 级或 Business+ | 每个操作 1 到 3 点领取额度,仅限付费套餐 | 包含在 Quest 套餐内 |
| 连接你自己服务器的方式 | REST 凭证 | API 任务 | Completion-Based API Task |
原生 X 任务
- Galxe
- 关注、转发、引用、带关键词发帖
- Zealy
- 关注、发帖、回复、转发、点赞、引用、Space
- TaskOn
- 关注、转发、点赞、带话题标签或 @ 提及的引用、发帖
操作是否经过确认?
- Galxe
- 只有开启 Authentic Verification 才会确认;默认点一下就算
- Zealy
- 是,来自已连接的账号
- TaskOn
- 是,来自已连接的账号
X 检查的成本
- Galxe
- 每次检查 10 点额度,需要 Rewards Hub 2 级或 Business+
- Zealy
- 每个操作 1 到 3 点领取额度,仅限付费套餐
- TaskOn
- 包含在 Quest 套餐内
连接你自己服务器的方式
- Galxe
- REST 凭证
- Zealy
- API 任务
- TaskOn
- Completion-Based API Task
在 Galxe 上,X 任务默认是不经确认的。每个 X 凭证一开始都关闭了 Authentic Verification,使用的是“Page Visit”方式,它只记录参与者打开过链接,而不记录他们是否关注或转发过(见 Galxe: Create Quest, Tasks Settings(在新标签页打开))。开启 Authentic Verification 后,每次关注、转发或引用检查消耗 10 点额度:Rewards Hub 2 级有 1 万点,3 级 4 万点,4 级 8 万点,额度用完后 Galxe 就会关闭检查(见 Galxe: X Authentic Verification Credits(在新标签页打开))。点赞则根本无法开启验证。
Zealy 的 X 任务从参与者已连接的账号检查五种操作,而且除了每次领取本身要花的 1 点额度外,每种操作还要另加领取额度:关注、发帖、引用或回复加 1,转发加 2,点赞加 3(见 Zealy: Twitter task(在新标签页打开))。X 任务只在付费套餐里提供,年付每月 $149 起,超出套餐月度额度的部分,Standard 套餐每 1,000 点 $15(见 Zealy 价格(在新标签页打开))。
TaskOn 在 Quest 套餐里有七种 X 任务类型,每六个月结算一次,每月 $199。它没有回复检查或社群检查,而且它给参与者的帮助要求 X 检查失败的人等 15 分钟,并一次只验证一个任务。
#用 Sorsa API 在你自己的服务器上验证 X 任务
要在 Galxe、Zealy 或 TaskOn 上确认 X 任务而不消耗它们的额度,就把平台的自定义 API 任务指向你自己的一台小服务器,让它去问 Sorsa API,一款 Twitter(X)API 与爬虫:每个任务是一次请求,回答真或假,$0.0014 起,一个 API 密钥,所有套餐统一每秒 20 次请求。
登录仍由平台负责。Zealy 和 TaskOn 会让参与者先连接 X 账号再运行检查,所以你的服务器收到的用户名属于正在领取的那个人。你的服务器用各平台自己的格式回答,不让 Sorsa API 密钥暴露给平台,并运行平台缺少的检查,比如回复或加入社群。
五种任务对应五种 Sorsa API 检查,每种检查都根据响应里的一个字段判定通过。
| 任务 | Sorsa API 请求 | 通过条件 |
|---|---|---|
| 关注一个账号 | POST /check-follow(在新标签页打开) | follow 为 true |
| 转发一条帖子 | POST /check-retweet(在新标签页打开) | retweet 为 true |
| 引用一条帖子 | POST /check-quoted(在新标签页打开) | status 为 quoted |
| 回复一条帖子 | GET /check-comment(在新标签页打开) | commented 为 true |
| 加入一个 X 社群 | POST /check-community-member(在新标签页打开) | is_member 为 true |
关注一个账号
- Sorsa API 请求
POST /check-follow(在新标签页打开)- 通过条件
follow为 true
转发一条帖子
- Sorsa API 请求
POST /check-retweet(在新标签页打开)- 通过条件
retweet为 true
引用一条帖子
- Sorsa API 请求
POST /check-quoted(在新标签页打开)- 通过条件
status为quoted
回复一条帖子
- Sorsa API 请求
GET /check-comment(在新标签页打开)- 通过条件
commented为 true
加入一个 X 社群
- Sorsa API 请求
POST /check-community-member(在新标签页打开)- 通过条件
is_member为 true
官方 X API 没有针对单个参与者作答的请求。它的做法是读取整份列表:你账号的粉丝每页 1,000 个,每个粉丝 $0.001;帖子的转发者每个账号 $0.010,转发者请求每 15 分钟限 75 次(见 X API 价格(在新标签页打开)、X API 速率限制(在新标签页打开))。列表读取塞不进 5 秒的回答时间里,所以这条路在服务器之外还需要同步任务、开发者账号和 OAuth。
#各个 API 任务会向你的服务器发送什么
各平台发送参与者信息的形式不同,读取的回答也不同,所以服务器需要为每个平台写一个小路由。
| Galxe REST 凭证 | Zealy API 任务 | TaskOn Completion-Based API Task | |
|---|---|---|---|
| 请求 | 向你的 URL 发 GET 或 POST | 带 JSON 请求体的 POST | 带 ?address= 的 GET |
| X 用户如何传来 | $socialId,放在你的 URL 里 | accounts.twitter.id 和 .username | 用户名,从不是数字 ID |
| 你的密钥 | 你添加的一个请求头 | X-Api-Key 请求头 | Authorization: Bearer |
| 通过 | 你的表达式返回 1 | HTTP 200 | {"result": {"isValid": true}} |
| 失败 | 你的表达式返回 0 | HTTP 400,附带 message | isValid: false,仍是 HTTP 200 |
| 时间限制 | 5 秒 | 10 秒 | 10 秒,不重试 |
请求
- Galxe REST 凭证
- 向你的 URL 发 GET 或 POST
- Zealy API 任务
- 带 JSON 请求体的 POST
- TaskOn Completion-Based API Task
- 带
?address=的 GET
X 用户如何传来
- Galxe REST 凭证
$socialId,放在你的 URL 里- Zealy API 任务
accounts.twitter.id和.username- TaskOn Completion-Based API Task
- 用户名,从不是数字 ID
你的密钥
- Galxe REST 凭证
- 你添加的一个请求头
- Zealy API 任务
X-Api-Key请求头- TaskOn Completion-Based API Task
Authorization: Bearer
通过
- Galxe REST 凭证
- 你的表达式返回 1
- Zealy API 任务
- HTTP 200
- TaskOn Completion-Based API Task
{"result": {"isValid": true}}
失败
- Galxe REST 凭证
- 你的表达式返回 0
- Zealy API 任务
- HTTP 400,附带
message - TaskOn Completion-Based API Task
isValid: false,仍是 HTTP 200
时间限制
- Galxe REST 凭证
- 5 秒
- Zealy API 任务
- 10 秒
- TaskOn Completion-Based API Task
- 10 秒,不重试
Galxe 的文档没有说明 $socialId 里是 X 用户名还是数字 ID,所以下面的服务器两种都接受:纯数字作为 user_id 发给 Sorsa API,其他的作为 username。
#四步搭建验证服务器
下面的服务器用一个 Node.js 文件应对三个平台,每个平台一个路由,再加一个共用函数,在 Sorsa API 上并行运行一个任务活动的所有检查。
-
获取密钥。 注册并从控制台复制你的 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": "tidewell_protocol", "username_2": "nova_quest_hunter"}'Response200 OK { "follow": true, "user_protected": false } -
描述每个任务活动。 在
QUESTS里,为每个活动写上名称和它的 X 任务:follow填你的用户名,retweet、quote和reply填帖子链接,community填社群的 ID。 -
运行服务器。 保存文件,设置
SORSA_API_KEY和一个足够长的随机RELAY_SECRET,在 HTTPS 之后的 443 或 80 端口上用node verify-server.mjs启动它。Node.js // verify-server.mjs: Node.js 18+, after `npm install express` import express from "express"; const SORSA = "https://api.sorsa.io/v3"; const KEY = process.env.SORSA_API_KEY || "YOUR_API_KEY"; const SECRET = process.env.RELAY_SECRET; // the same value on each platform // The X tasks each quest requires; the URL path names the quest const QUESTS = { "launch-week": { follow: "tidewell_protocol", retweet: "https://x.com/tidewell_protocol/status/2116180244581376001", }, }; async function sorsa(method, path, data) { const url = new URL(SORSA + path); const init = { method, headers: { ApiKey: KEY }, signal: AbortSignal.timeout(4000) }; if (method === "GET") { url.search = new URLSearchParams(data); } else { init.headers["Content-Type"] = "application/json"; init.body = JSON.stringify(data); } const res = await fetch(url, init); if (!res.ok) throw new Error(`Sorsa API ${res.status}`); return res.json(); } // One check per task type, each resolving to true or false const CHECKS = { follow: async (account, u) => (await sorsa("POST", "/check-follow", { username_1: account, ...(u.user_id ? { user_id_2: u.user_id } : { username_2: u.username }), })).follow, retweet: async (post, u) => (await sorsa("POST", "/check-retweet", { tweet_link: post, ...u })).retweet, quote: async (post, u) => (await sorsa("POST", "/check-quoted", { tweet_link: post, ...u })).status === "quoted", reply: async (post, u) => (await sorsa("GET", "/check-comment", { tweet_link: post, ...u })).commented, community: async (id, u) => (await sorsa("POST", "/check-community-member", { community_id: id, ...u })).is_member, }; // The tasks still missing; throws when a check couldn't run async function missing(questId, x) { const quest = QUESTS[questId]; if (!quest || !x) throw new Error("unknown quest or user"); const u = /^\d+$/.test(x) ? { user_id: x } : { username: x.replace(/^@/, "") }; const tasks = Object.entries(quest); const done = await Promise.all(tasks.map(([t, v]) => CHECKS[t](v, u))); return tasks.filter((_, i) => !done[i]).map(([t]) => t); } const app = express(); app.use(express.json()); // Galxe REST credential: GET /galxe/<quest>?user=$socialId const GALXE = { "Access-Control-Allow-Origin": "https://dashboard.galxe.com", "Access-Control-Allow-Methods": "GET, POST, OPTIONS", "Access-Control-Allow-Headers": "Content-Type, X-Relay-Secret", }; app.options("/galxe/:quest", (req, res) => res.set(GALXE).sendStatus(204)); app.get("/galxe/:quest", async (req, res) => { res.set(GALXE); if (req.get("X-Relay-Secret") !== SECRET) return res.status(401).end(); try { const left = await missing(req.params.quest, String(req.query.user)); res.json({ eligible: left.length ? 0 : 1, missing: left }); } catch { res.json({ eligible: 0, missing: ["not checked, try again"] }); } }); // Zealy API task: POST /zealy/<quest>, the secret arrives as X-Api-Key app.post("/zealy/:quest", async (req, res) => { if (req.get("X-Api-Key") !== SECRET) { return res.status(400).json({ message: "Invalid API key" }); } const x = req.body.accounts?.twitter; try { const left = await missing(req.params.quest, x?.id || x?.username); if (!left.length) return res.json({ message: "X tasks verified" }); res.status(400).json({ message: `Not done yet: ${left.join(", ")}` }); } catch { res.status(400).json({ message: "Couldn't check now, retry in a minute" }); } }); // TaskOn Completion-Based API Task: GET /taskon/<quest>?address=<handle> app.get("/taskon/:quest", async (req, res) => { if (req.get("Authorization") !== `Bearer ${SECRET}`) { return res.status(401).json({ result: { isValid: false } }); } let isValid = false; try { const left = await missing(req.params.quest, String(req.query.address)); isValid = left.length === 0; } catch {} // TaskOn reads anything but HTTP 200 as a broken endpoint res.json({ result: { isValid } }); }); app.listen(process.env.PORT || 3000);
一个任务活动每次领取、每个任务花一次请求,而同一次领取的检查是同时运行的,所以五个任务的回答时间和一个任务差不多。每次对 Sorsa API 的调用 4 秒后就会终止,落在 Galxe 的 5 秒窗口之内。
服务器把两种回答区分开。检查返回 false,领取失败,并指出缺少哪个任务。来自 Sorsa API 的超时、429 或 403 则表示服务器没能完成检查,这时会请参与者再试一次,而不是告诉他们没做到:403 表示密钥缺失或请求次数用完,429 表示一秒内发出了超过 20 次请求。失败的请求从不收费。
须知
POST /check-retweet每次请求会扫描一条帖子最新的 100 条转发。参与者刚转发完就点击验证,正好落在这个窗口里;而在有成千上万条转发的帖子上,几天前转发的人就不在了。请让参与者转发后立即验证,或者像 Twitter 验证 API 指南里展示的那样,在后台任务里跟随next_cursor。
#用 REST 凭证连接 Galxe
在 Galxe 上,服务器以 REST 凭证的形式接入:参与者点击验证时,Galxe 调用你的 URL,对返回的 JSON 运行你的表达式,表达式返回 1 就把任务标记为完成。
-
打开凭证。 在任务活动的 Task Settings 里,选择 Import Your Own Data,然后选 REST、GET 方法和 Single Dimension。
-
选择 ID 类型。 选参与者的 X 账号,Galxe 就会把它填入
$socialId。 -
填写接口地址。 使用
https://verify.example.com/galxe/launch-week?user=$socialId,并添加请求头X-Relay-Secret填入你的密钥;Galxe 只向 Space 管理员显示请求头。 -
粘贴表达式。 它必须返回数字 1 或 0,不能是 true 或 false。
Galxe expression function(resp) { return resp && resp.eligible === 1 ? 1 : 0; } -
测试并保存。 发送一个完成了任务的账号和一个没完成的账号,检查两个回答。
Galxe 会取消任何超过 5 秒的请求,只接受 443 和 80 端口,并且在你保存凭证时发送 CORS 预检请求,服务器的 OPTIONS 路由会处理它。请求来自 Galxe 位于 35.185.209.0 和 35.203.155.18 的服务器,所以如果服务器前面有防火墙,要放行这两个地址(见 Galxe Docs: REST credential(在新标签页打开))。表达式本身是公开的,所以不要把密钥放在里面。
#用 API 任务连接 Zealy
在 Zealy 上,服务器成为一个 API 任务:Zealy 发送一个带有参与者 X ID 和用户名的 POST,返回 200 就完成领取,返回 400 则把你的消息显示给参与者。
-
添加任务。 在任务活动编辑器里,选择 Add task,再选 Api。
-
设置接口和密钥。 填入
https://verify.example.com/zealy/launch-week,并把你的密钥作为 API key;Zealy 会把它放在X-Api-Key请求头里发送。 -
选择用 Twitter 识别用户。 这样 Zealy 会在每个请求里带上
accounts.twitter.id和accounts.twitter.username。 -
保存。 Zealy 会先测试这个接口:它必须在 10 秒内回答,且只能返回 HTTP 200 或 400。
想看看 Zealy 会看到什么,可以自己用测试账号发同样的请求:
curl -X POST "https://verify.example.com/zealy/launch-week" \
-H "X-Api-Key: YOUR_RELAY_SECRET" \
-H "Content-Type: application/json" \
-d '{"requestId": "test-1", "accounts": {"twitter":
{"id": "1849021166738190336", "username": "nova_quest_hunter"}}}'
{
"message": "Not done yet: retweet"
}
Zealy 会把这条消息连同这次领取的 requestId 一起显示给参与者,这样他们知道缺了哪个任务,你也能在日志里找到这次领取(见 Zealy: API task(在新标签页打开))。API 任务不属于 Zealy 的 X 任务,所以不会增加 X 额度:这样搭建的任务活动,每次领取只消耗 1 点基础领取额度,而原生的关注加转发要消耗 4 点。
#连接 TaskOn 的 Completion-Based API Task
在 TaskOn 上,服务器是一个 Completion-Based API Task:TaskOn 发送一个 GET,把参与者的 X 用户名放在 address 里,服务器始终以 HTTP 200 回答,把 isValid 设为 true 或 false。
-
添加任务。 在活动或任务里添加一个任务,打开 Custom API 标签页,选择 Completion-Based API Task。
-
设置 API URL。 点击 Set API URL,依次选择 Social Media Account 和 X handle,然后填入
https://verify.example.com/taskon/launch-week。 -
限定只允许 TaskOn 访问。 打开 Restrict API access exclusively to TaskOn,并把你的密钥填为 Bearer 令牌。
-
测试并确认。 输入一个完成了任务的账号和一个没完成的账号,分别点击 Verify,两个回答都正确后点击 Confirm。
TaskOn 每次点击只尝试一次,从不重试,并且把任何非 200 的状态码或缺少 result 都当作接口坏了(见 TaskOn: Completion-Based API Task(在新标签页打开))。这就是当 Sorsa API 无法连接时,服务器回答 isValid: false 的原因:参与者一分钟后再点一次验证,下一次检查会重新运行。
#每条路线上一次通过验证的领取成本
一次需要关注加转发的领取,在开启 Authentic Verification 的 Galxe 上消耗 20 点额度,在使用原生 X 任务的 Zealy 上消耗 4 点领取额度,在 API 任务后面用 Sorsa API 则是 2 次请求,$0.0028 起。
只有 Sorsa API 这条路线是随着你自己的套餐扩展,而不是受平台额度限制的,下表以一次关注加转发的领取为例:
| 路线 | 一次关注加转发的领取消耗 | 能支持多少 |
|---|---|---|
| API 任务后面的 Sorsa API | 2 次请求,$0.0028 起 | 你套餐的请求数能支持多少次领取就有多少次 |
| Zealy,原生 X 任务 | 4 点领取额度,按每 1,000 点 $15 折合 $0.06 | Standard 每月 1 万点额度可支持 2,500 次领取 |
| Zealy,使用 API 任务 | 1 点领取额度加 2 次请求 | 同样的 1 万点额度可支持 1 万次领取 |
| Galxe,Authentic Verification | 20 点 X 验证额度 | 2 级 500 次领取,4 级 4,000 次 |
| API 任务后面的官方 X API | 列表读取:你的每个粉丝 $0.001,每个转发者 $0.010 | 需要开发者账号、OAuth 和同步任务 |
API 任务后面的 Sorsa API
- 一次关注加转发的领取消耗
- 2 次请求,$0.0028 起
- 能支持多少
- 你套餐的请求数能支持多少次领取就有多少次
Zealy,原生 X 任务
- 一次关注加转发的领取消耗
- 4 点领取额度,按每 1,000 点 $15 折合 $0.06
- 能支持多少
- Standard 每月 1 万点额度可支持 2,500 次领取
Zealy,使用 API 任务
- 一次关注加转发的领取消耗
- 1 点领取额度加 2 次请求
- 能支持多少
- 同样的 1 万点额度可支持 1 万次领取
Galxe,Authentic Verification
- 一次关注加转发的领取消耗
- 20 点 X 验证额度
- 能支持多少
- 2 级 500 次领取,4 级 4,000 次
API 任务后面的官方 X API
- 一次关注加转发的领取消耗
- 列表读取:你的每个粉丝 $0.001,每个转发者 $0.010
- 能支持多少
- 需要开发者账号、OAuth 和同步任务
每个任务每次领取一次请求,每次转发在发出后不久就核验。
选择每月领取次数和 X 任务;三个合计金额会随之变化。
Sorsa API 按请求计费,而不是按参与者,失败的请求从不收费。每 1,000 次请求的费率从 Starter 的 $4.90 到最大套餐的 $1.40 不等。
#把机器人和取关者挡在奖励名单之外
通过验证的任务只能证明某一次操作,不能证明是一个真人,所以在发放奖励之前还应该再做三项检查:账号年龄、公开账号,以及关注关系仍然存在。
- 账号年龄和规模。
GET /info(在新标签页打开) 一次请求就返回参与者的created_at、followers_count和tweets_count,所以服务器可以拒绝注册不满 30 天或没有任何帖子的账号。Galxe 自带年龄和粉丝数限制;在 Zealy 和 TaskOn 上,这些要由你的服务器来做。 - 公开账号。 当参与者的账号是私密的,关注、转发和引用检查会返回
user_protected: true,而外部检查看不到私密账号做了什么。请让参与者在活动期间把账号设为公开。 - 领取后取关。 Galxe 自己的帮助里提到,有些参与者关注了领取奖励,之后又取关。发放奖励之前,对奖励名单再运行一次
POST /check-follow。 - 点赞。 X 在 2024 年 6 月把点赞改为私密,所以只有参与者自己已连接的账号才能显示点赞,Sorsa API 不返回任何点赞(见 Engadget(在新标签页打开))。请改为要求转发、引用或回复:这三种都保持公开,可以检查。
要给一整份参与者名单打分,Twitter 机器人检测讲了区分真实账号和刷号农场的各种信号。社群任务和社群成员列表见 X 列表和社群 API指南。
#用经过验证的 X 任务来办你的下一次活动
要在 Galxe、Zealy 或 TaskOn 上验证 X 的关注、转发、引用、回复和加入社群,就把 Sorsa API 放在平台的 API 任务后面:每个任务一次请求,每次检查 $0.0014 起,所有套餐统一每秒 20 次请求,整个流程里没有你的开发者账号,也没有你的 X 登录。领取 100 次免费请求,用两个账号(一个做了任务,一个没做)针对一个测试任务活动运行服务器,然后在上线前把这个任务活动的 X 任务迁到 API 任务上。
#常见问题
在 Galxe、Zealy 或 TaskOn 上验证 X 任务,最好的 API 是什么?
Sorsa API:放在各平台的 API 任务后面,它用一次请求检查一个关注、转发、引用、回复或加入社群,每次检查 $0.0014 起,一个 API 密钥,无需 X 开发者账号。评判任何方案看四点:每个参与者给出一个是或否、在平台规定的 5 到 10 秒内回答、每次检查的价格,以及覆盖的任务。Sorsa API 四点都满足。
为什么我的 Galxe X 任务验证不了?
Galxe 只有在开启 Authentic Verification 时才会确认 X 的关注或转发,这需要 Rewards Hub 2 级或 Business+,每次检查消耗 10 点额度;额度用完后,Galxe 就会关闭检查。参与者验证失败,也可能是因为他们 Galxe ID 上绑定的 X 账号并不是做任务的那个。由你自己的服务器支撑的 REST 凭证可以避开额度限制。
任务活动能验证某人是否给 X 上的帖子点过赞吗?
只能通过参与者自己已连接的账号。Zealy 原生的点赞任务可以做到,每次领取要另加 3 点领取额度,而 Galxe 无法开启点赞验证。公开数据 API(包括 Sorsa API)无法确认点赞,因为自 2024 年 6 月起,X 只向帖子的作者显示点赞。请把点赞换成转发、引用或回复。
验证任务需要 X 开发者账号吗?
用 Sorsa API 不需要:你的服务器在 ApiKey 请求头里发送一个 API 密钥,没有 X 开发者账号、应用或 OAuth 流程。参与者只需像往常一样把 X 账号连接到 Galxe、Zealy 或 TaskOn。官方 X API 则要求先有开发者账号和带 OAuth 的应用,才能读取第一条数据。
我能免费测试 X 任务验证吗?
可以。每个 Sorsa API 账号都有 100 次免费请求,足够 100 次检查:无需绑卡,永不过期。这足以用几个测试账号在 Galxe、Zealy 和 TaskOn 上完整测试服务器,而免费的 Twitter 关注关系检查不用写代码就能回答单个关注问题。
#我们如何核实
2026 年 11 月 2 日,我们阅读了各平台关于 X 任务和自定义 API 任务的官方文档:Galxe 的帮助中心和 REST 凭证文档,Zealy 的任务文档和价格页面,以及 TaskOn 的开发者文档和指南手册。我们把代码里用到的每个 Sorsa API 接口、参数和响应字段与在线 API 参考文档(45 个接口)逐一对照,并在同一天从 docs.x.com 取得官方 X API 的价格和速率限制。请求和响应使用的是演示账号,额度和成本数字是我们根据已公布的费率自己算出来的。
Sources
- Galxe Help Center: Create Quest, Tasks Settings(在新标签页打开)
- Galxe Help Center: X Authentic Verification Credits(在新标签页打开)
- Galxe Docs: REST credential(在新标签页打开)
- Zealy docs: Twitter task(在新标签页打开)
- Zealy docs: API task(在新标签页打开)
- Zealy pricing(在新标签页打开)
- TaskOn Developer Center: Completion-Based API Task(在新标签页打开)
- Sorsa API reference: Check Follow(在新标签页打开)
- Sorsa API reference: Check Retweet(在新标签页打开)
- X API pricing(在新标签页打开)
- X API rate limits(在新标签页打开)
- Engadget: X is officially making likes (mostly) private for everyone(在新标签页打开)