X

API 开发文档

XiaoyuSMS 平台 RESTful API 接口文档 v1.0
返回前台 调试工具
概述
规则
认证
钱包
发码
接码
示例
调试
服务地址
http://{{ location.host }}
认证方式
Cookie / Bearer Token
数据格式
JSON (UTF-8)

响应格式

大多数接口返回 JSON,注册验证码接口返回 SVG 图片;成功 HTTP 200,失败返回对应状态码和 error 字段

成功响应
{ "message": "操作成功" }
失败响应
{ "error": "错误原因描述" } // HTTP 400 参数错误 | 401 未登录 | 429 频率限制 | 500 服务器错误

调用流程

本系统支持两种鉴权方式:① Cookie Session(浏览器/支持Cookie的HTTP客户端)② Bearer Token(脚本/自动化工具推荐)。登录接口同时返回 Cookie 和 token,选其一即可。

1. 登录获取Token
2. 查余额(<1则充值)
3. 取号 /api/get-phone
4. 发码 /api/verify
5. 轮询 /api/sms/status
6. 接码 /api/sms/import(可选)
Token 认证方式:登录成功后响应 JSON 中包含 token 字段,后续请求在 Header 中添加 Authorization: Bearer {token} 即可。Token 有效期 24 小时,修改密码后立即失效。
常见对接失败原因:① 没充值,余额 < 1;② 接码时没先发过同号码的 safe 类型短信;③ 跑接码时同号 3 分钟内已请求过(返回 count=0);④ 管理员开了维护模式,所有接口被拦截;⑤ Token 24 小时过期没刷新;⑥ /api/verify 没传 verify_code(mobile/alphanum 类型必填)。

公开接口(无需登录)

{{ api.method }} {{ api.path }} 公开
{{ api.desc }}
响应示例
{{ api.response }}

7 种验证类型 type 参数详解

每种 type 在 /api/get-phone、/api/verify、/api/sms/import 中使用方式不同,下面给出完整的请求体示例

type 代码中文名
risk风险验证
safe安全手机
safe_new新安全手机
alphanum字母数字
change_safe_phone更换安全手机
mobile手游
change_password修改密码
详细的必填字段、限额、接码前置规则见下方"取号 → 发码 完整示例"和"业务规则"。

取号 → 发码 完整示例(每种 type)

① risk(风险验证)
// 1. 取号 POST /api/get-phone { "type": "risk" } // 2. 发码(取号返回的 phone 建议透传,也可省略) POST /api/verify { "type": "risk", "phone": "17600001111" }
② safe(安全手机)
POST /api/get-phone { "type": "safe" } POST /api/verify { "type": "safe", "phone": "17600001111" }
③ safe_new(新安全手机)
POST /api/get-phone { "type": "safe_new" } POST /api/verify { "type": "safe_new", "phone": "17600001111" }
④ alphanum(字母数字,verify_code 必填)
POST /api/get-phone { "type": "alphanum" } POST /api/verify { "type": "alphanum", "phone": "17600001111", "verify_code": "ABCD1234" } // 注意:verify_code 即为发送的短信内容
⑤ change_safe_phone(更换安全手机,phone 必填且严格 11 位)
POST /api/get-phone { "type": "change_safe_phone" } POST /api/verify { "type": "change_safe_phone", "phone": "17600001111" } // phone 必须 11 位以 1 开头,否则 400 "手机号格式错误"
⑥ mobile(手游,verify_code 必填,目标号不同)
POST /api/get-phone { "type": "mobile" } POST /api/verify { "type": "mobile", "phone": "17600001111", "verify_code": "888888" } // verify_code 即为发送内容;本类型短信目标号为 1069016373035
⑦ change_password(修改密码,phone 必填)
POST /api/get-phone { "type": "change_password" } POST /api/verify { "type": "change_password", "phone": "17600001111" } // phone 必须 11 位以 1 开头

接码示例(普通用户接码前置规则)

