2015年12月15日は、PlayStation版「幻想水滸伝」が発売されて20周年のその日です。この日を祝うためにTwitter上では #HappySuikoden20th というハッシュタグで各種お祝いツイートが寄せられています。
20周年のこの日に、このハッシュタグを用いて、毎時08分に定期的にお祝いの言葉をツイートするbotを作ってみました。以下にその方法をまとめます。
※20周年を祝うbotのみでなく、汎用的なbotに使える方法です
※言語はPHPですが容易に他言語に移植できます
1. Twitter Developersでアプリケーションの登録をする
まず、Twitter Developersに行きます。画面下の「TOOLS」の中の「Manage Your Apps」をクリックし、投稿に使うためのアプリケーションを登録します。
「Create New App」ボタンを押してください。「Application Details」で「Name」と「Description」と「Website」を入力します。これらは必須項目ですので省略することはできません。入力が完了したら下の規約を読み、チェックボックスにチェックを入れ、「Create your Twitter application」ボタンを押せばアプリケーションの登録は完了です。
アプリケーションのタブで「Keys and Access Tokens」タブを選びます。「Application Settings」の方はすでに取得できているでしょうから、下の「Your Access Token」を取得します。下の画面のように取得できるはずです。ここで重要なのは、「Consumer Key」「Consumer Secret」「Access Token」「Access Token Secret」です。
2. PHPのコードを書く その1
前章で得られた情報を用いて、ツイートをするためのコードを書いていきます。事前準備としてPEARのHTTP_OAuthを入れる必要があるので、以下にしたがって入れておきます。
ではコードを書いていきます。まず序盤の「おまじない」として以下のコードを書きましょう。
<?php // 初期設定 include 'HTTP/OAuth/Consumer.php'; // Twitter API 認証情報 $consumerKey = "ここに先ほどのConsumer Key"; $consumerSecret = "ここに先ほどのConsumer Secret"; $accessToken = "ここに先ほどのAccess Token"; $accessTokenSecret = "ここに先ほどのAccess Token Secret"; // リクエストのためのオブジェクトを生成する $consumer = new HTTP_OAuth_Consumer($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret); $http_request = new HTTP_Request2(); $http_request->setConfig('ssl_verify_peer', false); $consumer_request = new HTTP_OAuth_Consumer_Request; $consumer_request->accept($http_request); $consumer->accept($consumer_request);
ここまではおまじないで、そういうものと思って書きましょう。
ここまで来たらあとはツイートをするだけです。TwitterのAPIの叩き方の仕様については以下のページに大変に詳しいです。できれば一緒に公式のヘルプにもあたっておくといいでしょう。
ではツイートを行うコードを書きます。以下だけです。
<?php $tweet_text = 'PlayStation版「幻想水滸伝」、発売20周年おめでとうございます!まだPSのRPGがあまり無かった頃に彗星のごとく降ってきたのが幻水でした。最初は「変な名前のゲームだな」と思いましたが、プレイするとその魅力に完全に取りつかれました。 #HappySuikoden20th'; $response = $consumer->sendRequest('https://api.twitter.com/1.1/statuses/update.json', array('status'=>$tweet_text), 'POST');
$tweet_textにツイートしたい内容を代入しています(140字制限に注意しましょう)。$responseはAPIを叩いた際の戻り値が入りますが、無くても構いません。ただ、デバッグしにくくなるのである方が理想です。
$consumerのsendRequetメソッドでAPIを叩きます。引数に取るのは「URL」「(配列形式で)パラメータ」「POSTかGETか」です。見てみるだけでだいたい分かるかなと思います。リファレンスを参考にしましょう。
これだけでツイートが可能です。
3. PHPのコードを書く その2
確かにこれだけでツイートはできるのですが、2015年12月15日の毎時08分にツイートをする、という目的には不十分です。そこで以下の様な設計のもとにコードを書き直します。
- 毎時08分にツイートをするために、24のツイートを用意する
- 00時~24時の毎時にツイートができるように、ツイートのたびに現在時刻の「時」の値で条件分岐させてツイート内容を定める
上記の設計のもと、次のようなコードが書けます。
<?php // 時間別につぶやく内容を変える $hantei = getNowHour(); if ($hantei == "00") { $tweet_text = 'PlayStation版「幻想水滸伝」、発売20周年おめでとうございます!まだPSのRPGがあまり無かった頃に彗星のごとく降ってきたのが幻水でした。最初は「変な名前のゲームだな」と思いましたが、プレイするとその魅力に完全に取りつかれました。 #HappySuikoden20th'; $response = $consumer->sendRequest('https://api.twitter.com/1.1/statuses/update.json', array('status'=>$tweet_text), 'POST'); } elseif ($hantei == '01') { $tweet_text = '幻水は生まれるべくして生まれた名作だと思います。それは続編のIIで確固たるものとなるのですが、Iの時点で素敵なシナリオ、魅力的なキャラクター、豊かな音楽、成熟したゲームシステムとすでに名作の要素がふんだんに詰まっていました。 #HappySuikoden20th'; $response = $consumer->sendRequest('https://api.twitter.com/1.1/statuses/update.json', array('status'=>$tweet_text), 'POST'); } elseif ($hantei == '02') { (中略) } elseif ($hantei == '23') { $tweet_text = 'シナリオを書き、ディレクションを行った村山吉隆さん。貴方がいなければ幻想水滸伝という世界は生まれなかった。開発の過程は「THE UNTOLD HISTORY OF JAPANESE GAME DEVELOPERS」で拝見しました。 #HappySuikoden20th'; $response = $consumer->sendRequest('https://api.twitter.com/1.1/statuses/update.json', array('status'=>$tweet_text), 'POST'); } else { // 例外処理 } // 現在の「時間」を返す function getNowHour() { $dt = new DateTime(); $dt->setTimeZone(new DateTimeZone('Asia/Tokyo')); return $dt->format('H'); }
$hanteiに現在の「時」を代入します。現在の「時」を取得するために getNowHour という関数を用いていますが、この関数は文末に書かれているとおりです。
そして判定文の嵐の箇所に向かいます。「現在の『時』が00か01か02か…」で判定して、その「時」の内容をつぶやく、というわけです。とても褒められたコードではないですが、一つの解決法を示してはいます。保守性や拡張性を高めるためにはもっと汎用化して書く必要があります。
4. PHPのコードを書く(まとめ)
以上をまとめると、書くべきPHPのコードは以下のようになります。
<?php // 初期設定 include 'HTTP/OAuth/Consumer.php'; // Twitter API 認証情報 $consumerKey = "ここに先ほどのConsumer Key"; $consumerSecret = "ここに先ほどのConsumer Secret"; $accessToken = "ここに先ほどのAccess Token"; $accessTokenSecret = "ここに先ほどのAccess Token Secret"; // リクエストのためのオブジェクトを生成する $consumer = new HTTP_OAuth_Consumer($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret); $http_request = new HTTP_Request2(); $http_request->setConfig('ssl_verify_peer', false); $consumer_request = new HTTP_OAuth_Consumer_Request; $consumer_request->accept($http_request); $consumer->accept($consumer_request); // 時間別につぶやく内容を変える $hantei = getNowHour(); if ($hantei == "00") { $tweet_text = 'PlayStation版「幻想水滸伝」、発売20周年おめでとうございます!まだPSのRPGがあまり無かった頃に彗星のごとく降ってきたのが幻水でした。最初は「変な名前のゲームだな」と思いましたが、プレイするとその魅力に完全に取りつかれました。 #HappySuikoden20th'; // 139字 $response = $consumer->sendRequest('https://api.twitter.com/1.1/statuses/update.json', array('status'=>$tweet_text), 'POST'); } elseif ($hantei == '01') { $tweet_text = '幻水は生まれるべくして生まれた名作だと思います。それは続編のIIで確固たるものとなるのですが、Iの時点で素敵なシナリオ、魅力的なキャラクター、豊かな音楽、成熟したゲームシステムとすでに名作の要素がふんだんに詰まっていました。 #HappySuikoden20th'; $response = $consumer->sendRequest('https://api.twitter.com/1.1/statuses/update.json', array('status'=>$tweet_text), 'POST'); } elseif ($hantei == '02') { (中略) } elseif ($hantei == '23') { $tweet_text = 'シナリオを書き、ディレクションを行った村山吉隆さん。貴方がいなければ幻想水滸伝という世界は生まれなかった。開発の過程は「THE UNTOLD HISTORY OF JAPANESE GAME DEVELOPERS」で拝見しました。 #HappySuikoden20th'; $response = $consumer->sendRequest('https://api.twitter.com/1.1/statuses/update.json', array('status'=>$tweet_text), 'POST'); } else { // 例外処理 } // デバッグ用 print_r($response); // 現在の「時間」を返す function getNowHour() { $dt = new DateTime(); $dt->setTimeZone(new DateTimeZone('Asia/Tokyo')); return $dt->format('H'); }
以上のコードを実行することで、指定した「時」に合致する内容をツイートすることができます。実行後、$response の中身が見られます(デバッグ用であり、実行内容に影響を与えるものではありません)。
5. cronを設定する
前章のコードを実行すればツイートができるようになりました。これを自動で「12月15日の毎時08分」に回すように cron を設定します。/etc/crontabの内容を編集します。
# 幻水20周年bot(12/15の毎時08分にPHPを実行する) 08 * 15 12 * root php /hoge/hoge/hoge.php
上記内容を書いたcrontabを保存すれば設定完了です。ちなみに秒単位でcronを実行したい場合は方法がありますので検索してみてください。
6. ドキドキしながら待つ
あとは時間がくれば勝手にツイートを行ってくれます。それも、if文で判別された、その「時」にツイートするように設定した内容です。
以上の方法で、それぞれの「時」ごとの内容をツイートし、合計で24のツイートを正しく行うことができました。
7. 実行環境
- さくらのVPS 1G SSDプラン 石狩リージョン(http://vps.sakura.ad.jp/)
- Ubuntu 15.10
- PHP 7.0.0-5+deb.sury.org~wily+1 (cli) ( NTS )