MENU

【代码札记】Comment2Pushover,Typecho评论推送Pushover提醒

May 8, 2019 • Read: 403 • 瞎折腾

前几天发现一直在用的Server酱出了点问题,之前一直还是挺好用的,能够将网站上的评论推送到微信上进行提示,但最近不能用了,我才想起来两年前买的Pushover这个东西,遂魔改大佬的插件以令其能推送评论提醒到Pushover上。插件源文件内附。

简介

这个插件的原型是Y!an大佬写的Comment2Wechat,我修改了其中向Server酱的API推送消息的部分代码,使其可以利用Pushover推送评论通知。此处需要声明原插件在Github的项目是使用GNU General Public License v3.0协议授权的,因此修改后的代码仍需要使用相同的协议授权,并且注明版权归属声明。但你可以自由使用这些代码。

关于代码可靠性的警告

首先我没学过PHP这门语言,因此下面的修改都是凭我的感觉与通过搜索引擎(通常是谷歌)搜索得到的结论进行修改的。关于API的调用参照并对比了两个官方提供的手册,而插件修改完毕之后实际测试可用,但我并不保证插件没有Bug或其他不健全之处。因此是否使用的选择权在你,如果插件导致你的网站崩溃或数据全毁,这个责任需要你自己来承担。你可以通过阅读下面针对修改处的说明来进行判断。

对于修改处的说明

1. 插件的基础配置

首先要修改的就是插件的名称,显然这个插件不应当和原插件重名,其次便是随名称变动而变动的注册插件监听器(可能是叫这个名字吧,我没能找到一个官方的Typecho插件开发手册)的语句,以及启用插件成功时的提示消息:显然Pushover需要的配置和Server酱是不太一样的。

Pushover需要两个参数:USER_KEYAPI_TOKEN,前者是你一登陆Pushover控制台就能看见的,后者是你需要创建一个APP,并在APP的设定中找到的。这两个不能够弄反,二者皆在每次推送通知时和通知内容一并发给Pushover的API,由API判断二者是否正确。这两个参数我也对应的有关配置页面处的函数中做出了修改。

2. 插件的核心功能

对于插件推送通知的功能我修改的不多。我很高兴两个API使用的都是HTTP的POST请求工作的,而唯一的差别是POST请求的内容不一样罢了。因此我按照原来的格式,照猫画虎,实现了Pushover的API所需要的POST请求的构建。并且替换了请求要发送到的URL。

3. 其他未提到的修改

其他未提到或上面没说清楚的修改,应该都是和API有关的地方,请先参阅Pushover和/或Server酱的手册。若仍存疑问,欢迎评论。

使用

完整地复制以下代码,贴进一个文件名是Plugin.php的文件中。在Typecho 的插件目录下新建名为Comment2Pushover的目录(上述两个名字请务必区分大小写),并将此文件放置于其中。最后进入Typecho后台启用插件并配置好即可。

<?php
/**
 * Pushover推送评论通知,修改自Y!an的微信推送评论通知。
 * 
 * @package Comment2Pushover
 * @author 天空Blond
 * @version 1.0.0
 * @link https://www.skyblond.info
 */
class Comment2Pushover_Plugin implements Typecho_Plugin_Interface
{
    /**
     * 激活插件方法,如果激活失败,直接抛出异常
     * 
     * @access public
     * @return void
     * @throws Typecho_Plugin_Exception
     */
    public static function activate()
    {
    
        Typecho_Plugin::factory('Widget_Feedback')->comment = array('Comment2Pushover_Plugin', 'sc_send');
        Typecho_Plugin::factory('Widget_Feedback')->trackback = array('Comment2Pushover_Plugin', 'sc_send');
        Typecho_Plugin::factory('Widget_XmlRpc')->pingback = array('Comment2Pushover_Plugin', 'sc_send');
        
        return _t('请配置此插件的 USER_KEY 和 API_TOKEN, 以使您的Pushover推送生效');
    }
    
    /**
     * 禁用插件方法,如果禁用失败,直接抛出异常
     * 
     * @static
     * @access public
     * @return void
     * @throws Typecho_Plugin_Exception
     */
    public static function deactivate(){}
    
