From 9fa97ccd48f1f167bf3fc7f7e1865f085f251733 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A4=BE=E4=BC=9A=E6=98=93=E5=A7=90QwQ?= <45892418+SocialSisterYi@users.noreply.github.com> Date: Sun, 14 Nov 2021 21:48:11 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E3=80=90=E8=BD=AC=E6=AD=A3?= =?UTF-8?q?=E7=AD=94=E9=A2=98=E3=80=91=E7=9B=B8=E5=85=B3api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +- newbie_exam/action.md | 394 +++++++++++++++++++++++++++++++++++++++++- newbie_exam/fetch.md | 11 +- newbie_exam/info.md | 216 +++++++++++++++++------ 4 files changed, 558 insertions(+), 72 deletions(-) diff --git a/README.md b/README.md index b2ea958..42ca60e 100644 --- a/README.md +++ b/README.md @@ -13,11 +13,12 @@ GitHub forks - GitHub license + GitHub license

野生API文档

不断更新中....

+ 本项目旨在对B站web端、移动端以及TV端散落在世界各地的野生api进行收集整理,研究使用方法并对其进行说明,运用了黑箱法、控制变量法、js逆向分析法、apk拆包及反编译法、网络抓包法等研究办法 所有api均为标准http协议,返回数据大都为json或protobuf @@ -181,10 +182,10 @@ PS:所有http协议地址均可使用https,文档中为了统一写作`http` - 直播间操作 - [直播视频流](live/live_stream.md)× - [直播信息流](live/message_stream.md)× -- [转正答题](newbie_exam) - - [查询信息](newbie_exam/info.md)× +- [转正答题](newbie_exam)× + - [查询信息](newbie_exam/info.md)√ - [拉取题目](newbie_exam/fetch.md)√ - - [操作](newbie_exam/action.md)× + - [操作](newbie_exam/action.md)√ - B币钱包 - 基本信息 - B币充值 diff --git a/newbie_exam/action.md b/newbie_exam/action.md index b6314cd..42a02f2 100644 --- a/newbie_exam/action.md +++ b/newbie_exam/action.md @@ -2,12 +2,12 @@ - [提交答题](#提交答题) - [提交基础题](#提交基础题) - - 提交附加题 - - 提交自选题 - -- 获取极验验证码 -- 提交自选题分类 -- 提前交卷 + - [提交附加题](#提交附加题) + - [提交自选题](#提交自选题) +- [获取验证码](#获取验证码) +- [提交验证码](#提交验证码) +- [提交自选题分类](#提交自选题分类) +- [提前交卷](#提前交卷) --- @@ -35,7 +35,67 @@ | 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
41014:答题过快或错误太多
41012:用户答题提交题目id不合法
41020:用户基础题已通过 | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
41014:答题过快或错误太多
41012:用户答题提交题目id不合法
41020:用户基础题已通过
41023:用户答题记录不存在 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ---- | ------------ | ----------------------------------- | +| passed | bool | 选项是否正确 | true:选项正确
false:选项错误 | + +**示例:** + +提交题目id为`104`的题,选项hash为`cb4c8cc9424fc771f7c1598e74de498f` + +```shell +curl 'http://api.bilibili.com/x/answer/v4/base/check' \ +--data-urlencode 'question_id=104' \ +--data-urlencode 'ans_hash=cb4c8cc9424fc771f7c1598e74de498f' \ +--data-urlencode 'csrf=xxxx' \ +-b 'SESSDATA=xxxx' +``` + +
+查看响应示例: +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "passed": true + } +} +``` + +
+ +### 提交附加题 + +> http://api.bilibili.com/x/answer/v4/base/check + +*请求方式:POST* + +认证方式:APP或Cookie(SESSDATA) + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ----------- | ---- | ------------------------ | -------------- | ------------------------------------------ | +| question_id | num | 题目id | 必要 | 从[拉取基础题api](fetch.md#拉取基础题)获得 | +| ans_hash | str | 选项hash | 必要 | 从[拉取基础题api](fetch.md#拉取基础题)获得 | +| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
41014:答题过快或错误太多
41012:用户答题提交题目id不合法
41023:用户答题记录不存在 | | message | str | 错误信息 | 默认为0 | | ttl | num | 1 | | | data | obj | 信息本体 | | @@ -61,6 +121,66 @@ curl 'http://api.bilibili.com/x/answer/v4/base/check' \
查看响应示例: +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "passed": true + } +} +``` + +
+ +### 提交自选题 + +> http://api.bilibili.com/x/answer/v4/pro/check + +*请求方式:POST* + +认证方式:APP或Cookie(SESSDATA) + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ----------- | ---- | ------------------------ | -------------- | ------------------------------------------ | +| question_id | num | 题目id | 必要 | 从[拉取基础题api](fetch.md#拉取基础题)获得 | +| ans_hash | str | 选项hash | 必要 | 从[拉取基础题api](fetch.md#拉取基础题)获得 | +| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
41014:答题过快或错误太多
41012:用户答题提交题目id不合法
41023:用户答题记录不存在
41026:获取用户DB题目信息异常 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------ | ---- | ---- | ---------- | +| passed | bool | true | 恒为`true` | + +**示例:** + +提交题目id为`2935`的题,选项hash为`ffd55cbe0624f466bee2ea3eb576a4d0` + +```shell +curl -G 'http://api.bilibili.com/x/answer/v4/pro/check' \ +--data-urlencode 'question_id=2935' \ +--data-urlencode 'ans_hash=ffd55cbe0624f466bee2ea3eb576a4d0' \ +--data-urlencode 'csrf=xxxx' \ +-b 'SESSDATA=xxxx' +``` + +
+查看响应示例: ```json { @@ -73,4 +193,262 @@ curl 'http://api.bilibili.com/x/answer/v4/base/check' \ } ``` -
\ No newline at end of file + + +## 获取验证码 + +> http://api.bilibili.com/x/answer/v4/captcha + +*请求方式:GET* + +认证方式:APP或Cookie(SESSDATA) + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
41010:用户答题非法访问
41014:答题过快或错误太多
41020:用户基础题已通过
41021:用户基础题未通过 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| --------- | ---- | ----------- | ------------- | +| type | str | 验证码类型? | geetest:极验 | +| gt | str | 极验id | | +| challenge | str | 极验key | | +| token | str | (?) | | +| url | str | (?) | | + +**示例:** + +```shell +curl 'http://api.bilibili.com/x/answer/v4/captcha' \ +-b 'SESSDATA=xxxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "type": "geetest", + "gt": "abc55d1fb914cb110cfb4c232a4b4c35", + "challenge": "90a6e03e626e13ee186ddae0107c3ae2", + "token": "", + "url": "" + } +} +``` + +
+ +## 提交验证码 + +> http://api.bilibili.com/x/answer/v4/captcha/check + +*请求方式:POST* + +认证方式:APP或Cookie(SESSDATA) + +**注:** + +旧版`edition=0`同时提交自选题分类以及验证码 + +新版`edition=2`仅仅提交验证码 + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ----------------- | ---- | ---------------------- | -------------- | ---------------- | +| types | nums | 自选题分类(旧版) | 非必要 | 新版不需要此字段 | +| type | str | 验证码类型 | 非必要 | | +| bilibili_token | str | | 非必要 | | +| bilibili_code | str | | 非必要 | | +| geetest_challenge | str | 极验key | 非必要 | | +| geetest_seccode | str | 极验结果+\|jordan | 非必要 | | +| geetest_validate | str | 极验结果 | 非必要 | | +| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-101:账号未登录
-105:验证码错误
-400:请求错误
41010:用户答题非法访问
41014:答题过快或错误太多
41021:用户基础题未通过
41031:自选题未通过 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | + +**示例:** + +```shell +curl 'http://api.bilibili.com/x/answer/v4/captcha/check' \ +--data-urlencode 'types=' \ +--data-urlencode 'type=geetest' \ +--data-urlencode 'bilibili_token=' \ +--data-urlencode 'bilibili_code=' \ +--data-urlencode 'geetest_challenge=3f809a7a9c51edca751fd26c032c182d' \ +--data-urlencode 'geetest_seccode=513ec576a275a3eb250829202d4dce46|jordan' \ +--data-urlencode 'geetest_validate=513ec576a275a3eb250829202d4dce46' \ +--data-urlencode 'csrf=xxx' \ +-b 'SESSDATA=xxxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +
+ +## 提交自选题分类 + +> http://api.bilibili.com/x/answer/v4/pro/type/check + +*请求方式:POST* + +认证方式:APP或Cookie(SESSDATA) + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ---------------------- | -------------- | ---- | +| types | nums | 自选题分类(新版) | 必要 | | +| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
41010:用户答题非法访问
41014:答题过快或错误太多
41021:用户基础题未通过
41031:自选题未通过
41052:用户题目类型不合法
41055:基础附加题未通过 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | + +**示例:** + +选择`游戏` `影视` `科教/知识` `动画/动漫`分类 + +```shell +curl 'http://api.bilibili.com/x/answer/v4/pro/type/check' \ +--data-urlencode 'types=1,2,3,4' \ +--data-urlencode 'csrf=xxx' \ +-b 'SESSDATA=xxxx' +``` + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1 +} +``` + +
+ +## 提前交卷 + +> http://api.bilibili.com/x/answer/v4/submit + +*请求方式:POST* + +认证方式:APP或Cookie(SESSDATA) + +当当前得分>=60时,可请求本接口提前完成答题 + +**正文参数( application/x-www-form-urlencoded ):** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | ---------------------- | -------------- | ---- | +| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | + +**json回复:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ------------------------------------------------------------ | +| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
41014:答题过快或错误太多
41023:用户答题记录不存在
41031:自选题未通过 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | + +`data`对象: + +| 字段 | 类型 | 内容 | 备注 | +| ------------ | ---- | ---------------- | -------------------------------------------- | +| hid | num | 答题会话id | | +| mid | num | 答题用户mid | | +| score | num | 得分 | | +| status | num | 0 | | +| number | num | 0 | | +| result | str | succeed | | +| stage | str | result | | +| version | str | 版本 | 目前为`v4` | +| start_time | num | 本次答题开始时间 | 时间戳 | +| first_answer | num | 0 | | +| progress | str | | | +| text | str | | | +| url | str | | | +| in_reg_audit | bool | | | +| edition | num | 答题版本 | 0:旧版(40+10+50)
2:新版(40+30+30) | +| rewards | null | | | +| captcha | num | 1 | | + +**示例:** + +```shell +curl 'http://api.bilibili.com/x/answer/v4/submit' \ +--data-urlencode 'csrf=xxx' \ +-b 'SESSDATA=xxxx' +``` + +
+查看响应示例: +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": { + "hid": 1623207905520705, + "mid": 293793435, + "score": 63, + "status": 3, + "number": 0, + "result": "succeed", + "stage": "result", + "version": "v4", + "start_time": 1636889218, + "first_answer": 0, + "progress": "", + "text": "", + "url": "", + "in_reg_audit": false, + "edition": 0, + "rewards": null, + "captcha": 1 + } +} +``` + +
diff --git a/newbie_exam/fetch.md b/newbie_exam/fetch.md index a21d806..d7d4315 100644 --- a/newbie_exam/fetch.md +++ b/newbie_exam/fetch.md @@ -35,11 +35,11 @@ | 字段 | 类型 | 内容 | 备注 | | ---------- | ----- | ------------------ | ------------------------------------------------------------ | -| id | num | 问题id | | +| id | num | 问题id | **问题id不代表题图,因为选项是打乱的** | | number | num | 当前题号 | | | q_height | num | 问题部分总高度 | | | q_coord_y | num | 问题部分Y裁剪起始 | 当然是0 | -| image | str | 题图url | 题目+所有的选项 | +| image | str | 题图url | 题目文字+所有的选项文字排版成一张图,存储在bfs中 | | from | str | 问题来源页面url | 如:“xx弹幕是否违规”所在的视频页 | | options | array | 选项列表 | | | type_id | num | 题目父类型id | 见[查询自选题分类](info.md#查询自选题分类)
**注:36为基础题** | @@ -62,7 +62,7 @@ | number | num | 选项序号 | 如:1为A 2为B | | high | num | 选项部分总高度 | | | coord_y | num | 选项部分Y裁剪起始 | | -| hash | str | 选项hash | 作为提交对应选项时的参数 | +| hash | str | 选项hash | 作为提交对应选项时应传参 | **示例:** @@ -211,8 +211,6 @@ curl -G 'http://api.bilibili.com/x/answer/v4/pro' \
查看响应示例: - - ```json { "code": 0, @@ -260,4 +258,5 @@ curl -G 'http://api.bilibili.com/x/answer/v4/pro' \ } ``` -
\ No newline at end of file + + diff --git a/newbie_exam/info.md b/newbie_exam/info.md index fb02079..10f2c38 100644 --- a/newbie_exam/info.md +++ b/newbie_exam/info.md @@ -25,22 +25,25 @@ `data`对象: -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ---------------- | ------------------------------------------------------------ | -| hid | num | 答题会话id | | -| mid | num | 答题用户mid | | -| score | num | 当前得分 | | -| status | num | 答题状态 | 0:未答题
2:答题中
3:已通过 | -| number | num | 当前题号 | | -| result | str | 是否通过答题 | failed:未通过
succeed:已通过 | -| stage | str | 当前答题阶段 | base:基础题
extra:附加题
pro_type:等待选择自选题类型
pro:自选题
complete:已完成 | -| version | str | 答题版本 | | -| start_time | num | 本次答题开始时间 | | -| first_answer | num | (?) | | -| progress | str | 当前答题进度 | 百分比
60分为100% | -| text | str | 提示文案 | | -| url | str | 答题页面url | | -| in_reg_audit | bool | (?) | | +| 字段 | 类型 | 内容 | 备注 | +| ------------ | ---- | ------------------ | ------------------------------------------------------------ | +| hid | num | 答题会话id | | +| mid | num | 答题用户mid | | +| score | num | 当前得分 | | +| status | num | 答题状态 | 0:未答题
2:答题中
3:已通过 | +| number | num | 当前题号 | | +| result | str | 是否通过答题 | failed:未通过
succeed:已通过 | +| stage | str | 当前答题阶段 | base:基础题
extra:附加题
pro_type:等待选择自选题类型
pro:自选题
complete:已完成 | +| version | str | 答题版本 | 当前为`v4` | +| start_time | num | 本次答题开始时间 | 时间戳 | +| first_answer | num | (?) | | +| progress | str | 当前答题进度 | 百分比
60分为100% | +| text | str | 提示文案 | | +| url | str | 答题页面url | | +| in_reg_audit | bool | 是否为第一次答题 | | +| edition | num | 答题版本 | 0:旧版(40+10+50)
2:新版(40+30+30) | +| rewards | null | (?) | | +| captcha | num | 是否已经提交验证码 | 1:已提交
仅新版提交验证码后存在 | **示例:** @@ -58,20 +61,22 @@ curl -G 'http://api.bilibili.com/x/answer/v4/status' \ "message": "0", "ttl": 1, "data": { - "hid": 1614593296356209, - "mid": 1386643599, - "score": 28, + "hid": 1623207905520705, + "mid": 293793435, + "score": 2, "status": 2, - "number": 28, + "number": 2, "result": "failed", "stage": "base", "version": "v4", - "start_time": 1614593296, + "start_time": 1623207905, "first_answer": 2, - "progress": "47", + "progress": "3", "text": "继续答题", "url": "https://www.bilibili.com/h5/newbie/entry?navhide=1", - "in_reg_audit": false + "in_reg_audit": false, + "edition": 0, + "rewards": null } } ``` @@ -86,6 +91,8 @@ curl -G 'http://api.bilibili.com/x/answer/v4/status' \ 认证方式:Cookie或APP +当字段`edition`的值不同时,该接口返回的数据也不同 + **json回复:** | 字段 | 类型 | 内容 | 备注 | @@ -133,6 +140,8 @@ curl -G 'http://api.bilibili.com/x/answer/v4/pro/type' \ -b 'SESSDATA=xxx' ``` +旧版`edition=0`返回: +
查看响应示例: @@ -294,13 +303,111 @@ curl -G 'http://api.bilibili.com/x/answer/v4/pro/type' \
+新版`edition=2`返回: + +
+查看响应示例: + +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": [ + { + "id": 1, + "name": "游戏", + "fields": [ + { + "id": 1, + "name": "游戏" + } + ] + }, + { + "id": 2, + "name": "影视", + "fields": [ + { + "id": 2, + "name": "影视" + } + ] + }, + { + "id": 3, + "name": "科教/知识", + "fields": [ + { + "id": 3, + "name": "科教/知识" + } + ] + }, + { + "id": 4, + "name": "动画/动漫", + "fields": [ + { + "id": 4, + "name": "动画/动漫" + } + ] + }, + { + "id": 5, + "name": "音乐/舞蹈", + "fields": [ + { + "id": 5, + "name": "音乐/舞蹈" + } + ] + }, + { + "id": 32, + "name": "明星/娱乐", + "fields": [ + { + "id": 32, + "name": "明星/娱乐" + } + ] + }, + { + "id": 35, + "name": "鬼畜", + "fields": [ + { + "id": 35, + "name": "鬼畜" + } + ] + }, + { + "id": 42, + "name": "时尚/健身", + "fields": [ + { + "id": 42, + "name": "时尚/健身" + } + ] + } + ] +} +``` + +
+ + ## 查询答题结果 > http://api.bilibili.com/x/answer/v4/result *请求方式:GET* -认证方式:Cookie或APP +认证方式:无 **url参数:** @@ -310,39 +417,40 @@ curl -G 'http://api.bilibili.com/x/answer/v4/pro/type' \ **json回复:** -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
41014:答题过快或错误太多
41023:用户答题记录不存在 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | +| 字段 | 类型 | 内容 | 备注 | +| ------- | ---- | -------- | ---------------------------------------------------------- | +| code | num | 返回值 | 0:成功
-400:请求错误
41023:用户答题记录不存在 | +| message | str | 错误信息 | 默认为0 | +| ttl | num | 1 | | +| data | obj | 信息本体 | | `data`对象: -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ----- | ------------------ | ------ | -| hid | num | 答题会话id | | -| mid | num | 答题用户mid | | -| member | num | | | -| score | num | 得分 | | -| level | num | | | -| first_pass | num | | | -| uname | str | 答题用户昵称 | | -| face | str | 答题用户头像url | | -| status | str | 答题结果 | | -| question_types | array | 已选择的自选题列表 | | -| power | array | 自选题分类得分情况 | | -| start_time | num | 开始答题时间 | 时间戳 | -| share | array | | | -| can_show_rank_btn | bool | | | -| is_same_user | bool | | | -| view_more | str | | | -| video_info | obj | | | -| main_tids | array | | | -| sub_tids | array | | | -| power_result | null | | | -| score_rate | num | | | -| permission | obj | | | +| 字段 | 类型 | 内容 | 备注 | +| ----------------- | ----- | ------------------------ | ----------------------------------- | +| hid | num | 答题会话id | | +| mid | num | 答题用户mid | | +| member | num | | | +| score | num | 得分 | | +| level | num | 用户等级 | | +| first_pass | num | | | +| uname | str | 用户昵称 | | +| face | str | 用户头像url | | +| status | str | 答题结果 | failed:未通过
succeed:已通过 | +| question_types | array | 已选择的自选题列表 | | +| power | array | 自选题分类得分情况 | | +| start_time | num | 开始答题时间 | 时间戳 | +| share | obj | | | +| can_show_rank_btn | bool | | | +| is_same_user | bool | | | +| view_more | str | | | +| video_info | obj | | | +| main_tids | array | | | +| sub_tids | array | | | +| power_result | null | | | +| score_rate | num | 分数超过平均用户的百分比 | | +| permission | obj | | | +| rewards | null | | | **示例:**