「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 に登録します。