Twitterではたまに「おっぱい(揺れた)」とみんなが同時にツイートする瞬間があります。それをbot化してみようと思い立ち、作りました。
仕様
@earthquake_jp が情報をツイートした際に、「(時刻)、(地名)にておっぱいが揺れました。[おっぱい揺れたbot]」とツイートするbotです。
実装
TwitterのAPIを叩くのにはTwistOAuthを用いました。
@earthquake_jp のタイムラインをcronで2分おきに取得します。「最新ツイートが新しければ」、ツイート内の「時刻」と「地名」を抽出し、前述の形式に整形してツイートを行います。
「最新ツイートが新しければ」という部分の判定は、最新ツイートを取得した際に、そのツイートIDを別途テキストファイルに持っておき、最新ツイートの取得のたびにIDの比較を行って判定します。
具体的なコード
ソースコードoppaiquake.phpは以下のようになりました。「地名」の取得のところはやっつけです。
<?php // ライブラリ読み込み require __DIR__ . '/TwistOAuth.phar'; // Twitter API 認証情報 $consumerKey = ''; $consumerSecret = ''; $accessToken = ''; $accessTokenSecret = ''; // TwitterAPIに接続するあらゆる正常時の処理はこのブロックの中で行う try { // 接続 $to = new TwistOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret); // 特定のユーザーのツイートを検索し、結果を格納 $status = $to->get('statuses/user_timeline', ['screen_name' => 'earthquake_jp', 'count' => '1']); $tweet_id = $status[0]->id; $tweet_text_raw = $status[0]->text; // 最新の参照済みツイートのIDをファイルから取得する $tweet_id_log = __DIR__ . '/oppaiquake_newest_tweet_id.txt'; $fp = fopen($tweet_id_log, 'r+b'); flock($fp, LOCK_EX); $newest_tweet_id_from_log = fgets($fp); fflush($fp); flock($fp, LOCK_UN); fclose($fp); // 検索してヒットしたツイートから都道府県を抽出する $oppai_region = mb_substr($tweet_text_raw, mb_strpos($tweet_text_raw, '県', 0, "UTF-8") - 2, 3, "UTF-8"); if ($oppai_region == '奈川県' or $oppai_region == '歌山県' or $oppai_region == '児島県') { $oppai_region = mb_substr($tweet_text_raw, mb_strpos($tweet_text_raw, '県', 0, "UTF-8") - 3, 4, "UTF-8"); } if ($oppai_region == 'ke') { $oppai_region = mb_substr($tweet_text_raw, mb_strpos($tweet_text_raw, '都', 0, "UTF-8") - 2, 3, "UTF-8"); } if ($oppai_region == 'ke') { $oppai_region = mb_substr($tweet_text_raw, mb_strpos($tweet_text_raw, '道', 0, "UTF-8") - 2, 3, "UTF-8"); } if ($oppai_region == 'ke') { $oppai_region = mb_substr($tweet_text_raw, mb_strpos($tweet_text_raw, '府', 0, "UTF-8") - 2, 3, "UTF-8"); } if ($oppai_region == 'ke') { $oppai_region = '日本のどこか'; } // 検索してヒットしたツイートから発生時刻を抽出する $oppai_time = mb_substr($tweet_text_raw, mb_strpos($tweet_text_raw, '頃', 0, "UTF-8") - 6, 7, "UTF-8"); // ツイートをする $tweet_contents = $oppai_time . '、' . $oppai_region . 'にておっぱいが揺れました。[おっぱい揺れたbot]'; if ($tweet_id != $newest_tweet_id_from_log) { $status = $to->post('statuses/update', ['status' => $tweet_contents]); } // 最新の参照済みツイートのIDをファイルに記録する $fp = fopen($tweet_id_log, 'r+b'); flock($fp, LOCK_EX); ftruncate($fp, 0); fwrite($fp, $tweet_id); fflush($fp); flock($fp, LOCK_UN); fclose($fp); } catch (TwistException $e) { // エラーを表示 echo "[{$e->getCode()}] {$e->getMessage()}"; } ?>
cronでまわす
あとはcronで定期的に実行させればOKです。