twitterAPIでBOTのフォローユーザ発言を取得[cakephp/OAuth] | 外部記憶

外部記憶

http://twitter.com/n0bisuke

前回記事
cakephpでtwitterのOAuthを利用してBOTを作ってcron実行するまで

前回作ったBOTをカスタマイズしていく,botも人間的な発言があれば親しみを持てるかなぁと思い.
フォローしてるユーザーの発言を取得して,てきとーな文章をツイートする」機能を付けたいなぁと思ったので作って行きます.
(他にも「私鉄の時刻表を自動的にツイート」「天気/気温等の情報を自動的にツイート」とかやりたいけど(・∀・))

今回は「フォローしてるユーザーの発言を取得」までやります.

1.まずはタイムライン情報の取得
前回使ったoauth_consumer.phpのライブラリからget()メソッドを利用します.

リクエストのURLはhttp://twitter.com/statuses/friends_timeline.xml としておく.
(↓仕様書より引用)

friends_timeline
自分の friend の過去800件分のステータス(include_rts 引数使用時は自分の friend の retweet も含む)から最大20件(count引数使用時は最大200件)を取得する。
引数 id を指定すれば、その id のユーザの friend のステータスを取得できる
URL: http://api.twitter.com/1/statuses/friends_timeline.format
http://api.twitter.com/1/statuses/friends_timeline/id.format
(format は xml, json, rss, atom のうちのいずれかを指定)


home_timelineでも問題無いかも.
formatはxmlを利用.
細かい事はtwitterのapi仕様書を確認しましょう.

$TL = $consumer->get(
$this->accessToken,
$this->accessTokenSecret,
'http://twitter.com/statuses/home_timeline.xml' //TL取得リクエスト
,array('count' => 5) //5件取得
);


これで$TLにxml形式でフォローしているユーザーの情報が格納される..
※初めはjson形式を利用しようとしたけど文字化けかエンコードミスかごにょごにょして諦めた.

2.$TLの情報をほげる.
一応,mb_convert_encoding()で文字コードをUTL-8にして,simplexml_load_string()で扱い易い形式にする.

$TL = mb_convert_encoding($TL,"UTF-8","auto"); //エンコード
$TL = simplexml_load_string($TL);

※simplexml_load_string()の部分をsimplexml_load_finl(),simplexml_import_dom()を使うと日本語が文字化けしてた.


3.発言を取得
$TL->status->user->screen_name でアカウントIDを取得できるので,$this->twIdにボットのアカウントIDをセットしておきforeach()で探したときに,ボット自身の発言を拾わない様にします.


$item="";//初期化
foreach ($TL->status as $key => $value){
if($value->user->screen_name == $this->twId)continue;
$item .= htmlspecialchars($value->text);
$item .= $this->cat; //区切り文字列
}


これで$itemに発言内容を抽出できます.
>明日のメシはどこにいこうか///スノボ準備もそろそろしないとね///明日 #offside_now の応援に来てくれる人募集。笑///

今回はここまでです.以下がここまでをまとめたコードです.


App::import('Vendor', 'Oauth', array('file'=>'OAuth'.DS.'oauth_consumer.php')); //ライブラリの読み込み
class BotController extends AppController
{
var $name = 'Bot';
var $uses = array();
// Consumer key の値
var $consumerKey = 'consumerKey';
// Consumer secret の値
var $consumerSecret = 'consumerSecret';
// Access Token の値
var $accessToken = 'accessToken';
// Access Token Secret の値
var $accessTokenSecret = 'Access Token Secret';
var $twId = 'ITU38'; //ボットのID
var $cat = '///'; //区切り文字

function update() {
$consumer = new OAuth_Consumer($this->consumerKey, $this->consumerSecret);
//タイムラインを取得
$TL = $consumer->get(
$this->accessToken,
$this->accessTokenSecret,
'http://twitter.com/statuses/friends_timeline.xml'
,array('count' => 5)
);
$TL = mb_convert_encoding($TL,"UTF-8","auto"); //エンコード
$TL = simplexml_load_string($TL);//変換

$item="";//初期化
foreach ($TL->status as $key => $value){
if($value->user->screen_name == $this->twId)continue;
$item .= htmlspecialchars($value->text);
$item .= $this->cat;
}

echo $item;
exit();
}
}