- 追加された行はこの色です。
- 削除された行はこの色です。
**目次 [#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;
}
}
?>