以下是 GeekApk 后端服务器所提供的 HTTP API,版本 1 GeekApk Center 服务 API 地址
-
GET /返回<html><h1>GeekApk API Server v{Server Version}</h1></html> -
GET /version返回以:分割的 API 版本和服务器程序版本 -
GET /ping返回 GeekApk 服务器所见你的 IP 地址 -
GET /admins返回以:分割的站点管理员 UID -
GET /config/topic返回话题特殊分类的 ID -
GET /config/headline返回头条特殊应用的 ID -
GET /config/album返回应用集特殊分类的 ID -
GET /config/news返回新闻特殊应用的 ID -
POST /admin/:username新建用户,返回用户 id 和 Hash,需要参数&uid和&token -
PUT /admin/:username修改用户 Hash,body 为 hash,需要参数&uid和&token -
DELETE /admin/:username删除用户,需要参数&uid和&token
Token 是 GeekApk 进行身份验证的一种方式
GET /token/:uid需要一个hash参数作为请求用户的 hash,返回用户所有令牌POST /token/:uid需要一个hash参数身份验证,可选是否是持久化令牌&p(✓ 或 ✗) 和 access level&l(10 以内的数字), body 为令牌内容,内容不能与现存内容冲突DELETE /token/:uid需要hash参数验证,body 为令牌内容POST /token/:uid/checkbody 为令牌内容,返回令牌访问级别
{
"token": "{token}",
"ctime": "{ctime datetime}",
"access": "access_level_integer"
}其实也可以用二进制位运算设置 flag, 不过为了方便就只做了这些
- 0 默认访问级别,拥有所有权限
- 1 有修改用户资料的权限
- 2 有发布修改删除消息的权限
- 3 有发布修改删除应用的权限
- 4 有检查用户资料的权限
- 5 有删除用户的权限
- 6 没有任何权限,只能用于检查用户对帐号的所有权
POST /user/search参数&t(name, alias, bio) body 为检索内容GET /user/:uid可以是all, 参数&fil(super, email, alias, bio, dev)&sort(ctime, atime, followed following)&dscPUT /user/:uid需要&token &uidbody=对象DELETE /user/:uid需要&token &uid
{
"id": "id_int",
"name": "name",
"alias": "alias",
"emali": "email",
"github": "github",
"super": "super_int",
"bio": "bio",
"dev_bio": "dev_bio",
"ctime": "ctime_datetime",
"atime": "atime_datetime",
"following": "following_num",
"followed": "followed_num",
"avatar": "avatar"
}GET /follow/:idGET /follow/:id/followingPOST /follow/:id需要&token &uidDELETE /follow/:id需要&token &uid
POST /comment/searchbody 为检索内容GET /comment/:id返回 Comment 对象GET /comment/app/:app(all)可选&user&sort(star like reply created updated)&toplev(✓ 或 ✗)&s(since Unix 时间)POST /comment/:app参数&uid &token可选 reply body 为 content 返回 idPUT /comment/:id&tokenbody 为 contentDELETE /comment/:id&token
{
"id": "id_int",
"user": "user_int",
"target": "target_int",
"ctime": "ctime_datetime",
"mtime": "mtime_datetime_null",
"reply": "reply_int_null",
"content": "content",
"stars": "stars_int",
"likes": "likes_int",
"replies": "replies_int"
}GET /comment/:id/star返回 star 用户 id 以:分割GET /user/:id/cstar返回用户的 starsPOST /comment/:id/star需要参数 uid 和 tokenDELETE /comment/:id/star需要参数 uid 和 Token
GET /comment/:id/like返回 like 用户 id 以:分割GET /user/:id/like返回用户的 likesPOST /comment/:id/like需要参数 uid 和 tokenDELETE /comment/:id/like需要参数 uid 和 Token
POST /app/search&type(name, alias, pkg, desc) body 为内容GET /app/:id获取一个应用对象all可选&cate&minapi&user&sort(star replies created updated size)POST /app参数&uid &token&name &icon &reversion &locked 返回创建的 idPUT /app/:id&tokenbody 是 app 对象DELETE /app/:id&token
{
"id": "",
"creator": "",
"category": "",
"name": "",
"alias": "",
"pkgname": "",
"icon": "",
"version": "",
"reversion": "",
"description": "",
"updates": "",
"visualizer": "",
"optlabel": "",
"special": "",
"install": "",
"previews": "",
"apimin": "",
"apitarget": "",
"size": "",
"lang": "",
"src": "",
"perm": "",
"stars": "",
"replies": "",
"locked": "",
"updated": ""
}duangsuse 被玩坏了不想写那啥了
GET /update/:app获取所有更新GET /update/:app/updated获取最后更新时间GET /update/:app/:rev获取某版本的更新POST /update/:app&token&reversion(指定 reversion) &install 发布一个更新, 返回更新 reversionPUT /update/:app/:rev&token修改一个更新 body 是对象DELETE /update/:app/:rev删除指定 reversion 的更新
{
"app": "",
"name": "",
"alias": "",
"icon": "",
"version": "",
"reversion": "",
"description": "",
"updates": "",
"visualizer": "",
"optlabel": "",
"special": "",
"install": "",
"previews": "",
"apimin": "",
"apitarget": "",
"size": "",
"perm": "",
}duangsuse 被玩坏了不想写那啥了
GET /app/:id/star返回 star 用户 id 以:分割GET /user/:id/star返回用户的 starsPOST /app/:id/star需要参数 uid 和 tokenDELETE /app/:id/star需要参数 uid 和 Token
GET /app/:id/recommend返回 recommend 对象GET /user/:id/recommend返回用户的 recommend 对象POST /app/:id/recommend/:r需要参数 uid 和 token, body 为 reasonDELETE /app/:id/recommend/:r需要参数 uid 和 Token
{
"user": "uid_integer",
"app": "app_integer",
"recommed": "recommend_integer",
"reason": "reason"
}GET /app/:id/pinned返回 pinned Comment ID 以:分割POST /app/:id/pin/:c需要参数 tokenDELETE /app/:id/pin/:c需要参数 token
Category 是给应用分类的方法
GET /category/:id获取 这个 Category 的描述或allPOST /category增加一个 Category, 参数&uid&token&name可选&parent返回 idPUT /category/:id更新一个 Category 的 name, body 为 name, 参数&uid&tokenDELETE /category/:id删除一个 Category, 参数&uid&token
{
"id": "id_integer",
"name": "name",
"parent": "parent_name"
}Timeline 是 GeekApk 记录分享用户活动的一种方式,记录行为完全由服务器自动且强制执行
GET /timeline/:uid获取这个(组) UID 的所有 Timeline,UID 之间可以用,切分,也可以是all,可用参数&dsc(✓ 或 ✗) 倒序&t只返回固定类型的数据,&s指定一个 Unix 时间只返回在那之后的数据
{
"user": "uid_integer",
"ctime": "created_datetime",
"type": "type_integer",
"data": "data_integer"
}- 0 Follow 了某 UID
- 1 Like 了某 Comment
- 2 Star 了某 Comment
- 3 发布了某 Comment
- 4 更新了某 Comment
- 5 在某 App 里增加了一个 Pin
- 6 在某 App 里增加了一个 Recommend
- 7 创建了某 App
- 8 发布了某 App 的更新
- 9 删除了某 App
- 10 Star 了某 App
Private table 是 GeekApk 实现插件配置云存储的方式,也作为实现 PM 的工具
GET /private/user/:uid/received获取accessable我 UID 的所有消息,需要参数&token,可选参数&s指定数据 ctime 起始,&t`类型 filterGET /private/user/:uid获取 UID 的所有记录,需要参数&token,可选参数&s指定数据 ctime 起始,&t`类型 filterPOST /private/:uid为 UID 的表创建一条记录 可选参数&t类型acc额外访问权限 body 为内容返回私有记录 IDGET /private/:id获取一条记录,可选参数&uid&token会自动进行权限验证,如果允许访问即返回记录PUT /private/:id更新一条记录,body 为内容,需要&tokenuid 自动推导到此记录所有者DELETE /private/:id删除一条记录,需要&tokenuid 自动推导到此记录所有者
{
"id": "id_integer",
"uid": "uid_integer",
"type": "type_integer",
"accessable": "accessable_integer",
"text": "text",
"ctime": "ctime_datetime",
"atime": "atime_datetime_null"
}Postage 是 GeekApk 中的「消息中心」后端支持
GET /postage/:uid获取我的所有邮件,需要验证&token可选&all(✓ 或 ✗)&dsc(✓ 或 ✗)&t(类型)&from(发送人), 可选参数&s指定数据 time 起始
没有获取所有已发送邮件的方法,不要忘记了,这只是一个把服务端自动的消息提示变成你手动控制的而已
PUT /postage/:uid/:from必须&token可选&type&dataignore 一个记录DELETE /postage/:uid/:from必须&token可选&type&data删除一个记录POST /postage/:uid/:to必须&token可选&type&data发送一个记录
- 0 Follow 了你
- 1 在 Comment 中 At 了你
- 2 在 Comment 中回复了你
- 3 Like 了你的 Comment
- 4 Star 了你的 Comment
- 5 Star 了你的 App
- 6 PM 了你
{
"from": "from_integer",
"to": "to_integer",
"type": "type_integer",
"data": "data_integer",
"ignore": "ignore_boolean",
"time": "sent_datetime"
}WebSocket 端口一般会被开在 233, 如果是特殊情况 其实是无法自动支持的
WebSocket 可以向每个已经连接的客户端发送即时全站更新消息方便他们更新自己的信息
同时,WebSocket 也会向已经验证的用户发送他们自己的 Post 信息和好友 Timeline 更新信息
连接上 WebSocket 服务器时,GeekApk 服务器会向你发送一个 欢迎消息 Welcome to the GeekApk live Stream Server v{GeekApk Server Version}!,而且会向所有连接发送你已经加入的消息,会包含 Socket resource descriptor 和你 IP 的 hascode
之后你可以发送你的用户名和 Token,在验证成功后,GeekApk 服务器会发送广播已通知你已上线,会包含你的用户名信息
之后你可以发送指令查询在线人数/各类信息的最近更新时间以及向在线用户发送消息,GeekApk 会在各类信息更新时发送广播。
Welcome to the GeekApk live Stream Server v1!
New connection:(resource descriptor):(ip hashcode)
Connection:(resource descriptor):identified as:(uid):(username)
(你发送你的用户 ID 和密码)
3:sasasasasa
(你收到密码错误提示)
Bad Password
3:dasdasdads
Welcome
Connection:(your resource descriptor):identified as:3:foo
(服务器在更新时向你发送更新 ID)
02234
(你发送指令查询在线人数)
line
(服务器返回在线人数)
233
(你查询 ID 最近更新时间)
0
(服务器返回最近更新 Unix 时间)
2147483647
(你向(且只能向)某个已经登陆的非匿名用户发送即时消息(必须非匿名))
send 0 Hello, world!!!
(你收到即时消息)
Message from 0: Hello!
(你离开 live stream)
- 0 普通应用更新
- 1 普通新 Comment
- 2 新 Post(登陆后)
- 3 头条更新
- 4 应用集更新
- 5 话题更新
- 6 新闻更新
关闭连接时,GeekApk realtime 服务器会发送广播(无论是匿名用户还是已登陆用户)来通知你已经下线
内个,大家觉得没有 bug 我就做了