**目次 [#u3865089]
 #contents
 
 ** TwitterとYahoo、楽天のAPIを使いマッシュアップサービスを作る [#b980b253]
 |カテゴリー|TiwitterとYahoo、楽天のAPIを使いマッシュアップサービスを作る|
 |優先順位|至急|
 |イテレーション|[[イテレーション1]]|
 |状態|未着手|
 |完了予定日||
 |状態|完了|
 |完了予定日|2007/9/18|
 |工数||
 |対応者|清原|
 
 ----
 **要件 [#o554c79d]
 -1. ユーザーの最新コメントを検知(これはmeddlerに実装済み)
 -2. Yahooの形態素解析APIで、コメントを形態素に分解
 http://www.itmedia.co.jp/news/articles/0706/18/news090.html  
 -3. 文章の中から名詞をとってきて、楽天APIで検索して引っかかった商品からランダムに1つを選択しそのURLをmeddler用アカウントに発言させる。
 **メモ [#m4f0c1ab]
 Yahoo!日本語形態素解析Webサービス
 http://developer.yahoo.co.jp/jlp/MAService/V1/parse.html
 -APIを使用するにはアプリケーションIDが必要
 http://api.search.yahoo.co.jp/webservices/register_application
 -リクエストの構築
 http://developer.yahoo.co.jp/jlp/rest.html
 -入力パラメータ
 --filter=9で名詞を拾える
 
 
 楽天商品検索API
 http://webservice.rakuten.co.jp/api/itemsearch/
 -デベロッパーIDの登録が必要
 https://grp02.id.rakuten.co.jp/rms/nid/registfwd
 
 -入力パラメータ(デフォルトから変更したもの)
 --1ページあたりの取得件数 	hits=3
 --ソート:sort=で価格順や更新日順に並び替えを指定出来る
 今回は「ランダムに1つを選択」と言うことでここでランダム選択にした
 sort=random:ランダム順 
 
 --検索フィールド field=0  (0:検索対象が広い(同じ検索キーワードでも多くの検索結果が得られる))
 
 他にもorFlagでor検索も出来るようになる
 
 **プログラム [#f722906c]
 -meddler2.php
  <?php
  set_include_path(get_include_path() . PATH_SEPARATOR . './lib/');
  require_once "Meddler.php";
  $meddler = new Meddler();
  $result =  $meddler->meddler2('kiyohara_training','29d603e9db7f9b9480aed88a8ab218b5');
  if(PEAR::isError($result)){
      echo ($result->getMessage());
  }
  ?>
 
 -Meddler.php(追加分)
     //リクエストURLを貰いリクエストを送信し、返ってきたレスポンスを返す
     function getResponse($url){ 
        $req = new Http_Request($url);
        if (!PEAR::isError($req->sendRequest())){
             $result = $req->getResponsebody();
             return $result;
        }else{
            die('request failed');
        }
     }
     //各APIからの結果XMLを受け取り要素を取り出し、配列で返す 
     function getXmlAttribute($xml,$parse){
        $parse->setInputString($xml);
        $res = $parse->parse();
        if(PEAR::isError($res)){
            dir('Parsing failed'.$res->getMassage());
        }
        return $parse->getResultArray();
     }
     //キーワードを重複させずにランダムに$k個抽出する。
     //パラメータ array,int
     function selectKeywordRandom($data,$k=1){
         $count = count($data);
         $use = array();
         if($count < $k){
             foreach($data as $s){
                 $keywords = $keywords.$s.' ';
             }
         }else{
             for($i = 0; $i < $k; $i++){
                 $value[$i] = mt_rand()%$count;
                 $use = array_unique($value);
                 $i = (count($use)-1);
             }
             for($j = 0; $j < $k; $j++){
                 $keywords = $keywords.$data[$value[$j]].' ';
             } 
         }
         return $keywords;
     }
     
     //友達の欲がっていそうな物を楽天商品検索する
     function meddler2($yappid='',$rappid=''){
         $yhoo = 'http://api.jlp.yahoo.co.jp/MAService/V1/parse?appid='.$yappid.'&results=ma&filter=9&sentence=';
         $raku = 'http://api.rakuten.co.jp/rws/1.7/rest?developerId='.$rappid.'&operation=ItemSearch&version=2007-04-11&hits=1&sort=random&field=1&orFlag=0&keyword=';
         $timeline = $this->getFriendsTimeline();
         $enc_key = urlencode($timeline[0]['text']);  //Tiwwiterから取得したコメントをYahooAPIで使えるようURLエンコ
         $yhoo = $yhoo.$enc_key;                  //YahooAPIリクエストURL
         $rslt_xml = $this->getResponse($yhoo);   //YahooAPIにリクエストし結果を取得
         $nouns = $this->getXmlAttribute($rslt_xml,new YahooApiParser());  //取得したXMLから名詞のみを配列形式で取り出す 
         $enc_key = urlencode($this->selectKeywordRandom($nouns['SURFACE'],1)); //検索に使う語句を第2引数個分抽出ランダムにする
         echo '拾ったキーワード:'.urldecode($enc_key);
         $raku = $raku.$enc_key;
         $rslt_xml = $this->getResponse($raku);
         $serch_rslt = $this->getXmlAttribute($rslt_xml,new RakutenApiParser());
         $message = 'オススメ商品:'.$serch_rslt['ITEMNAME'].'価格:'.$serch_rslt['ITEMPRICE'].'円'.'URL:'.$serch_rslt['ITEMURL'];
         return $this->advise($message);
     }
     
     function advise($message){
             $result = $this->_twitter->setUpdate("@{$userName}".$message);
             $result= $this->_twitterErrorCheck($friends,'Twitterに発言できませんでした');
             if(PEAR::isError($result)){
                 return $result;
             }
     } 
 -RakutenApiParser.php
  <?php
  require_once '../PEAR/Parser.php';
  class RakutenApiParser extends XML_Parser
  {
      var $word = array();
      var $currentTag;
      function RakutenApiParser()
      {
          parent::XML_Parser();
      }
      function startHandler($parser,$name,$attribs){
          switch($name){
              case 'ITEMNAME':
                  $this->currentTag = $name;
                  break;
              case 'ITEMPRICE':
                  $this->currentTag = $name;
                  break;
              case 'ITEMURL':
                  $this->currentTag = $name;
                  break;
              default:
                  break;
          }
      }
      function endHandler($parser,$name){
          $this->currentTag = null;
      }
      function cdataHandler($xp, $cdata)
      {
           $cdata = trim($cdata);
           if(empty($cdata)){
               return true;
           }
           if (($this->currentTag == 'ITEMNAME') || ($this->currentTag == 'ITEMPRICE') || ($this->currentTag == 'ITEMURL')){
               $this->word[$this->currentTag] = $cdata;
           }
      }
      function getResultArray(){
          return $this->word;
      }
  }
  ?>
 
 

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

アークウェブのサービスやソリューションはこちら