Mr丶冷文

文章 分类 评论
83 8 3717

站点介绍

冷文学习者(KEVINLU98.COM),记录一个北漂小码农的日常业余生活
顺带帮大家免费代下载IT教程吧的资源 传送门
友链申请地址(直接评论即可): 传送门

手把手教你开发一个Typecho插件

MR丶冷文 2021-03-24 1535 5条评论 typecho相关 插件typecho评论通知

首页 / 正文
Freewind主题v1.4版本已经发布,详情与下载请关注 Freewind1.4更新
抱歉:
年后因为工作和生活上的一系列不顺心的事情我无法去维护Freewind主题,目前也在思考一些问题,比如要不要继续工作,或者要不要去读硕士等,等这些事件都处理好了我会继续看Freewind主题的

发布于2022-05-26

说明

该插件使用Server酱公众号推送功能(将于4月30日失效),带大家熟悉一下Typecho插件的开发

该插件已废弃,但开发方法大家可以参考

需求

当我们的站点收到他人评论时微信公众号会主动推给我们一条消息告知我们评论内容

准备

  • Server酱登录(可选用github登录 ,方便)然后点击微信推送->扫码绑定微信
  • 点出发送消息,然后生成SCKEY,如图所示,因为我已经生成了,所以页面有些不一样

https://imagebed-1252410096.cos.ap-nanjing.myqcloud.com/20210323/8cd70958b1df4e2186888e1ddaf5e2ca.png

  • 本地搭建一套typecho的开发环境,你能看到这里说明肯定这一步已经做好了

开始开发

  • 在项目目录usr/plugins 目录下创建名为WechatNotice 文件夹,Enmm...这个名字怎么来的呢?如图

https://imagebed-1252410096.cos.ap-nanjing.myqcloud.com/20210323/d5213d6c9be4462ea8fba05c79a53de9.png

  • 在刚刚创建好的文件夹下面新创建一个名为Plugin.php的文件(注意:文件名一定是这个,这是typecho的规范)
  • 先写上插件的信息,在刚刚创建的文件写上如下

    <?php
    if (!defined('__TYPECHO_ROOT_DIR__')) exit;
    /**
     * 当你的站点收到他人评论时微信公众号会主动推给你一条消息告知你评论内容
     *
     * @package 微信通知插件
     * @author 冷文博客
     * @version 1.0.0
     * @link https://kevinlu98.cn
     */
  • 去站点后台插件管理看看,对照一下信息不难发现这些信息都怎么修改,这个大家看着改

https://imagebed-1252410096.cos.ap-nanjing.myqcloud.com/20210323/9e58afed6b7043d1b2992c19b40cb250.png

  • 创建一个名为插件目录_Plugin的类实现Typecho_Plugin_Interface接口,这个是typecho规范,我这边插件目录是WechatNotice 所以我的类名应该为WechatNotice_Plugin ,如果你是用PhpStorm开发工具的话你会发现它会让你去实现接口里的几个方法,我把每个方法的注释都标出来大家可以看看
<?php
if (!defined('__TYPECHO_ROOT_DIR__')) exit;

/**
 * 当你的站点收到他人评论时微信公众号会主动推给你一条消息告知你评论内容
 *
 * @package 微信通知插件
 * @author 冷文博客
 * @version 1.0.0
 * @link https://kevinlu98.cn
 */
class WechatNotice_Plugin implements Typecho_Plugin_Interface
{

    /**
     * 激活插件方法
     * 就是你在站点后台点击插件管理的启用时会执行此方法
     * 主要写一些需要初始化的操作,如创建数据库表、挂载内容等等
     */
    public static function activate()
    {
        // TODO: Implement activate() method.
    }

    /**
     * 从名称不难看出这是当你禁用插件时执行的方法,主要用于释放资源
     */
    public static function deactivate()
    {
        // TODO: Implement deactivate() method.
    }

    /**
     * 当你点击插件设置时会有一个表单,里面的表单项就是从这里创建的
     * @param Typecho_Widget_Helper_Form $form
     */
    public static function config(Typecho_Widget_Helper_Form $form)
    {
        // TODO: Implement config() method.
    }

    /**
     * 这个是个人用户的配置面板,基本来说用不到,我们就先不管啦
     * @param Typecho_Widget_Helper_Form $form
     */
    public static function personalConfig(Typecho_Widget_Helper_Form $form)
    {
        // TODO: Implement personalConfig() method.
    }
}

分析需求

