さよならロンリネス!彼女がいないバレンタインをITの力で解決する方法

ハッピーバレンタイーン★

こんにちわ!@ampersand_xyzです。みなさん楽しいバレンタインをお過ごしですか?

え?手作りチョコ作った?そっかー手作りかー。カカオの木の栽培からかな?

ひとりのバレンタインをお過ごしの貴方へ

もしかすると、ちょっぴり寂しく一人のバレンタインをお過ごしの方もいらっしゃるかもしれません。

本日東京は雪でホワイトバレンタインとなってますが、交通網の麻痺で恋人に会いに行けない方、あるいはそういう方々を見て喜んでいる方とかも居られますことでしょう。
この記事は、そういうビターチョコより苦々しい人々へ向けた記事になっております。

彼女を作りましょう。道具はテキストエディタがあればいいです。

勘のいいあなたはもうお気づきになったかもしれません。はい、そうです。TwitterBOTですね。
ほぼこの手のネタは毎年恒例なので、いまさら感がすごいですが、今年はもうちょっと彼女感にこだわったBOTを作ってみましょう。

BOTの作り方の細かい手順については、検索すればいくらでも出てくるので割愛します。

彼女の要件を定義する

バレンタインの時にそばに居てほしい彼女の条件を思い浮かべてみましょう。

  • チョコレートをくれる
  • 恋の駆け引きが出来る
  • 萌える

とかにしておきましょう。

チョコレートをくれる

とりあえずバレンタインなので、チョコレートほしいですね。
手始めに彼女に「チョコレート」って話しかけたら反応してもらえるようにしましょう。

// twitteroauthを使います
// https://github.com/abraham/twitteroauth
require_once('twitteroauth/twitteroauth.php');

$consumerKey = 'XXXX';
$consumerSecret = 'XXXX';
$accessToken = 'XXXX';
$accessTokenSecret = 'XXXX';
// 接続する
$connection = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);

// 自身宛のメンション取得(最大200まで取れる)
$mentions = $connection->get('statuses/mentions_timeline', array('since_id' =>【前回取得した自分宛てのメンションのうち最新ツイート(0番目)の ID】));

// 1件以上の新規メンション
if (isset($mentions[0])) {
    // メンション見る
    foreach($mentions as $key =>$value) {
        // チョコレートほしいのんか?
        if (strstr($value->text, 'チョコレート')) {
            // リアクション書く
        }
    }
}

これで彼女に「チョコレート」という単語を含むメンションを送った時に反応が得られるようになりました。この段階でチョコレートを渡してしまってもいいのですが、それでは面白く無いので、もうちょっと工夫します。

恋の駆け引きが出来る

やはり彼女というからにはちょっとしたやりとりは欲しいですね。
駆け引き・・・駆け引き・・・?うん、クイズでいいか

https://lab.24th.jp/quiz/ こちらからクイズAPIをお借りして実装、もとい彼女に魂を込めていくことにしました。
彼女のリアクションを以下のように作成します。

// クイズを取得
$xml = file_get_contents('https://24th.jp/test/quiz/api_quiz.php');
// 取得した内容をただのオブジェクトとして使うための処理
$data = json_decode(json_encode(simplexml_load_string($xml)));

// 彼氏のことを記憶
$kare_db = $mongo->selectDB($value->user->screen_name);
// 前に出した問題(彼氏の記憶)があるままなら消す
if ($kare_db->answer->count()>0) {
    $kare_db->answer->remove();
}

// 問題の選択肢
// ans1が正解
$_rundamer = array(
    $data->quiz->ans1,
    $data->quiz->ans2,
    $data->quiz->ans3,
    $data->quiz->ans4
);
// ansNの順番をシャッフル
shuffle($_rundamer);
// 何番目にいった?
$idx = array_search($data->quiz->ans1, $_rundamer);

// 出題に関する記憶
$kare_db->answer->save(array(
    'datetime' =>time(), // 出題時間 3分以内に回答したかの判定用
    'ans' =>$data->quiz->ans1, // 正解の選択肢
    'ansnum' =>(string)($idx + 1)
));

