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

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

实现思路

幸运的是,我们身处 AI 时代,许多曾经遥不可及的想法,如今有了实现的可能。前不久,在访问星日语的博客时,他为 Stellar 主题开发的获取最新评论功能给了我灵感。我茅塞顿开:何不借助 AI 的力量,将我的动态友链项目彻底重构,并打造成一个可复用的 GitHub Workflow 呢?这样一来,至少能解决那个配置和更新繁琐的最大痛点。

在技术选型上,我果断选择了 Node.js。相较于 Python,我对 Node.js 更为熟悉,遇到问题时也更有方向感,知道如何高效地查找资料和解决问题。

经过一番努力,重构后的动态友链核心项目 issues2json 诞生了!它可以自动抓取每个 GitHub Issue 中的第一段 JSON 数据并保存为文件,支持多种排序和过滤规则。我还贴心地加入了一个小特性:当用户未设置图标时,会自动使用其 GitHub 头像作为默认图标。但是,我更推荐大家关注基于它构建的、功能更为强大的项目:links-checker。它能自动检查友链的存活状态,并为不同状态的链接打上相应的标签,让友链管理更加智能高效。

此外,我还从风记星辰的友链设计中汲取灵感,同样运用 Node.js 技术栈,开发了一个实用的友链文章订阅功能。其原理是解析每个 Issue 中 feed 字段提供的 RSS 地址,抓取最新的 N 篇文章,并将这些信息写回 Issue 中。如此一来,再结合 issues2json 的 Workflow,就能轻松将最新的朋友动态整合到友链数据中了。

如何用上新版动态友链?

最便捷的方式莫过于直接 fork 我的友链仓库,根据您的需求稍作配置,启用相关的 GitHub Workflow,即可轻松体验新版动态友链的魅力。如果您已经拥有自己的动态友链仓库,但并非 fork 自我的仓库,也无需担心,只需按照以下步骤操作即可:

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 文档可能未能做到实时同步更新。因此,在配置过程中,请优先以我实际使用的友链仓库中的配置为准。

成果回顾与致谢 🙏

经过一番努力和 AI 的鼎力相助,曾经困扰我的那些痛点问题,如今都得到了圆满解决:

痛点逐一击破

  • 配置繁琐? 新方案虽未达到“开箱即用”的极致便捷,但相较以往,配置流程已大大简化。
  • 网站状态未知? 现在可以自动检测并标记友链的在线状态(通过标签),且不影响您自定义的其他标签。
  • 手动查更新? 无需再手动逐一查看!现在每个友链都会清晰展示其最新发布的文章及时间。
  • 排序不合理? 告别低效排序!新版默认按照朋友们文章的更新时间进行排序,让最新动态一目了然。

特别鸣谢

  • 技术参考与启发:星日语 的精彩分享。
  • 设计灵感来源:风记星辰 独具匠心的友链页面。
  • 代码实现支持:TRAE 提供的强大 AI 编程辅助。