开放接口、计费方式和接入说明
接口数量
11
鉴权方式
JWT/OAuth
服务能力
RemoteJudge
更多文档
/api-docs
公测说明
Becoder 开放平台目前处于公测阶段,服务 SLA 和接口稳定性仅能提供尽力而为的支持。如遇接入问题,可通过邮箱联系平台团队。
更详细的接口文档
更完整的 OpenAPI 文档可访问 https://becoder.com.cn/api-docs/。
服务概览
服务说明
Becoder 开放平台提供评测能力服务(RemoteJudge)和 OAuth 第三方登录能力;如调用量较大,可单独联系。
计费点
1 计费点 = 0.02 元 = 0.02 金币;每次评测成功至少扣 1 点,超时按 10 秒阶梯增加,单次最多 10 点。
服务标准
服务可用性 99.99%;可评测两万余道公共非远程提交题目,并提供公共题面与接入支持。
计费规则
- 每次评测成功后,至少扣除 1 个计费点。
- 如果实际运行时间超过 10 秒,则每超过 10 秒增扣 1 个计费点,不足 10 秒按 10 秒计算。
- 每次评测扣除计费点上限为 10 个。
- 平台未产生结果的评测失败请求不扣费。
性能说明
以 1 秒时限题目为例,目前评测能力约为 700 至 800 次/分钟,提交能力约为 1200 至 1500 次/分钟。
用户登录,获取 accessToken 和 refreshToken
鉴权方式
无
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
username |
string | 是 | 用户名 |
password |
string | 是 | 密码 |
返回字段
| 字段名 | 类型 | 说明 |
|---|---|---|
success |
boolean | 是否成功 |
accessToken |
string | 短期有效的访问 token(1h) |
refreshToken |
string | 长期有效的刷新 token(7d) |
计费说明
- 登录接口不计费
检查用户是否登录
鉴权方式
JWT Bearer Token
请求参数
| 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|
Header |
Authorization | - | Bearer accessToken |
返回字段
| 字段名 | 类型 | 说明 |
|---|---|---|
success |
boolean | 是否成功 |
user |
object | 用户实例(含 id,username) |
计费说明
- 检查用户是否登录接口不计费
查询当前用户的可用计费点
鉴权方式
JWT Bearer Token
请求参数
| 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|
Header |
Authorization | - | Bearer accessToken |
返回字段
| 字段名 | 类型 | 说明 |
|---|---|---|
success |
boolean | 是否成功 |
credit |
integer | 可用计费点数量 |
coin |
number | 可用金币数量 |
计费说明
- 检查当前用户可用计费点接口不计费
刷新 accessToken
鉴权方式
无
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
refreshToken |
string | 是 | 长期有效的刷新 token |
返回字段
| 字段名 | 类型 | 说明 |
|---|---|---|
success |
boolean | 是否成功 |
accessToken |
string | 短期有效的访问 token |
计费说明
- 刷新 accessToken 接口不计费
第三方应用管理
鉴权方式
平台登录态
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
浏览器登录态 |
cookie | 是 | 用户登录后访问,用于创建和管理 OAuth 应用 |
返回字段
| 字段名 | 类型 | 说明 |
|---|---|---|
client_id |
string | 第三方应用 ID |
client_secret |
string | 第三方应用密钥,仅创建或重置时显示一次 |
redirect_uris |
string | 允许的回调地址列表 |
scopes |
string | 应用可申请的权限范围 |
计费说明
- 第三方应用管理不计费
OAuth 授权码登录
鉴权方式
平台登录态
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
client_id |
string | 是 | 第三方应用 ID |
redirect_uri |
string | 是 | 必须与应用登记的回调地址完全一致 |
response_type |
string | 是 | 固定为 code |
scope |
string | 否 | 权限范围,默认 profile,可追加 email |
state |
string | 建议 | 第三方生成的随机状态值,用于防 CSRF |
返回字段
| 字段名 | 类型 | 说明 |
|---|---|---|
code |
string | 用户同意后回跳到 redirect_uri 携带的授权码,10 分钟有效且只能使用一次 |
state |
string | 原样返回第三方传入的 state |
error |
string | 用户拒绝或授权失败时返回的错误码 |
计费说明
- OAuth 授权登录不计费
使用授权码换取 OAuth Token
鉴权方式
client_id + client_secret
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
grant_type |
string | 是 | authorization_code 或 refresh_token |
client_id |
string | 是 | 第三方应用 ID,也可通过 HTTP Basic Auth 传入 |
client_secret |
string | 是 | 第三方应用密钥,也可通过 HTTP Basic Auth 传入 |
code |
string | 授权码模式必填 | 授权回调拿到的 code |
redirect_uri |
string | 授权码模式必填 | 必须与 authorize 阶段一致 |
refresh_token |
string | 刷新模式必填 | 刷新 access_token 使用 |
返回字段
| 字段名 | 类型 | 说明 |
|---|---|---|
access_token |
string | 访问令牌,默认 1 小时有效 |
token_type |
string | 固定为 Bearer |
expires_in |
integer | access_token 有效期秒数 |
refresh_token |
string | 刷新令牌,默认 30 天有效 |
scope |
string | 本次授权的权限范围 |
计费说明
- OAuth Token 接口不计费
获取当前授权用户信息
鉴权方式
OAuth Bearer Token
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
Header |
Authorization | 是 | Bearer access_token |
返回字段
| 字段名 | 类型 | 说明 |
|---|---|---|
success |
boolean | 是否成功 |
user.sub |
string | 平台用户唯一 ID,字符串形式 |
user.id |
integer | 平台用户 ID |
user.username |
string | 用户名 |
user.nickname |
string | 昵称 |
user.avatar |
string | 头像地址 |
user.profile_url |
string | 用户主页地址 |
user.is_banned |
boolean | 账号是否被禁用 |
user.is_verified |
boolean | 是否已认证 |
user.email |
string | 仅授权 email scope 时返回 |
计费说明
- OAuth 用户信息接口不计费
提交评测任务
鉴权方式
JWT Bearer Token
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
pid |
string | 是 | 题目编号 |
lang |
string | 是 | 评测语言(如 cpp11、cpp17 等) |
code |
string | 是 | 源代码 |
o2 |
boolean | 否 | 是否开启 O2 优化(默认开启) |
trackId |
string | 否 | 跟踪 ID |
返回字段
| 字段名 | 类型 | 说明 |
|---|---|---|
success |
boolean | 是否成功 |
requestId |
integer | 评测请求 ID |
计费说明
- 每次评测消耗 1 个计费点
- 评测实际运行时间超过 10 秒,每超过 10 秒增加 1 个计费点,最多 10 个
- 评测失败(无结果)不扣点
获取评测结果
鉴权方式
JWT Bearer Token
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
requestId |
integer | 是 | 评测请求 ID |
返回字段
| 字段名 | 类型 | 说明 |
|---|---|---|
success |
boolean | 是否成功 |
requestId |
integer | 评测请求 ID |
status |
string | 评测状态(如 Waiting, Accepted, Wrong Answer 等) |
score |
number | 得分 |
total_time |
number | 运行总时间(毫秒) |
max_memory |
number | 最大使用内存(KB) |
code |
string | 用户提交的源代码 |
formattedCode |
string | 格式化后的代码 |
language |
string | 评测语言 |
result |
object | 评测详细结果 |
pending |
boolean | 是否仍在评测中 |
submitTime |
integer | 提交时间(时间戳) |
userId |
integer | 用户 ID |
problemId |
integer | 题目 ID |
creditDeducted |
integer | 本次实际扣除的计费点 |
coinDeducted |
number | 本次实际扣除的金币 |
message |
string | 评测失败时的提示信息 |
计费说明
- 查询评测结果计费(评测成功后只计费一次,失败不计费)
获取评测结果(长轮询)
鉴权方式
JWT Bearer Token
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
requestId |
integer | 是 | 评测请求 ID |
返回字段
| 字段名 | 类型 | 说明 |
|---|---|---|
success |
boolean | 是否成功 |
requestId |
integer | 评测请求 ID |
status |
string | 评测状态(如 Waiting, Accepted, WrongAnswer 等) |
total_time |
number | 运行总时间(毫秒) |
max_memory |
number | 最大使用内存(KB) |
score |
number | 得分 |
code |
string | 用户提交的源代码 |
formattedCode |
string | 格式化后的代码 |
language |
string | 评测语言 |
result |
object | 评测详细结果 |
pending |
boolean | 是否仍在评测中 |
submitTime |
integer | 提交时间(时间戳,单位秒) |
userId |
integer | 用户 ID |
problemId |
integer | 题目 ID |
nextPoll |
integer | 建议前端下次轮询间隔(毫秒) |
creditDeducted |
integer | 本次实际扣除的计费点 |
coinDeducted |
number | 本次实际扣除的金币 |
message |
string | 评测失败时的提示信息 |
计费说明
- 查询评测结果计费(评测成功后只计费一次,失败不计费)
result 结构
| 字段名 | 类型 | 说明 |
|---|---|---|
compile |
object | 编译结果 |
compile.status |
integer | 编译状态 |
judge |
object | 评测结果 |
judge.subtasks |
array | 子任务列表 |
judge.subtasks[].cases |
array | 测试点列表 |
judge.subtasks[].cases[].status |
integer | 测试点状态 |
judge.subtasks[].cases[].result |
object | 测试点详细结果 |
judge.subtasks[].cases[].result.type |
integer | 结果类型 |
judge.subtasks[].cases[].result.time |
integer | 用时(毫秒) |
judge.subtasks[].cases[].result.memory |
integer | 内存(KB) |
judge.subtasks[].cases[].result.userError |
string | 用户程序错误输出 |
judge.subtasks[].cases[].result.userOutput |
string/null | 用户输出 |
judge.subtasks[].cases[].result.scoringRate |
number | 得分率 |
judge.subtasks[].cases[].result.spjMessage |
string/null | SPJ 消息 |
judge.subtasks[].cases[].result.input |
object | 输入文件信息 |
judge.subtasks[].cases[].result.input.name |
string | 输入文件名 |
judge.subtasks[].cases[].result.input.content |
string | 输入内容(部分省略) |
judge.subtasks[].cases[].result.output |
object | 输出文件信息 |
judge.subtasks[].cases[].result.output.name |
string | 输出文件名 |
judge.subtasks[].cases[].result.output.content |
string | 输出内容(部分省略) |
judge.subtasks[].cases[].result.systemMessage |
string | 系统消息(如崩溃原因) |