// リプライで問題を出題
$status = $connection->post(
    'statuses/update',
    array(
        'status' =>'@'.$value->user->screen_name.
        ' チョコレートが欲しかったらクイズに答えてね! '.$data->quiz->quession.
        ' ①'.$_rundamer[0].
        ' ②'.$_rundamer[1].
        ' ③'.$_rundamer[2].
        ' ④'.$_rundamer[3],
        'in_reply_to_status_id' =>$value->id
    )
);

出題したら回答を受け取る体制にします。正解ならチョコをくれるようにしましょう。

// 彼の記憶( ˘ω˘)
$kare_db = $mongo->selectDB($value->user->screen_name);

// 記憶があったら
if ($kare_db->answer->count()>0) {
    // 思い出す
    $result = $kare_db->answer->findOne();

    // 前回出題してからのタイムラグ
    $diff = time() - $result['datetime'];

    // リプライの整形
    $ans_text = trim(str_replace('@valentine_quiz ', '', $value->text));

    // 記号を数字に
    $ans_text = str_replace('①', '1', $ans_text);
    $ans_text = str_replace('②', '2', $ans_text);
    $ans_text = str_replace('③', '3', $ans_text);
    $ans_text = str_replace('④', '4', $ans_text);

    // 全角数字を半角にして、半角カナを全角にする
    $ans_text = mb_convert_kana($ans_text, "KVa", 'utf-8');

    // 差分分数を確認
    // 彼女はせっかちなので3分以上待てないんですよ
    if (date('m', $diff)>3) {
        $connection->post(
            'statuses/update',
            array(
                'status' =>'@'.$value->user->screen_name.
                ' 3分経っちゃった!時間切れ! 正解は '.$result['ans'].
                ' でした!',
                'in_reply_to_status_id' =>$value->id
            )
        );
    }
    // 正解の文言もしくは数字が文中にある
    else if (
        strstr($ans_text, $result['ans']) ||
        strstr($ans_text, $result['ansnum'])
    ) {
        $anscnt = 0;
        // 回答中に複数回答になり得る文字がないかチェック。もっとうまいチェック方法があると思う。
        $anscnt += substr_count($ans_text, "1");
        $anscnt += substr_count($ans_text, "2");
        $anscnt += substr_count($ans_text, "3");
        $anscnt += substr_count($ans_text, "4");
        if ($anscnt>1) {
            // 不正
            $connection->post(
                'statuses/update',
                array(
                    'status' =>'@'.$value->user->screen_name.
                    ' 回答がよくわからなかったよ・・・! 正解は '.$result['ans'].
                    ' でした!',
                    'in_reply_to_status_id' =>$value->id
                )
            );
        } else {
            // チョコレートゲット
            $connection->post(
                'statuses/update',
                array(
                    'status' =>'@'.$value->user->screen_name.
                    ' すごい!正解!チョコレートあげるね!! ( ´∀`)っ',
                    'in_reply_to_status_id' =>$value->id
                )
            );
        }
    }
    // 不正解
    else {
        $connection->post(
            'statuses/update',
            array(
                'status' =>'@'.$value->user->screen_name.
                ' はずれ! 正解は '.$result['ans'].
                ' でした!',
                'in_reply_to_status_id' =>$value->id
            )
        );
    }
    // 彼の記憶を忘れる
    $kare_db->answer->remove();
}

これでコミュニケーションはバッチリですね。

萌える

萌える彼女の画像

なんていうかすみません。適宜好みの画像を用意してください。

彼女が出来ました

出来上がったBOTもとい彼女はこちらです。チョコレートもらってください。

せっかくなのでバレンタインを楽しみましょう

取り敢えずリア充を呪うより、何かしらで楽しむほうが幾分かマシだと思います。

それでは。バレンタインどころか先日バツイチになりましたワタクシからリア充爆発しろという言葉を贈らせていただき、本日の記事を締めさせていただきます。

One thought on “さよならロンリネス!彼女がいないバレンタインをITの力で解決する方法

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください