星火商店搜索服务
星火商店应用搜索功能开发
星火商店后端维持一个数据库,把所有的应用信息记录进去。然后写接口供商店客户端调用。
应用信息表、应用截图表、应用分类表三个表基本上基本上就OK了
直接用数据库记录好应用的数据,遍历仓库目录读取json,然后将信息写入数据库,写接口,然后客户端查。
但是暂时我没有接触星火后端的权限,先用爬虫抓取应用数据,反正星火商店的应用数据都是开放的。
数据库可能对并发的能力比较弱,要上缓存,或者限流。
抓取好数据写入数据表后,然后投稿端添加新的应用,都要写入数据库。
用fastapi写API供客户端使用,一个是应用信息查询,一个是应用信息录入。
几个服务器路线:
http://sucdn.jerrywang.top/
http://store.jerrywang.top/
http://dcstore.spark-app.store/
商店仓库地址 http://sucdn.jerrywang.top
仓库应用信息项目地址 https://github.com/Jerrywang959/jsonpng
应用信息抓取
// 静态页面地址
http://sucdn.jerrywang.top/store/#/
store/#/network
store/#/relations
store/#/musicandsound
store/#/videos
store/#/photos
store/#/games
store/#/office
store/#/reading
store/#/programming
store/#/tools
store/#/themes
store/#/others
// json 文件地址
网络应用 https://d.store.deepinos.org.cn/store/network/applist.json
社交沟通 https://d.store.deepinos.org.cn/store/chat/applist.json
音乐欣赏 https://d.store.deepinos.org.cn/store/music/applist.json
视频播放 https://d.store.deepinos.org.cn/store/video/applist.json
图形图像 https://d.store.deepinos.org.cn/store/image_graphics/applist.json
游戏娱乐 https://d.store.deepinos.org.cn/store/games/applist.json
办公学习 https://d.store.deepinos.org.cn/store/office/applist.json
阅读翻译 https://d.store.deepinos.org.cn/store/reading/applist.json
编程开发 https://d.store.deepinos.org.cn/store/development/applist.json
系统工具 https://d.store.deepinos.org.cn/store/tools/applist.json
主题美化 https://d.store.deepinos.org.cn/store/themes/applist.json
其他应用 https://d.store.deepinos.org.cn/store/others/applist.json
// 单个应用分析
应用信息下载地址 https://d.store.deepinos.org.cn/store/development/code/app.json
应用图标 https://cdn.jsdelivr.net/gh/Jerrywang959/jsonpng/store/development/code/icon.png
应用下载地址 http://sucdn.jerrywang.top/store/development/code/code_1.49.0-1599744551_amd64.deb
// 图标的分类与应用json的分类是不一致的=_= 坑啊
单个应用信息json示例
{
"Name": "Visual Studio Code",
"Version": "1.49.0-1599744551",
"Filename": "code_1.49.0-1599744551_amd64.deb",
"Pkgname": "code",
"Author": "Microsoft",
"Contributor": "Anysets",
"Website": "https://code.visualstudio.com/",
"Update": "2020-09-12 20:04:04",
"Size": "61.57 MB",
"More": "Visual Studio Code是一个运行于 Mac OS X、Windows和 Linux 之上的,针对于编写现代 Web 和云应用的跨平台源代码编辑器。该编辑器也集成了所有一款现代编辑器所应该具备的特性,包括语法高亮(syntax high lighting),可定制的热键绑定(customizable keyboard bindings),括号匹配(bracket matching)以及代码片段收集(snippets)。",
"Tags": "",
"img_urls": "[\"https://examine-spark.oss-cn-shanghai.aliyuncs.com/images/2020/09/12/c15c6380-f4ef-11ea-bf79-1335c9b78358.png\",\"https://examine-spark.oss-cn-shanghai.aliyuncs.com/images/2020/09/12/c3964df0-f4ef-11ea-bf79-1335c9b78358.png\"]",
"icons": "https://examine-spark.oss-cn-shanghai.aliyuncs.com/icons/2020/09/12/bd3e4fc0-f4ef-11ea-bf79-1335c9b78358.png"
}
读取所有的json数据,然后分析提取,首先插入分类,再插入应用信息,然后插入截图。
检测分类是否在分类表中,不在则新建该分类,然后拿到分类ID
插入应用信息,拿到应用ID
然后插入应用的相关截图。
应用已经下载好了,重新下载需要删除json目录下的文件
TODO 图标好像需要进行拼接构建,不能直接从json文件里读取。
数据表创建
应用信息表、应用截图表、应用分类表
--- 应用信息表
CREATE TABLE `spark_appinfo` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`category_id` INT(11) NOT NULL COMMENT '所属分类',
`name` VARCHAR(255) NOT NULL COMMENT '应用名称',
`pkgname` VARCHAR(255) NOT NULL COMMENT '包名称',
`version` VARCHAR(255) NOT NULL COMMENT '版本号',
`author` VARCHAR(255) NOT NULL DEFAULT '未知' COMMENT '开发者',
`contributor` VARCHAR(255) NOT NULL DEFAULT '未知' COMMENT '投稿人',
`website` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '应用官网',
`path` VARCHAR(255) NOT NULL COMMENT '文件下载路径',
`size` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '大小',
`icon` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '图标',
`tags` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '标签',
`more` TEXT COMMENT '详细及描述',
`app_status` TINYINT(1) UNSIGNED NOT NULL DEFAULT '1' COMMENT '应用状态; 0: 下架, 1:正常, 2:未审核',
`order` INT(11) NOT NULL DEFAULT '10000' COMMENT '排序',
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` TIMESTAMP NULL DEFAULT NULL COMMENT '最近一次修改时间',
PRIMARY KEY (`id`),
INDEX `category_id` (`category_id`),
UNIQUE INDEX `pkgname` (`pkgname`)
)
COMMENT='应用信息表'
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB;
--- 应用截图表
CREATE TABLE `spark_screenshot` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`appid` INT(11) NOT NULL,
`url` VARCHAR(255) NOT NULL COMMENT '图片链接',
`order` INT(11) NOT NULL DEFAULT '10000' COMMENT '排序',
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
INDEX `appid` (`appid`)
)
COMMENT='应用截图表'
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB;
--- 应用分类表
CREATE TABLE `spark_category` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`slug` VARCHAR(50) NOT NULL COMMENT '分类标识',
`name` VARCHAR(50) NOT NULL COMMENT '分类名称',
`order` INT(11) NOT NULL DEFAULT '10000' COMMENT '分类排序',
PRIMARY KEY (`id`),
UNIQUE KEY `slug` (`slug`)
)
COMMENT='应用分类表'
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB;
=_= 服务求Mysql 版本太低,VARCHAR 不支持255了
应用API编写
使用 Python FastAPI 来写接口
.env 配置文件只支持ASCII字符,不能有中文存在。
应用API目录为 api_server
几个API说明
/appinfo/search?keyword=微信关键字搜索APP信息/appinfo/name?pkgname=com.qq.weixin.dcs根据包名获取APP信息/appinfo/list?cate_name=chat&page=1&limit=10获取应用列表信息
运行部署说明
修改 spark_extract 下的 extract.py 文件的数据库配置:
# 四个参数分别为:ip地址,数据库用户名,数据库密码,数据库名
db = MySQL("localhost", "root", "root", "spark_store")
然后运行 extract.py 即可抓取星火商店应用数据插入到 spark_store 数据库中。
复制 api_server 目录下的 .env.example 文件为 .env 文件,修改其数据库配置
SQLALCHEMY_DATABASE_URI=mysql+pymysql://root:root@localhost/spark_store
然后在 api_server 目录下运行:
$ uvicorn main:app --host 127.0.0.1 --port 8000
客户端搜索功能开发说明
spk://store/reading/listera-novelreader 下载的URL为: QUrl("spk://store/video/com.obsproject.studio") url.path() : "/video/com.obsproject.studio"
能够拿到应用的包名和分类名称,就可以直接调用 Widget::openUrl(QUrl u)