说明
该插件使用Server酱
公众号推送功能(将于4月30日失效),带大家熟悉一下Typecho
插件的开发
需求
当我们的站点收到他人评论时微信公众号会主动推给我们一条消息告知我们评论内容
准备
- 去Server酱登录(可选用github登录 ,方便)然后点击微信推送->扫码绑定微信
- 点出发送消息,然后生成
SCKEY
,如图所示,因为我已经生成了,所以页面有些不一样
- 本地搭建一套typecho的开发环境,你能看到这里说明肯定这一步已经做好了
开始开发
- 在项目目录
usr/plugins
目录下创建名为WechatNotice
文件夹,Enmm...这个名字怎么来的呢?如图
- 在刚刚创建好的文件夹下面新创建一个名为
Plugin.php
的文件(注意:文件名一定是这个,这是typecho
的规范) 先写上插件的信息,在刚刚创建的文件写上如下
<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; /** * 当你的站点收到他人评论时微信公众号会主动推给你一条消息告知你评论内容 * * @package 微信通知插件 * @author 冷文博客 * @version 1.0.0 * @link https://kevinlu98.cn */
- 去站点后台插件管理看看,对照一下信息不难发现这些信息都怎么修改,这个大家看着改
- 创建一个名为
插件目录_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酱
的推送功能将消息推送到我们的公众号上 - 到这里说一个经验吧,一般来说像这种支持插件的项目基本都是在开发过程中在很多必要的地方提前预留挂载点,当挂载点有被挂载内容是就会执行相应的内容,例如
typecho
、emlog
等都是这样 - 到这里我们不难想到下一步应该就是找到评论的挂载点,然后编写程序利用
Server酱
的推送API进行消息推送 - 现在我们可以拿到评论内容了,同时我们也有了
SCKEY
,但是等等,别忘了,我们的插件开发好是给别人用的,我们有SCKEY
不行啊,这是我们的,我们需要给别人提供一个可以配置他自己的SCKEY
的地方 - 有没有想起上面我们实现
Typecho_Plugin_Interface
接口有个方法可以帮我们完成这件事,就是public static function config(Typecho_Widget_Helper_Form $form)
方法 - 现在分析完了我们再开始撸代码就简单多了
代码开始
- 我们先找找发表评论的方法,看看里面有没有挂载点,我是通过全局查找字符串找到的评论方法
- 大概在代码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
的例子,我们直接考过来就行
- 稍稍更改一下,删除
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;
}
效果
全部代码
<?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);
}
}
落叶依旧秋 游客 2022-04-30 12:41 回复
厉害了
. 游客 2022-03-13 12:09 回复
牛
zmr 游客 2022-01-24 17:11 回复
牛
LF 游客 2021-12-10 14:27 回复
值得学习
雨停之後 游客 2021-03-25 10:50 回复
学到了