    /**
     * 获取插件配置面板
     * 
     * @access public
     * @param Typecho_Widget_Helper_Form $form 配置面板
     * @return void
     */
    public static function config(Typecho_Widget_Helper_Form $form)
    {
        $key = new Typecho_Widget_Helper_Form_Element_Text('user', NULL, NULL, _t('USER_KEY'), _t('USER_KEY 可以在 Pushover 账户的控制台中找到'));
        $form->addInput($key->addRule('required', _t('您必须填写一个正确的 USER_KEY')));
        
        $key2 = new Typecho_Widget_Helper_Form_Element_Text('token', NULL, NULL, _t('API_TOKEN'), _t('API_TOKEN 可以在 Pushover 的 APP 的控制台中找到'));
        $form->addInput($key2->addRule('required', _t('您必须填写一个正确的 API_TOKEN')));
    }
    
    /**
     * 个人用户的配置面板
     * 
     * @access public
     * @param Typecho_Widget_Helper_Form $form
     * @return void
     */
    public static function personalConfig(Typecho_Widget_Helper_Form $form){}

    /**
     * 微信推送
     * 
     * @access public
     * @param array $comment 评论结构
     * @param Typecho_Widget $post 被评论的文章
     * @return void
     */
    public static function sc_send($comment, $post)
    {
        $options = Typecho_Widget::widget('Widget_Options');

        $token = $options->plugin('Comment2Pushover')->token;
        $user = $options->plugin('Comment2Pushover')->user;

        $text = "有人在您的博客发表了评论";
        $desp = "".$comment['author']." 在「".$post->title."」中说到: \n\n > ".$comment['text'];

        $postdata = http_build_query(
            array(
                'token' => $token,
                'user' => $user,
                'message' => $desp,
                'title' => $text,
                'url' => $post->permalink,
                'url_title' => $post->title
                )
            );

        $opts = array('http' =>
            array(
                'method'  => 'POST',
                'header'  => 'Content-type: application/x-www-form-urlencoded',
                'content' => $postdata
                )
            );
        $context  = stream_context_create($opts);
        $result = file_get_contents('https://api.pushover.net/1/messages.json', false, $context);
        return  $comment;
    }
}

-全文完-


知识共享许可协议
【代码札记】Comment2Pushover,Typecho评论推送Pushover提醒天空 Blond 采用 知识共享 署名 - 非商业性使用 - 相同方式共享 4.0 国际 许可协议进行许可。
本许可协议授权之外的使用权限可以从 https://www.skyblond.info/about.html 处获得。

Archives QR Code Tip
QR Code for this page
Tipping QR Code
Leave a Comment

7 Comments
  1. serverchan出问题的时候Pushover确实也不错。我也好早前就注册了。

  2. 感觉现在的大学生写的博客很多都是用typecho了

    1. @奶爸de笔记我感觉还好吧,用WordPress的也不少。我个人觉得typecho比较简洁,WordPress功能好多我用不到,装起来有点浪费2333

    2. @天空Blond反正我逛到的用typecho然后动漫风格的,基本上都是大学生或者才毕业的。是不是你们这一代的也喜欢搭建博客了?还是只是一少部分。

    3. @奶爸de笔记我感觉其实大多数同龄人发朋友圈或微博居多,搭博客普
      还是挺少见的。我写博客的爱好大概是源自小时候看着新鲜,初步了解了一下之后就被资金劝退了2333当时家里人也完全不理解一个初中生为啥要花钱去弄一些看不见摸不着的东西。后来我发现了点点轻博客,在那上面写东西,比起博客更像是个社交平台,但是个能够发表长篇大论的平台,能收到别人的反馈。后来点点不行了,我又转到网易lofter,后来lofter各种敏感词强迫我搬出来自立门户了2333自此才开始做独立博客。不过大学同学之中,都是学计算机的,各专业加一块也没见有几个人做独立博客。我觉得年轻人可能还是偏向主流碎片化的社交平台吧

    4. @天空Blond我觉得尤其是学计算机的,弄一个个人博客还是很有必要的,最好是弄一个技术和生活分开的博客,出来找工作也是一个门面。博客最大的意义其实我感觉是结交朋友。

    5. @奶爸de笔记嗯,我之前也想过分开弄,但是后来觉得还是混在一个上了。一来是技术博客我写的不多,写了的也比较水,单拿不出手;二来我觉得单独分开这二者有悖于我的个性:我不介意别人看到我的一部分,但我比较介意别人只看到我的一部分,我更偏向于强调自己是个完整的人,而不单单只是一个学生/码农/或其他什么角色。所以我更期望别人在审视我作为某一角色之外,还将我视作同他一样的人,会学习,会试着创造些东西,会娱乐,也会发泄牢骚,会有感情。关于第二点想法,我觉得可能有朝一日离开学校进入社会之后就会慢慢被改掉吧2333不过从第二点出发,这个博客不光是为了表达自己,也是同样希望能够认识一些人,倾心交流吧

0:00