积分 · 等级 · 身份 · 记录
双请求头鉴权 · 加密传输
GET 读取 · JSON 数据格式
curl 'https://api.astudlox.top/api/v1/users/<ROBLOX_USER_ID>' \ -H 'X-App-ID: <APP_ID>' \ -H 'X-API-Key: <API_KEY>'
展示统一响应结构,数据字段已省略。此操作不发送网络请求。
{
"success": true,
"code": 200,
"message": "ok",
"data": { "…": "业务数据,详见返回结果" },
"meta": { "…": "请求标识、耗时与缓存状态" }
}为你的场景,找到接口。
统一的请求方式,专注不同的数据需求。
/api/v1/users/{robloxuserid}用户数据汇总GET/api/v1/users/{robloxuserid}/pointsR 点积分GET/api/v1/users/{robloxuserid}/level等级信息GET/api/v1/users/{robloxuserid}/experience经验值GET/api/v1/users/{robloxuserid}/roles身份组GET/api/v1/users/{robloxuserid}/violations违规记录GET/api/v1/users/{robloxuserid}/violation-status违规账号查询GET/api/v1/cards/random卡片随机抽取GET/health健康检查1接口概览
本服务按 Roblox 用户 ID 查询用户的违规库记录、R 点积分、身份组、经验值与等级。
所有接口均为 GET,响应为 application/json,
仅支持 HTTPS。数据来源于机器人插件的只读数据库,服务本身不写入任何数据。
基础信息
| 项 | 值 |
|---|---|
| 服务地址 | https://api.astudlox.top |
| 接口版本 | v1(路径前缀 /api/v1) |
| 请求方法 | GET(全部业务接口) |
| 请求 Content-Type | 不适用(GET 无请求体) |
| 响应 Content-Type | application/json |
| 字符编码 | UTF-8 |
| 鉴权方式 | 请求头 X-App-ID + X-API-Key(见第 2 节) |
| 凭证申请 | 邮件至 robloxbot@astudlox.top(填写格式见 2.1) |
接口一览
查看完整地址、用途与响应类型
| 接口名称 | 用途 | 请求地址(完整 URL) | 方法 | Content-Type |
|---|---|---|---|---|
| 用户数据汇总 | 一次返回该用户的积分、等级、经验、身份组与违规记录 | https://api.astudlox.top/api/v1/users/{robloxuserid} |
GET | 响应 application/json |
| R 点积分 | 查询 R 点余额、累计获得/消费/扣除、签到与查询统计 | https://api.astudlox.top/api/v1/users/{robloxuserid}/points |
GET | 响应 application/json |
| 等级 | 查询等级、等级名称/徽章与等级特权(查询上限、单价、免积分额度等) | https://api.astudlox.top/api/v1/users/{robloxuserid}/level |
GET | 响应 application/json |
| 经验值 | 查询本级经验、升级所需经验、剩余经验与进度百分比 | https://api.astudlox.top/api/v1/users/{robloxuserid}/experience |
GET | 响应 application/json |
| 身份组 | 查询系统/自定义身份组、生效权限、全部权限与签到倍数 | https://api.astudlox.top/api/v1/users/{robloxuserid}/roles |
GET | 响应 application/json |
| 违规记录 | 查询违规库条目、账号风控状态与最近人工审核记录 | https://api.astudlox.top/api/v1/users/{robloxuserid}/violations |
GET | 响应 application/json |
| 违规账号查询 | 按 Roblox 用户 ID 查询用户名、用户 ID 与是否违规(限额 60 次/分钟) | https://api.astudlox.top/api/v1/users/{robloxuserid}/violation-status |
GET | 响应 application/json |
| 卡片随机抽取 | 从「今日老婆 / 老公 / 福瑞」三个卡片库中随机抽取已入库卡片(限额 60 次/分钟,详见第 8 节) | https://api.astudlox.top/api/v1/cards/random?library=furry |
GET | 响应 application/json |
| 健康检查 | 服务与数据库可用性探针,无需鉴权,不含业务数据 | https://api.astudlox.top/health |
GET | 响应 application/json |
上述业务接口除路径参数写法外,还支持查询参数写法,二者响应完全一致并共用同一份缓存:
GET /api/v1/points?robloxuserid=10404804391 等。
违规账号查询额外支持 userId 作为查询参数名:
GET /api/v1/violation-status?userId=10404804391。
2认证方式
完成凭证申请,为你的第一次请求做好准备。
除 /health 与本文档页外,所有 /api/v1/* 请求都必须携带以下两个请求头:
| 请求头 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
X-App-ID | string | 必填 | 调用方标识(AppID),需向官方邮箱申请获取(见 2.1) |
X-API-Key | string | 必填 | 调用密钥(API Key),与 AppID 成对使用,需向官方邮箱申请获取(见 2.1) |
X-Request-ID | string | 可选 | 调用方自定义追踪 ID;服务端会回显,便于对账与排障 |
2.1 凭证申请
本服务不开放自助注册。请发送邮件至 robloxbot@astudlox.top, 邮件需按以下格式填写:
- 申请用途;
- 申请理由;
- 申请项目证明等。
审核通过后,由服务方分配 AppID 与 API Key。
收件人:robloxbot@astudlox.top 主题:Astudlox API 凭证申请 - <项目名称> 1. 申请用途: 2. 申请理由: 3. 申请项目证明等:
- 请求头名称大小写不敏感(
x-app-id同样有效); - 缺少任一请求头返回
401 MISSING_CREDENTIALS;AppID 或 Key 错误返回401 INVALID_CREDENTIALS(不区分具体哪项错误,避免凭据枚举); - 凭据仅通过官方邮箱申请获取,不要写入前端代码、URL 参数或公开仓库。
-H 'X-App-ID: <APP_ID>' \ -H 'X-API-Key: <API_KEY>'
3请求参数
了解路径、查询参数与有效取值,让每次调用清晰可控。
3.1 路径参数(Path)
| 参数名 | 类型 | 是否必填 | 默认值 | 取值范围 | 说明 |
|---|---|---|---|---|---|
robloxuserid |
string | 必填 | 无 | 1~17 位纯数字,且大于 0 | Roblox 用户 ID。前导零会被规范化(01001 → 1001);0、负数、小数、非数字均判为非法。 |
3.2 查询参数(Query)
| 参数名 | 类型 | 是否必填 | 默认值 | 取值范围 | 说明 |
|---|---|---|---|---|---|
robloxuserid |
string | 条件必填 | 无 | 同路径参数 | 仅在不使用路径参数的写法下必填,例如 GET /api/v1/points?robloxuserid=10404804391。 |
userId |
string | 条件必填 | 无 | 同路径参数 | 仅违规账号查询接口支持,作为 robloxuserid 的等价别名,例如 GET /api/v1/violation-status?userId=10404804391。 |
3.3 请求体参数(Body)
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
无。本服务全部业务接口均为 GET,不接收请求体,请勿发送 Content-Type 或 Body。 | ||||
违规记录接口返回的人工审核记录条数、历史风控记录条数等由服务端配置决定,调用方无法通过参数调整:审核记录默认最近 20 条,风控历史默认最近 50 条。
4请求示例
从完整示例开始,将接口接入你的服务。
以下示例中的 <APP_ID>、<API_KEY>、<ROBLOX_USER_ID> 均需替换为真实值,请勿直接复制运行。
4.1 cURL:全部业务接口
# 通用变量(替换为真实值) APP_ID='<APP_ID>' API_KEY='<API_KEY>' RID='<ROBLOX_USER_ID>' BASE='https://api.astudlox.top' # 1) 汇总:积分 + 等级 + 经验 + 身份组 + 违规记录 curl -sS -H "X-App-ID: $APP_ID" -H "X-API-Key: $API_KEY" \ "$BASE/api/v1/users/$RID" # 2) R 点积分 curl -sS -H "X-App-ID: $APP_ID" -H "X-API-Key: $API_KEY" \ "$BASE/api/v1/users/$RID/points" # 3) 等级 curl -sS -H "X-App-ID: $APP_ID" -H "X-API-Key: $API_KEY" \ "$BASE/api/v1/users/$RID/level" # 4) 经验值 curl -sS -H "X-App-ID: $APP_ID" -H "X-API-Key: $API_KEY" \ "$BASE/api/v1/users/$RID/experience" # 5) 身份组 curl -sS -H "X-App-ID: $APP_ID" -H "X-API-Key: $API_KEY" \ "$BASE/api/v1/users/$RID/roles" # 6) 违规记录 curl -sS -H "X-App-ID: $APP_ID" -H "X-API-Key: $API_KEY" \ "$BASE/api/v1/users/$RID/violations" # 7) 违规账号查询(限额 60 次/分钟) curl -sS -H "X-App-ID: $APP_ID" -H "X-API-Key: $API_KEY" \ "$BASE/api/v1/users/$RID/violation-status"
4.2 违规账号查询(入参与返回)
# 路径参数写法 curl -sS -H "X-App-ID: <APP_ID>" -H "X-API-Key: <API_KEY>" \ 'https://api.astudlox.top/api/v1/users/<ROBLOX_USER_ID>/violation-status' # 查询参数写法(入参名 userId) curl -sS -H "X-App-ID: <APP_ID>" -H "X-API-Key: <API_KEY>" \ 'https://api.astudlox.top/api/v1/violation-status?userId=<ROBLOX_USER_ID>'
// 违规账号:isViolation = true
{
"success": true,
"code": 200,
"message": "ok",
"data": {
"userId": "10726271939",
"username": "ASDTVWM",
"isViolation": true,
"violationStatus": "violation",
"violationLabel": "违规账号",
"hasHistoricalViolation": true,
"activeViolationCount": 1,
"violationDetail": {
"targetId": "10726271939",
"targetType": "user",
"targetName": "ASDTVWM",
"violationReason": "人工审核确认含敏感信息",
"severity": "high",
"sourceViolationId": "A1788868780194-fb487",
"addedBy": "manual",
"hitCount": 0,
"expired": false,
"addedAtIso": "2026-09-08T20:20:03",
"expiresAtIso": "2027-09-08T20:21:45"
},
"recordSource": "violation_lib"
},
"meta": { "requestId": "…", "elapsedMs": 0.52, "cached": false }
}
// 正常账号:isViolation = false
{
"success": true,
"code": 200,
"message": "ok",
"data": {
"userId": "10404804391",
"username": "ainixiaofan",
"isViolation": false,
"violationStatus": "normal",
"violationLabel": "正常账号",
"hasHistoricalViolation": false,
"activeViolationCount": 0,
"violationDetail": null,
"recordSource": "user_local"
},
"meta": { "requestId": "…", "elapsedMs": 0.41, "cached": false }
}
4.3 查询参数写法 / 健康检查
# 查询参数写法(与路径参数等价) curl -sS -H "X-App-ID: $APP_ID" -H "X-API-Key: $API_KEY" \ "$BASE/api/v1/points?robloxuserid=$RID" # 健康检查(无需鉴权,不含业务数据) curl -sS "$BASE/health"
4.4 携带自定义追踪 ID
curl -sS -H "X-App-ID: $APP_ID" -H "X-API-Key: $API_KEY" \ -H "X-Request-ID: order-20260909-0001" \ "$BASE/api/v1/users/$RID/points"
4.5 Python(标准库,无第三方依赖)
import json
import urllib.request
BASE = "https://api.astudlox.top"
HEADERS = {
"X-App-ID": "<APP_ID>",
"X-API-Key": "<API_KEY>",
}
def fetch(roblox_user_id: str, resource: str = "") -> dict:
url = f"{BASE}/api/v1/users/{roblox_user_id}{resource}"
req = urllib.request.Request(url, headers=HEADERS, method="GET")
with urllib.request.urlopen(req, timeout=10) as resp:
return json.loads(resp.read().decode("utf-8"))
data = fetch("<ROBLOX_USER_ID>", "/points")
print(data["data"]["aggregate"]["currentPointsTotal"])
5返回结果
统一的响应结构,清楚的数据字段。
5.1 统一响应信封
| 字段 | 类型 | 说明 |
|---|---|---|
success | boolean | 请求是否成功 |
code | integer | 与 HTTP 状态码一致,成功为 200 |
message | string | 成功时为 "ok" |
data | object | 业务数据(结构见 5.3) |
meta | object | requestId、elapsedMs、cached |
5.2 成功响应示例(汇总接口)
{
"success": true,
"code": 200,
"message": "ok",
"data": {
"robloxUserId": "10404804391",
"accounts": [
{
"userId": "349B816AA707E74A6E6039D5AE923C32",
"bound": true,
"current": true,
"bindingName": "ainixiaofan",
"lastBindTime": 1757000000000,
"lastBindTimeIso": "2026-09-04T22:13:20",
"points": { "currentPoints": 195, "...": "..." },
"level": { "level": 1, "name": "新手", "...": "..." },
"experience": { "expIntoLevel": 30, "expToNextLevel": 230, "...": "..." },
"roles": { "systemRoles": [], "groups": [], "...": "..." }
}
],
"violations": {
"robloxUserId": "10404804391",
"violationLib": [],
"violationLibCount": 0,
"accounts": []
},
"aggregate": {
"accountCount": 1,
"currentAccounts": 1,
"currentPointsTotal": 195,
"maxLevel": 1,
"roleIds": [],
"violationLibCount": 0
}
},
"meta": {
"requestId": "b3f1c2d4e5f60718293a4b5c6d7e8f90",
"elapsedMs": 1.234,
"cached": false
}
}
5.3 各接口 data 字段
汇总接口 GET /api/v1/users/{robloxuserid}
| 字段 | 类型 | 说明 |
|---|---|---|
robloxUserId | string | 规范化后的 Roblox 用户 ID |
accounts[] | array | 关联账号列表(含历史绑定) |
accounts[].userId | string | QQ openid |
accounts[].bound | boolean | 是否当前绑定(在 user_local 中) |
accounts[].current | boolean | 是否当前有效绑定 |
accounts[].bindingName | string | 绑定的 Roblox 用户名,可能为空 |
accounts[].lastBindTime / lastBindTimeIso | integer / string | 最近绑定时间(毫秒时间戳 / 本地时间字符串) |
accounts[].points | object | 同积分接口 points 字段 |
accounts[].level | object | 同等级接口 level 字段 |
accounts[].experience | object | 同经验接口 experience 字段 |
accounts[].roles | object | 同身份组接口 roles 字段 |
violations | object | 同违规记录接口结构 |
aggregate.accountCount | integer | 关联账号总数 |
aggregate.currentAccounts | integer | 当前有效绑定账号数 |
aggregate.currentPointsTotal | integer | 各账号 R 点合计 |
aggregate.maxLevel | integer | 各账号中的最高等级 |
aggregate.roleIds | array | 各账号身份组 ID 去重并集 |
aggregate.violationLibCount | integer | 违规库命中条目数 |
R 点积分 GET /api/v1/users/{robloxuserid}/points
| 字段 | 类型 | 说明 |
|---|---|---|
accounts[].points.currentPoints | integer | 当前 R 点余额 |
accounts[].points.totalEarned | integer | 累计获得 |
accounts[].points.totalSpent | integer | 累计消费 |
accounts[].points.totalDeducted | integer | 累计违规扣除 |
accounts[].points.signIn | object | lastSignInAt/lastSignInAtIso、consecutiveDays、totalSignIns |
accounts[].points.queryStats | object | 今日查询/经验/免积分/兑换统计、累计查询数、最后查询时间 |
accounts[].points.createdAt / updatedAt | integer | 毫秒时间戳(另附 *Iso 字段) |
aggregate.currentPointsTotal | integer | 各账号 R 点合计 |
等级 GET /api/v1/users/{robloxuserid}/level
| 字段 | 类型 | 说明 |
|---|---|---|
accounts[].level.level | integer | 等级数值(0~7) |
accounts[].level.name / badge / label | string | 等级名称、徽章、展示文本 |
accounts[].level.privilege.dailyQueryLimit | integer / null | 每日查询上限;null 表示无限,配合 dailyQueryLimitUnlimited: true |
accounts[].level.privilege.queryCost | integer | 单次查询消耗 R 点 |
accounts[].level.privilege.freeQuota | integer / null | 每日免积分额度;null + freeQuotaUnlimited: true 表示无限 |
accounts[].level.privilege.cooldownDiscount | number | 风控冷却减免比例(0~0.3) |
accounts[].level.expToNextLevel | integer | 升到下一级所需经验 |
aggregate.maxLevel | integer | 各账号最高等级 |
经验值 GET /api/v1/users/{robloxuserid}/experience
| 字段 | 类型 | 说明 |
|---|---|---|
accounts[].experience.level | integer | 当前等级 |
accounts[].experience.expIntoLevel | integer | 本级已获得经验 |
accounts[].experience.expToNextLevel | integer | 本级升级所需经验 |
accounts[].experience.expRemaining | integer | 距离升级还差的经验 |
accounts[].experience.progressPercent | number | 本级进度百分比(保留 2 位小数) |
accounts[].experience.totalExpEarned | integer | 累计获得经验 |
aggregate.totalExpEarned | integer | 各账号累计经验合计 |
身份组 GET /api/v1/users/{robloxuserid}/roles
| 字段 | 类型 | 说明 |
|---|---|---|
accounts[].roles.systemRoles | array | 命中的系统身份组:developer / admin / assistAdmin / sponsor / whitelist |
accounts[].roles.baseRole / baseRoleLabel | string | 最高系统身份及其中文名 |
accounts[].roles.whitelisted | boolean | 是否在白名单名单中 |
accounts[].roles.customRoleIds | array | 关联的自定义身份组 ID |
accounts[].roles.groups[] | array | 身份组明细:id/name/icon/description/isSystem/permissions/inheritFrom/signinMultiplier |
accounts[].roles.effectivePermissions | array | 生效权限(仅取最高优先级身份组的权限) |
accounts[].roles.allPermissions | array | 全部身份组权限并集(含继承) |
accounts[].roles.signinMultiplier | number | 签到总倍数 = 1 + Σ(身份组倍数 − 1) |
accounts[].roles.isAdmin | boolean | 生效权限中是否含 admin.general |
aggregate.roleIds / permissions | array | 各账号身份组与权限并集 |
白名单豁免在机器人侧由白名单名单直查决定,不经身份组权限计算,因此白名单用户的 effectivePermissions 可能为空,但其 whitelisted=true 且 allPermissions 含 whitelist.bypass。
违规记录 GET /api/v1/users/{robloxuserid}/violations
| 字段 | 类型 | 说明 |
|---|---|---|
violationLib[] | array | 违规库条目(目标级):targetId/targetName/violationReason/severity/hitCount/addedBy/expiresAt/expired 等 |
violationLibCount | integer | 违规库条目数 |
accounts[].riskState | object / null | 账号风控状态:level(L0~L4)、activeRestrictions[]、violationCounts、violationTotal、history[](最近 50 条) |
accounts[].auditRecords[] | array | 最近人工审核记录(默认 20 条):id/status/violationType/reason/summary/verdict/resolvedBy/appliedLevel/appliedDays 等 |
违规账号查询 GET /api/v1/users/{robloxuserid}/violation-status(限额 60 次/分钟)
| 字段 | 类型 | 说明 |
|---|---|---|
userId | string | Roblox 用户 ID(与入参一致,规范化后的值) |
username | string / null | Roblox 用户名;无绑定记录时取自违规库名称,均无则为 null |
isViolation | boolean | 是否违规账号的明确标识:违规库中存在未过期条目时为 true |
violationStatus | string | 机器可读状态:violation / normal |
violationLabel | string | 中文标签:违规账号 / 正常账号 |
hasHistoricalViolation | boolean | 是否存在违规库记录(含已过期) |
activeViolationCount | integer | 未过期的违规库条目数 |
violationDetail | object / null | 违规库条目明细(无记录时为 null):targetName/violationReason/severity/addedBy/hitCount/expired/时间字段等 |
recordSource | string / null | 记录来源:violation_lib / user_local / bind_history |
该 Roblox ID 在本系统中既无绑定记录、也不在违规库中时返回
404 USER_NOT_FOUND;若查询目标不在违规库但已绑定账号,则返回
200 且 isViolation=false。
5.4 响应头
| 响应头 | 说明 |
|---|---|
X-Request-ID | 请求追踪 ID(调用方传入则回显,否则服务端生成) |
X-Response-Time-Ms | 服务端处理耗时(毫秒) |
X-Cache | HIT / MISS / BYPASS |
X-RateLimit-Limit | 当前窗口的请求上限(120) |
X-RateLimit-Remaining | 当前窗口剩余可用次数 |
Retry-After | 仅在 429 响应中返回,建议等待秒数 |
Cache-Control | no-store(禁止中间层缓存) |
5.5 错误响应结构
{
"success": false,
"code": 401,
"error": {
"code": "INVALID_CREDENTIALS",
"message": "AppID 或 API Key 无效",
"details": { "requiredHeaders": ["X-App-ID", "X-API-Key"] }
},
"meta": { "requestId": "b3f1c2d4e5f60718293a4b5c6d7e8f90" }
}
6错误码与排查
通过状态码与错误信息,快速定位调用问题。
| HTTP | 错误码 | 含义 | 排查建议 |
|---|---|---|---|
| 400 | INVALID_ROBLOX_USER_ID |
robloxuserid 缺失、非数字、超长或非正数 | 确认参数为 1~17 位纯数字且大于 0;注意不要带空格、小数点或正负号 |
| 401 | MISSING_CREDENTIALS |
未提供 X-App-ID 或 X-API-Key |
检查请求头是否被网关/客户端丢弃;details.missingHeader 会指明缺失项 |
| 401 | INVALID_CREDENTIALS |
AppID 或 API Key 校验失败 | 核对凭据是否与服务方分配一致、是否已停用;服务端不区分具体错误项 |
| 404 | USER_NOT_FOUND |
该 Roblox ID 在本系统中无记录:未绑定任何 QQ 账号,且不在违规库中 | 核对 ID 是否正确;确认用户已完成绑定,或该目标已被加入违规库 |
| 404 | RESOURCE_NOT_FOUND |
接口路径不存在 | 核对路径拼写与版本前缀 /api/v1 |
| 405 | METHOD_NOT_ALLOWED |
使用了非 GET/HEAD 方法 | 全部业务接口仅支持 GET |
| 429 | RATE_LIMIT_EXCEEDED |
同一客户端 IP 在 60 秒窗口内请求超过 120 次 | 按响应头 Retry-After 退避后重试;避免无节制重试加重限流 |
| 500 | INTERNAL_ERROR |
服务内部错误 | 记录 X-Request-ID 与服务端日志后反馈服务方 |
| 503 | SERVICE_UNAVAILABLE |
数据源暂时不可用 | 稍后重试;若持续出现请联系服务方 |
遇到异常时请一并提供 X-Request-ID、请求时间、完整请求 URL 与响应体,便于服务端按追踪 ID 定位。
7调用注意事项
了解频率限制、缓存机制与重试策略。
7.1 认证
- 凭据放在请求头,不要放在 URL 查询参数或请求体中;
- 仅通过 HTTPS 传输,服务端 80 端口会 301 跳转到 443;
- 凭据泄露后请立即联系服务方轮换。
7.2 调用频率限制
- 每个客户端 IP 每 60 秒最多 120 次请求(滑动窗口),全部 API 接口(
/api/v1/*与/health)共享同一额度; - 违规账号查询(
violation-status)更严格:每个客户端 IP 每 60 秒最多 60 次,在全局限额外叠加生效(两者取更严格者),超限响应的error.details.scope为endpoint; - 统计维度为客户端 IP(Nginx 通过
X-Real-IP传递真实来源地址); - 超限返回
429 RATE_LIMIT_EXCEEDED,并携带Retry-After、X-RateLimit-Limit、X-RateLimit-Remaining;建议按Retry-After退避重试; - 本文档页(
/docs)为静态页面,不计入限流。
HTTP/1.1 429 Too Many Requests
Retry-After: 42
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 0
{
"success": false,
"code": 429,
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "请求过于频繁:每 60 秒最多 120 次,请稍后重试",
"details": { "limit": 120, "windowSeconds": 60, "retryAfterSeconds": 42 }
}
}
7.3 超时与重试
- 服务端超时:Nginx 连接 3s、读取 15s;应用进程 30s。建议客户端超时设为 10s;
- 仅对网络错误与
500/503重试,建议最多 1~2 次并采用指数退避;429请按Retry-After等待后再试; 400/401/404/405属于确定性错误,重试无意义;- 如需幂等追踪,请在请求头携带
X-Request-ID。
7.4 缓存与数据实时性
- 服务端对业务接口结果缓存 30 秒(账号解析与身份目录缓存 60 秒),因此数据变更最坏约 30 秒后可见;
- 缓存键为「接口 + robloxuserid」,查询参数不参与缓存键,追加时间戳等参数无法绕过缓存;
- 可通过响应头
X-Cache判断本次是否命中缓存; - 精确的端到端数据可见延迟 SLA 尚未定义。TODO: 待补充(需确认机器人写入路径与可承诺的延迟指标)。
7.5 多账号说明
- 一个 Roblox 账号最多绑定 2 个 QQ 账号;接口按关联账号逐条返回,
bound/current标识绑定状态; - 汇总类字段(如
currentPointsTotal)为各账号合计,请注意业务含义; - 历史绑定账号(已解绑)也会出现在结果中,其
bound=false。
7.6 其他
- 本服务为只读接口,不提供任何写入/变更能力;
/health与本文档页无需鉴权,但仅用于运维探针与文档,不返回业务数据;- 字段含义与机器人插件保持一致,插件侧规则调整时字段可能同步变化,请关注版本号。
8卡片随机抽取
从三个卡片库中随机发现已入库卡片。
从机器人「今日Roblox老婆」插件的三个卡片库(老婆 / 老公 / 福瑞)中 随机抽取已入库卡片,返回用户名、昵称、简介与形象图链接。 与聊天侧「今日老婆 / 今日老公 / 今日福瑞」指令使用同一套池子规则 (已入库且图片正常的卡片),数据只读、实时。
8.1 请求
GET https://api.astudlox.top/api/v1/cards/random?library=furry&count=1
| 参数 | 位置 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
library | Query | 是 | — | 取值 wife(老婆库)/ husband(老公库)/
furry(福瑞库)/ all(三库混抽,别名 any);
大小写不敏感。缺失或非法返回 400 |
count | Query | 否 | 1 | 抽取张数,取值 1~10;同一次调用的结果互不重复 |
allowFallbackImage | Query | 否 | false | true 时放宽池子到全部已入库卡片(含图片异常),
对齐插件设置 excludeBrokenImage=false |
truncateBlurb | Query | 否 | true | 简介是否按聊天规则截断(超 25 字取前 25 字 + ...,空简介给占位文案) |
鉴权:请求头 X-App-ID + X-API-Key(同其它业务接口)。
本接口不缓存(响应头 X-Cache: BYPASS),每次请求都是独立的随机抽取。
8.2 响应示例
{
"success": true,
"code": 200,
"message": "ok",
"data": {
"library": "furry",
"libraryLabel": "福瑞",
"libraryTitle": "今日福瑞",
"requested": 1,
"returned": 1,
"truncated": false,
"poolSize": 68,
"cards": [
{
"id": 42,
"username": "DraKoMon279",
"displayName": "DraKoMon279",
"blurb": "正常简介",
"blurbTruncated": false,
"robloxUserId": "1234567",
"avatarUrl": "https://…/avatar.png",
"bodyPicUrl": "https://…/body.png",
"bodyPicFallback": false,
"library": "furry",
"libraryLabel": "福瑞",
"libraryTitle": "今日福瑞",
"imageState": "ok",
"approvedAt": 1757572893000,
"approvedAtIso": "2026-09-11T12:41:33",
"profileUrl": "https://rbx.astudlox.top/?type=profile_card&userId=1234567"
}
]
},
"meta": { "requestId": "b3f1…", "elapsedMs": 0.41, "cached": false, "drawnAt": 1759810000000 }
}
| 字段 | 说明 |
|---|---|
library / libraryLabel / libraryTitle |
库标识 / 中文库名(老婆 / 老公 / 福瑞)/ 聊天指令标题(今日老婆 / 今日老公 / 今日福瑞);
all 时为「全部 / 今日随机」 |
poolSize | 本次可抽取的池子大小(秒级缓存的计数,可用于判断池子是否过小) |
requested / returned / truncated |
请求张数 / 实际返回张数 / 是否因池子不足而少于请求张数(仍为 200) |
cards[].username / displayName | Roblox 用户名与昵称 |
cards[].blurb / blurbTruncated |
简介(默认与聊天一致截断)与截断标记;空简介返回占位文案「这个人很懒,什么都没写~」 |
cards[].avatarUrl / bodyPicUrl |
头像 / 全身形象图;全身图缺失时按插件同款顺序回退
(body → avatar → 原始 body → 原始 avatar),回退时
bodyPicFallback=true |
cards[].approvedAtIso | 该卡片入库时间(本地时区文本) |
cards[].profileUrl | 与插件模板一致的资料页链接 |
字段与插件模板占位符对应关系:{{username}}→username、
{{blurb}}→blurb、
{{bodyPic}}→bodyPicUrl、
{{avatar}}→avatarUrl、
{{robloxUserId}}→robloxUserId、
{{libraryName}}→libraryLabel、
{{libraryTitle}}→libraryTitle、
{{addedAt}}→approvedAtIso。
如需自行渲染成群内同款卡片,按此表填充模板即可(本接口不返回渲染后的 Markdown)。
8.3 关于「重复」的重要说明
抽取是独立随机的:每次请求都从池子重新随机,服务端 不做去重,连续多次请求出现同一张卡片属正常现象。 池子越小、调用越频繁,重复越明显(生日悖论):
| 池子 | 2 次调用出现重复 | 5 次 | 10 次 | 20 次 |
|---|---|---|---|---|
| 福瑞库(约 68 张) | 1.5% | 13.7% | 48.4% | 93.9% |
| 三库混抽(约 496 张) | 0.2% | 2.0% | 8.7% | 31.8% |
建议:对「不想看到重复」的场景改用 library=all(池子约 496 张),
或由调用方自行记录最近结果并决定重试;池子规模会随入库/删除实时变化,可在响应 poolSize 中读取。
8.4 调用示例
# 福瑞库抽 1 张 curl -s -H 'X-App-ID: <APP_ID>' -H 'X-API-Key: <API_KEY>' \ 'https://api.astudlox.top/api/v1/cards/random?library=furry' | jq # 三库混抽 3 张 curl -s -H 'X-App-ID: <APP_ID>' -H 'X-API-Key: <API_KEY>' \ 'https://api.astudlox.top/api/v1/cards/random?library=all&count=3' | jq # 放宽到全部已入库卡片(含图片异常) curl -s -H 'X-App-ID: <APP_ID>' -H 'X-API-Key: <API_KEY>' \ 'https://api.astudlox.top/api/v1/cards/random?library=wife&allowFallbackImage=true' | jq
| HTTP | 错误码 | 场景 |
|---|---|---|
| 400 | INVALID_LIBRARY | 缺少 library 或取值不在允许集合 |
| 400 | INVALID_COUNT | count 非整数或不在 1~10 |
| 404 | CARD_POOL_EMPTY | 该库当前没有可抽取的卡片(details.poolSize 为 0) |
| 503 | SERVICE_UNAVAILABLE | 卡片库暂时不可用(插件重载/维护中),仅影响本接口 |
限额:每客户端 IP 每分钟 60 次(另有全局限额 120 次/分钟); 并发请求会同时计入两者,超限返回 429。