21
好好学习,天天向上
回复讨论
0
登录后可参与回复讨论。
当前还没有回复,欢迎成为第一个参与讨论的人。
友情链接是博客的"社交名片",但手动维护友链总会遇到这些麻烦:对方悄悄删了不知道、想加友链要改主题文件、点击没统计、外链跳转没提示。所以自己开发了 FriendLinks 友情链接插件把这些事都一次性解决了。

访客可在前台填写申请表(站点名称、URL、Logo、描述、反链检测页面),提交后进入后台审核流程。支持两种模式:
申请表内置防滥用:HMAC Token 防 CSRF、蜜罐字段拦机器人、同 IP 每小时限 5 次、URL 去重。

<!--more-->
插件定时去对方站点抓取页面,检查是否真的有指向本站的链接。检测策略可配置:
检测有安全防护:只允许公网 HTTP/HTTPS、不跟随重定向、拦截内网地址、限制响应体 2MB,避免 SSRF 风险。
前台展示也会配合状态:反链失败的友链加删除线、悬停提示"暂未检测到本站友链"、链接强制走安全跳转并加 nofollow。

点击友链不直接跳走,先到一个中英文确认页,显示目标站点名称和完整 URL,访客点"继续访问"才跳转。
后台"访客记录"页可查看点击时间、友链名称、IP、User-Agent、来源页,支持按保留期自动清理。
一个友链可属于多个分类,主题用"调用标识"(slug)调用:
php\TypechoPlugin\FriendLinks\Plugin::render(['categories' => ['tech', 'friends']]);
没有分类的友链自动归入"默认分类"。删除分类不删除友链,只解除关联。后台支持批量追加/移出/替换分类,事务保存。
列表页可勾选多条友链,批量审核通过、拒绝、下线、删除,或调整分类。批量删除需二次确认。
每条友链可单独配置:
nofollow提供两种调度方式:
独立 Cron URL(推荐):插件设置页生成带 Token 的地址,加到服务器 crontab 即可。

FriendLinks 目录放入 usr/plugins/。激活时自动建表,无需手动操作 SQL。
最简单的调用,一行搞定:
php<?php \TypechoPlugin\FriendLinks\Plugin::render(); ?>
输出申请表:
php<?php \TypechoPlugin\FriendLinks\Plugin::renderApplyForm(); ?>
按分类输出:
php<?php \TypechoPlugin\FriendLinks\Plugin::render(['categories' => ['tech']]); ?>
完全自定义 HTML:
php<?php foreach (\TypechoPlugin\FriendLinks\Plugin::getLinks() as $link): ?>
<a href="<?php echo \TypechoPlugin\FriendLinks\Plugin::escape(\TypechoPlugin\FriendLinks\Plugin::linkUrl($link)); ?>"
rel="<?php echo \TypechoPlugin\FriendLinks\Plugin::escape(\TypechoPlugin\FriendLinks\Plugin::linkRel($link)); ?>">
<?php echo \TypechoPlugin\FriendLinks\Plugin::escape($link['site_name']); ?>
</a>
<?php endforeach; ?>
在默认主题 sidebar.php 中:
php<?php if (in_array('ShowFriendLinks', (array)$this->options->sidebarBlock, true)
&& class_exists('\TypechoPlugin\FriendLinks\Plugin')
&& \TypechoPlugin\FriendLinks\Plugin::getLinks()): ?>
<section class="widget">
<h3 class="widget-title"><?php _e('友情链接'); ?></h3>
<?php \TypechoPlugin\FriendLinks\Plugin::render(); ?>
</section>
<?php endif; ?>
再到主题 functions.php 的 sidebarBlock 选项里加入 'ShowFriendLinks' => _t('显示友情链接'),即可在外观设置里开关。
插件设置页会生成一个带 Token 的 URL,复制后加到服务器 crontab:
text*/10 * * * * curl -fsS "https://example.com/action/friend-links?do=cron&token=YOUR_TOKEN" >/dev/null
Token 只应保存在服务器计划任务中,不要公开。
插件信息:FriendLinks v1.0.0 · 兼容 Typecho 1.3.x · 作者:欧阳博客 (https://www.oyzm.cn)
FriendLinks.zip