PageRenderTime 44ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/var/Widget/Service.php

http://typecho.googlecode.com/
PHP | 161 lines | 132 code | 4 blank | 25 comment | 2 complexity | 73579c2df4c860ce9a59661e86ed9da4 MD5 | raw file
Possible License(s): AGPL-1.0
  1. <?php
  2. /**
  3. * ??????
  4. *
  5. * @category typecho
  6. * @package Widget
  7. * @copyright Copyright (c) 2008 Typecho team (http://www.typecho.org)
  8. * @license GNU General Public License 2.0
  9. * @version $Id$
  10. */
  11. /**
  12. * ????????
  13. *
  14. * @author qining
  15. * @category typecho
  16. * @package Widget
  17. */
  18. class Widget_Service extends Widget_Abstract_Options implements Widget_Interface_Do
  19. {
  20. /**
  21. * ??pingback??
  22. *
  23. * @access public
  24. * @return void
  25. */
  26. public function sendPingHandle()
  27. {
  28. /** ???? */
  29. $this->user->pass('contributor');
  30. /** ???? */
  31. ignore_user_abort(true);
  32. /** ??post */
  33. $post = $this->widget('Widget_Archive', "type=post", "cid={$this->request->cid}");
  34. if ($post->have() && preg_match_all("|<a[^>]*href=[\"'](.*?)[\"'][^>]*>(.*?)</a>|", $post->text, $matches)) {
  35. $links = array_unique($matches[1]);
  36. $permalinkPart = parse_url($post->permalink);
  37. /** ??pingback */
  38. foreach ($links as $url) {
  39. $urlPart = parse_url($url);
  40. if (isset($urlPart['scheme'])) {
  41. if ('http' != $urlPart['scheme'] || 'https' != $urlPart['scheme']) {
  42. continue;
  43. }
  44. } else {
  45. $urlPart['scheme'] = 'http';
  46. $url = Typecho_Common::buildUrl($urlPart);
  47. }
  48. if ($permalinkPart['host'] == $urlPart['host'] && $permalinkPart['path'] == $urlPart['path']) {
  49. continue;
  50. }
  51. $spider = Typecho_Http_Client::get();
  52. if ($spider) {
  53. $spider->setTimeout(10)
  54. ->send($url);
  55. if (!($xmlrpcUrl = $spider->getResponseHeader('x-pingback'))) {
  56. if (preg_match("/<link[^>]*rel=[\"']pingback[\"'][^>]*href=[\"']([^\"']+)[\"'][^>]*>/i",
  57. $spider->getResponseBody(), $out)) {
  58. $xmlrpcUrl = $out[1];
  59. }
  60. }
  61. if (!empty($xmlrpcUrl)) {
  62. try {
  63. $xmlrpc = new IXR_Client($xmlrpcUrl);
  64. $xmlrpc->pingback->ping($post->permalink, $url);
  65. unset($xmlrpc);
  66. } catch (Exception $e) {
  67. continue;
  68. }
  69. }
  70. }
  71. unset($spider);
  72. }
  73. }
  74. /** ??trackback */
  75. if ($post->have() && !empty($this->request->trackback)) {
  76. $links = $this->request->trackback;
  77. foreach ($links as $url) {
  78. $client = Typecho_Http_Client::get();
  79. if ($client) {
  80. try {
  81. $client->setTimeout(5)
  82. ->setData(array(
  83. 'blog_name' => $this->options->title . ' &raquo ' . $post->title,
  84. 'url' => $post->permalink,
  85. 'excerpt' => $post->excerpt
  86. ))
  87. ->send($url);
  88. unset($client);
  89. } catch (Typecho_Http_Client_Exception $e) {
  90. continue;
  91. }
  92. }
  93. }
  94. }
  95. }
  96. /**
  97. * ??pingback
  98. * <code>
  99. * $this->sendPingbacks(365);
  100. * </code>
  101. *
  102. * @access public
  103. * @param integer $cid ??id
  104. * @param array $trackback trackback?url
  105. * @return void
  106. */
  107. public function sendPing($cid, array $trackback = NULL)
  108. {
  109. $this->user->pass('contributor');
  110. if ($client = Typecho_Http_Client::get()) {
  111. try {
  112. $input = array('do' => 'ping', 'cid' => $cid);
  113. if (!empty($trackback)) {
  114. $input['trackback'] = $trackback;
  115. }
  116. $client->setCookie('__typecho_uid', Typecho_Cookie::get('__typecho_uid'), 0, $this->options->siteUrl)
  117. ->setCookie('__typecho_authCode', Typecho_Cookie::get('__typecho_authCode'), 0, $this->options->siteUrl)
  118. ->setHeader('User-Agent', $this->options->generator)
  119. ->setTimeout(3)
  120. ->setData($input)
  121. ->setIp('127.0.0.1')
  122. ->send(Typecho_Common::url('/action/service', $this->options->index));
  123. } catch (Typecho_Http_Client_Exception $e) {
  124. return;
  125. }
  126. }
  127. }
  128. /**
  129. * ??????
  130. *
  131. * @access public
  132. * @return void
  133. */
  134. public function action()
  135. {
  136. $this->on($this->request->is('do=ping'))->sendPingHandle();
  137. }
  138. }