魔改一个站长侧的 Ntfy 推送

曾经试过几次,忙起来忘了上站,结果人家评论待了几天没有回复。
再加上站点因为成本问题没有实现评论邮件通知推送,站长自然也就看不到信息
思来想去,决定还是让评论直接推送到手机,这样一看通知就知道是什么情况了,可以及时去回复读者评论
(不过读者侧依然暂未实现推送)

点击此处,展开目录

前言

关于推送这种东西,笔者研究过很多方案。最简单的当然是搭建邮件推送,好处就是读者也可以收到评论回复提醒,不必像现在这样还得回来看看。但是自己搭建邮件推送最大的问题就是容易进垃圾箱。就,你知道的,那几个反垃圾邮件联盟那群人不是吃白饭的,而且著名的大邮箱服务商(比如Gmail,163,QQ)都有自己的反垃圾邮件规则,和对方的发信IP白名单,所以互相发信没事。如果自建邮箱发信就很容易进垃圾箱。即使能够成功投递,投递频率也有上限,而且吃不准什么时候又进去垃圾箱了。

此外,自建发信会暴露源站IP,相当于你费尽心思隐藏的原站,被人家一个评论钓走了。当然有程序可以改写SMTP Received字段以屏蔽源站IP,但是此时又会容易被垃圾邮件判定规则认为是恶意发信而进垃圾箱甚至直接拒收。

解决办法很简单,要么额外买机器做发信服务器,但此时很难解决进垃圾箱问题;要么买成品邮件推送服务,人家做服务的会准备好干净(且可能经过认证)的IP。但不论怎么解决都好,最后都得花钱——也有免费服务,但是要么不稳定(被滥用后很快被各大邮箱拉黑),要么发信量严重不足,要么要求你绑定支付渠道以便及时从你口袋里掏钱,总之都不是上策。

退一步回来,如果仅仅是推送到笔者的手机,那么可选的方案会多一些,比如用得多的有Server酱,也有自己搭建企业微信推送的,优点当然是可以实时推送,但是这类依赖微信的,笔者不是很喜欢(主要是不想绑死在某个平台上,以及涉及国内平台的问题...你懂的)

于是再退一步回来,经过比较,笔者选择了ntfy这种基于独立平台原生推送的东西,而且在接口打一下就能推送,实在是方便。本来还想自己搭建服务器,后来想想,算了,官方服务器问题也不大。

代码修改

Typecho是支持写插件的,但是官方文档年久失修,大量内容缺失(估计是迁移平台导致的问题),直接写插件怕是难以下手。不过好在前两天安装了一个反垃圾评论插件SmartSpam,正好里面有对于评论操作的hook,于是依葫芦画瓢,寄生在它下面了:

首先打开Plugin.php,在类的空白处加一个方法:


private static function sendCommentNTFY($comment, $type, $author) {
    //为了防止请求失败阻止合法评论,干脆就放在try里面
    try {
        $act = array(
            'abandon' => '【🚫已拒绝】',
            'spam' => '【👎️垃圾评论】',
            'waiting' => '【🚩待审核】',
            'none' => '【✔️审核通过】'
        );
        $cType = ($act[$type] != '') ? $act[$type] : '【✔️审核通过】';
        $header = array(
            'Content-Type: text/plain',
            'X-Title: 博客新评论'.$cType,
            'X-Actions: view,评论管理, https://<你的博客域名>/<后台管理地址>/, clear=true'
        );
        $comm = (mb_strlen($comment,'utf8') > 15) ? mb_substr($comment,0,15,'utf8').'...' : $comment;
        $message = "发送者:".$author."\n内容:".$comm;

        //记得打开PHP中的curl模块
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, 'https://ntfy.sh/<你的推送主题,别让人猜到>');
        curl_setopt($curl, CURLOPT_HEADER, 0);
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 5);
        curl_setopt($curl,CURLOPT_HTTPHEADER,$header);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); 
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $message);
        $tmpInfo = curl_exec($curl);
        curl_close($curl);
        return $tmpInfo;
    } catch(Exception $ignored) {
        //do nothing
    }
}

然后往上翻,找到代码中即将把评论提交给typecho处理的地方,插入对这个函数的调用:

//自编程序:评论结果推送到NTFY
SmartSpam_Plugin::sendCommentNTFY($comment['text'],$comment['status'],$comment['author']);

//下面是原来的逻辑
Typecho_Cookie::delete('__typecho_remember_text');
return $comment;

PHP就这点好,写完之后SFTP推送到服务器,然后发条评论测试一下结果,马上就能看到成效:

写在最后

俗话说,师傅领进门,修行看个人。网上确实一抓一大把教程教你怎么建站,但是真正上手了,你不久就会碰到一大堆的挑战,包括但不限于:

  • 如何防止垃圾评论
  • 如何防止源站泄露
  • 如何防止CC攻击
  • 如何给站点提速
  • 如何防止接口被刷
  • 如何吸引读者
  • 如何打磨细节

当然还有笔者觉得最重要的一点:

  • 如何持续产出内容,而不是像某些网站那样AIGC塞满搜索引擎结果

(完)


木头箱子脆脆,但是这样正好

如无特殊声明,本站内容均遵循 CC BY-NC-SA 4.0 协议

转载请注明出处并保留作者信息,谢谢!

none
最后修改于:2025年03月09日 13:11

添加新评论

提醒:站长手头紧,没有配备『评论回复邮件提醒』功能
评论后,劳烦您隔一段时间回到本页面查看站长回复(一般都会回)