v1.0.0
开发者文档v1.0.0

让数据,
触手可及。

以简洁的 API(应用程序接口),连接你的下一次创造。
从用户数据到随机卡片,每个请求都有清晰的答案。

01 / 08
一次请求,完整数据

积分 · 等级 · 身份 · 记录

安全的只读访问

双请求头鉴权 · 加密传输

统一的数据结构

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>'
替换占位符后,在服务端运行

1接口概览

本服务按 Roblox 用户 ID 查询用户的违规库记录、R 点积分、身份组、经验值与等级。 所有接口均为 GET,响应为 application/json, 仅支持 HTTPS。数据来源于机器人插件的只读数据库,服务本身不写入任何数据。

基础信息

项值
服务地址https://api.astudlox.top
接口版本v1(路径前缀 /api/v1)
请求方法GET(全部业务接口)
请求 Content-Type不适用(GET 无请求体)
响应 Content-Typeapplication/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。

参考文档 / 02

2认证方式

完成凭证申请,为你的第一次请求做好准备。

除 /health 与本文档页外,所有 /api/v1/* 请求都必须携带以下两个请求头:

请求头类型是否必填说明
X-App-IDstring必填调用方标识(AppID),需向官方邮箱申请获取(见 2.1)
X-API-Keystring必填调用密钥(API Key),与 AppID 成对使用,需向官方邮箱申请获取(见 2.1)
X-Request-IDstring可选调用方自定义追踪 ID;服务端会回显,便于对账与排障

2.1 凭证申请

AppID 与 API Key 需向官方邮箱申请获取

本服务不开放自助注册。请发送邮件至 robloxbot@astudlox.top, 邮件需按以下格式填写:

  1. 申请用途;
  2. 申请理由;
  3. 申请项目证明等。

审核通过后,由服务方分配 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>'
参考文档 / 03

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 条。

参考文档 / 04

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"])
参考文档 / 05

5返回结果

统一的响应结构,清楚的数据字段。

5.1 统一响应信封

字段类型说明
successboolean请求是否成功
codeinteger与 HTTP 状态码一致,成功为 200
messagestring成功时为 "ok"
dataobject业务数据(结构见 5.3)
metaobjectrequestId、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}
字段类型说明
robloxUserIdstring规范化后的 Roblox 用户 ID
accounts[]array关联账号列表(含历史绑定)
accounts[].userIdstringQQ openid
accounts[].boundboolean是否当前绑定(在 user_local 中)
accounts[].currentboolean是否当前有效绑定
accounts[].bindingNamestring绑定的 Roblox 用户名,可能为空
accounts[].lastBindTime / lastBindTimeIsointeger / string最近绑定时间(毫秒时间戳 / 本地时间字符串)
accounts[].pointsobject同积分接口 points 字段
accounts[].levelobject同等级接口 level 字段
accounts[].experienceobject同经验接口 experience 字段
accounts[].rolesobject同身份组接口 roles 字段
violationsobject同违规记录接口结构
aggregate.accountCountinteger关联账号总数
aggregate.currentAccountsinteger当前有效绑定账号数
aggregate.currentPointsTotalinteger各账号 R 点合计
aggregate.maxLevelinteger各账号中的最高等级
aggregate.roleIdsarray各账号身份组 ID 去重并集
aggregate.violationLibCountinteger违规库命中条目数
R 点积分 GET /api/v1/users/{robloxuserid}/points
字段类型说明
accounts[].points.currentPointsinteger当前 R 点余额
accounts[].points.totalEarnedinteger累计获得
accounts[].points.totalSpentinteger累计消费
accounts[].points.totalDeductedinteger累计违规扣除
accounts[].points.signInobjectlastSignInAt/lastSignInAtIso、consecutiveDays、totalSignIns
accounts[].points.queryStatsobject今日查询/经验/免积分/兑换统计、累计查询数、最后查询时间
accounts[].points.createdAt / updatedAtinteger毫秒时间戳(另附 *Iso 字段)
aggregate.currentPointsTotalinteger各账号 R 点合计
等级 GET /api/v1/users/{robloxuserid}/level
字段类型说明
accounts[].level.levelinteger等级数值(0~7)
accounts[].level.name / badge / labelstring等级名称、徽章、展示文本
accounts[].level.privilege.dailyQueryLimitinteger / null每日查询上限;null 表示无限,配合 dailyQueryLimitUnlimited: true
accounts[].level.privilege.queryCostinteger单次查询消耗 R 点
accounts[].level.privilege.freeQuotainteger / null每日免积分额度;null + freeQuotaUnlimited: true 表示无限
accounts[].level.privilege.cooldownDiscountnumber风控冷却减免比例(0~0.3)
accounts[].level.expToNextLevelinteger升到下一级所需经验
aggregate.maxLevelinteger各账号最高等级
经验值 GET /api/v1/users/{robloxuserid}/experience
字段类型说明
accounts[].experience.levelinteger当前等级
accounts[].experience.expIntoLevelinteger本级已获得经验
accounts[].experience.expToNextLevelinteger本级升级所需经验
accounts[].experience.expRemaininginteger距离升级还差的经验
accounts[].experience.progressPercentnumber本级进度百分比(保留 2 位小数)
accounts[].experience.totalExpEarnedinteger累计获得经验
aggregate.totalExpEarnedinteger各账号累计经验合计
身份组 GET /api/v1/users/{robloxuserid}/roles
字段类型说明
accounts[].roles.systemRolesarray命中的系统身份组:developer / admin / assistAdmin / sponsor / whitelist
accounts[].roles.baseRole / baseRoleLabelstring最高系统身份及其中文名
accounts[].roles.whitelistedboolean是否在白名单名单中
accounts[].roles.customRoleIdsarray关联的自定义身份组 ID
accounts[].roles.groups[]array身份组明细:id/name/icon/description/isSystem/permissions/inheritFrom/signinMultiplier
accounts[].roles.effectivePermissionsarray生效权限(仅取最高优先级身份组的权限)
accounts[].roles.allPermissionsarray全部身份组权限并集(含继承)
accounts[].roles.signinMultipliernumber签到总倍数 = 1 + Σ(身份组倍数 − 1)
accounts[].roles.isAdminboolean生效权限中是否含 admin.general
aggregate.roleIds / permissionsarray各账号身份组与权限并集
说明

白名单豁免在机器人侧由白名单名单直查决定,不经身份组权限计算,因此白名单用户的 effectivePermissions 可能为空,但其 whitelisted=true 且 allPermissions 含 whitelist.bypass。

违规记录 GET /api/v1/users/{robloxuserid}/violations
字段类型说明
violationLib[]array违规库条目(目标级):targetId/targetName/violationReason/severity/hitCount/addedBy/expiresAt/expired 等
violationLibCountinteger违规库条目数
accounts[].riskStateobject / 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 次/分钟)
字段类型说明
userIdstringRoblox 用户 ID(与入参一致,规范化后的值)
usernamestring / nullRoblox 用户名;无绑定记录时取自违规库名称,均无则为 null
isViolationboolean是否违规账号的明确标识:违规库中存在未过期条目时为 true
violationStatusstring机器可读状态:violation / normal
violationLabelstring中文标签:违规账号 / 正常账号
hasHistoricalViolationboolean是否存在违规库记录(含已过期)
activeViolationCountinteger未过期的违规库条目数
violationDetailobject / null违规库条目明细(无记录时为 null):targetName/violationReason/severity/addedBy/hitCount/expired/时间字段等
recordSourcestring / null记录来源:violation_lib / user_local / bind_history
404 语义

该 Roblox ID 在本系统中既无绑定记录、也不在违规库中时返回 404 USER_NOT_FOUND;若查询目标不在违规库但已绑定账号,则返回 200 且 isViolation=false。

5.4 响应头

响应头说明
X-Request-ID请求追踪 ID(调用方传入则回显,否则服务端生成)
X-Response-Time-Ms服务端处理耗时(毫秒)
X-CacheHIT / MISS / BYPASS
X-RateLimit-Limit当前窗口的请求上限(120)
X-RateLimit-Remaining当前窗口剩余可用次数
Retry-After仅在 429 响应中返回,建议等待秒数
Cache-Controlno-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" }
}
参考文档 / 06

6错误码与排查

通过状态码与错误信息,快速定位调用问题。

HTTP错误码含义排查建议
400INVALID_ROBLOX_USER_ID robloxuserid 缺失、非数字、超长或非正数 确认参数为 1~17 位纯数字且大于 0;注意不要带空格、小数点或正负号
401MISSING_CREDENTIALS 未提供 X-App-ID 或 X-API-Key 检查请求头是否被网关/客户端丢弃;details.missingHeader 会指明缺失项
401INVALID_CREDENTIALS AppID 或 API Key 校验失败 核对凭据是否与服务方分配一致、是否已停用;服务端不区分具体错误项
404USER_NOT_FOUND 该 Roblox ID 在本系统中无记录:未绑定任何 QQ 账号,且不在违规库中 核对 ID 是否正确;确认用户已完成绑定,或该目标已被加入违规库
404RESOURCE_NOT_FOUND 接口路径不存在 核对路径拼写与版本前缀 /api/v1
405METHOD_NOT_ALLOWED 使用了非 GET/HEAD 方法 全部业务接口仅支持 GET
429RATE_LIMIT_EXCEEDED 同一客户端 IP 在 60 秒窗口内请求超过 120 次 按响应头 Retry-After 退避后重试;避免无节制重试加重限流
500INTERNAL_ERROR 服务内部错误 记录 X-Request-ID 与服务端日志后反馈服务方
503SERVICE_UNAVAILABLE 数据源暂时不可用 稍后重试;若持续出现请联系服务方
排障提示

遇到异常时请一并提供 X-Request-ID、请求时间、完整请求 URL 与响应体,便于服务端按追踪 ID 定位。

参考文档 / 07

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 与本文档页无需鉴权,但仅用于运维探针与文档,不返回业务数据;
  • 字段含义与机器人插件保持一致,插件侧规则调整时字段可能同步变化,请关注版本号。
参考文档 / 08

8卡片随机抽取

从三个卡片库中随机发现已入库卡片。

从机器人「今日Roblox老婆」插件的三个卡片库(老婆 / 老公 / 福瑞)中 随机抽取已入库卡片,返回用户名、昵称、简介与形象图链接。 与聊天侧「今日老婆 / 今日老公 / 今日福瑞」指令使用同一套池子规则 (已入库且图片正常的卡片),数据只读、实时。

8.1 请求

GET https://api.astudlox.top/api/v1/cards/random?library=furry&count=1
参数位置必填默认说明
libraryQuery 是— 取值 wife(老婆库)/ husband(老公库)/ furry(福瑞库)/ all(三库混抽,别名 any); 大小写不敏感。缺失或非法返回 400
countQuery 否1 抽取张数,取值 1~10;同一次调用的结果互不重复
allowFallbackImageQuery 否false true 时放宽池子到全部已入库卡片(含图片异常), 对齐插件设置 excludeBrokenImage=false
truncateBlurbQuery 否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 / displayNameRoblox 用户名与昵称
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错误码场景
400INVALID_LIBRARY缺少 library 或取值不在允许集合
400INVALID_COUNTcount 非整数或不在 1~10
404CARD_POOL_EMPTY该库当前没有可抽取的卡片(details.poolSize 为 0)
503SERVICE_UNAVAILABLE卡片库暂时不可用(插件重载/维护中),仅影响本接口

限额:每客户端 IP 每分钟 60 次(另有全局限额 120 次/分钟); 并发请求会同时计入两者,超限返回 429。

↑ ↓ 选择   ↵ 跳转   Esc 关闭搜索全部 8 个章节