Blog友链朋友圈适配

友链朋友圈适配

github库
参考1
参考2

  • [ ]
  • 爬取文章: 爬取所有友链的文章,结果放置在根目录的all.json文件中,方便读取并部署到前端。
  • 邮箱推送更新(对作者推送所有友链更新): 作者可以通过邮箱订阅所有rss的更新(未来开发)。
  • issue邮箱订阅(对访客实时推送最新文章邮件): 基于GitHub issue的博客更新邮件订阅功能,游客可以通过简单的提交issue进行邮箱订阅站点更新,删除对应issue即可取消订阅。
  • 自部署: 本项目支持自部署,通过较为简洁的方式实现在服务器上获取数据并返回,同时可以合并github 获取的数据,实现更高的准确率。
  • 轻量化:对比原版友链朋友圈的功能,该友圈功能简洁,去掉了设置和fastAPI的臃肿,仅保留关键内容。
  • 无数据库:因为内容较少,我采用json直接存储文章信息,减少数据库操作,提升action运行效率。
  • 部署简单:原版友链朋友圈由于功能多,导致部署较为麻烦,本方案仅需简单的部署action即可使用,vercel仅- 用于部署前端静态页面和实时获取最新内容。
  • 文件占用:对比原版4MB的bundle.js文件大小,本项目仅需要5.50KB的fclite.min.js文件即可轻量的展示到前端。
  • 前端分离: 将前后端分离,前端文件放在page分支,后端文件放在主分支
  • 文章爬取:实现友圈基本功能。
  • 暗色适配:适配本站暗色主题,理论上所有类butterfly主题均适配。
  • 显示作者所有文章:点击作者头像即可弹出窗口并显示所有文章
  • 随机钓鱼:通过前端实现的随机访问。
  • 邮箱推送:可以向订阅者邮箱推送网站更新。
  • 邮箱模板:内置简单邮箱模板,支持自定义。
  • 自部署(2024-08-11添加)
  • 前端单开分支(2024-09-05添加) @CCKNBC

效果展示

友链朋友圈

爬取服务部署

由于为了追求简单,并没有实现从页面直接爬取友链信息,仅仅实现了从固定json格式中获取信息,所以我们先讲解一下怎么获取这种格式的json。

json获取

下面就是该json格式的文件示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"friends": [
[
"清羽飞扬",
"https://blog.liushen.fun/",
"https://blog.liushen.fun/info/avatar.ico"
],
[
"ChrisKim",
"https://www.zouht.com/",
"https://cdn.qyliu.top/i/2024/06/27/667d880789765.webp"
],
[
"Akilar",
"https://akilar.top/",
"https://cdn.qyliu.top/i/2024/04/06/661170950f7a2.png"
]
}

由于主题较多,这里我仅实现了hexo-theme-butterfly获取该格式的json方法,其余主题可以根据自己的友链格式针对性实现代码。

  • 在博客根目录添加文件link.js,写入以下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const YML = require('yamljs')
const fs = require('fs')

const blacklist = ["友站名称1", "友站名称2", "友站名称3"]; // 由于某种原因,不想订阅的列表

let friends = [],
data_f = YML.parse(fs.readFileSync('source/_data/link.yml').toString().replace(/(?<=rss:)\s*\n/g, ' ""\n'));

data_f.forEach((entry, index) => {
let lastIndex = 2;
if (index < lastIndex) {
const filteredLinkList = entry.link_list.filter(linkItem => !blacklist.includes(linkItem.name));
friends = friends.concat(filteredLinkList);
}
});

// 根据规定的格式构建 JSON 数据
const friendData = {
friends: friends.map(item => {
return [item.name, item.link, item.avatar];
})
};

// 将 JSON 对象转换为字符串
const friendJSON = JSON.stringify(friendData, null, 2);

// 写入 friend.json 文件
fs.writeFileSync('./source/friend.json', friendJSON);

console.log('friend.json 文件已生成。');
  • 按照需求修改其中的黑名单,该黑名单可以用于排除一些采集站之类的灌水文章,其中填写对应站点的名称,然后再在根目录执行:
1
node link.js
  • 你将会在source文件中发现文件friend.json,即为对应格式文件,下面正常hexo三件套即可放置到网站根目录。