我最近发布了一个 AI 辅助开发的 Typecho 插件:FriendLinks

仓库地址:https://github.com/NHPT/FriendLinks

我的博客也已经在使用它:https://blog.hackall.cn/FrindLinks.html

为什么要写这个插件

Typecho 生态里友情链接不是新需求,很多主题也内置了友链管理的功能,但是缺少健康检测、通知、数据迁移等功能,我比较懒,不想时不时看看友链是否还有效。某些主题可能有这样的功能,但那可能并不是我喜欢的主题。所以我写了 FriendLinks,它的目标是一个独立的友情链接综合管理插件。

FriendLinks 的优势是功能完整、边界清楚:

  • 主题解耦:使用普通独立页面承载展示,不要求主题提供 page-links.php
  • 多模板展示:内置卡片网格、紧凑列表、站点目录、Logo 方阵、极简文字。
  • 健康检测:支持 DNS、HTTP、TLS 证书、RDAP 域名到期检测。
  • 后台调度:优先使用 CLI Cron,也支持签名 HTTP Worker。
  • 主动通知:支持钉钉机器人、通用 Webhook、SMTP 邮件。
  • 数据迁移:支持 JSON 和 CSV 导入导出,CSV 会防护电子表格公式注入。
  • 安全边界:前台不发起外部请求,检测链路包含 SSRF 防护。
  • 生命周期明确:停用不删数据,只有输入 DELETE 显式卸载才清理数据表。

展示效果

FriendLinks 默认会在绑定的独立页面正文后追加友链列表。我的博客友链页就是这种方式:页面上方是我写的说明,下面的友链列表由插件渲染。内置模板中,卡片网格适合普通友链页:

friendlinks-cards.png

Logo 方阵适合更强调站点标识的页面:

friendlinks-logo-grid.png

移动端也做了单列适配,状态信息不会只依赖鼠标悬停:

friendlinks-mobile.png

如何使用

推荐直接下载 Release 包,下载地址:https://github.com/NHPT/FriendLinks/releases/latest

安装流程:

  1. 下载 FriendLinks.zip
  2. 解压到 Typecho 的 usr/plugins/,最终目录应为 usr/plugins/FriendLinks/
  3. 在 Typecho 后台启用插件。
  4. 到“管理 -> 独立页面”创建一个普通页面,比如“友链”。
  5. 到“友情链接 -> 设置”绑定这个页面。
  6. 到“友情链接 -> 友链”添加站点名称、URL、Logo、描述和分类。
  7. 选择前台模板,保存后访问友链页。

如果只是展示友链,到这里就够了。如果要启用健康检测,还需要配置 Worker:

  • 推荐方案:CLI Cron。环境支持时插件会自动安装;不支持时按 README 手工配置。
  • 可选方案:签名 HTTP Worker。适合用外部监控平台或定时请求触发。

如果要接收异常通知,可以在“友情链接 -> 通知”里配置:

  • 钉钉机器人;
  • 通用 Webhook;
  • SMTP 邮件。

健康检测能做什么

FriendLinks 的检测会分别检查:

  • DNS 是否能解析,解析结果是否为公网地址;
  • HTTP 是否可访问,状态码是否正常;
  • HTTPS 证书链、主机名和有效期;
  • 域名 RDAP 到期信息。

前台会显示聚合后的公开状态,例如:

  • 正常;
  • 需要关注;
  • 不稳定;
  • 不可用;
  • 等待检测;
  • 状态未知;
  • 未检测。

默认策略不会因为一次网络抖动就立刻判定友链不可用,连续失败后才会进入不可用状态。证书过期、主机名不匹配这类明确问题则会更快标记出来。这个设计比较适合长期维护友链:不用每天手工点开检查,也不会因为一次偶发超时就误报。

简单说下设计过程

这个插件开发时先确定了几个边界:

  1. 前台只读数据库,不做远端网络请求。
  2. 友链展示不依赖主题模板。
  3. 检测任务必须有独立 Worker。
  4. URL 检测必须考虑 SSRF。
  5. 通知失败不能影响检测结果。
  6. 停用插件不能删除用户数据。

所以代码结构分成了几层:

  • Plugin.php:负责激活、停用、菜单、路由和 Typecho 钩子。
  • panel/:后台页面,包括友链、分类、健康、历史、导入导出、通知和设置。
  • src/Application/:处理友链保存、导入导出、Worker、通知计划和投递。
  • src/Domain/:处理 URL 规范化、状态聚合、调度策略等规则。
  • src/Infrastructure/:处理数据库、HTTP、RDAP、Cron、Webhook、邮件等外部依赖。
  • src/Presentation/:处理前台渲染、模板和资源加载。

发布前做了 PHP 7.4 到 8.5、Typecho 1.2.1、SQLite/MariaDB/PostgreSQL、Cron 生命周期、HTTP Worker 签名、通知投递、前端渲染等测试。仓库里也配置了 GitHub Actions 做语法检查、Composer 审计和基础测试。

更多设计细节请查阅:https://github.com/NHPT/FriendLinks/blob/main/docs/friend-links-architecture.md

适合谁

我建议下面这类 Typecho 用户使用 FriendLinks:

  • 希望友链功能独立于主题;
  • 希望换主题后不用重新做友链页;
  • 希望友链有健康状态;
  • 希望证书、域名或站点异常时能收到通知;
  • 希望友链数据可以导入导出;
  • 希望插件停用时保留数据。

如果你只是临时放几个链接,这个插件可能偏重。但如果你把友链当成站点长期维护的一部分,FriendLinks 会比主题模板更稳。

文章目录