You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
4.7 KiB
162 lines
4.7 KiB
5 years ago
|
<?php
|
||
|
if (!defined('__TYPECHO_ROOT_DIR__')) exit;
|
||
|
/**
|
||
|
* 通用异步服务
|
||
|
*
|
||
|
* @category typecho
|
||
|
* @package Widget
|
||
|
* @copyright Copyright (c) 2008 Typecho team (http://www.typecho.org)
|
||
|
* @license GNU General Public License 2.0
|
||
|
* @version $Id$
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* 通用异步服务组件
|
||
|
*
|
||
|
* @author qining
|
||
|
* @category typecho
|
||
|
* @package Widget
|
||
|
*/
|
||
|
class Widget_Service extends Widget_Abstract_Options implements Widget_Interface_Do
|
||
|
{
|
||
|
/**
|
||
|
* 发送pingback实现
|
||
|
*
|
||
|
* @access public
|
||
|
* @return void
|
||
|
*/
|
||
|
public function sendPingHandle()
|
||
|
{
|
||
|
/** 验证权限 */
|
||
|
$this->user->pass('contributor');
|
||
|
|
||
|
/** 忽略超时 */
|
||
|
ignore_user_abort(true);
|
||
|
|
||
|
/** 获取post */
|
||
|
$post = $this->widget('Widget_Archive', "type=post", "cid={$this->request->cid}");
|
||
|
|
||
|
if ($post->have() && preg_match_all("|<a[^>]*href=[\"'](.*?)[\"'][^>]*>(.*?)</a>|", $post->text, $matches)) {
|
||
|
$links = array_unique($matches[1]);
|
||
|
$permalinkPart = parse_url($post->permalink);
|
||
|
|
||
|
/** 发送pingback */
|
||
|
foreach ($links as $url) {
|
||
|
$urlPart = parse_url($url);
|
||
|
|
||
|
if (isset($urlPart['scheme'])) {
|
||
|
if ('http' != $urlPart['scheme'] || 'https' != $urlPart['scheme']) {
|
||
|
continue;
|
||
|
}
|
||
|
} else {
|
||
|
$urlPart['scheme'] = 'http';
|
||
|
$url = Typecho_Common::buildUrl($urlPart);
|
||
|
}
|
||
|
|
||
|
if ($permalinkPart['host'] == $urlPart['host'] && $permalinkPart['path'] == $urlPart['path']) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$spider = Typecho_Http_Client::get();
|
||
|
|
||
|
if ($spider) {
|
||
|
$spider->setTimeout(10)
|
||
|
->send($url);
|
||
|
|
||
|
if (!($xmlrpcUrl = $spider->getResponseHeader('x-pingback'))) {
|
||
|
if (preg_match("/<link[^>]*rel=[\"']pingback[\"'][^>]*href=[\"']([^\"']+)[\"'][^>]*>/i",
|
||
|
$spider->getResponseBody(), $out)) {
|
||
|
$xmlrpcUrl = $out[1];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (!empty($xmlrpcUrl)) {
|
||
|
try {
|
||
|
$xmlrpc = new IXR_Client($xmlrpcUrl);
|
||
|
$xmlrpc->pingback->ping($post->permalink, $url);
|
||
|
unset($xmlrpc);
|
||
|
} catch (Exception $e) {
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
unset($spider);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/** 发送trackback */
|
||
|
if ($post->have() && !empty($this->request->trackback)) {
|
||
|
$links = $this->request->trackback;
|
||
|
foreach ($links as $url) {
|
||
|
|
||
|
$client = Typecho_Http_Client::get();
|
||
|
|
||
|
if ($client) {
|
||
|
try {
|
||
|
$client->setTimeout(5)
|
||
|
->setData(array(
|
||
|
'blog_name' => $this->options->title . ' » ' . $post->title,
|
||
|
'url' => $post->permalink,
|
||
|
'excerpt' => $post->excerpt
|
||
|
))
|
||
|
->send($url);
|
||
|
|
||
|
unset($client);
|
||
|
} catch (Typecho_Http_Client_Exception $e) {
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 发送pingback
|
||
|
* <code>
|
||
|
* $this->sendPingbacks(365);
|
||
|
* </code>
|
||
|
*
|
||
|
* @access public
|
||
|
* @param integer $cid 内容id
|
||
|
* @param array $trackback trackback的url
|
||
|
* @return void
|
||
|
*/
|
||
|
public function sendPing($cid, array $trackback = NULL)
|
||
|
{
|
||
|
$this->user->pass('contributor');
|
||
|
|
||
|
if ($client = Typecho_Http_Client::get()) {
|
||
|
try {
|
||
|
|
||
|
$input = array('do' => 'ping', 'cid' => $cid);
|
||
|
if (!empty($trackback)) {
|
||
|
$input['trackback'] = $trackback;
|
||
|
}
|
||
|
|
||
|
$client->setCookie('__typecho_uid', Typecho_Cookie::get('__typecho_uid'))
|
||
|
->setCookie('__typecho_authCode', Typecho_Cookie::get('__typecho_authCode'))
|
||
|
->setHeader('User-Agent', $this->options->generator)
|
||
|
->setTimeout(3)
|
||
|
->setData($input)
|
||
|
->send(Typecho_Common::url('/action/service', $this->options->index));
|
||
|
|
||
|
} catch (Typecho_Http_Client_Exception $e) {
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 异步请求入口
|
||
|
*
|
||
|
* @access public
|
||
|
* @return void
|
||
|
*/
|
||
|
public function action()
|
||
|
{
|
||
|
$this->on($this->request->is('do=ping'))->sendPingHandle();
|
||
|
}
|
||
|
}
|