オールアバウト Advent Calendar 8日目です。
普段ゲームは全くしないのだけど、ほそぼそとかれこれ2年くらい続けているゲーム(アプリ)があります。
パズドラです。
先日、ランクが200を超えました。
2年やっててやっと!?と思う方がいるかもしれないけど、それでもちょっと嬉しいもの。
本題とは全く関係ないですが、私のリーダーはケンシロウです。
パズドラ内ではあまり強くもなく弱くもなく微妙な存在なのだが、私の中ではこれからも不動のリーダーとして君臨し続けるだろぅホアタァ!
さて、やっと本題へ。
今年は仕事でGoogleのAPIを利用して、社内のサービスを開発したりしていました。
今ではオフィス内でExcelよりもGoogleスプレッドシートを利用したり、予定もGoogleカレンダーで管理したり…そんな企業も多くなってきているのではないでしょうか。
またツールの提供だけでなく、開発者向けに各種ツールのAPIを公開してより可能性を広めている部分も素敵です。
というわけで今回、好きなパズドラとGoogleのカレンダーAPIを利用して、
パズドラで開催されているゲリラダンジョンのスケジュールを自分のカレンダーに落とし込み、いつでもどこでも(仕事中でも)確認できるようにしようと思います。
※ちなみに、ゲリラダンジョンとはキャラクターを強くできるボーナスステージみたいなものです。
やること
1.パズドラのゲリラダンジョンのスケジュールを取ってくる
2.GoogleカレンダーAPIを利用してGoogleカレンダーに予定を反映する
用意したもの
1.ゲリラダンジョンのスケジュール
API的なものが見つからなかったので、ここのWEBページから直接持ってくることにしました。
2.GoogleAPI
APIはライブラリとして提供されています。
https://github.com/google/google-api-php-client
※APIを利用する際は使用するためのリクエストや、認証キーなど事前に通しておく必要があります。こちらのページが詳しく記載しているのでご参考ください。
3.環境
言語はPHPを使用しました。
実装してみた
長くなってしまいそうなので色々と省きますが、、
おおまかにやったことは下記のとおりです。
まずは、GoogleAPIのパッケージをcomposerで取得します。
"require": {
"laravel/framework": "5.0.*",
"googleads/googleads-php-lib": "dev-master"
},
強引な実装になっていますが、ゲリラダンジョンのスケジュールを取得します。
// サイト読み込み
$dom = file_get_html('http://paznet.net/');
$nodes = $dom->find("table.table caption");
if (array($nodes) && count($nodes) > 0) {
$date_text = reset($nodes)->text();
$matches = array();
if (preg_match('/(?P<month>\d{1,2})[^\d]+?(?P<day>\d{1,2})/', $date_text, $matches) === 1) {
$date_str = date('Y') . '-' . $matches['month'] . '-' . $matches['day'];
$this->setDate($date_str);
}
}
// 以下省略
取得したスケジュールの情報をGoogleカレンダーのAPIに渡して完了です。
/**
* GoogleCalenderService に認証を通す
*/
public function getServiceCalendar()
{
$scopes = array('https://www.googleapis.com/auth/calendar');
$credential = new Google_Auth_AssertionCredentials($this->auth_email, $scopes, $this->key);
$client = new Google_Client();
$client->setAssertionCredentials($credential);
if ($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion($credential);
}
return new Google_Service_Calendar($client);
}
/**
* イベントを追加する
*
* @param string $class class string(A,B,C,D,E)
* @param string $subject event title
* @param int $start_timestamp event start timestamp value
* @param int $end_timestamp event end timestamp value
*/
public function addEvent($class, $subject, $start_timestamp, $end_timestamp)
{
$pd_calendar_id = $this->getPdCalendarId($class);
$event = new Google_Service_Calendar_Event();
$event->setSummary($subject);
// 予定の開始日
$start_datetime = new Google_Service_Calendar_EventDateTime();
$start_datetime->setDateTime(date('c', $start_timestamp));
$event->setStart($start_datetime);
// 予定の終了日
$end_datetime = new Google_Service_Calendar_EventDateTime();
$end_datetime->setDateTime(date('c', $end_timestamp));
$event->setEnd($end_datetime);
// リマインダーの設定
$reminder = new Google_Service_Calendar_EventReminder();
$reminder->setMethod('popup');
$reminder->setMinutes(10);
$reminders = new Google_Service_Calendar_EventReminders();
$reminders->setUseDefault(false);
$reminders->setOverrides(array($reminder));
$event->setReminders($reminders);
// カレンダーに登録
$this->getServiceCalendar()->events->insert($pd_calendar_id, $event);
}
結果
結果はこんな感じ。
意外と綺麗に表示できました。
注意点は、決して会社用のメールアドレスに間違って登録しないこと。
※高い確率でお叱りを受けることになります。
他にもGoogle提供のAPIは色々とあるので、今後共注目していきたいと思います。