Twitter API で特定のアカウントのツイートを取得する方法、修正版

Twitter API で特定のアカウントのツイートを取得する方法」ですが、タイムアウトして情報が取れないことがあり、その辺りを改良しました。

<?php
require_once 'TwistOAuth.phar';

$consumer_key = '{your-consumer-key}';
$consumer_secret = '{your-consumer-secret}';
$access_token = '{your-access-token}';
$access_token_secret = '{your-access-token-secret}';

$connection = new TwistOAuth($consumer_key, $consumer_secret, $access_token, $access_token_secret);
$count = 3;
$max_length = 25;

function get_tweet($screen_name){
  global $connection, $count, $max_length;
  $ret = "";

	// connect
	try{
		$user = $connection->get('statuses/user_timeline',
    array('screen_name' => $screen_name,
      'count' => $count,
      'exclude_replies' => 'false',
      'include_rts' => 'false',)
    );
	} catch (TwistException $e) {
		fputs(STDERR, "Error : $screen_name , " . date("Y/m/d H:i:s") . "\n");
		$text = '<h4><a href = "https://twitter.com/@' . $screen_name . '">@' . $screen_name . '</a></h4>';
		$text .= '<ul class = "tweet"><li>取得失敗</li></ul>' . "\n";
		return $text;
	}

	// get user names.
	$screen_name = htmlspecialchars($user[0]->user->screen_name, ENT_QUOTES, 'UTF-8', false);
  $names = "<h4>" . htmlspecialchars($user[0]->user->name, ENT_QUOTES, 'UTF-8', false) 
      . ' <a href = "https://twitter.com/@' . $screen_name . '">@' . $screen_name . "</a></h4>\n";
  $ret .= $names;

  $ret .= '<ul class = "tweet">';

  // get tweets.
  foreach ($user as $value){
    $screen_name = htmlspecialchars($value->user->screen_name, ENT_QUOTES, 'UTF-8', false);
    $post_date_utc = htmlspecialchars($value->created_at, ENT_QUOTES, 'UTF-8', false);
    $post_date = timezone_change_ja($post_date_utc);
    $text = htmlspecialchars(mb_substr($value->text, 0, $max_length, 'UTF-8'), ENT_QUOTES, 'UTF-8', false);
    $link = '<a href = "https://twitter.com/' . $screen_name . '/status/' . $value->id_str . '">';
    $ret .= "<li>" . $post_date . " " . $link . $text . "</a></li>\n";
  }

  $ret .= "</ul>\n";
  return $ret;
}

/*
	Twitterからのタイムゾーンを日本時間(東京)に変換するq
         $time = timezone_change('Tue Jul 12 06:27:46 +0000 2011');
         echo $time{"tm_year"};
         
*/

function timezone_change_ja($timezone = null){

	$year = $month = $day = $hour = $minute = $second = null;
	if(!empty($timezone)){

		$date_arr = explode(" ", $timezone);
		$year = intval($date_arr[5]);
		
		if($date_arr[1] == "Jan"){
			$month = 1;
		}else if($date_arr[1] == "Feb"){
			$month = 2;
		}else if($date_arr[1] == "Mar"){
			$month = 3;
		}else if($date_arr[1] == "Apr"){
			$month = 4;
		}else if($date_arr[1] == "May"){
			$month = 5;
		}else if($date_arr[1] == "Jun"){
			$month = 6;
		}else if($date_arr[1] == "Jul"){
			$month = 7;
		}else if($date_arr[1] == "Aug"){
			$month = 8;
		}else if($date_arr[1] == "Sep"){
			$month = 9;
		}else if($date_arr[1] == "Oct"){
			$month = 10;
		}else if($date_arr[1] == "Nov"){
			$month = 11;
		}else if($date_arr[1] == "Dec"){
			$month = 12;
		}

		$day = intval(sprintf("%d", $date_arr[2]));

		$arr = explode(":", $date_arr[3]);
		
		$hour = intval(sprintf("%d", $arr[0]));
		$minute = intval(sprintf("%d", $arr[1]));
		$second = intval(sprintf("%d", $arr[2]));

		$time = mktime($hour, $minute, $second, $month, $day, $year);
		$time = $time + 60 * 60 * 9; # 9時間進める
    //$date = localtime($time, true);
    return date("Y-m-d H:i", $time);
		//return $date;
	}else{
                  return false;
         }
}

?>

取得失敗の例外発生時に、スクリーンネームと「取得失敗」を戻り値にして返して、標準エラー出力にエラー内容を出力するようにしました。

このため PHP の実行文も変わります。
エラー内容を itawoerror.log に追記していきます。

php ./itawotweet/itwt_cjpn.php > ./www/itawotweet/itwt_cjpn.html 2>> itawoerror.log

ログは定期的に自分のメールアドレスに送るようにシェルスクリプトを書きました。

#!/bin/sh
if [ -s ./itawoerror.log ]; then
	cat -v ./itawoerror.log | mail -s "itawotweet error log" {your-mail-address}
	rm -f itawoerror.log
fi

これを cron に登録します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です