本站友链文章聚合后端源码及部署过程
前言
参考友链文章聚合。
这个项目是在今年春季时候做的。当时看到凡尘纪有个友链朋友圈的东西,是小冰大佬做的,部署在Leancloud。
此前我也曾想过尝试部署使用友链朋友圈,但因为过程繁琐,就放弃了,说到底还是懒,懒到自己重新造轮子(笑)。当然,也是因为懒,追求开发效率,我无脑地选择了Python3。
因为这个项目的作者想要标新立异,所以命名其为“友链文章聚合”而非“友链朋友圈”。也同样是因为参考了别人的东西所以就没面子放Gayhub上。
项目完成后因为升学也没有及时公开代码,今天把代码及部署过程发一下吧。
须知
- 本项目遵循MIT协议;
- 部署本项目至少需要一个能够运行Python3解释器(包括pip)和诸如Apache2之类的Web服务的土豆服务器(使用Debian及其分支GNU/Linux发行版最佳,并需要提前搭建好一个外网能够访问的网站。如果服务器在内网,可以试试内网穿透服务),以及一个会面向API编程的活人;
- 本项目会用到feedparser库;
- 因运行环境异同,不保证在任何机器上都能运行;
- 因部署本项目造成的任何损失作者不会承担任何责任;
- 本文只涉及后端,如果要使用本项目,还麻烦自行编写前端;
- 提问前请先尝试自行解决,避免浪费时间;
本项目优点:
- 部署起来相对而言不是那么麻烦,轻量;
- 因为使用的是烂大街的编程语言(Python3)所以可以放心修改;
- 因为要自行来写前端,所以你可以按你天马行空的想象力去写,反正都是同一种功能。
本项目缺陷:
- 就算将部署过程尽可能简化了但还是对小白而言有一定门槛的,否则你连部署的过程都无法理解;
- 需要root权限,且需要设置Web服务的
Access-Control-Allow-Origin
跨域请求头; - 要自行来写前端(当然要F12抄本站的页面也是可以接受的,但我写的真的很烂)。
正文
原理
定时获取友链列表,得到各友链站点的Feed URL,再逐个解析,得到友链的文章列表,排序输出一个json文件到后端站点。
前端通过ajax载入该文件,解析,格式化写入到document。
环境
- OS: Debian 10 GNU/Linux(i686);
- Web Server: Apache2;
- Python3 version: Python 3.7.3.
其他的操作系统下的环境……自己研究吧。同是Linux的话应该大同小异。
部署
0. 整理友链
将友链列表整理为json友链列表,格式如下:
文件名:friends.json
1 | { |
如上,class
中的link_list
为友链列表。列表中,每个字典都必须有rss
字符串对象。rss
为站点的feed,即订阅RSS的URL。以上是最简单的模板,其他的对象可以根据自己需要加入(参考),你可以使其单独作为订阅列表,使之与你的博客的友链列表分开存放,也可以像我一样通过某种手段,使之成为你博客的友链列表,每次访问友链页都载入该文件,然后输出html。
麻烦在于,需要挨个儿拜访邻居以获得feed,在这里还是推荐使用RSSHub Radar插件。
编辑完后,将该文件保存至博客所在域名能找得到的位置。
1. 安装feedparser
1 | sudo python3 -m pip install feedparser -i https://pypi.tuna.tsinghua.edu.cn/simple |
2. 将以下脚本修改并保存
文件名:rsssubs.py
1 | #!/usr/bin/python3 |
修改以下几个变量:
subclistf
: 字符串类型。友链列表的URL,即储存在博客站点下、在步骤0编辑的json文件所对应的URL。必须更改;SaveJSON
: 字符串类型。输出json结果的保存路径,应当为输出到后端服务器的网站根目录下的路径,最好为网站根目录路径。必须更改;SaveLog
: 字符串类型。日志保存路径,默认为程序所在目录。可以更改,但请注意权限问题;IntervalUpd
: 整型。数据自动更新时间,单位为秒。可以更改,但请注意权限问题;
3. 赋权运行测试
执行:
1 | sudo chmod +x rsssubs.py |
正常的话,会在控制台输出:已输出至*/RSSsubsfetch.json
、下一次更新将在*分钟后
的字样,且会在后端服务器的网站下(SaveJSON
变量所对应的路径下)
这时就说明成功部署,可以Ctrl
+C
杀死这个进程了。
4. 添加到服务
在/etc/systemd/system
下创建rsssubs.service
,写入:
1 | [Unit] |
ExecStart
中,/usr/bin/python3
是Debian系Linux下python3解释器默认安装路径,/path/to/rsssubs.py
是步骤2创建的rsssubs.py
所在路径,根据情况修改。
然后执行:
1 | sudo systemctl enable rsssubs.service |
输出结果会类似于:
1 | ● rsssubs.service - RSS Subscriptions |
其中Active
行,正常为active (running)
,否则应检查方才编辑的rsssubs.service
。
5. 前端调用
可以试着在浏览器中访问一下rsssubs.py
输出的JSON文件。
因为这个输出的文件又臭又长,所以这里就简单地讲以下其大概的结构吧。
graph TD id1[`subscribes`: 订阅列表] --> id2[`faliures`: 错误数] id1 --> id3[`allRSS`: 所有订阅站点的文章] id3 --> id4[各个元素] id4 --> id5[`post`: 文章标题] id4 --> id6[`time`: 发布时间] id4 --> id7[`url`: 文章URL] id4 --> id8[`site`: 站点名称] id1 --> id9[`updated`: 该订阅列表更新时间]
输出的json文件中,所有代表“时间”的量都为一个十四位数整型,如20210630134909
代表2021
年06
月30
日13
时49
分09
秒,可以自己设计算法把以上十四位数整形转化为时间对象。
后记
在暑假正式开始前总算是把它写完了。
应该不会有人使用我这种东西吧,又需要服务器又得折腾来折腾去的。其实也可以稍微改变以下,就可以和使订阅列表与博客一起发布,就是很没有时效性,不经常更新博客的话还是不推荐这样。
虽然是从头开始造轮子,但也并非一无所获,至少,还是折腾出来了些东西的。