【CakePHP】TwitterAPIをつかって検索とトレンドを取得しよう!!

images

2012年10月25日(木)

さて、連続投稿3作目!どんどん行きましょう! 今回はTwitterAPIをつかって簡単に実装できる、つぶやき検索とつぶやきのトレンドの取得の仕方を備忘録として残します。 もうそろそろAPIシリーズも潮時に近いですね。そろそろなにかマッシュアップしてサービスをリリースしたいですね。 もしその機会があればまた投稿させて頂きます。 さぁ、毎度のことながら、このTwitterAPIをつかってどんなことができるのかを軽く説明したいと思います。 まず、つぶやき検索。 これは大体わかると思いますが、つぶやきの検索ができます。 読んで字のごとくとはこのこと。 以上。w   で、今回結構注目しているのがトレンドの取得です。(古ッ!!!) これって今リアルタイムのトレンドの文字列を引っ張り上げてくれるのです。 結構WEBサービスの幅が広がると思いませんか? しかもアカウント認証いらずですよ! もうつかいたい放題!(ってわけじゃないです。以下に制限等も書いてあります。節度よく使いましょう。)    

初期準備

  • Zend Framework ダウンロード
http://framework.zend.com/downloads/latest Zend Framework 1.12.0 Minimal  
  • cakephpダウンロード
cakephp 1.3.15 http://cakephp.jp/  

作業開始

1.ダウンロードしたzenddataの中のlibraryのZendディレクトリをcakephpのvendorsへ移動 app/vendors/Zend   2.ZendFrameworkLoader Compornentを作成する。 app/controllers/components/zend.php  
<?php
class ZendComponent extends Object {
	public function startup() {
		$include = get_include_path();
		$include.= PATH_SEPARATOR. APP . 'vendors' . DS;
		$successful = set_include_path($include);
		if (!$successful) {
			throw new Exception('ZendComponent failed to set include path.', E_ERROR);
		}
		require_once('Zend/Loader.php');
	}
	public function loadClass($class, $dirs = null){
		Zend_Loader::loadClass($class, $dirs);
	}
	public function loadFile($filename, $dirs = null, $once = false){
		Zend_Loader::loadFile($filename, $dirs, $once);
	}
	public function isReadable($filename) {
		Zend_Loader::isReadable($filename);
	}
} 
  3.Zend/Service/Twitter/Search.php の trends functionを書き換え Twitterトレンドを取得する際のメソッドを書き換えます。 なんだかデフォルトのままだと正常に動作しなかったので、作り変えました。 (トレンドを取得しない場合は特にいらないと思います)
 public function trends($woeid)
{
	// 指定したWOEIDで該当地域のトレンドを取得する
	$this->setUri("https://api.twitter.com/");
	$response     = $this->restGet("/1/trends/$woeid.json");

	return Zend_Json::decode($response->getBody());
}
 
※WOEIDとは・・・ WOEID(Where on Earth IDentifier)とはヤフーが設定した地域のIDになります。
  4.Controllerの作成 app/controllers/twitter_controller.php
<?php
class TwitterController extends AppController{
    public $name = 'Twitter';
    public $uses = null;
    public $layout = 'default';
    public $components = array('Zend');

