前言

这两天突然发现,之前使用极简模式部署好的友链朋友圈没法获取到数据了。看了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 ,通过调用这个文件,就可以做前端渲染了。

大功告成。