添加部分【转正答题】api

This commit is contained in:
SocialSisterYi 2021-03-07 13:04:29 +08:00
parent 50e91c7ec7
commit 74eed0044e
4 changed files with 792 additions and 2 deletions

View File

@ -20,7 +20,7 @@
<h3 align="center">野生API文档</h3>
<h3 align="center">不断更新中....</h3>
本项目旨在对B站web端、移动端以及TV端散落在世界各地的野生api进行收集整理研究使用方法并对其进行说明运用了黑箱法、控制变量法、js逆向分析法、网络抓包法等研究办法
本项目旨在对B站web端、移动端以及TV端散落在世界各地的野生api进行收集整理研究使用方法并对其进行说明运用了黑箱法、控制变量法、js逆向分析法、apk拆包及反编译法、网络抓包法等研究办法
所有api均为标准http协议返回数据大都为json或protobuf
@ -174,7 +174,10 @@ PS所有http协议地址均可使用https文档中为了统一写作`http`
- 直播间操作
- [直播视频流](live/live_stream.md)×
- [直播信息流](live/message_stream.md)×
- 答题
- [转正答题](newbie_exam)
- [查询信息](newbie_exam/info.md)×
- [拉取题目](newbie_exam/fetch.md)√
- [操作](newbie_exam/action.md)×
- B币钱包
- 基本信息
- B币充值

76
newbie_exam/action.md Normal file
View File