    public function index(){

    	$searchTerms = "";
    	$arr_Morphemes = "";

    	if (!empty($this->data)){
    		$searchTerms .= $this->data['name'];

    		$arr_Morphemes = $this->_get_Analysis($searchTerms);
    	}
    	$this->set('searchTerms', $searchTerms);
    	$this->set('arr_Morphemes', $arr_Morphemes);

    	// Twitter読み込み
    	$this->Zend->loadClass('Zend_Service_Twitter_Search');
    	$twitter = new Zend_Service_Twitter_Search();

    	// Search
    	$search_results = $twitter->search('お風呂',array('lang' => 'ja'));
    	$this->set('search_twit', $search_results);

    	/*  *********************************
    	*  WOEID 取得サービス
    	*  http://sigizmund.info/woeidinfo/
    	*  ※国内の都市に限定して取得することもできますがかなり限定されています。ちなみに十和田は使えない。
    	*  	・23424856	日本のトレンド
    	*  	・1118370	東京のトレンド
    	*  	・1118398	十和田のトレンド	※現時点で使えない(2012.09.21)
    	*
    	*  ※トレンドが発生している地域検索
    	*  http://api.twitter.com/1/trends/available.json
    	*  **********************************/
    	// Search->Trends()
    	$search_trends = $twitter->trends(23424856);		// カスタマイズメソッド(Zend/Twitter/Search.php)
    	$this->set('trend_twit', $search_trends);
    }
  3.Modelはつくらない 別にModelがなくとも動くので今回は特に作成しません。   4.Viewはつくる もちろんViewは作ります。 app/view/twitter/index.php Controllerから渡されるものの中味です。   以下が検索結果サンプルです。
var_dump($search_twit)
---
array(11) {
  ["completed_in"]=>
  float(0.053)
  ["max_id"]=>
  float(2.5073908674947E+17)
  ["max_id_str"]=>
  string(18) "250739086749466625"
  ["next_page"]=>
  string(71) "?page=2&max_id=250739086749466625&q=%E9%87%91%E7%B8%9B%E3%82%8A&lang=ja"
  ["page"]=>
  int(1)
  ["query"]=>
  string(27) "%E9%87%91%E7%B8%9B%E3%82%8A"
  ["refresh_url"]=>
  string(66) "?since_id=250739086749466625&q=%E9%87%91%E7%B8%9B%E3%82%8A&lang=ja"
  ["results"]=>
  array(15) {
    [0]=>
    array(18) {
      ["created_at"]=>
      string(31) "Tue, 25 Sep 2012 23:30:31 +0000"
      ["from_user"]=>
      string(6) "39392_"
      ["from_user_id"]=>
      int(282842895)
      ["from_user_id_str"]=>
      string(9) "282842895"
      ["from_user_name"]=>
      string(36) "作業なうたかむら作業なう"
      ["geo"]=>
      NULL
      ["id"]=>
      float(2.5073908674947E+17)
      ["id_str"]=>
      string(18) "250739086749466625"
      ["iso_language_code"]=>
      string(2) "ja"
      ["metadata"]=>
      array(1) {
        ["result_type"]=>
        string(6) "recent"
      }
      ["profile_image_url"]=>
      string(78) "http://a0.twimg.com/profile_images/2610247819/fm24zintjklk5msofk2e_normal.jpeg"
      ["profile_image_url_https"]=>
      string(80) "https://si0.twimg.com/profile_images/2610247819/fm24zintjklk5msofk2e_normal.jpeg"
      ["source"]=>
      string(61) "<a href="http://twtr.jp">Keitai Web</a>"
      ["text"]=>
      string(48) "あれ金縛りに合う夢かな?わからん"
      ["to_user"]=>
      NULL
      ["to_user_id"]=>
      int(0)
      ["to_user_id_str"]=>
      string(1) "0"
      ["to_user_name"]=>
      NULL
    }
    [1]=>
    array(18) {
      ["created_at"]=>
      string(31) "Tue, 25 Sep 2012 23:30:06 +0000"
      ["from_user"]=>
      string(13) "Hato_ouma_bot"
      ["from_user_id"]=>
      int(166570420)
      ["from_user_id_str"]=>
      string(9) "166570420"
      ["from_user_name"]=>
      string(21) "レプリカント鳩"
      ["geo"]=>
      NULL
      ["id"]=>
      float(2.5073898346894E+17)
      ["id_str"]=>
      string(18) "250738983468941313"
      ["iso_language_code"]=>
      string(2) "ja"
      ["metadata"]=>
      array(1) {
        ["result_type"]=>
        string(6) "recent"
      }
      ["profile_image_url"]=>
      string(90) "http://a0.twimg.com/profile_images/1078046243/0925_wt03pcwestup_w3a379ouma_0001_normal.jpg"
      ["profile_image_url_https"]=>
      string(92) "https://si0.twimg.com/profile_images/1078046243/0925_wt03pcwestup_w3a379ouma_0001_normal.jpg"
      ["source"]=>
      string(75) "<a href="http://pha22.net/twitterbot/">EasyBotter</a>"
      ["text"]=>
      string(297) "頭の周りで足音と振動が聞こえてそれが「寝てる自分に構わず母親が勝手に部屋に入ってきた」という設定だと何故か判っている夢を何度と見た百戦錬磨の鳩には、金縛りは幽霊の仕業であるはずが無いと断言できます。"
      ["to_user"]=>
      NULL
      ["to_user_id"]=>
      int(0)
      ["to_user_id_str"]=>
      string(1) "0"
      ["to_user_name"]=>
      NULL
    }
    [2]=>
    array(18) {
      ["created_at"]=>
      string(31) "Tue, 25 Sep 2012 23:29:07 +0000"
      ["from_user"]=>
      string(6) "39392_"
      ["from_user_id"]=>
      int(282842895)
      ["from_user_id_str"]=>
      string(9) "282842895"
      ["from_user_name"]=>
      string(36) "作業なうたかむら作業なう"
      ["geo"]=>
      NULL
      ["id"]=>
      float(2.5073873646218E+17)
      ["id_str"]=>
      string(18) "250738736462184448"
      ["iso_language_code"]=>
      string(2) "ja"
      ["metadata"]=>
      array(1) {
        ["result_type"]=>
        string(6) "recent"
      }
      ["profile_image_url"]=>
      string(78) "http://a0.twimg.com/profile_images/2610247819/fm24zintjklk5msofk2e_normal.jpeg"
      ["profile_image_url_https"]=>
      string(80) "https://si0.twimg.com/profile_images/2610247819/fm24zintjklk5msofk2e_normal.jpeg"
      ["source"]=>
      string(61) "<a href="http://twtr.jp">Keitai Web</a>"
      ["text"]=>
      string(47) "久しぶりに金縛りにあった\(^o^)/"
      ["to_user"]=>
      NULL
      ["to_user_id"]=>
      int(0)
      ["to_user_id_str"]=>
      string(1) "0"
      ["to_user_name"]=>
      NULL
    }
	・・・
— 以下がトレンドのサンプルです。
var_dump($trend_twit);
---
array(1) {
  [0]=>
  array(4) {
    ["created_at"]=>
    string(20) "2012-09-25T23:28:49Z"
    ["locations"]=>
    array(1) {
      [0]=>
      array(2) {
        ["name"]=>
        string(6) "日本"
        ["woeid"]=>
        int(23424856)
      }
    }
    ["as_of"]=>
    string(20) "2012-09-25T23:30:51Z"
    ["trends"]=>
    array(10) {
      [0]=>
      array(5) {
        ["events"]=>
        NULL
        ["query"]=>
        string(39) "%23%E3%81%82%E3%81%95%E3%82%A4%E3%83%81"
        ["name"]=>
        string(13) "#あさイチ"
        ["promoted_content"]=>
        NULL
        ["url"]=>
        string(68) "http://twitter.com/search/?q=%23%E3%81%82%E3%81%95%E3%82%A4%E3%83%81"
      }
      [1]=>
      array(5) {
        ["events"]=>
        NULL
        ["query"]=>
        string(10) "%23asaichi"
        ["name"]=>
        string(8) "#asaichi"
        ["promoted_content"]=>
        NULL
        ["url"]=>
        string(39) "http://twitter.com/search/?q=%23asaichi"
      }
      [2]=>
      array(5) {
        ["events"]=>
        NULL
        ["query"]=>
        string(45) "%E3%81%8A%E3%81%AF%E3%81%AB%E3%82%83%E3%83%BC"
        ["name"]=>
        string(15) "おはにゃー"
        ["promoted_content"]=>
        NULL
        ["url"]=>
        string(74) "http://twitter.com/search/?q=%E3%81%8A%E3%81%AF%E3%81%AB%E3%82%83%E3%83%BC"
      }
      [3]=>
      array(5) {
        ["events"]=>
        NULL
        ["query"]=>
        string(15) "%22Nexus%207%22"
        ["name"]=>
        string(7) "Nexus 7"
        ["promoted_content"]=>
        NULL
        ["url"]=>
        string(44) "http://twitter.com/search/?q=%22Nexus%207%22"
      }
	・・・
—   5.Layoutもつくるが割愛します。 つくりますが個人のセンスでお願いします。 app/view/layout/index.php  

まとめ

どうでしょう? 結構いいデータがとれるよね?結構使い勝手がいいAPIです。 使用限度があると思いますが、こちらはバッチやCronで制御して時間帯別に実行させたらなにも問題ないですよね。 最近Twitterのデベロッパーにかなり衝撃的なニュースもありますが、 やっぱり情報収集に関しては結構Twitterはイケていると思います。 これを機になにかサービス立ち上げたいです。(毎度言っていますが今度こそは作ろうと思っています!!) ではまた次回の更新日までさようなら。

スポンサードリンク

運営サービスPR

スポンサードリンク

運営サービスPR