電車遅延がつらたんなので、キーワードで定期的にtwitter検索して、規定数以上のツイートならメール通知してくれるPHPスクリプト(時間帯指定も出来る)を書いてみた。

電車遅延がつらたんなので、キーワードで定期的にtwitter検索して、規定数以上のツイートならメール通知してくれるPHPスクリプト(時間帯指定も出来る)を書いてみた。

参考URL: Twitter APIでつぶやきを取得する

2015-07-27 17.06.05

これで家を出る時に遅延メール通知があれば、自転車通勤に切り替えよう!
わりと、Twitter REST APIsは使いやすい。
でも、日時指定でuntilはあるのにsinceが書いてないのはドキュメント漏れなのかな?
https://dev.twitter.com/rest/reference/get/search/tweets

twitterアプリを作成するのに、いつの間にか携帯電話番号登録が必須になっていた。
そして、twitterアプリ認証は自分しか使わない場合は実装しなくてもいいだ!コレは楽だ(笑)
自分のためだけのWebアプリというのも、これはこれで贅沢な感じやね~。

あとはコレを平日限定で、朝にcrontabが実行してくれればシステムは完了!
文句を言う人が誰も居ないのは気楽だwwww

<?php
// 設定値
define("SEARCH_KEYWORD", '横須賀線,遅延'); // twitter検索したいキーワード
define("TWEET_NUM_FOR_MAIL", 10); // 何件以上ヒットしたらメールするか
define("SEND_MAIL_ADDRESS", 'your@gmail.com'); // 通知して欲しいメアド
define("FROM_MAIL_ADDRESS", 'your@gmail.com'); // 送信元メールアドレス(迷惑メールにならないようにする)
define("SINCE_HOUR", 6); // 検索開始する時刻。6なら朝6時から開始(crontabで開始させる)
define("UNTIL_HOUR", 7); // この時刻を超えると検索しない。7なら7:59まで
define("SLEEP_SECOND", 60); // twitter検索する間隔(秒)
// twitterアプリの識別子(secretはキーワードと同じだから公表しちゃダメ!keyも止めた方がいい)
$consumer_key = 'aaa';
$consumer_secret = 'bbb';
// 認証ユーザの識別子(自分しか使わないなら、twitterアプリ管理画面から取得できる)
$access_token = 'ccc';
$access_token_secret = 'ddd';
// ライブラリを使う
require 'TwistOAuth.phar';
// タイムゾーンをコードで指定
date_default_timezone_set('Asia/Tokyo');
// ツイッターに接続
$connection = new TwistOAuth($consumer_key, $consumer_secret, $access_token, $access_token_secret);
// キーワードによる検索(本日のツイートのみ、タイムゾーンもJST指定する)
$tweets_params = ['q' => SEARCH_KEYWORD , 'since' => sprintf("%s_%02d:00:00_JST", date('Y-m-d') , SINCE_HOUR)];
$tweets = $connection->get('search/tweets', $tweets_params)->statuses;
// 指定された時間帯の間は、メールするまでループ
while(date("H") >= SINCE_HOUR and date("H") <= UNTIL_HOUR){
// ツイート件数でメール送信するか決める
$tweet_count = 0;
$mail_text = "";
// JSONからツイートを取り出す。
foreach ($tweets as $value) {
$text = htmlspecialchars($value->text, ENT_QUOTES, 'UTF-8', false);
// 検索キーワードをマーキング
$keywords = preg_split('/,|\sOR\s/', $tweets_params['q']); //配列化
foreach ($keywords as $key) {
$text = str_ireplace($key, '<span class="keyword">'.$key.'</span>', $text);
}
// ツイート表示のHTML生成
$icon_url = $value->user->profile_image_url;
$screen_name = $value->user->screen_name;
$updated = date('Y/m/d H:i', strtotime($value->created_at));
$tweet_id = $value->id_str;
$url = 'https://twitter.com/' . $screen_name . '/status/' . $tweet_id;
$mail_text .= '<div class="tweetbox">' . PHP_EOL;
$mail_text .= '<div class="thumb">' . '<img alt="" src="' . $icon_url . '">' . '</div>' . PHP_EOL;
$mail_text .= '<div class="meta"><a target="_blank" href="' . $url . '">' . $updated . '</a>' . '<br>@' . $screen_name .'</div>' . PHP_EOL;
$mail_text .= '<div class="tweet">' . $text . '</div>' . PHP_EOL;
$mail_text .= '</div>' . PHP_EOL;
++$tweet_count;
}
// 指定した数以上のツイートがあったら
if($tweet_count >= TWEET_NUM_FOR_MAIL){
mb_language('uni');
mb_internal_encoding('UTF-8');
// キーワードで検索した結果をメールする。
header('Content-Type: text/html; charset=UTF-8');
header('Content_Language: ja');
$to = SEND_MAIL_ADDRESS; //送信先メールアドレス
$subj = date('Y年n月j日')."の".SEARCH_KEYWORD; //件名
$mess = $mail_text; //本文
$from = 'Content-type: text/html; charset=UTF-8' . "\r\n";
$from .= "From:" . "<". FROM_MAIL_ADDRESS .">"; //送信元メールアドレス
//メール送信したらプログラム終了!
mb_send_mail($to, $subj, $mess, $from);
print($mail_text);
exit();
}else{
echo date('Y-m-d H:i:s'). " ". $tweet_count."件のツイートしかない\n";
}
// 指定された秒数だけ、ループ待機
sleep(SLEEP_SECOND);
}