@ -0,0 +1,76 @@
# 操作
- [提交答题](#提交答题)
- [提交基础题](#提交基础题)
- 提交附加题
- 提交自选题
- 获取极验验证码
- 提交自选题分类
- 提前交卷
---
## 提交答题
### 提交基础题
> http://api.bilibili.com/x/answer/v4/base/check
*请求方式POST*
认证方式APP或CookieSESSDATA
**正文参数( 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成功<br />-101账号未登录<br />-400请求错误<br />41014答题过快或错误太多<br />41012用户答题提交题目id不合法<br />41020用户基础题已通过 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ---- | ------------ | ----------------------------------- |
| passed | bool | 选项是否正确 | true选项正确<br />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'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"passed": true
}
}
```
</details>

263
newbie_exam/fetch.md Normal file
View File

@ -0,0 +1,263 @@
# 拉取题目
- [拉取基础题](#拉取基础题)
- [拉取附加题](#拉取附加题)
- [拉取自选题](#拉取自选题)
---
## 拉取基础题
> http://api.bilibili.com/x/answer/v4/base
*请求方式GET*
认证方式Cookie或APP
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />41014答题过快或错误太多<br />41020用户基础题已通过<br />41023用户答题记录不存在 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | -------- | ---- |
| question | obj | 题目内容 | |
`data`中的`question`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ----- | ------------------ | ------------------------------------------------------------ |
| id | num | 问题id | |
| number | num | 当前题号 | |
| q_height | num | 问题部分总高度 | |
| q_coord_y | num | 问题部分Y裁剪起始 | 当然是0 |
| image | str | 题图url | 题目+所有的选项 |
| from | str | 问题来源页面url | 如“xx弹幕是否违规”所在的视频页 |
| options | array | 选项列表 | |
| type_id | num | 题目父类型id | 见[查询自选题分类](info.md#查询自选题分类)<br />**注36为基础题** |
| type_name | str | 分院小电视提示文案 | 如xx小电视 |
| type_image | str | 分院小电视图标url | |
`question`中的`options`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----- | ---------------------- |
| 0 | obj | 选项A | |
| 1 | obj | 选项B | 选项至少2个 |
| 2 | obj | 选项C | 数组长度取决于选项个数 |
| 3 | obj | 选项D | |
`question`中的`options`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ----------------- | ------------------------ |
| number | num | 选项序号 | 如1为A 2为B |
| high | num | 选项部分总高度 | |
| coord_y | num | 选项部分Y裁剪起始 | |
| hash | str | 选项hash | 作为提交对应选项时的参数 |
**示例:**
```shell
curl -G 'http://api.bilibili.com/x/answer/v4/base' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"question": {
"id": 6511,
"number": 1,
"q_height": 38.4,
"q_coord_y": 0,
"image": "https://i0.hdslb.com/bfs/member/9d7f1f1f0b7478a621d1b998a5a98982.png",
"from": "",
"options": [
{
"number": 1,
"high": 42,
"coord_y": 38.4,
"hash": "f7619d6c2040d44f39dc87a7aa34fb9e"
},
{
"number": 2,
"high": 42,
"coord_y": 80.4,
"hash": "dce5140040f40ca4030783585684369d"
}
],
"type_id": 36,
"type_name": "小电视校长",
"type_image": "https://i0.hdslb.com/bfs/face/7b67c0c0da64a6ab059ff49bb0d4b92988b91806.png"
}
}
}
```
</details>
## 拉取附加题
> http://api.bilibili.com/x/answer/v4/extra
*请求方式GET*
认证方式Cookie或APP
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />41014答题过快或错误太多<br />41021用户基础题未通过<br />41023用户答题记录不存在<br />41054用户附加题已通过 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
同[拉取基础题](#拉取基础题)的`data`对象
**示例:**
```shell
curl -G 'http://api.bilibili.com/x/answer/v4/extra' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"question": {
"id": 11492,
"number": 44,
"q_height": 76.8,
"q_coord_y": 0,
"image": "https://i0.hdslb.com/bfs/member/b6c846613bd0b44cd7c8af1d83e3f0c2.png",
"from": "https://www.bilibili.com/video/av14659093",
"options": [
{
"number": 1,
"high": 42,
"coord_y": 76.8,
"hash": "ca15e6009047cf82358c50ab90fd8d9e"
},
{
"number": 2,
"high": 42,
"coord_y": 118.8,
"hash": "60e86a1c736c68da3462f66377e4e8ca"
}
],
"type_id": 36,
"type_name": "小电视校长",
"type_image": "https://i0.hdslb.com/bfs/face/7b67c0c0da64a6ab059ff49bb0d4b92988b91806.png"
}
}
}
```
</details>
## 拉取自选题
> http://api.bilibili.com/x/answer/v4/pro
*请求方式GET*
认证方式Cookie或APP
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />41014答题过快或错误太多<br />41021用户基础题未通过<br />41023用户答题记录不存在<br />41051用户答题验证码未通过<br />41055基础附加题未通过 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
同[拉取基础题](#拉取基础题)的`data`对象
**示例:**
```shell
curl -G 'http://api.bilibili.com/x/answer/v4/extra' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"question": {
"id": 824,
"number": 54,
"q_height": 38.4,
"q_coord_y": 0,
"image": "https://i0.hdslb.com/bfs/member/417e02be5652f79d0312fa2fcee28869.png",
"from": "",
"options": [
{
"number": 1,
"high": 42,
"coord_y": 38.4,
"hash": "c4574c23cf728c19abeab3e7525258d4"
},
{
"number": 2,
"high": 42,
"coord_y": 80.4,
"hash": "ffd48760758fbb8a2c183d1d04f692f8"
},
{
"number": 3,
"high": 42,
"coord_y": 122.4,
"hash": "898d414dff49fe20c4a1da1e148fadb2"
},
{
"number": 4,
"high": 42,
"coord_y": 164.4,
"hash": "09018443f09d8ef4f6fec5e96e082270"
}
],
"type_id": 1,
"type_name": "游戏小电视",
"type_image": "https://i0.hdslb.com/bfs/face/6590bee26086fed66ee7cc5bac26a32d2f733037.png"
}
}
}
```
</details>

448
newbie_exam/info.md Normal file
View File

@ -0,0 +1,448 @@
# 查询信息
- [查询答题状态](#查询答题状态)
- [查询自选题分类](#查询自选题分类)
- [查询答题结果](#查询答题结果)
---
## 查询答题状态
> http://api.bilibili.com/x/answer/v4/status
*请求方式GET*
认证方式Cookie或APP
**json回复**
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />41014答题过快或错误太多 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------ | ---- | ---------------- | ------------------------------------------------------------ |
| hid | num | 答题会话id | |
| mid | num | 答题用户UID | |
| score | num | 当前得分 | |
| status | num | 答题状态 | 0未答题<br />2答题中<br />3已通过 |
| number | num | 当前题号 | |
| result | str | 是否通过答题 | failed未通过<br />succeed已通过 |
| stage | str | 当前答题阶段 | base基础题<br />extra附加题<br />pro_type等待选择自选题类型<br />pro自选题<br />complete已完成 |
| version | str | 答题版本 | |
| start_time | num | 本次答题开始时间 | |
| first_answer | num | | |
| progress | str | 当前答题进度 | 百分比<br />60分为100% |
| text | str | 提示文案 | |
| url | str | 答题页面url | |
| in_reg_audit | bool | | |
**示例:**
```shell
curl -G 'http://api.bilibili.com/x/answer/v4/status' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"hid": 1614593296356209,
"mid": 1386643599,
"score": 28,
"status": 2,
"number": 28,
"result": "failed",
"stage": "base",
"version": "v4",
"start_time": 1614593296,
"first_answer": 2,
"progress": "47",
"text": "继续答题",
"url": "https://www.bilibili.com/h5/newbie/entry?navhide=1",
"in_reg_audit": false
}
}
```
</details>
## 查询自选题分类
> http://api.bilibili.com/x/answer/v4/pro/type
*请求方式GET*
认证方式Cookie或APP
**json回复**
| 字段 | 类型 | 内容 | 备注 |
| ------- | ----- | ---------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />41014答题过快或错误太多<br />41021用户基础题未通过<br />41031自选题未通过<br />41055基础附加题未通过 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | array | 父分类列表 | |
`data`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------- | ---- |
| 0 | obj | 父分类1 | |
| n | obj | 父分类(n+1) | |
| …… | obj | …… | …… |
`data`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ------ | ----- | ---------- | ---- |
| id | num | 父分类id | |
| name | str | 父分类名 | |
| fields | array | 子分类列表 | |
`data`数组中的对象中的`fields`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------- | ---- |
| 0 | obj | 子分类1 | |
| n | obj | 子分类(n+1) | |
| …… | obj | …… | …… |
`fields`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | -------- | ---- |
| id | num | 子分类id | |
| name | str | 子分类名 | |
**示例:**
```shell
curl -G 'http://api.bilibili.com/x/answer/v4/pro/type' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": [
{
"id": 1,
"name": "游戏",
"fields": [
{
"id": 8,
"name": "动作射击"
},
{
"id": 9,
"name": "冒险格斗"
},
{
"id": 12,
"name": "策略模拟 "
},
{
"id": 13,
"name": "角色扮演 "
},
{
"id": 14,
"name": "音乐体育 "
}
]
},
{
"id": 2,
"name": "影视",
"fields": [
{
"id": 15,
"name": "纪录片 "
},
{
"id": 16,
"name": "电影 "
},
{
"id": 17,
"name": "电视剧 "
}
]
},
{
"id": 3,
"name": "科技",
"fields": [
{
"id": 18,
"name": "军事 "
},
{
"id": 19,
"name": "地理 "
},
{
"id": 20,
"name": "历史 "
},
{
"id": 21,
"name": "文学 "
},
{
"id": 22,
"name": "数学 "
},
{
"id": 23,
"name": "物理 "
},
{
"id": 24,
"name": "化学 "
},
{
"id": 25,
"name": "生物 "
},
{
"id": 26,
"name": "数码科技 "
}
]
},
{
"id": 4,
"name": "动画",
"fields": [
{
"id": 27,
"name": "动画声优 "
},
{
"id": 28,
"name": "动漫内容 "
}
]
},
{
"id": 5,
"name": "艺术",
"fields": [
{
"id": 29,
"name": "ACG音乐 "
},
{
"id": 30,
"name": "三次元音乐 "
},
{
"id": 31,
"name": "绘画 "
}
]
},
{
"id": 6,
"name": "流行前线",
"fields": [
{
"id": 32,
"name": "娱乐 "
},
{
"id": 33,
"name": "时尚 "
},
{
"id": 34,
"name": "运动 "
}
]
},
{
"id": 7,
"name": "鬼畜",
"fields": [
{
"id": 35,
"name": "鬼畜 "
}
]
}
]
}
```
</details>
## 查询答题结果
> http://api.bilibili.com/x/answer/v4/result
*请求方式GET*
认证方式Cookie或APP
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ---------- | ------ | ---- |
| hid | num | 答题会话id | 必要 | |
**json回复**
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误<br />41014答题过快或错误太多<br />41023用户答题记录不存在 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------------- | ----- | ------------------ | ------ |
| hid | num | 答题会话id | |
| mid | num | 答题用户UID | |
| 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 | | |
**示例:**
```shell
curl -G 'http://api.bilibili.com/x/answer/v4/result' \
--data-urlencode 'hid=1615088061307609' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"hid": 1615088061307609,
"mid": 1386643599,
"member": 0,
"score": 70,
"level": 0,
"first_pass": 0,
"uname": "眉凭铱ひ前非",
"face": "http://i0.hdslb.com/bfs/face/cd83d4cdbfb521455c168eaa181915b40cb664d1.jpg",
"status": "succeed",
"question_types": [
{
"id": 12,
"name": "策略模拟 "
},
{
"id": 13,
"name": "角色扮演 "
},
{
"id": 14,
"name": "音乐体育 "
},
{
"id": 8,
"name": "动作射击"
},
{
"id": 9,
"name": "冒险格斗"
}
],
"power": [
{
"score": 0,
"name": "动画"
},
{
"score": 0,
"name": "艺术"
},
{
"score": 5,
"name": "游戏"
},
{
"score": 0,
"name": "科技"
},
{
"score": 0,
"name": "影视"
},
{
"score": 0,
"name": "鬼畜"
}
],
"start_time": 1615088061,
"share": {
"content": "",
"short_content": ""
},
"can_show_rank_btn": false,
"is_same_user": true,
"view_more": "",
"video_info": {
"url": "",
"name": "",
"img": "",
"watch_num": "",
"up_num": ""
},
"main_tids": [],
"sub_tids": [],
"power_result": null,
"score_rate": 84,
"permission": {
"reply": true,
"color_dm": true
}
}
}
```
</details>