普通用户必须先成功完成 safe / safe_new / alphanum / change_safe_phone 任一类型的发码,才能调用 /api/sms/import;并且 phone 必须是自己曾经发码 success 过的号码。risk / mobile / change_password 这三种类型本身不能作为接码前置条件。
// 接码(必须先满足前置条件 + 号码绑定) GET /api/sms/import?phone=17600001111&type=safe // 返回:count=0 表示暂未收到,需要继续轮询(建议 2-3 秒间隔)

错误码与典型错误

所有错误返回格式为 { "error": "原因描述" },HTTP 状态码见下表

HTTP含义典型 error 内容
400参数/业务校验失败余额不足 / 手机号格式错误 / 请先获取图形验证码 / 接码号码必须是您发码成功的号码
401未登录或登录失效未登录 / token无效或已过期 / 密码已修改,请重新登录 / 账号已被封禁
404资源不存在任务不存在 / 用户不存在
429限流登录失败次数过多 / 注册过于频繁
500服务器错误三方接口异常 / 数据库错误(一般可重试)
401 特殊响应: 当 session 因密码变更/账号被禁用而失效时,返回体除 error 外还会包含 "kicked": true"scope": "user"|"admin",客户端应据此清空本地登录态。

用户登录

登录成功后服务器返回 Set-Cookie,后续所有需登录接口必须携带该 Cookie;账号 ID 支持纯数字或字母数字字符串

{{ api.method }} {{ api.path }} {{ api.auth?'需登录':'公开' }}
{{ api.desc }}
参数类型必填说明
{{ p.name }}{{ p.type }}{{ p.required?'是':'否' }}{{ p.desc }}
请求体
{{ formatJson(api.body) }}
响应示例
{{ api.response }}

余额与充值

查询余额、卡密充值、用户资料等钱包相关接口

{{ api.method }} {{ api.path }} 需登录
{{ api.desc }}
参数类型必填说明
{{ p.name }}{{ p.type }}{{ p.required?'是':'否' }}{{ p.desc }}
请求体
{{ formatJson(api.body) }}
响应示例
{{ api.response }}

发码接口

发码是异步任务:先取号,再创建发码任务,最后轮询状态接口直到 success/failed

{{ api.method }} {{ api.path }} {{ api.auth?'需登录':'公开' }}
{{ api.desc }}
参数类型必填说明
{{ p.name }}{{ p.type }}{{ p.required?'是':'否' }}{{ p.desc }}
请求体
{{ formatJson(api.body) }}
响应示例
{{ api.response }}

接码接口

接收短信验证码,需要余额和接码权限

{{ api.method }} {{ api.path }} {{ api.auth?'需登录':'公开' }}
{{ api.desc }}
参数类型必填说明
{{ p.name }}{{ p.type }}{{ p.required?'是':'否' }}{{ p.desc }}
响应示例
{{ api.response }}

多语言调用示例

完整的登录 → 取号 → 发码 → 查状态流程,支持 curl / Java / 易语言 / 懒人精灵

curl
Java
易语言
懒人精灵
1

登录获取 Cookie

POST 请求登录接口,-c 保存 Cookie 到文件

# 登录并保存Cookie curl -X POST http://{{ location.host }}/api/users/login \ -H "Content-Type: application/json" \ -d '{"user_id":"your_user_id","password":"yourpwd"}' \ -c cookies.txt # 响应: {"message":"登录成功","user_id":"your_user_id","is_superuser":false,"user_type":"普通用户"}
2

查询余额

-b 读取之前保存的 Cookie 文件

curl http://{{ location.host }}/api/users/balance \ -b cookies.txt # 响应: {"balance":30.5}
3

取号

获取一个可用手机号,返回 phone 和 com。type 这里用 safe(安全手机),它能同时用于发码和接码

curl -X POST http://{{ location.host }}/api/get-phone \ -H "Content-Type: application/json" \ -d '{"type":"safe"}' \ -b cookies.txt # 响应: {"phone":"17600001111","com":"33","link_id":1,"verify_type":"safe"}
4

