mirror of
https://github.com/typecho/plugins.git
synced 2025-01-22 13:41:34 +08:00
125 lines
3.9 KiB
PHP
125 lines
3.9 KiB
PHP
<?php
|
||
/**
|
||
* 增加评论黑名单(根据 IP 地址过滤)
|
||
*
|
||
* @package Block Comment
|
||
* @author 明城
|
||
* @version 0.0.1
|
||
* @link http://typecho.org
|
||
*/
|
||
class BlockComment_Plugin implements Typecho_Plugin_Interface
|
||
{
|
||
/**
|
||
* 激活插件方法,如果激活失败,直接抛出异常
|
||
*
|
||
* @access public
|
||
* @return void
|
||
* @throws Typecho_Plugin_Exception
|
||
*/
|
||
public static function activate()
|
||
{
|
||
Typecho_Plugin::factory('Widget_Feedback')->comment = array('BlockComment_Plugin', 'filter');
|
||
Typecho_Plugin::factory('Widget_Feedback')->trackback = array('BlockComment_Plugin', 'filter');
|
||
Typecho_Plugin::factory('Widget_XmlRpc')->pingback = array('BlockComment_Plugin', 'filter');
|
||
}
|
||
|
||
/**
|
||
* 禁用插件方法,如果禁用失败,直接抛出异常
|
||
*
|
||
* @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)
|
||
{
|
||
$hosts = new Typecho_Widget_Helper_Form_Element_Textarea('hosts', NULL, NULL,
|
||
_t('地址列表'), _t('每行单个地址,请仔细匹配以免误封杀'));
|
||
|
||
$form->addInput($hosts);
|
||
}
|
||
|
||
/**
|
||
* 个人用户的配置面板
|
||
*
|
||
* @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 $commentWidget 评论组件
|
||
* @param string $status 评论状态
|
||
* @return void
|
||
*/
|
||
public static function mark($comment, $commentWidget, $status)
|
||
{
|
||
if ('spam' == $comment['status'] && $status != 'spam') {
|
||
self::filter($comment, $commentWidget, NULL, 'submit-ham');
|
||
} else if ('spam' != $comment['status'] && $status == 'spam') {
|
||
self::filter($comment, $commentWidget, NULL, 'submit-spam');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 评论过滤器
|
||
*
|
||
* @access public
|
||
* @param array $comment 评论结构
|
||
* @param Typecho_Widget $post 被评论的文章
|
||
* @param array $result 返回的结果上下文
|
||
* @param string $api api地址
|
||
* @return void
|
||
*/
|
||
public static function filter($comment, $post, $result, $api = 'comment-check')
|
||
{
|
||
$comment = empty($result) ? $comment : $result;
|
||
|
||
$options = Typecho_Widget::widget('Widget_Options');
|
||
$hosts = $options->plugin('BlockComment')->hosts;
|
||
|
||
$data = array(
|
||
'blog' => $options->siteUrl,
|
||
'user_ip' => $comment['ip'],
|
||
'user_agent' => $comment['agent'],
|
||
'referrer' => Typecho_Request::getInstance()->getReferer(),
|
||
'permalink' => $post->permalink,
|
||
'comment_type' => $comment['type'],
|
||
'comment_author' => $comment['author'],
|
||
'comment_author_email' => $comment['mail'],
|
||
'comment_author_url' => $comment['url'],
|
||
'comment_content' => $comment['text']
|
||
);
|
||
|
||
foreach(split("\n", $hosts) as $key => $value){
|
||
$value = trim($value);
|
||
if (strlen($value)) {
|
||
$regex = sprintf("/^%s/i", preg_quote($value));
|
||
|
||
// 如果提交者符合指定的 IP,则扔进垃圾评论中
|
||
if (preg_match($regex, $data['user_ip'])) {
|
||
$comment['status'] = 'spam';
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
return $comment;
|
||
}
|
||
}
|