以下是 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/check
body 为令牌内容,返回令牌访问级别
{
"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)&dsc
PUT /user/:uid
需要&token &uid
body=对象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/:id
GET /follow/:id/following
POST /follow/:id
需要&token &uid
DELETE /follow/:id
需要&token &uid
POST /comment/search
body 为检索内容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
&token
body 为 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
&token
body 是 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 的描述或all
POST /category
增加一个 Category, 参数&uid
&token
&name
可选&parent
返回 idPUT /category/:id
更新一个 Category 的 name, body 为 name, 参数&uid
&token
DELETE /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 为内容,需要&token
uid 自动推导到此记录所有者DELETE /private/:id
删除一条记录,需要&token
uid 自动推导到此记录所有者
{
"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
&data
ignore 一个记录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 我就做了