写个脚本自动接码:API 完整上手指南
从创建 API Key 到下单、轮询拿码的完整流程,附带真实可运行的 curl 示例、限流规则和常见踩坑点。
网页够用的场景:你偶尔注册个账号,手动点几下、等一条短信。不够用的场景:你在写自动化测试、 批量注册脚本、CI 流水线,或者机器人需要在无人值守时自己拿到验证码。这些场景网页做不到, API 能。这篇文章把从零到跑通整套流程需要知道的都写在一处。
第一步:拿到 API Key
登录后去 /account/api-keys 创建一个。key 长这样:jm_ 开头一串随机串,创建时明文只显示一次,我们数据库里存的是它的哈希,之后连你自己都看不到原文 —— 丢了就只能删掉重建,没有"找回"这一说。
所有请求都用标准 Bearer 认证:
Authorization: Bearer jm_your_keykey 和密码同等敏感 —— 不要提交进公开代码仓库,不要贴在聊天记录里发给别人调试。 如果怀疑泄露了,回 /account/api-keys 删掉重建一个,旧 key 立即失效。
第二步:挑服务和国家
下单需要两个东西:service(服务代码)和 country(国家 id)。 先查目录:
curl https://jiema.my/api/v1/services \
-H "Authorization: Bearer jm_your_key"返回里每一项都有 code(比如 Telegram 是 tg)—— 这个字段直接传给下单接口最稳, 比自己拼 slug 少一层转换出错的机会。想看某个服务在各国的实时价格和库存,加一个 service 参数:
curl "https://jiema.my/api/v1/prices?service=tg" \
-H "Authorization: Bearer jm_your_key"返回的 items 里每条带 countryId / priceCents / count(当前可用号码数)—— 下单前看一眼 count,等于 0 的国家现在下单必定失败,别浪费一次调用额度。
第三步:下单
curl -X POST https://jiema.my/api/v1/orders \
-H "Authorization: Bearer jm_your_key" \
-H "Content-Type: application/json" \
-d '{"service":"tg","country":"6"}'成功会拿到一个手机号和到期时间:
{
"ok": true,
"data": {
"id": "cm...",
"status": "WAITING",
"phone": "62812xxxxxxx",
"expiresAt": "2026-08-01T12:15:00.000Z",
"chargedCents": "40"
}
}钱在这一步已经扣了 —— chargedCents 是实际扣款额(单位分)。把这个号码交给目标 App 接收验证码, 然后进入下一步等结果。
第四步:轮询拿验证码
没有 WebSocket,也没有 webhook 推送 —— 拿短信内容靠轮询 GET /api/v1/orders/:id, 直到 smsBody 不再是 null:
while true; do
RESP=$(curl -s https://jiema.my/api/v1/orders/$ORDER_ID \
-H "Authorization: Bearer jm_your_key")
BODY=$(echo "$RESP" | jq -r '.data.smsBody')
if [ "$BODY" != "null" ]; then
echo "Code received: $BODY"
break
fi
sleep 5
done5 秒一次是个合理起点 —— 号码 15 分钟内有效,60 次/分钟的查询限流留了很大余量。 真的没耐心,3 秒也够用;没必要 1 秒一次地打,除了浪费限流额度不会让码来得更快。
常见坑
- 限流按用户算,不按 key 算。写接口(下单 / 取消 / 要下一条)每用户 10 次/分钟,查询接口 60 次/分钟 —— 建多个 key 分流没用,撞的是同一个上限。
- 号码 15 分钟后过期。过期还没收到码会自动退款,不用你手动申请;但如果程序逻辑 等太久才把号码交出去用(比如卡在队列里),到期后目标 App 再发码这个号也收不到了。
- 一个号可以连续收多条码。如果目标 App 分两步发验证码(先一条确认注册、 再一条登录码),第一条收到后调
POST /api/v1/orders/:id/next-sms告诉我们 "这条处理完了,请继续等下一条",不用重新下单占用新号码。 - 已经收到码就不能取消退款。
POST /api/v1/orders/:id/cancel在号码 还没收到码时可以随时调用、立即退款;一旦smsBody非空过,这个接口会直接返回CODE_RECEIVED错误 —— 钱已经买到了东西,这条路走不通。 - 状态别只查一次就放弃。
status会经历WAITING→RECEIVED;如果一直卡在WAITING直到过期,大概率是目标国家 / 服务 组合当下的到码率问题,换个国家重新下单比死等更快出结果。
接下来
以上覆盖了下单到拿码的主流程。完整字段列表、错误码、每个接口的边界情况,/api-docs 里有更详细的参考。如果你的场景是批量而不是单条 —— 比如要同时维护 几十个账号的验证码接收 —— 轮询逻辑要按订单各自独立计时,不要在一个循环里排队串行等, 不然前面的号过期了后面的还没轮到。
每位邀请用户的每笔订单,你都拿 10%
无封顶、无有效期。分享你的链接,对方账户终身贡献佣金。