发码

创建发码任务并异步发送,需继续轮询状态;最终 success 后扣费 1 元

curl -X POST http://{{ location.host }}/api/verify \ -H "Content-Type: application/json" \ -d '{"type":"safe","phone":"17600001111"}' \ -b cookies.txt # 响应: {"token":"xxx","com":"33","phone":"17600001111","task_id":"uuid","command":"COM33##..."}
5

查状态

轮询任务状态,直到返回 success 或 failed(建议间隔 2 秒)

curl "http://{{ location.host }}/api/sms/status?token=返回的token&com=33&sendtype=safe&sendtext=" # 响应: {"status":"success","message":"发送成功"}
6

接码(收验证码短信)

发码 success 后调接码接口,必须用同一个 phone 和 type;count>0 时扣 1 元

curl "http://{{ location.host }}/api/sms/import?phone=17600001111&type=safe" \ -b cookies.txt # 响应: {"cached":false,"count":1,"messages":[{"verify_code":"123456","content":"...","number":"10690163331","com":"33"}]} # count=0 表示暂未收到,需继续轮询(间隔 2-3 秒)
1

初始化 HTTP 客户端

使用 OkHttp + CookieJar 自动管理 Cookie

// 依赖:okhttp + okhttp-urlconnection import okhttp3.*; import okhttp3.JavaNetCookieJar; import java.net.CookieManager; import java.net.CookiePolicy; CookieManager cookieManager = new CookieManager(); cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); OkHttpClient client = new OkHttpClient.Builder() .cookieJar(new JavaNetCookieJar(cookieManager)) .build(); MediaType JSON = MediaType.parse("application/json");
2

登录

CookieJar 会自动保存并在后续请求中发送 Cookie

RequestBody loginBody = RequestBody.create( "{\"user_id\":\"your_user_id\",\"password\":\"yourpwd\"}", JSON); Request loginReq = new Request.Builder() .url("http://{{ location.host }}/api/users/login") .post(loginBody).build(); Response loginRes = client.newCall(loginReq).execute(); System.out.println(loginRes.body().string()); // {"message":"登录成功","user_id":"your_user_id","is_superuser":false,"user_type":"普通用户"}
3

取号 + 发码

自动携带 Cookie,无需手动处理。type 用 safe(安全手机),能同时用于发码和接码

// 取号 Request phoneReq = new Request.Builder() .url("http://{{ location.host }}/api/get-phone") .post(RequestBody.create("{\"type\":\"safe\"}", JSON)) .build(); String phoneJson = client.newCall(phoneReq).execute().body().string(); // {"phone":"17600001111","com":"33","link_id":1,"verify_type":"safe"} String phone = "17600001111"; // 从 phoneJson 解析得到 // 发码 Request verifyReq = new Request.Builder() .url("http://{{ location.host }}/api/verify") .post(RequestBody.create( "{\"type\":\"safe\",\"phone\":\"" + phone + "\"}", JSON)) .build(); String verifyResult = client.newCall(verifyReq).execute().body().string(); // {"token":"xxx","com":"33","phone":"17600001111","task_id":"uuid","command":"..."} String smsToken = "xxx"; // 从 verifyResult 解析 token String com = "33"; // 从 verifyResult 解析 com
4

轮询状态

每 2 秒查一次,直到 status=success 或 failed,最多 30 秒

for (int i = 0; i < 15; i++) { Thread.sleep(2000); Request statusReq = new Request.Builder() .url("http://{{ location.host }}/api/sms/status?token=" + smsToken + "&com=" + com + "&sendtype=safe&sendtext=") .get().build(); String s = client.newCall(statusReq).execute().body().string(); if (s.contains("\"success\"")) { System.out.println("发送成功"); break; } if (s.contains("\"failed\"")) { System.out.println("发送失败"); break; } }
5

接码(收验证码短信)

必须用刚发码的 phone 和同样的 type;count>0 时扣 1 元

