プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
PHP、トラックバックPingを受信する
こっちのブロクで書いた内容をこっちのサイトに反映しているのですが
一部手動なんです。
これがちょいとばっかし面倒臭くなりましてね。

記事投稿時にPing投げて自動反映させちゃおうと思ったのが今回のきっかけです。
意味合い的には更新Pingを投げるべきなのでしょうが
小回りが利くのでトラックバックPingを投げることにしましたよっと。

※Seesaaブログさんだと更新Ping先は設定画面で変更だけど
 トラックバックURLは記事毎に指定可能なので。

どーせPing受け取った後の挙動はこっちで任意に決めるんだから
更新通知でもトラックバック通知でも一緒でしょ、多分。

ってな経緯でPHPでトラックバックPingを受信する方法を調べてみました(--)b
PearのXML/RPC.phpとか使わんと駄目なのかな~?と思ったら
全然そんなこと無かったじぇいヽ(´∀`)ノ

仕組みとしてはとても単純で

1.Postで通知がくるから
2.それを解析してあれやこれやして
3.応答をXMLで返してやれば良い

みたいです。
ちなみに応答のXML形式も単純で

・成功φ(--)
  <?xml version="1.0" encoding="UTF-8"?>
  <response>
  <error>0</error>
  </response>

・失敗φ(--)
  <?xml version="1.0" encoding="UTF-8"?>
  <response>
  <error>1</error>
  <message>error message</message>
  </response>

だそーな。

よーし!
後はサンプル探してきてぐりぐり作るだけだ!

と言う訳でこちらのサイトを参考に……と言うよりは
ほぼ丸パクリさせていただいて出来あがったのがこちらφ(--)

  <?php
  
  /**************************/
  // 返却XML用クラス
  /**************************/
  class ResXml{
      public $xml;
      public $node;
  
      /**
       * コンストラクタ
       * 
       */
      public function __construct() {
          // レスポンス用XML初期化
          $this->xml = new DOMDocument('1.0', 'UTF-8');
  
          // 整形した形で出力
          $this->xml->formatOutput = true;
  
          // ルートノード「response」の作成
          $this->node = $this->xml->appendChild($this->xml->createElement('response'));
      }
  
      /**
       * 結果コード設定
       * 
       */
      public function setResultCode($key, $val) {
          $this->setNode($key, $val);
      }
  
      /**
       * 結果メッセージ設定
       * 
       */
      public function setResultMsg($key, $val) {
          $this->setNode($key, $val);
      }
  
      /**
       * ノード設定
       * 
       */
      private function setNode($key, $val) {
          $element = $this->xml->createElement($key, $val);
          $this->node->appendChild($element);
      }
  
      /**
       * 結果XML返却設定
       * 
       */
      private function saveXML() {
          return $this->xml->saveXML();
      }
  
  }
  
  /**************************/
  // 受信データ格納用クラス
  /**************************/
  class ReceivedData{
      //URL
      public $url;
      //記事タイトル
      public $title;
      //概要
      public $excerpt;
      //ブログ名
      public $blogName;
  
      /**
       * コンストラクタ
       * 
       */
      public function __construct() {
          $this->url = "";
          $this->title = "";
          $this->excerpt = "";
          $this->blogName = "";
      }
  
      /**
       * url設定
       * 
       */
      public function setUrl($val) {
          if (isset($val) && preg_match("/^http:\/\/.+\./", $val)){
              $this->url = $val;
          }
      }
  
      /**
       * 記事タイトル設定
       * 
       */
      public function setTitle($val) {
          if (isset($val) && !preg_match("/^[\s|\t| ]*$/", $val)){
              $this->title = $val;
          }
      }
  
      /**
       * 概要設定
       * 
       */
      public function setExcerpt($val) {
          if (isset($val) && !preg_match("/^[\s|\t| ]*$/", $val)){
              $this->excerpt = $val;
          }
      }
  
      /**
       * ブログ名設定
       * 
       */
      public function setBlogName($val) {
          if (isset($val) && !preg_match("/^[\s|\t| ]*$/", $val)){
              $this->blogName = $val;
          }
      }
  }
  
  /**************************/
  // 関数群
  /**************************/
  // UTF-8エンコード用関数
  function ToUtf8() {
      if(func_num_args() == 1){
          if(is_array(func_get_arg(0))) {
              $array = func_get_arg(0);
              return array_map('ToUtf8', $array);
          }else{
              $text = func_get_arg(0);
              return mb_convert_encoding($text, "UTF-8", "auto");
          }
      }else{
          return null;
      }
  }
  
  // サニタイジング用関数
  function Sanitize() {
      if(func_num_args() == 1){
          if(is_array(func_get_arg(0))){
              $array = func_get_arg(0);
              return array_map('Sanitize', $array);
          }else{
              $text = func_get_arg(0);
              $text = str_replace("\0", "", $text);
  
              if(get_magic_quotes_gpc()){
                  $text = stripslashes($text);
              }
  
              return htmlspecialchars($text);
          }
      }else{
          return null;
      }
  }
  
  /**************************/
  // main
  /**************************/
      //-----------
      //初期化
      //-----------
      //ログファイル名
      $logFileName =  dirname(__FILE__) . '/log/' . "result.log";
      //受け取った値
      $reqData = new ReceivedData();
      //返却XML
      $rexXml = new ResXml();
  
      //-----------
      //主処理
      //-----------
      try{
  
          if (isset($_POST)){
              // 受信データ整形
              $vars = ToUtf8(Sanitize($_POST));
  
              // 「url(アドレス)」がセットされてれば、処理開始
              if (isset($vars['url']) && preg_match("/^http:\/\/.+\./", $vars['url'])){
                  //値設定
                  $reqData->setUrl($vars['url']);
                  $reqData->setTitle($vars['title']);
                  $reqData->setExcerpt($vars['excerpt']);
                  $reqData->setBlogName($vars['blog_name']);
  
                  /*****************************************
  
                  主処理:受け取った値を元にあれやこれやとどーぞ
  
                  *****************************************/
  
                  //ログ出力
                  $log = fopen($logFileName, "a");
                  fputs($log, "--------val start-----------\n");
                  fputs($log, "url       : ".$reqData->url."\n");
                  fputs($log, "title     : ".$reqData->title."\n");
                  fputs($log, "excerpt   : ".$reqData->excerpt."\n");
                  fputs($log, "blog_name : ".$reqData->blogName."\n");
                  fputs($log, "--------val end-----------\n");
                  fclose($log);
  
                  // 受信成功
                  $rexXml->setResultCode('error', "0");
                  $rexXml->setResultMsg('message', 'OK.');
  
              }else{
                  // 受信失敗(「url」が異常)
                  throw new Exception('Error. Cannot Found URL Parameter.');
              }
          }else{
              // 受信失敗(POSTデータが異常)
              throw new Exception('Error. Invailed Data.');
          }
  
      } catch (Exception $e) {
          // エラーログ出力
          $log = fopen($logFileName, "a");
          fputs($log, $e->getMessage() . "\n");
          fclose($log);
  
          // 返却用XML生成
          $rexXml->setResultCode('error', "1");
          $rexXml->setResultMsg('message', $e->getMessage());
  
      }
  
      // レスポンス送信
      echo $rexXml->saveXML();
  
  ?>

完成\(--)/

なのですが、よく考えたら「お気に入り度」がトラックバック通知はもとより
RSSにも含まれていないから自動化できませんでした(′・ω・`)
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● PHP  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事