酥米小机器人正在努力构思中···(如果文章里面一直显示ai构思中,那就是酥米本米没有在文章设置AI总结/DOGE)
酥米机器人AI摘要
Qwen3-8B

anzhiyu主题友链测速后端修复

前提

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

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

脚本可以放在scripts文件夹也可以单独执行node 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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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修复方案

此修复方法仅经过本人测试正常运行,可否正常使用请自行测试

作者原版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即可。

引用教程

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

最终实现效果