From 74eed0044e0b670e515e8e1c9e7ae94e55e64f0d Mon Sep 17 00:00:00 2001
From: SocialSisterYi <45892418+SocialSisterYi@users.noreply.github.com>
Date: Sun, 7 Mar 2021 13:04:29 +0800
Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=83=A8=E5=88=86=E3=80=90?=
=?UTF-8?q?=E8=BD=AC=E6=AD=A3=E7=AD=94=E9=A2=98=E3=80=91api?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 7 +-
newbie_exam/action.md | 76 +++++++
newbie_exam/fetch.md | 263 +++++++++++++++++++++++++
newbie_exam/info.md | 448 ++++++++++++++++++++++++++++++++++++++++++
4 files changed, 792 insertions(+), 2 deletions(-)
create mode 100644 newbie_exam/action.md
create mode 100644 newbie_exam/fetch.md
create mode 100644 newbie_exam/info.md
diff --git a/README.md b/README.md
index 19bd74e..8586aa2 100644
--- a/README.md
+++ b/README.md
@@ -20,7 +20,7 @@
野生API文档
不断更新中....
-本项目旨在对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币充值
diff --git a/newbie_exam/action.md b/newbie_exam/action.md
new file mode 100644
index 0000000..b6314cd
--- /dev/null
+++ b/newbie_exam/action.md
@@ -0,0 +1,76 @@
+# 操作
+
+- [提交答题](#提交答题)
+ - [提交基础题](#提交基础题)
+ - 提交附加题
+ - 提交自选题
+
+- 获取极验验证码
+- 提交自选题分类
+- 提前交卷
+
+---
+
+## 提交答题
+
+### 提交基础题
+
+> 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不合法
41020:用户基础题已通过 |
+| 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
+ }
+}
+```
+
+
\ No newline at end of file
diff --git a/newbie_exam/fetch.md b/newbie_exam/fetch.md
new file mode 100644
index 0000000..58a2181
--- /dev/null
+++ b/newbie_exam/fetch.md
@@ -0,0 +1,263 @@
+# 拉取题目
+
+- [拉取基础题](#拉取基础题)
+- [拉取附加题](#拉取附加题)
+- [拉取自选题](#拉取自选题)
+
+---
+
+## 拉取基础题
+
+> http://api.bilibili.com/x/answer/v4/base
+
+*请求方式:GET*
+
+认证方式:Cookie或APP
+
+**json回复:**
+
+根对象:
+
+| 字段 | 类型 | 内容 | 备注 |
+| ------- | ---- | -------- | ------------------------------------------------------------ |
+| code | num | 返回值 | 0:成功
-101:账号未登录
41014:答题过快或错误太多
41020:用户基础题已通过
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#查询自选题分类)
**注: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'
+```
+
+
+查看响应示例:
+
+```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"
+ }
+ }
+}
+```
+
+
+## 拉取附加题
+
+> http://api.bilibili.com/x/answer/v4/extra
+
+*请求方式:GET*
+
+认证方式:Cookie或APP
+
+**json回复:**
+
+根对象:
+
+| 字段 | 类型 | 内容 | 备注 |
+| ------- | ---- | -------- | ------------------------------------------------------------ |
+| code | num | 返回值 | 0:成功
-101:账号未登录
41014:答题过快或错误太多
41021:用户基础题未通过
41023:用户答题记录不存在
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'
+```
+
+
+查看响应示例:
+
+```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"
+ }
+ }
+}
+```
+
+
+## 拉取自选题
+
+> http://api.bilibili.com/x/answer/v4/pro
+
+*请求方式:GET*
+
+认证方式:Cookie或APP
+
+**json回复:**
+
+根对象:
+
+| 字段 | 类型 | 内容 | 备注 |
+| ------- | ---- | -------- | ------------------------------------------------------------ |
+| code | num | 返回值 | 0:成功
-101:账号未登录
41014:答题过快或错误太多
41021:用户基础题未通过
41023:用户答题记录不存在
41051:用户答题验证码未通过
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'
+```
+
+
+查看响应示例:
+
+
+```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"
+ }
+ }
+}
+```
+
+
\ No newline at end of file
diff --git a/newbie_exam/info.md b/newbie_exam/info.md
new file mode 100644
index 0000000..57dcffe
--- /dev/null
+++ b/newbie_exam/info.md
@@ -0,0 +1,448 @@
+# 查询信息
+
+- [查询答题状态](#查询答题状态)
+- [查询自选题分类](#查询自选题分类)
+- [查询答题结果](#查询答题结果)
+
+---
+
+## 查询答题状态
+
+> http://api.bilibili.com/x/answer/v4/status
+
+*请求方式:GET*
+
+认证方式:Cookie或APP
+
+**json回复:**
+
+| 字段 | 类型 | 内容 | 备注 |
+| ------- | ---- | -------- | ------------------------------------------------------------ |
+| code | num | 返回值 | 0:成功
-101:账号未登录
41014:答题过快或错误太多 |
+| message | str | 错误信息 | 默认为0 |
+| ttl | num | 1 | |
+| data | obj | 信息本体 | |
+
+`data`对象:
+
+| 字段 | 类型 | 内容 | 备注 |
+| ------------ | ---- | ---------------- | ------------------------------------------------------------ |
+| hid | num | 答题会话id | |
+| mid | num | 答题用户UID | |
+| 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 | (?) | |
+
+**示例:**
+
+```shell
+curl -G 'http://api.bilibili.com/x/answer/v4/status' \
+-b 'SESSDATA=xxx'
+```
+
+
+查看响应示例:
+
+```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
+ }
+}
+```
+
+
+
+## 查询自选题分类
+
+> http://api.bilibili.com/x/answer/v4/pro/type
+
+*请求方式:GET*
+
+认证方式:Cookie或APP
+
+**json回复:**
+
+| 字段 | 类型 | 内容 | 备注 |
+| ------- | ----- | ---------- | ------------------------------------------------------------ |
+| code | num | 返回值 | 0:成功
-101:账号未登录
41014:答题过快或错误太多
41021:用户基础题未通过
41031:自选题未通过
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'
+```
+
+
+查看响应示例:
+
+```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": "鬼畜 "
+ }
+ ]
+ }
+ ]
+}
+```
+
+
+
+## 查询答题结果
+
+> http://api.bilibili.com/x/answer/v4/result
+
+*请求方式:GET*
+
+认证方式:Cookie或APP
+
+**url参数:**
+
+| 参数名 | 类型 | 内容 | 必要性 | 备注 |
+| ------ | ---- | ---------- | ------ | ---- |
+| hid | num | 答题会话id | 必要 | |
+
+**json回复:**
+
+| 字段 | 类型 | 内容 | 备注 |
+| ------- | ---- | -------- | ------------------------------------------------------------ |
+| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
41014:答题过快或错误太多
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'
+```
+
+
+查看响应示例:
+
+```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
+ }
+ }
+}
+```
+
+
\ No newline at end of file