到这里我们开发一个插件的基本骨架已经完成了,现在我们就来分析一下需求

  • 我们需要做的就是在他人评论时拿到他人的评论内容,然后通过Server酱的推送功能将消息推送到我们的公众号上
  • 到这里说一个经验吧,一般来说像这种支持插件的项目基本都是在开发过程中在很多必要的地方提前预留挂载点,当挂载点有被挂载内容是就会执行相应的内容,例如typechoemlog等都是这样
  • 到这里我们不难想到下一步应该就是找到评论的挂载点,然后编写程序利用Server酱的推送API进行消息推送
  • 现在我们可以拿到评论内容了,同时我们也有了SCKEY,但是等等,别忘了,我们的插件开发好是给别人用的,我们有SCKEY不行啊,这是我们的,我们需要给别人提供一个可以配置他自己的SCKEY的地方
  • 有没有想起上面我们实现Typecho_Plugin_Interface接口有个方法可以帮我们完成这件事,就是public static function config(Typecho_Widget_Helper_Form $form)方法
  • 现在分析完了我们再开始撸代码就简单多了

代码开始

  • 我们先找找发表评论的方法,看看里面有没有挂载点,我是通过全局查找字符串找到的评论方法

https://imagebed-1252410096.cos.ap-nanjing.myqcloud.com/20210324/668f4f192563414d85d698f01b446242.png

  • 大概在代码130多行左右可以看到如下代码
/** 生成过滤器 */
try {
  $comment = $this->pluginHandle()->comment($comment, $this->_content);
} catch (Typecho_Exception $e) {
  Typecho_Cookie::set('__typecho_remember_text', $comment['text']);
  throw $e;
}
  • 我们如愿以偿的找到了挂载点,而且可以看到它传了两个参数,一个是评论对象,一个是文章对象
  • 现在开始开发,我们先来完成激活插件的方法,在该方法里面挂载我们的插件
/**
 * 激活插件方法
 * 就是你在站点后台点击插件管理的启用时会执行此方法
 * 主要写一些需要初始化的操作,如创建数据库表、挂载内容等等
 */
public static function activate()
{
  /**
         * Widget_Feedback 要挂载插件的类名
         * WechatNotice_Plugin 挂载插件的类名,即我们当前的类名
         * send_comment_wechat 在挂载点执行方法
         */
  Typecho_Plugin::factory('Widget_Feedback')->comment = ['WechatNotice_Plugin', 'send_comment_wechat'];
}
  • 插件挂载好了后我们需要让用户配置Server酱的SCKEY,我们可以在config方法里面配置
/**
 * 当你点击插件设置时会有一个表单,里面的表单项就是从这里创建的
 * @param Typecho_Widget_Helper_Form $form
 */
public static function config(Typecho_Widget_Helper_Form $form)
{
  /** 分类名称 */
  $sckey = new Typecho_Widget_Helper_Form_Element_Text(
    'sckey',    //配置名称  我们取值的时候需要用到它
    NULL,
    NULL,
    _t('SCKEY'),//表单提示词,即input上方显示的内容
    _t('SCKEY可在<a href="http://sc.ftqq.com/?c=code" target="_blank">Server酱</a>注册申请')//表单内容详细说明,即input下方显示的内容
  );
  /**
   * addRule 方法,加入表单校验,required为非空
   */
  $form->addInput($sckey->addRule('required', _t('SCKEY不能为空')));
}
  • 现在我们有了SCKEY后就可以在收到评论时推送消息了,很幸运,Server酱官网有php的例子,我们直接考过来就行

https://imagebed-1252410096.cos.ap-nanjing.myqcloud.com/20210324/90b377f7dbff42fcbb6bb2b41887da33.png

  • 稍稍更改一下,删除key参数的默认值,并将方法设为public static
public static function sc_send($text, $desp = '', $key = '')
{
  $postdata = http_build_query(
    array(
      'text' => $text,
      'desp' => $desp
    )
  );

  $opts = array('http' =>
                array(
                  'method' => 'POST',
                  'header' => 'Content-type: application/x-www-form-urlencoded',
                  'content' => $postdata
                )
               );
  $context = stream_context_create($opts);
  return $result = file_get_contents('https://sc.ftqq.com/' . $key . '.send', false, $context);

}
  • 刚刚我们在挂载插件的时候挂载了send_comment_wechat方法,我们就创建该方法,参数有两个,$comment$post
/**
 * 插件挂载我方法
 * @param $comment
 * @param $post
 * @return mixed
 * @throws Typecho_Exception
 */
public static function send_comment_wechat($comment, $post)
{
  // 文章标题
  $text = $post->title;
  //评论内容,Server酱支持markdown格式的数据
  $desp = "**" . $comment['author'] . "**发表评论:\n\n>" . $comment['text'];
  //获取我们刚刚设置的sckey
  $key = Typecho_Widget::widget('Widget_Options')->plugin('WechatNotice')->sckey;
  //发送消息
  WechatNotice_Plugin::sc_send($text, $desp, $key);
  //返回评论对象,因为挂载点上是有接收返回值的
  return $comment;
}

