熟悉我的朋友可能知道,我并非科班出身的前端或后端开发者。五年前,我摸索着实现了一个动态友链项目。这个项目磕磕绊绊地运行至今,但也暴露出一些由于我技能所限而难以解决的痛点,加之日常事务繁忙,项目一直处于“勉强能用”的状态。比如:

  • 配置和更新流程略显繁琐
  • 无法自动标记友链的在线状态(例如404错误)
  • 查看朋友们是否更新博客,需要逐个手动访问
  • 只能按照 issue 创建或更新时间排序,体验不佳

实现思路

前不久,我在星日语的博客上看到他给 Stellar 主题做的获取最新评论功能,才想起自己那个一直没动的友链项目:如果把抓取、检测、订阅拆成几个独立的小工具,再配上 GitHub Workflow,配置繁琐这件事也许就有解了。

技术选型用的 Node.js,理由很简单:对它最熟,出了问题知道去哪找答案。

重构后最基础的一个项目是 issues2json:抓取每个 Issue 里的第一段 JSON 存成文件,支持排序和过滤;如果用户没有设置图标,就自动用他的 GitHub 头像顶上。基于它做的 links-checker 更实用一些,它会检查友链还能不能访问,并给不同状态的链接打上标签。

风记星辰的友链页给了我另一个想法:解析每个 Issue 里 feed 字段指向的 RSS,抓最新几篇文章写回 Issue,再交给 issues2json 生成数据。这样友链列表里就带上了朋友们的最新动态,也就是第三个项目 feed-posts-parser

如何用上新版动态友链?

最省事的方式是直接 fork 我的友链仓库,改几处配置、启用对应的 Workflow 就行。如果你已经有自己的动态友链仓库,照着下面的步骤也能改过来:

1. 清理旧版配置

为避免旧的 Workflow 意外覆盖新生成的数据,请您先将友链仓库中与旧版动态友链相关的代码和配置文件彻底删除。

接下来,在您的友链仓库中创建一个新的 GitHub Workflow 文件(例如 .github/workflows/links-checker.yml),文件名可自定义。然后,将以下代码复制到该文件中:

name: Reachability Checker

# Controls when the workflow will run
on:
issues:
# 新增(打开)/关闭/重新打开/设置标签/移除标签
types: [opened, closed, reopened, labeled, unlabeled]
# 手动触发
workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job called "build"
reachability-checker:
# The type of runner that the job will run on
runs-on: ubuntu-latest
permissions:
contents: write
issues: write
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
- name: Checkout repository
uses: actions/checkout@v4
# 检查链接状态
- name: Check Reachability
uses: xaoxuu/links-checker@main
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
checker: 'reachability'
unreachable_label: '失联'
exclude_issue_with_labels: '审核中, 白名单, 缺少互动, 缺少文章' # 具有哪些标签的issue不进行检查
# 检查完毕后重新生成一下JSON
- name: Generate data.json
uses: xaoxuu/issues2json@main
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
data_version: 'v2'
data_path: '/v2/data.json'
sort: 'posts-desc' # created-desc/created-asc/updated-desc/updated-asc/version-desc/posts-desc
exclude_issue_with_labels: '审核中, 缺少互动, 缺少文章, 风险网站' # 具有哪些标签的issue不生成到JSON中
hide_labels: '白名单' # 这些标签不显示在前端页面
- name: Setup Git Config
run: |
git config --global user.name 'github-actions[bot]'
git config --global user.email 'github-actions[bot]@users.noreply.github.com'
- name: Commit and Push to output branch
run: |
git fetch origin output || true
git checkout -B output
git add --all
git commit -m "Update data from issues" || echo "No changes to commit"
git push -f origin output

强烈推荐您使用 posts-desc 作为排序规则。这样可以确保最近有内容更新的友链优先展示。如果您的友链尚未配置文章订阅功能,该排序规则会自动降级为 created-desc,即按照友链的添加时间降序排列。

3. 配置 Feed Posts Parser(友链文章订阅器)

如果您希望启用友链文章订阅功能,请在友链仓库中再创建一个新的 GitHub Workflow 文件(例如 .github/workflows/feed-parser.yml),文件名同样可以自定义。然后,将以下代码粘贴进去:

name: Feed Posts Parser

on:
workflow_dispatch: # Allows manual triggering
schedule:
- cron: '0 21 * * *' # Runs daily at 21:00 UTC

jobs:
feed-parser:
runs-on: ubuntu-latest
permissions:
issues: write
contents: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Run Feed Post Parser
uses: xaoxuu/feed-posts-parser@main
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
data_path: '/v2/data.json'
posts_count: 3
date_format: 'YYYY-MM-DD HH:mm'
# 重新生成一下JSON
- name: Generate data.json
uses: xaoxuu/issues2json@main
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
data_version: 'v2'
data_path: '/v2/data.json'
sort: 'posts-desc' # 'created-desc'/'created-asc'/'updated-desc'/'updated-asc'
exclude_issue_with_labels: '审核中, 缺少互动, 缺少文章, 风险网站' # 具有哪些标签的issue不生成到JSON中
hide_labels: '白名单' # 这些标签不显示在前端页面
- name: Setup Git Config
run: |
git config --global user.name 'github-actions[bot]'
git config --global user.email 'github-actions[bot]@users.noreply.github.com'
- name: Commit and Push to output branch
run: |
git fetch origin output || true
git checkout -B output
git add --all
git commit -m "Update data from issues" || echo "No changes to commit"
git push -f origin output

这个 Workflow 会按照预设的定时任务(默认东八区时间每天凌晨05:00)自动运行,当然也支持手动触发。它会自动解析每个 Issue 中的 feed 字段,抓取对应 RSS 源的最新 N 篇文章(数量可配置),并将这些信息更新回 Issue 中。要在您的网站上展示友链的最新文章,需要确保您的主题支持此功能(例如最新版的 Stellar 主题),并在原有的动态友链标签中增加 posts:true 参数即可:

{% friends posts:true api:https://raw.github.xaox.cc/xaoxuu/friends/output/v2/data.json %}

最新友链效果

温馨提示

README

由于这些新项目仍处于快速迭代和完善阶段,相关的 README 文档可能未能做到实时同步更新。因此,在配置过程中,请优先以我实际使用的友链仓库中的配置为准。

成果回顾与致谢 🙏

前面列出的几个问题,现在的情况是:

现在的情况

  • 配置:没做到开箱即用,但比旧版简单了很多。
  • 链接状态:自动检测并打标签,不影响你自己设置的其他标签。
  • 朋友更新:不用再逐个点开,每个友链都会显示最新一篇文章和时间。
  • 排序:默认按朋友们最近更新的时间排。

特别鸣谢


后记(2025 年 6 月):当时部分模型服务排队严重、体验受限,一些代码补全功能也开始收费。

站内搜索

没有找到内容!