FriendLinks:一个不依赖主题的 Typecho 友情链接插件
我最近发布了一个 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 默认会在绑定的独立页面正文后追加友链列表。我的博客友链页就是这种方式:页面上方是我写的说明,下面的友链列表由插件渲染。内置模板中,卡片网格适合普通友链页:

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

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

如何使用
推荐直接下载 Release 包,下载地址:https://github.com/NHPT/FriendLinks/releases/latest
安装流程:
- 下载
FriendLinks.zip。 - 解压到 Typecho 的
usr/plugins/,最终目录应为usr/plugins/FriendLinks/。 - 在 Typecho 后台启用插件。
- 到“管理 -> 独立页面”创建一个普通页面,比如“友链”。
- 到“友情链接 -> 设置”绑定这个页面。
- 到“友情链接 -> 友链”添加站点名称、URL、Logo、描述和分类。
- 选择前台模板,保存后访问友链页。
如果只是展示友链,到这里就够了。如果要启用健康检测,还需要配置 Worker:
- 推荐方案:CLI Cron。环境支持时插件会自动安装;不支持时按 README 手工配置。
- 可选方案:签名 HTTP Worker。适合用外部监控平台或定时请求触发。
如果要接收异常通知,可以在“友情链接 -> 通知”里配置:
- 钉钉机器人;
- 通用 Webhook;
- SMTP 邮件。
健康检测能做什么
FriendLinks 的检测会分别检查:
- DNS 是否能解析,解析结果是否为公网地址;
- HTTP 是否可访问,状态码是否正常;
- HTTPS 证书链、主机名和有效期;
- 域名 RDAP 到期信息。
前台会显示聚合后的公开状态,例如:
- 正常;
- 需要关注;
- 不稳定;
- 不可用;
- 等待检测;
- 状态未知;
- 未检测。
默认策略不会因为一次网络抖动就立刻判定友链不可用,连续失败后才会进入不可用状态。证书过期、主机名不匹配这类明确问题则会更快标记出来。这个设计比较适合长期维护友链:不用每天手工点开检查,也不会因为一次偶发超时就误报。
简单说下设计过程
这个插件开发时先确定了几个边界:
- 前台只读数据库,不做远端网络请求。
- 友链展示不依赖主题模板。
- 检测任务必须有独立 Worker。
- URL 检测必须考虑 SSRF。
- 通知失败不能影响检测结果。
- 停用插件不能删除用户数据。
所以代码结构分成了几层:
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 会比主题模板更稳。
最后更新于 2026-08-25 「部分内容存在时效性,如有失效请留言反馈」
除注明外为 Hack All Sec 的博客 原创文章,转载请注明出处。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
Hack All Sec 的博客