效果

https://imagebed-1252410096.cos.ap-nanjing.myqcloud.com/20210324/2c110a9df7ad41f184642238c28955c6.png

全部代码

<?php
if (!defined('__TYPECHO_ROOT_DIR__')) exit;

/**
 * 当你的站点收到他人评论时微信公众号会主动推给你一条消息告知你评论内容
 *
 * @package 微信通知插件
 * @author 冷文博客
 * @version 1.0.0
 * @link https://kevinlu98.cn
 */
class WechatNotice_Plugin implements Typecho_Plugin_Interface
{

    /**
     * 激活插件方法
     * 就是你在站点后台点击插件管理的启用时会执行此方法
     * 主要写一些需要初始化的操作,如创建数据库表、挂载内容等等
     */
    public static function activate()
    {
        /**
         * Widget_Feedback 要挂载插件的类名
         * WechatNotice_Plugin 挂载插件的类名,即我们当前的类名
         * send_comment_wechat 在挂载点执行方法
         */
        Typecho_Plugin::factory('Widget_Feedback')->comment = ['WechatNotice_Plugin', 'send_comment_wechat'];
    }

    /**
     * 从名称不难看出这是当你禁用插件时执行的方法,主要用于释放资源
     */
    public static function deactivate()
    {
    }

    /**
     * 当你点击插件设置时会有一个表单,里面的表单项就是从这里创建的
     * @param Typecho_Widget_Helper_Form $form
     */
    public static function config(Typecho_Widget_Helper_Form $form)
    {
        /** 分类名称 */
        $sckey = new Typecho_Widget_Helper_Form_Element_Text(
            'sckey',    //配置名称  我们取值的时候需要用到它
            NULL,
            NULL,
            _t('SCKEY'),//表单提示词,即input上方显示的内容
            _t('SCKEY可在<a href="http://sc.ftqq.com/?c=code" target="_blank">Server酱</a>注册申请')//表单内容详细说明,即input下方显示的内容
        );
        /**
         * addRule 方法,加入表单校验,required为非空
         */
        $form->addInput($sckey->addRule('required', _t('SCKEY不能为空')));
    }

    /**
     * 这个是个人用户的配置面板,基本来说用不到,我们就先不管啦
     * @param Typecho_Widget_Helper_Form $form
     */
    public static function personalConfig(Typecho_Widget_Helper_Form $form)
    {

    }

    /**
     * 插件挂载我方法
     * @param $comment
     * @param $post
     * @return mixed
     * @throws Typecho_Exception
     */
    public static function send_comment_wechat($comment, $post)
    {
        // 文章标题
        $text = $post->title;
        //评论内容,Server酱支持markdown格式的数据
        $desp = "**" . $comment['author'] . "**发表评论:\n\n>" . $comment['text'];
        //获取我们刚刚设置的sckey
        $key = Typecho_Widget::widget('Widget_Options')->plugin('WechatNotice')->sckey;
        //发送消息
        WechatNotice_Plugin::sc_send($text, $desp, $key);
        //返回评论对象,因为挂载点上是有接收返回值的
        return $comment;
    }

    public static function sc_send($text, $desp = '', $key = '')
    {
        $postdata = http_build_query(
            array(
                'text' => $text,
                'desp' => $desp
            )
        );

        $opts = array('http' =>
            array(
                'method' => 'POST',
                'header' => 'Content-type: application/x-www-form-urlencoded',
                'content' => $postdata
            )
        );
        $context = stream_context_create($opts);
        return $result = file_get_contents('https://sc.ftqq.com/' . $key . '.send', false, $context);

    }

}

对不起,作者设置了附件 回复 可见

评论(5)

  1. 落叶依旧秋 游客 2022-04-30 12:41 回复

    厉害了

  2. . 游客 2022-03-13 12:09 回复

  3. zmr 游客 2022-01-24 17:11 回复

  4. LF 游客 2021-12-10 14:27 回复

    值得学习

  5. 雨停之後 游客 2021-03-25 10:50 回复

    学到了

热门文章

最新评论

  • 易晨

    现在用不了吧,打开后显示错误,是不是不视频最新版

  • 易晨

    谢谢分享

  • 一坨肥肉

      看起来很不错哦。
  • ac

    酷酷酷

  • A

    感谢分享

日历

2022年05月

1234567
891011121314
15161718192021
22232425262728
293031    

文章目录

站点公告
Freewind主题v1.4版本已经发布,详情与下载请关注 Freewind1.4更新
抱歉:
年后因为工作和生活上的一系列不顺心的事情我无法去维护Freewind主题,目前也在思考一些问题,比如要不要继续工作,或者要不要去读硕士等,等这些事件都处理好了我会继续看Freewind主题的
点击小铃铛关闭
配色方案