「おっぱい揺れたbot」の制作方法

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です。

Powered by はてなブログ