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