Typecho主题/插件开发教程汇聚地

标签 typecho API 下的文章

1.爬虫从网上扒取文章

假设爬虫只扒取了文章标题和文章内容,那么,我们可以假设爬虫会将title和text两个字段内容post过来。
那么在我们的Widget中,可以通过$request获取提交过来的内容。

 $title = $request->get('title');
 $text = $request->get('text');

2.设置作者信息

在Typecho中,每篇文章的创建均需要管理到一个有“编辑”权限的用户。在我们的widget中,通过Widget_User来进行权限设定。

$user="创建此文章的用户,注意要有权限";
$password="用户对应的密码";
if (!$this->user->hasLogin()) {
    if (!$this->user->login($user, $password, true)) { //使用特定的账号登陆
        die('登录失败');
    }
}

3.调用Widget_Contents_Post_Edit进行文章导入
使用Request组件来设定文章信息,然后调用Widget_Contents_Post_Edit组价来进行文章导入。

$request->setParams(
    array(
        'title'=>$title,
        'text'=>$text,
        ...
    )
);
//执行添加文章操作
$widgetName = 'Widget_Contents_Post_Edit';
$reflectionWidget = new ReflectionClass($widgetName);
if ($reflectionWidget->implementsInterface('Widget_Interface_Do')) {
    $this->widget($widgetName)->action();
    echo 'Successful';
    return;
}

4.附上完整代码

class MyPlugin_NewPost extends Widget_Abstract_Contents implements Widget_Interface_Do {
    public function __construct($request, $response, $params = NULL) {
        parent::__construct($request, $response, $params);
    }

    public function action() {
        $user="创建此文章的用户,注意要有权限";
        $password="用户对应的密码";
        if (!$this->user->hasLogin()) {
            if (!$this->user->login($user, $password, true)) { //使用特定的账号登陆
                die('登录失败');
            }
        }
        
        $request = Typecho_Request::getInstance();
        $title = $request->get('title');
        $text = $request->get('text');

        //填充文章的相关字段信息。
        $request->setParams(
            array(
                'title'=>$title,
                'text'=>$text,
                'fieldNames'=>array(),
                'fieldTypes'=>array(),
                'fieldValues'=>array(),
                'cid'=>'',
                'do'=>'publish',
                'markdown'=>'1',
                'date'=>'',
                'category'=>array(),
                'tags'=>'',
                'visibility'=>'publish',
                'password'=>'',
                'allowComment'=>'1',
                'allowPing'=>'1',
                'allowFeed'=>'1',
                'trackback'=>'',
            )
        );

        //设置token,绕过安全限制
        $security = $this->widget('Widget_Security');
        $request->setParam('_', $security->getToken($this->request->getReferer()));
        //设置时区,否则文章的发布时间会查8H
        date_default_timezone_set('PRC');

        //执行添加文章操作
        $widgetName = 'Widget_Contents_Post_Edit';
        $reflectionWidget = new ReflectionClass($widgetName);
        if ($reflectionWidget->implementsInterface('Widget_Interface_Do')) {
            $this->widget($widgetName)->action();
            echo 'Successful';
            return;
        }
    }
}

接着,通过添加路由,使爬虫能够请求到此Widget即可。

Helper::addAction('import', 'MyPlugin_NewPost');

最后,爬虫通过往http://127.0.0.1/index.php/action/import地址post数据即可。附上js的伪代码:

var url = http://127.0.0.1/index.php/action/import
$.post(url,{
    title:'your title',
    'text':'your post text',
    'sign':'your hash sign'//增加安全校验码,避免其他人向此接口恶意请求
});

来自 typechodev,转载请注意声明出处