Request smsReq = new Request.Builder() .url("http://{{ location.host }}/api/sms/import?phone=" + phone + "&type=safe") .get().build(); String smsResult = client.newCall(smsReq).execute().body().string(); // {"cached":false,"count":1,"messages":[{"verify_code":"123456",...}]} // count=0 表示暂未收到,需要循环轮询(2-3 秒间隔)
1

声明变量

使用网页访问对象(精易模块或系统自带)

.局部变量 网页, 网页访问对象 .局部变量 返回文本, 文本型 .局部变量 Cookie, 文本型 .局部变量 手机号, 文本型
2

登录并保存 Cookie

注意 JSON 用 UTF-8 编码提交,不要用 GBK

' 登录 网页.打开 ("POST", "http://{{ location.host }}/api/users/login") 网页.设置请求头 ("Content-Type", "application/json") 网页.发送 (到字节集 ("{""user_id"":""your_user_id"",""password"":""yourpwd""}")) Cookie = 网页.取回应头 ("Set-Cookie") 返回文本 = 网页.取回应文本 () ' 返回: {"message":"登录成功"}
3

带 Cookie 调用业务接口

每次请求都要带上登录时获取的 Cookie

' 取号(type 用 safe,能同时用于发码和接码) 网页.打开 ("POST", "http://{{ location.host }}/api/get-phone") 网页.设置请求头 ("Content-Type", "application/json") 网页.设置请求头 ("Cookie", Cookie) 网页.发送 (到字节集 ("{""type"":""safe""}")) 手机号 = 取JSON值 (网页.取回应文本 (), "phone") ' 发码 网页.打开 ("POST", "http://{{ location.host }}/api/verify") 网页.设置请求头 ("Content-Type", "application/json") 网页.设置请求头 ("Cookie", Cookie) 网页.发送 (到字节集 ("{""type"":""safe"",""phone"":""" + 手机号 + """"}"))
兼容说明:本平台所有 POST 接口同时支持 application/jsonapplication/x-www-form-urlencoded 两种格式。懒人精灵推荐使用 Token 认证 + 表单格式,无需处理 Cookie。
1

登录获取 Token

登录后从返回的 JSON 中提取 token,后续所有请求在 Header 带上 Authorization: Bearer token

local baseUrl = "http://{{ location.host }}" -- 登录(表单格式) local code, body = httpPost( baseUrl .. "/api/users/login", "user_id=your_user_id&password=yourpwd" ) local token = body:match('"token":"(.-)"') print("登录结果: " .. body) print("Token: " .. (token or "获取失败")) -- 构造认证 Header(后续所有请求都带这个) local authHeader = "Authorization: Bearer " .. (token or "")
2

取号

带 Token 请求取号接口,解析返回的 phone

-- 取号(表单格式 + Token,type 用 safe,能同时用于发码和接码) local code2, body2 = httpPost( baseUrl .. "/api/get-phone", "type=safe", {authHeader} ) local phone = body2:match('"phone":"(.-)"') local com = body2:match('"com":"(.-)"') print("取号: " .. (phone or "失败"))
3

发码

表单提交发码请求,带 Token 认证

-- 发码(表单格式 + Token) local code3, body3 = httpPost( baseUrl .. "/api/verify", "type=safe&phone=" .. (phone or ""), {authHeader} ) local smsToken = body3:match('"token":"(.-)"') print("发码结果: " .. body3)
4

查状态(轮询)

GET 请求轮询,每2秒查一次,直到 success 或 failed(此接口无需登录)

-- 轮询状态(每2秒查一次,最多30秒) for i = 1, 15 do mSleep(2000) local code4, body4 = httpGet( baseUrl .. "/api/sms/status?token=" .. (smsToken or "") .. "&com=" .. (com or "") .. "&sendtype=safe&sendtext=" ) if body4:find('"success"') then print("发送成功!") break elseif body4:find('"failed"') then print("发送失败: " .. body4) break end end
5

接码(可选)

发码成功后查收验证码短信,需带 Token

-- 接码(GET 请求 + Token,必须用刚发码的 phone 和同样的 type) local code5, body5 = httpGet( baseUrl .. "/api/sms/import?phone=" .. (phone or "") .. "&type=safe", {authHeader} ) local verifyCode = body5:match('"verify_code":"(.-)"') print("收到验证码: " .. (verifyCode or "暂无"))

切换其他验证类型时怎么改

上面 4 种语言示例统一用 safe(最简单,能直接跑通)。如果你要用其他 type,只需把请求中的 type 字段替换成下面对应的值,并按"必填字段"加上参数即可

用途type 值取号 body发码 body(最小)能接码?
风险验证 risk {"type":"risk"} {"type":"risk","phone":"取号返回的phone"} ❌ 不能作前置
安全手机 safe {"type":"safe"} {"type":"safe","phone":"取号返回的phone"} ✅ 可接码
新安全手机 safe_new {"type":"safe_new"} {"type":"safe_new","phone":"取号返回的phone"} ✅ 可接码
字母数字 alphanum {"type":"alphanum"} {"type":"alphanum","phone":"取号phone","verify_code":"ABCD1234"} ✅ 可接码
更换安全手机 change_safe_phone {"type":"change_safe_phone"} {"type":"change_safe_phone","phone":"11位手机号"} ✅ 可接码
手游 mobile {"type":"mobile"} {"type":"mobile","phone":"取号phone","verify_code":"888888"} ❌ 不能作前置
修改密码 change_password {"type":"change_password"} {"type":"change_password","phone":"11位手机号"} ❌ 不能作前置
3 条必读规则:
verify_code 必填的 type:alphanummobile。verify_code 的内容就是要发送的短信正文(自己定,例如 "ABCD1234" 或 "888888")。
phone 必须传且必须 11 位以 1 开头的 type:change_safe_phonechange_password。其他 type 的 phone 可省略,但建议透传取号接口返回的 phone 以保证接码绑定。
能作接码前置条件的 type 只有 4 种:safe / safe_new / alphanum / change_safe_phone。如果你要用 risk/mobile/change_password 接码,必须先用上面 4 种之一发码成功一次(管理员豁免)。

举例:把示例改成"手游(mobile)"类型

// 1. 取号 → type 改成 mobile POST /api/get-phone {"type":"mobile"} // 2. 发码 → type 改成 mobile,并加 verify_code(即短信内容) POST /api/verify {"type":"mobile","phone":"取号phone","verify_code":"888888"} // 3. 查状态 → sendtype 也改成 mobile GET /api/sms/status?token=...&com=...&sendtype=mobile&sendtext= // 4. 想接 mobile 的码?要先用 safe/safe_new/alphanum/change_safe_phone 之一发码成功才能接

举例:把示例改成"字母数字(alphanum)"类型

// 1. 取号 → type 改成 alphanum POST /api/get-phone {"type":"alphanum"} // 2. 发码 → type 改成 alphanum,加 verify_code(即短信内容) POST /api/verify {"type":"alphanum","phone":"取号phone","verify_code":"ABCD1234"} // 3. 查状态 → sendtype=alphanum GET /api/sms/status?token=...&com=...&sendtype=alphanum&sendtext= // 4. 接码 → alphanum 本身就能作接码前置,所以可以直接接 GET /api/sms/import?phone=取号phone&type=alphanum
注意事项:① POST 请求同时支持 JSON(Content-Type: application/json)和表单(application/x-www-form-urlencoded)两种格式;② 认证方式二选一:Cookie 或 Bearer Token(推荐脚本使用 Token);③ Token 有效期 24 小时,修改密码后失效;④ 发码成功后扣费 1 元,请确保余额充足;⑤ 查询状态建议间隔 2 秒轮询,避免过于频繁。

在线调试工具

点击其他标签页的接口可自动填充到调试器。登录接口调试成功后浏览器自动保存 Cookie。

发送请求 填入登录 填入取号 填入发码
响应结果
{{ debug.response || '等待请求...' }}