前言
这两天突然发现,之前使用极简模式部署好的友链朋友圈没法获取到数据了。看了Github仓库才知道原项目已经停止支持了,取而代之的就是这个轻量友链朋友圈。
不知道是不是因为这个项目是为了 hexo
打造的原因,项目看了很久,愣是没看明白。直到把详细文档研究了一通,才大概明白了运行的原理。
其实严格来讲,该项目主要分为三个步骤:
- 获取朋友圈JSON
- 配置 Github Action
- 拿到朋友圈文章列表JSON
获取朋友圈JSON
顾名思义,该步骤通过以下代码,将指定页面上的友链信息,直接转换成为一个 friend.json
。
原代码如下:
const YML = require('yamljs')
const fs = require('fs')
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 文件已生成。');
比较遗憾的是,该代码仅适用于 HEXO
博客程序,如果想要用在HUGO
中,需要做如下修改:
const cheerio = require('cheerio');
const fs = require('fs');
const path = require('path');
// 获取项目根目录的路径
const projectRoot = process.cwd();
// 读取 HTML 文件内容
const htmlFilePath = path.join(projectRoot, 'public', 'links', 'index.html');
const htmlContent = fs.readFileSync(htmlFilePath).toString();
// 使用 cheerio 解析 HTML
const $ = cheerio.load(htmlContent);
// 创建一个空的 friends 数组
let friends = [];
// 假设在 HTML 中每个好友信息存储在 <div class="friend-item"> 中,
// 并且每个条目包含 <a class="username">、<img class="avatar"> 和 <a class="link">
$('.friend-item').each((index, element) => {
const username = $(element).find('.username').text().trim(); // 提取用户名
const link = $(element).find('.link').attr('href'); // 提取链接
const avatar = $(element).find('.avatar').attr('src'); // 提取头像
// 如果都存在,添加到 friends 数组
if (username && link && avatar) {
friends.push({
name: username,
link: link,
avatar: avatar
});
}
});
// 根据规定的格式构建 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(path.join(__dirname, 'friend.json'), friendJSON);
console.log('friend.json 文件已生成。');
将该代码文件保存在根目录Link.js文件中。运行:
node link.js
就可以得到 friend.json
文件。
需要注意的是,这里需要用到 cheerio
解析 HTML。所以在运行前,需要:
npm install cheerio
以下就是JSON格式文件示例:
{
"friends": [
[
"林木木",
"https://immmmm.com",
"https://cravatar.cn/avatar/ba83fa02fc4b2ba621514941307e21be.jpeg?s=400"
],
[
"山卜方",
"https://novcu.com",
"https://cravatar.cn/avatar/6ebab96f3131621c51c08370d3c996f0.jpeg?s=400"
],
[
"大大的小蜗牛",
"https://eallion.com",
"https://cravatar.cn/avatar/171e4c30959e8c077a6c58b958624b31.jpeg?s=400"
]
}
配置 Github Action
在 fork 了仓库:Friend-Circle-Lite 之后,只需要修改仓库中的 config.yaml
文件
spider_settings:
enable: true
json_url: "https://<你的地址>/friend.json"
article_count: 5
merge_result:
enable: true
merge_json_url: "<你的地址>"
如果需要邮件推送功能的,跟随官方文档完成相应配置即可。
拿到朋友圈文章列表JSON
在完成所有配置后,就可以手动或者自动的运行 Github Action
,该Action就会根据我们提供的 friend.json
拿到友链中所有朋友更新的文章啦。最后会在page分支中,生成一个 all.json
,通过调用这个文件,就可以做前端渲染了。
大功告成。