iPhone

iPhone

  • im.kayac.comでiPhoneにtwitterをプッシュ通知するphpソースコードサンプル

    特定のユーザのtwitterの投稿をiPhoneにプッシュ通知してくれるアプリが欲しい。
    そういうアプリはなさそうなので、本当はそういうアプリを作りたかったのだけれど、大変そうなのでim.kayac.comとphpとcronで実現してみた。
    im.kayac.com(App Store)
    このiPhoneアプリはいろいろ便利。プログラムかければいろんなのをプッシュ通知できる。

    以下サンプルソース。変なところがあったら教えて欲しい。
    これをcronで5分毎に実行する。
    (cronで実行するときは、1行目に#!/usr/local/bin/phpって書く)

    created_at);
    	$content = date("Y/m/d H:i",$timestamp)."@";
    	// 名前
    	$content .= $message->user->name.">>";
    	// 内容
    	$content .= $message->text."";
    
    	// imkayacを使ってプッシュ
    	imkayac($content);
    	return;
    }
    
    // http://project-p.jp/halt/anubis/blog_show/1269をほぼそのまんま
    // cURLでできるんじゃなかろうか。
    function imkayac($message){
    
    	$data = array(
    	    "message" => $message,
    	    "password" => K_PASS,
    	);
    
    	$data['sig'] = sha1($data['message'] . K_SIG);
    	unset($data['password']);
    
    	$data = http_build_query($data, "", "&");
    
    	//header
    	$header = array(
    	    "Content-Type: application/x-www-form-urlencoded",
    	    "Content-Length: ".strlen($data)
    	);
    
    	$context = array(
    	    "http" => array(
    	        "method"  => "POST",
    	        "header"  => implode("\r\n", $header),
    	        "content" => $data
    	    )
    	);
    
    	$url = "http://im.kayac.com/api/post/".K_NAME;
    	file_get_contents($url, false, stream_context_create($context));
    	return;
    }
    
    
    // ログ取得(重複tweet読込回避)
    function getLog(){
    	$retval = array();
    	if( ($fp = fopen(LOG_FILE_NAME,"r+") ) ){
    		while (! feof($fp)) {
    			$line = fgets ($fp, 4096);
    			$data = explode(",", trim($line));
    			$retval[$data[0]] = $data[1];
    		}
    		fclose($fp);
    	}
    	return $retval;
    }
    
    // ログ保存(重複tweet読込回避)
    function saveLog($datas){
    	$log = '';
    	if(!empty($datas) && is_array($datas)){
    		foreach($datas as $name => $id){
    			if(!empty($name) && $id){
    				$log .= $name.",".$id."\n";
    			}
    		}
    	}
    	$fp = fopen(LOG_FILE_NAME,"w+");
    	flock($fp, LOCK_EX);
    	fputs($fp, $log);
    	flock($fp, LOCK_UN);
    	fclose($fp);
    	return;
    }
    
    // エラーログ保存(念のため)
    function saveErrLog($message){
    	$fp = fopen(ERRLOG_FILE_NAME,"a+");
    	$date = date('Y/m/d h:i:s');
    	$logmessage = $date." ".$message."\n";
    	flock($fp, LOCK_EX);
    	fputs($fp, $logmessage);
    	flock($fp, LOCK_UN);
    	fclose($fp);
    	return;
    }
    
    // 重複取得回避用
    $logs = getLog();
    
    foreach($tnames as $tname){
    	// 重複取得回避用
    	if(!empty($logs[$tname])){
    		$since_id = "?since_id=".$logs[$tname];
    	} else {
    		$since_id = "";
    	}
    
    	// 特定のユーザーのタイムライン取得用API
    	$apiURL = "http://api.twitter.com/1/statuses/user_timeline/".$tname.".xml".$since_id;
    
    	// cURLを使ってXML取得
    	$ch = curl_init(); 
    	curl_setopt($ch, CURLOPT_URL, $apiURL);
    	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
    	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    	$retXML = curl_exec($ch); 
    	curl_close($ch);
    
    	// 取得したXMLを解析
    	if(!empty($retXML) && ereg("^<\?xml", $retXML) && 
    	   $xml = simplexml_load_string($retXML)
    	){
    		if($xml->status){
    			foreach($xml->status as $message){
    				// 重複取得回避用
    				if($logs[$tname] <= $message->id){
    					$logs[$tname] = $message->id;
    				}
    				// 取得したTLを出力
    				outMessage($message);
    			}
    		}
    	} else {
    		// 一応エラーログ記録
    		saveErrLog("xml取得失敗");
    	}
    }
    
    // 重複取得回避用
    saveLog($logs);
    ?>
    

    twiiterAPIと通信する部分をいろいろ変えればReplyとかmentionとかだけ取得することも可能。
    そんときはログインも必要になるので、「phpでTwitterをハンドリングするサンプル」を参考に変えたらいいと思う。
    他に欲しい情報とかあったら、Twitter API Wikiのサイトをみればだいたい分かる。
    英語読めなくても結構わかる。

    ※参考サイト