電車遅延がつらたんなので、キーワードで定期的にtwitter検索して、規定数以上のツイートならメール通知してくれるPHPスクリプト(時間帯指定も出来る)を書いてみた。
参考URL: Twitter APIでつぶやきを取得する
これで家を出る時に遅延メール通知があれば、自転車通勤に切り替えよう!
わりと、Twitter REST APIsは使いやすい。
でも、日時指定でuntilはあるのにsinceが書いてないのはドキュメント漏れなのかな?
https://dev.twitter.com/rest/reference/get/search/tweets
twitterアプリを作成するのに、いつの間にか携帯電話番号登録が必須になっていた。
そして、twitterアプリ認証は自分しか使わない場合は実装しなくてもいいだ!コレは楽だ(笑)
自分のためだけのWebアプリというのも、これはこれで贅沢な感じやね~。
あとはコレを平日限定で、朝にcrontabが実行してくれればシステムは完了!
文句を言う人が誰も居ないのは気楽だwwww
1 |
0 6 * * 1-5 /usr/bin/php phpファイルのパス |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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); | |
} | |