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