玩Android 开放API
xiaoyang 2017-12-11 23:58
大家不要利用开放接口去存一些违法相关的数据,所有访问记录都有日志备份,如有发现,一定全数交给法律审判。
注意
为了满足大家开发小程序等需求,目前本站完全迁移到https下,如果你是开源项目开发者,请尽快迁移 base url 为 https。
目前已知问题:
- http 下登录、注册无法使用 -> 请使用https
baseurl 请使用:
https://www.wanandroid.com
将所有的 http 改为https,即完全支持!
更新一些接口变化的地方,具体看对应章节。有问题请在https://github.com/hongyangAndroid/wanandroid/issues反馈。
注意事项
- 增加 logout 退出接口,见5.3;
- 修改未登录的错误码为-1001,其他错误码为-1,成功为0,建议对errorCode 判断当不为0的时候,均为错误。
由于早期开放的一些API页码为0开始,后期接口修改为从1开始,为了兼顾之前的开放API,故无法统一。
对于POST接口建议使用postman模拟
在编写过程中如果遇到一些问题,也有一些参考项目,这里针对Java和Kotlin各自选择了一款:
- java版本开源:wanandroid开源客户端Java版本
- kotlin版本开源:wanandroid开源客户端kotlin版本
- flutter版本开源:wanandroid开源flutter版本
开源项目或多或少包含一些问题,仅供参考,最好自己写一个啦~
如果你想装一个使用,建议下载kotlin那个版本,我一直在使用,较为稳定。
当然你也可以在github上搜索wanandroid。
返回数据结构定义:
{
"data": ...,
"errorCode": 0,
"errorMsg": ""
}
所有的返回结构均为上述,其中errorCode如果为负数则认为错误,此时errorMsg会包含错误信息。data为Object,返回数据根据不同的接口而变化。
- errorCode = 0 代表执行成功,不建议依赖任何非0的 errorCode.
- errorCode = -1001 代表登录失效,需要重新登录。
如果遇到接口错误,请及时通过https://github.com/hongyangAndroid/wanandroid反馈。
对于需要登录访问的接口,强烈建议阅读下:
【2024-5-26】新增 API
1. 鸿蒙专栏
https://wanandroid.com/harmony/index/json
方法:GET
返回格式:
{
"data": {
"links": {
},
"open_sources": {
},
"tools": {
}
},
"errorCode": 0,
"errorMsg": ""
}
分别对应常用链接、开源项目、常用工具。
最终对象可以复用Chapter、Article bean。
2. 首页最受欢迎板块
问答:
https://wanandroid.com/popular/wenda/json
专栏
https://wanandroid.com/popular/column/json
路线:
https://wanandroid.com/popular/route/json
最终对象可以复用Chapter bean。
1.首页相关
1.1 首页文章列表
https://www.wanandroid.com/article/list/0/json
方法:GET
参数:页码,拼接在连接中,从0开始。
很多 H5 页面会恶意跳转淘宝等,可以在 webview 的 shouldOverrideUrlLoading 中做一下拦截,非常影响用户体验。
可直接点击查看示例:https://www.wanandroid.com/article/list/1/json。
注意:页码从0开始,拼接在链接上。
注:该接口支持传入 page_size 控制分页数量,取值为[1-40],不传则使用默认值,一旦传入了 page_size,后续该接口分页都需要带上,否则会造成分页读取错误。
其中有两个易混淆的字段:
"superChapterId": 153,
"superChapterName": "framework", // 一级分类的名称
superChapterId其实不是一级分类id,因为要拼接跳转url,内容实际都挂在二级分类下,所以该id实际上是一级分类的第一个子类目的id,拼接后故可正常跳转。
有两个字段比较容易混淆:
author 与 shareUser
网站上的文章可能是某位作者author的,也可能是某位分享人shareUser分享的。
如果是分享人分享的,author 为 null。
注意:除了文字标题,链接,其他字段都可能为null,一定要注意布局下发 null 时的显示情况。
1.2 首页banner
https://www.wanandroid.com/banner/json
方法:GET
参数:无
可直接点击查看示例:https://www.wanandroid.com/banner/json
1.3 常用网站
https://www.wanandroid.com/friend/json
方法:GET
参数:无
可直接点击查看示例:https://www.wanandroid.com/friend/json
1.4 搜索热词
即目前搜索最多的关键词。
https://www.wanandroid.com//hotkey/json
方法:GET
参数:无
可直接点击查看示例:https://www.wanandroid.com/hotkey/json
1.5 置顶文章
https://www.wanandroid.com/article/top/json
2. 体系
2.1 体系数据
https://www.wanandroid.com/tree/json
方法:GET
参数:无
可直接点击查看示例:https://www.wanandroid.com/tree/json
主要标识的网站内容的体系结构,二级目录。部分数据参考:
{
"children": [
{
"children": [],
"courseId": 13,
"id": 60, // id会在查看该目录下所有文章时有用
"name": "Android Studio相关", // 子名称
"order": 1000,
"parentChapterId": 150,
"visible": 1
},...
],
"courseId": 13,
"id": 150,
"name": "开发环境", // 一级的名称
"order": 1,
"parentChapterId": 0,
"visible": 1
}
2.2 知识体系下的文章
https://www.wanandroid.com/article/list/0/json?cid=60
方法:GET
参数:
cid 分类的id,上述二级目录的id
页码:拼接在链接上,从0开始。
注:该接口支持传入 page_size 控制分页数量,取值为[1-40],不传则使用默认值,一旦传入了 page_size,后续该接口分页都需要带上,否则会造成分页读取错误。
例如查看类别:Android Studio下所有的文章:https://www.wanandroid.com/article/list/0/json?cid=60
2.3 按照作者昵称搜索文章
https://wanandroid.com/article/list/0/json?author=鸿洋
方法:GET
页码:拼接在链接上,从0开始。
author:作者昵称,不支持模糊匹配。
注:该接口支持传入 page_size 控制分页数量,取值为[1-40],不传则使用默认值,一旦传入了 page_size,后续该接口分页都需要带上,否则会造成分页读取错误。
3. 导航
3.1 导航数据
https://www.wanandroid.com/navi/json
方法:GET
参数:无
可直接点击查看示例:https://www.wanandroid.com/navi/json
4. 项目
4.1 项目分类
https://www.wanandroid.com/project/tree/json
方法: GET
参数: 无
项目为包含一个分类,该接口返回整个分类。
[
{
"children": [],
"courseId": 13,
"id": 294, // 该id在获取该分类下项目时需要用到
"name": "完整项目", // 该分类名称
"order": 145000,
"parentChapterId": 293,
"visible": 0
}
]
可以直接访问:https://www.wanandroid.com/project/tree/json
4.2 项目列表数据
某一个分类下项目列表数据,分页展示
https://www.wanandroid.com/project/list/1/json?cid=294
方法:GET
参数:
cid 分类的id,上面项目分类接口
页码:拼接在链接中,从1开始。
注:该接口支持传入 page_size 控制分页数量,取值为[1-40],不传则使用默认值,一旦传入了 page_size,后续该接口分页都需要带上,否则会造成分页读取错误。
可以直接访问:https://www.wanandroid.com/project/list/1/json?cid=294
5. 登录与注册
5.1 登录
https://www.wanandroid.com/user/login
方法:POST
参数:
username,password
登录后会在cookie中返回账号密码,只要在客户端做cookie持久化存储即可自动登录验证。
5.2 注册
https://www.wanandroid.com/user/register
方法:POST
参数
username,password,repassword
5.3 退出
https://www.wanandroid.com/user/logout/json
方法:GET
访问了 logout 后,服务端会让客户端清除 Cookie(即cookie max-Age=0),如果客户端 Cookie 实现合理,可以实现自动清理,如果本地做了用户账号密码和保存,及时清理。
如果需要特殊的errorCode 来支持清除数据,请反馈。
6. 收藏
注意所有收藏相关都需要登录操作,建议登录将返回的cookie(其中包含账号、密码)持久化到本地即可。
对于需要登录访问的接口,强烈建议阅读下:
6.1 收藏文章列表
https://www.wanandroid.com/lg/collect/list/0/json
方法:GET
参数: 页码:拼接在链接中,从0开始。
注:该接口支持传入 page_size 控制分页数量,取值为[1-40],不传则使用默认值,一旦传入了 page_size,后续该接口分页都需要带上,否则会造成分页读取错误。
在网站上登录后,可以直接访问https://www.wanandroid.com/lg/collect/list/0/json查看自己收藏的文章。
6.2 收藏站内文章
https://www.wanandroid.com/lg/collect/1165/json
方法:POST
参数: 文章id,拼接在链接中。
注意链接中的数字,为需要收藏的id.
6.3 收藏站外文章
https://www.wanandroid.com/lg/collect/add/json
方法:POST
参数:
title,author,link
[新增] 编辑收藏的文章,支持站内,站外
更新日期 2021-08-22
https://wanandroid.com/lg/collect/user_article/update/ 文章 id/json
方法:POST请求
参数
文章 id:拼接在 url 上
title: 文章标题
link: 文章 url
author: 作者
注意:调用此接口,一定要带上 title,link,author,否则会认为想设置为""。
6.4 取消收藏
取消收藏一共有两个地方可以触发:
6.4.1 文章列表
https://www.wanandroid.com/lg/uncollect_originId/2333/json
方法:POST
参数:
id:拼接在链接上
id传入的是列表中文章的id。
6.4.2 我的收藏页面(该页面包含自己录入的内容)
https://www.wanandroid.com/lg/uncollect/2805/json
方法:POST
参数:
id:拼接在链接上
originId:列表页下发,无则为-1
如下图:id=2766,originId=2324
originId 代表的是你收藏之前的那篇文章本身的id; 但是收藏支持主动添加,这种情况下,没有originId则为-1
6.5 收藏网站列表
https://www.wanandroid.com/lg/collect/usertools/json
方法:GET
参数:无
6.6 收藏网址
https://www.wanandroid.com/lg/collect/addtool/json
方法:POST
参数:
name,link
6.7 编辑收藏网站
https://www.wanandroid.com/lg/collect/updatetool/json
方法:POST
参数:
id,name,link
6.8 删除收藏网站
https://www.wanandroid.com/lg/collect/deletetool/json
方法:POST
参数:
id
7. 搜索
7.1 搜索
https://www.wanandroid.com/article/query/0/json
方法:POST
参数:
页码:拼接在链接上,从0开始。
k : 搜索关键词
注:该接口支持传入 page_size 控制分页数量,取值为[1-40],不传则使用默认值,一旦传入了 page_size,后续该接口分页都需要带上,否则会造成分页读取错误。
注意:支持多个关键词,用空格隔开
8. TODO 工具
最新的 v2版本已经更新,建议使用:玩 Android TODO Open API v2,老接口依然支持,但是已经不再推荐使用。
注意所有TODO相关都需要登录操作,建议登录将返回的cookie(其中包含账号、密码)持久化到本地即可。
对于需要登录访问的接口,强烈建议阅读下:
9.积分 API 2019-08-25
积分排行榜接口
https://www.wanandroid.com/coin/rank/1/json
获取个人积分,需要登录后访问
https://www.wanandroid.com/lg/coin/userinfo/json
{
"data": {
"coinCount": 451, //总积分
"rank": 7, //当前排名
"userId": 2,
"username": "x**oyang"
},
"errorCode": 0,
"errorMsg": ""
}
获取个人积分获取列表,需要登录后访问
https://www.wanandroid.com//lg/coin/list/1/json
10. 广场 2019-10-02
10.1 广场列表数据
https://wanandroid.com/user_article/list/页码/json
GET请求
页码拼接在url上从0开始
注:该接口支持传入 page_size 控制分页数量,取值为[1-40],不传则使用默认值,一旦传入了 page_size,后续该接口分页都需要带上,否则会造成分页读取错误。
示例:
https://wanandroid.com/user_article/list/0/json
可能出现返回列表数据<每页数据,因为有自见的文章被过滤掉了。
10.2 分享人对应列表数据
这个展示的文章数据都是审核通过的,一般是点击分享人然后展示的列表。
就像:https://wanandroid.com/user/2/articles/1
https://www.wanandroid.com/user/2/share_articles/页码/json
GET请求
参数:
用户id: 拼接在url上
页码拼接在url上从1开始
返回数据:
{
"data": {
"coinInfo": { // 该用户积分信息
"coinCount": 20, // 积分总数
"rank": 1, // 排名
"userId": 2,
"username": "x**oyang"
},
"shareArticles": { // 该用户分享文章分页信息
}
}
},
"errorCode": 0,
"errorMsg": ""
}
示例:
https://www.wanandroid.com/user/2/share_articles/1/json
可能出现返回列表数据<每页数据,因为有自见的文章被过滤掉了。
10.3 自己的分享的文章列表
https://wanandroid.com/user/lg/private_articles/1/json
方法:
GET
参数:
页码,从1开始
注:该接口支持传入 page_size 控制分页数量,取值为[1-40],不传则使用默认值,一旦传入了 page_size,后续该接口分页都需要带上,否则会造成分页读取错误。
如果你登陆了,可以直接点击查看自己分享的列表:
https://wanandroid.com/user/lg/private_articles/1/json
10.4 删除自己分享的文章
https://wanandroid.com/lg/user_article/delete/9475/json
请求:POST
参数:文章id,拼接在链接上
建议测试方式:登陆网站后,自己分享一篇文章在广场,然后与删除按钮,打开chrome调试模式,查看Network里面有请求。
10.5 分享文章
https://www.wanandroid.com/lg/user_article/add/json
请求:POST
参数:
title:
link
注意需要登录后查看,如果为CSDN,简书等链接会直接通过审核,在对外的分享文章列表中展示。
否则只能在自己的分享文章列表查看,见10.3。
11. 问答
https://wanandroid.com/wenda/list/1/json
请求:GET
参数:
pageId,拼接在链接上,例如上面的1
pageId从 1 开始。
注:该接口支持传入 page_size 控制分页数量,取值为[1-40],不传则使用默认值,一旦传入了 page_size,后续该接口分页都需要带上,否则会造成分页读取错误。
12. 个人信息接口
更新日期 2021-08-22
接口:
https://wanandroid.com//user/lg/userinfo/json
返回:
{
"data": {
"coinInfo": { // 积分和排名可能不是实时的,每天更新
"coinCount": 36662, // 可用
"level": 367, // 可用
"nickname": "",
"rank": "3", // 可用
"userId": 2, // 可用
"username": "x**oyang"
},
"userInfo": {
"admin": false,
"chapterTops": [],
"coinCount": 36662, // 可用
"collectIds": [ // 可用
],
"email": "623565791@qq.com", // 可用
"icon": "",
"id": 2, // 可用
"nickname": "鸿洋",// 可用
"password": "",
"publicName": "鸿洋",
"token": "",
"type": 0,
"username": "xiaoyang"// 可用
}
},
"errorCode": 0,
"errorMsg": ""
}
13. 问答评论列表 | 2021-06-27 更新
返回问答的评论列表,默认以点赞数倒序排列,如果当前用户登录,则本人评论会置顶。
api:
https://wanandroid.com/wenda/comments/问答id/json
问答 id,可以通过问答列表获取
方法:GET
注意拿到的对象中id,称之为评论 id,未来回复、删除都会依赖。
示例:
https://wanandroid.com/wenda/comments/14500/json
14. 站内消息列表 | 2021-06-27 更新
14.1 未读消息数量
格式:
api:
https://wanandroid.com/message/lg/count_unread/json
方法:GET
返回当前登录用户未读消息数量。
注意:此需要登录。
案例:
https://wanandroid.com/message/lg/count_unread/json
14.2 已读消息列表
格式:
api:
https://wanandroid.com/message/lg/readed_list/页码/json
注意页码从 1 开始
方法:GET
返回当前已经登录用户已读消息列表,分页展示。
注意:此接口需要登录
注:该接口支持传入 page_size 控制分页数量,取值为[1-40],不传则使用默认值,一旦传入了 page_size,后续该接口分页都需要带上,否则会造成分页读取错误。
案例:
https://wanandroid.com/message/lg/readed_list/1/json
14.3 未读消息列表
格式:
api:
https://wanandroid.com/message/lg/unread_list/页码/json
注意页码从 1 开始
方法:GET
返回当前登录用户未读消息列表,分页展示。
- 注意1:此接口需要登录。
- 注意 2:此接口一旦访问,则所有该用户的消息都会被认为已读,即第二次只能从已读消息列表获取,想获取未读数量不要访问此接口。
注:该接口支持传入 page_size 控制分页数量,取值为[1-40],不传则使用默认值,一旦传入了 page_size,后续该接口分页都需要带上,否则会造成分页读取错误。
案例:
https://wanandroid.com/message/lg/unread_list/1/json
开放 Google Maven Repo API | 2020-05-08
我们更新了一个新的能力:Google Maven 仓库快速查询!
15 公众号Tab | 2018-10-13
增加微信公众号 Tab,查看公众号文章,支持搜索,。
15.1 获取公众号列表
https://wanandroid.com/wxarticle/chapters/json
方法: GET
15.2 查看某个公众号历史数据
https://wanandroid.com/wxarticle/list/408/1/json
方法:GET
参数:
公众号 ID:拼接在 url 中,eg:405
公众号页码:拼接在url 中,eg:1
注:该接口支持传入 page_size 控制分页数量,取值为[1-40],不传则使用默认值,一旦传入了 page_size,后续该接口分页都需要带上,否则会造成分页读取错误。
15.3 在某个公众号中搜索历史文章
https://wanandroid.com/wxarticle/list/405/1/json?k=Java
方法:GET
参数 :
k : 字符串,eg:Java
公众号 ID:拼接在 url 中,eg:405
公众号页码:拼接在url 中,eg:1
注:该接口支持传入 page_size 控制分页数量,取值为[1-40],不传则使用默认值,一旦传入了 page_size,后续该接口分页都需要带上,否则会造成分页读取错误。
16. 最新项目 Tab | 2018-10-10
16.1 最新项目tab (首页的第二个tab)
按时间分页展示所有项目。
https://wanandroid.com/article/listproject/0/json
方法:GET
参数:页码,拼接在连接中,从0开始。
注:该接口支持传入 page_size 控制分页数量,取值为[1-40],不传则使用默认值,一旦传入了 page_size,后续该接口分页都需要带上,否则会造成分页读取错误。
17. 工具列表接口 2022-03-27
https://wanandroid.com/tools/list/json
直接访问即可。
注意,单个工具的详情页可能没有适配移动端,所以展现效果不一定好,该功能不一定适合在手机端在展示。
18. 教程 2022-03-27
18.1 教程列表
对应:
GET请求,直接访问即可:
https://www.wanandroid.com/chapter/547/sublist/json
注意:547是固定值不会变化。
返回列表:
{
"data": [
{
"author": "阮一峰",
"children": [],
"courseId": 13,
"cover": "https://www.wanandroid.com/blogimgs/f1cb8d34-82c1-46f7-80fe-b899f56b69c1.png",
"desc": "C 语言入门教程。",
"id": 548, // 单个教程下所有文章列表会使用到
"lisense": "知识共享 署名-相同方式共享 3.0协议",
"lisenseLink": "https://creativecommons.org/licenses/by-sa/3.0/deed.zh",
"name": "C 语言入门教程_阮一峰",
"order": 270000,
"parentChapterId": 547,
"userControlSetTop": false,
"visible": 1
},
...
18.2 单个教程下所有文章列表
列表接口返回的教程合集,注意教程对象中有个 id 需要在此接口使用。
GET请求
https://wanandroid.com/article/list/0/json?cid=549
参数:
cid // 教程列表中返回的教程对象中的 id 属性
示例:
https://wanandroid.com/article/list/0/json?cid=549&order_type=1
注:这个接口是复用的章节,大多时候我们希望按照时间倒序,但是教程想要保持一个好的目录结构,需要正序,注意传入 order_type=1
{
"data": {
"curPage": 1,
"datas": [
{
"apkLink": "",
"audit": 1,
"author": "阮一峰",
"canEdit": false,
"chapterId": 549,
"chapterName": "HTML 教程_阮一峰",
"collect": false,
"courseId": 13,
"desc": "",
"descMd": "",
"envelopePic": "",
"fresh": false,
"host": "",
"id": 21894,
"link": "https://www.wanandroid.com/blog/show/3214", // 详情页
"niceDate": "2022-03-22 15:03",
"niceShareDate": "2022-03-22 15:03",
"origin": "",
"prefix": "",
"projectLink": "",
"publishTime": 1647932634000,
"realSuperChapterId": 547,
"selfVisible": 0,
"shareDate": 1647932593000,
"shareUser": "",
"superChapterId": 548,
"superChapterName": "教程",
"tags": [],
"title": "其他标签",
"type": 0,
"userId": -1,
"visible": 0,
"zan": 0
},
这个接口其实和之前章节对应的文章列表是一致的,如果前面已经开发了,相关代码可以复用。
注:文章详情页已经适配了移动端,显示效果应该蛮好的。