渋谷で引きこもってる社長です

株式会社Chotchy代表取締役 / エンジニア

PHP+JSでTwitterAPIに一分に一回クエリを投げるプログラム

twitterAPIって基本一分に一回しかクエリが投げられなくて、Twitterのフォロワーネットワークとかツイート情報とかを解析したいときには困りますね。cronとか使えばいいのですが、今回は簡単にPHP+JSでMysqlにフォロワーネットワークをぶち込んでいきたいです。

構成としてはサーバー側にPHPAPIを自分で組んで、そこをJavascriptでたたく感じです。

 

PHP側にはtwitterOAuthライブラリ

https://github.com/abraham/twitteroauth/blob/master/twitteroauth/twitteroauth.php

ここからもってきてくださいねー。ファイル2個だけなので僕はRawをコピペしちゃいますが。

 

index.php

//twitterの開発者ダッシュボードからもってきてね
$consumerKey = "";
$consumerSecret = "";
$accessToken = "";
$accessTokenSecret = "";

$twObj = new TwitterOAuth($consumerKey,$consumerSecret,$accessToken,$accessTokenSecret);

twitter OAuthのインスタンスができました。 次はPDOでデータベースにがっちゃんこします。

$dsn = 'mysql:dbname=network;host=localhost;charset=utf8';
$user = 'hogehoge';
$password = 'hohogegehohogge';
try {
  $pdo = new PDO($dsn,$user,$password,array(PDO::ATTR_EMULATE_PREPARES => false));
} catch (PDOException $e) {
 exit('データベース接続失敗。'.$e->getMessage());
}

URLにどのTwitter IDの人のフォローを取得するか入れておきますよ。

    $id = $_GET['id'];
	$json = $twObj->OAuthRequest("https://api.twitter.com/1.1/friends/ids.json","GET",array('user_id' => $id));
	$jset = json_decode($json, true);
	//存在しないidを入れてもエラーがでないように
	if(array_key_exist('errors',$json)){
		foreach ($jset['ids'] as $value) {
		//fromとtoだけの単純な構造だよーん
			$stmt2 = $pdo -> prepare("INSERT INTO twitter_edge (from_id,to_id) VALUES (:f_id,:t_id)");
			$stmt2->bindValue(':f_id', $id, PDO::PARAM_INT);
			$stmt2->bindValue(':t_id', $value, PDO::PARAM_INT);
			$stmt2->execute();
			$stmt2=null;
		}
	}

はい!PHPはおしまい!次はこれをJavascriptでたたきに行くよ!

setIntervalで一分に一回index.phpにアクセス

do.html

var ids = [{"id":"3270391"}, {"id":"12720442"}, {"id":"19373710"}, {"id":"54154542"}..........];

というjsonデータを使用します。

    var counter =0;
	var time;
	function start(){
	//setIntervalで60秒に一回実行する
		time = setInterval(function(){
			var request = new XMLHttpRequest();
			//ajaxでぶったたきにいくぜ
			request.open('GET'/*GET or POST*/, "http://localhost/twitter/index.php?id="+ids[counter].id/*URL*/, true/*非同期か否か*/);
			request.onload = function(){//通信が成功した場合の処理
			  document.write(counter+"周目<br>
"); }; request.onerror = function(){//通信が失敗した場合の処理 alert(request.status); }; request.send(null);//POSTする場合はこの引数で渡す counter++; },60000); } start(); //全部やりおわったらsetIntervalを止めます if(counter>ids.length){ clearInterval(time); }

TwitterAPIってやっかいだね