874 字
4 分钟
Page Views
anzhiyu主题友链测速后端修复
2025-09-24

前提#

最近在捣腾anzhiyu主题的友链延迟检测,前端使用了辰渊尘大佬的方法,后端则使用了LiuShen大佬的Github Action方法,但是大佬附带的友链提取js并不适配anzhiyu主题,提示格式错误,于是我投给豆包进行了修改。

现已支持自动检测编码和自动修复并生成合适的友链json,也能检测出语法问题并且输出错误。

脚本可以放在scripts文件夹也可以单独执行node link.js来生成

效果如图

代码#

代码如下:

const YML = require('yamljs');
const fs = require('fs').promises;
const path = require('path');
// 路径配置
const LINK_YML_PATH = path.join('source', '_data', 'link.yml');
const OUTPUT_JSON_PATH = path.join('source', 'flink_count.json');
const TAKE_COUNT = 2;
async function processLinks() {
try {
// 读取文件(二进制方式)
const yamlBuffer = await fs.readFile(LINK_YML_PATH);
console.log('文件读取成功,大小:', yamlBuffer.length, '字节');
// 处理UTF-8 BOM头(移除BOM)
let cleanBuffer = yamlBuffer;
if (yamlBuffer[0] === 0xef && yamlBuffer[1] === 0xbb && yamlBuffer[2] === 0xbf) {
console.warn('检测到UTF-8 BOM头,已自动移除');
cleanBuffer = yamlBuffer.slice(3); // 移除前3个BOM字节
}
// 转换为字符串
const yamlContent = cleanBuffer.toString('utf8');
// 显示文件前100个字符用于调试
console.log('文件前100字符:', yamlContent.substring(0, 100).replace(/\n/g, '\\n'));
// 更安全的YAML处理 - 只处理确实为空的rss字段
const processedContent = yamlContent
.replace(/^\s*rss:\s*$/gm, 'rss: ""') // 处理空的rss字段
.replace(/\t/g, ' '); // 将制表符替换为两个空格(YAML不允许制表符缩进)
// 保存处理后的内容用于调试
await fs.writeFile('processed_yaml_debug.yml', processedContent, 'utf8');
console.log('已保存处理后的YAML到 processed_yaml_debug.yml');
// 尝试使用更严格的方式定位错误
try {
console.log('开始解析YAML...');
const data = YML.parse(processedContent);
console.log('YAML解析成功,根结构类型:', Array.isArray(data) ? '数组' : typeof data);
if (!Array.isArray(data)) {
throw new Error('YAML文件的根结构不是数组');
}
const linkList = [];
for (let i = 0; i < Math.min(TAKE_COUNT, data.length); i++) {
const item = data[i];
if (item && Array.isArray(item.link_list)) {
linkList.push(...item.link_list);
} else {
console.warn(`第${i+1}项不包含有效的link_list数组,已跳过`);
}
}
const outputData = {
link_list: linkList,
length: linkList.length
};
await fs.writeFile(
OUTPUT_JSON_PATH,
JSON.stringify(outputData, null, 2),
'utf8'
);
console.log(`成功生成 ${OUTPUT_JSON_PATH},共包含 ${linkList.length} 条友链`);
} catch (parseError) {
console.error('\n=== YAML解析错误 ===');
console.error('错误信息:', parseError.message);
// 尝试定位错误行
if (parseError.parsedLine) {
console.error('错误位置: 第', parseError.parsedLine, '行');
// 输出错误行附近的内容
const lines = processedContent.split('\n');
const errorLine = parseError.parsedLine - 1; // 转换为数组索引
// 显示错误行前后3行
for (let i = Math.max(0, errorLine - 3); i <= Math.min(lines.length - 1, errorLine + 3); i++) {
console.log(`${i + 1}: ${lines[i]}`);
}
} else {
console.error('错误位置: 未知(可能是文件开头附近)');
}
console.error('请检查 processed_yaml_debug.yml 文件是否有格式问题');
}
} catch (error) {
console.error('\n=== 处理过程出错 ===');
console.error('错误信息:', error.message);
}
}
processLinks();

运行脚本前请先安装yamljs node install yamljs --save

后端Github Action修复方案#

{% note warning flat %}此修复方法仅经过本人测试正常运行,可否正常使用请自行测试{% endnote %}

作者原版github actions运行后可能会出现找不到环境变量的问题,导致抓取失败。

这里有个走偏门的方法,可以Fork后修改workflows文件夹里面的yaml文件夹的check_links.yml,将env:下面的

SOURCE_URL: ${{ secrets.SOURCE_URL }}

改成自己的URL,例如:

SOURCE_URL: https://www.sumi233.top/flink_count.json

然后在项目的Github Actions再次运行workflows即可。

引用教程#

  • 谢谢大佬们的无私贡献!

{% link Github Action实现友链状态检测,LiuShen,https://blog.liushen.fun/posts/c2262998/ %}

{% link 安知鱼主题实现友链状态前端显示,辰渊尘の个人博客,https://blog.mcxiaochen.top/posts/p1c0fbc06/ %}

最终实现效果#

anzhiyu主题友链测速后端修复
https://astro.sumi233.top/posts/教程/blogflinkcountfix/
作者
Supermini233
发布于
2025-09-24
许可协议
CC BY-NC-SA 4.0