パズドレンダー

オールアバウト Advent Calendar 8日目です。

普段ゲームは全くしないのだけど、ほそぼそとかれこれ2年くらい続けているゲーム（アプリ）があります。

パズドラです。

先日、ランクが200を超えました。
2年やっててやっと！？と思う方がいるかもしれないけど、それでもちょっと嬉しいもの。

本題とは全く関係ないですが、私のリーダーはケンシロウです。
パズドラ内ではあまり強くもなく弱くもなく微妙な存在なのだが、私の中ではこれからも不動のリーダーとして君臨し続けるだろぅホアタｧ！

![1861-status-s.jpg](https://qiita-image-store.s3.amazonaws.com/0/58362/aa0f0604-2a53-4f1c-85fd-073c992efa36.jpeg)

さて、やっと本題へ。
今年は仕事でGoogleのAPIを利用して、社内のサービスを開発したりしていました。
今ではオフィス内でExcelよりもGoogleスプレッドシートを利用したり、予定もGoogleカレンダーで管理したり…そんな企業も多くなってきているのではないでしょうか。
またツールの提供だけでなく、開発者向けに各種ツールのAPIを公開してより可能性を広めている部分も素敵です。

というわけで今回、好きなパズドラとGoogleのカレンダーAPIを利用して、
パズドラで開催されているゲリラダンジョンのスケジュールを自分のカレンダーに落とし込み、いつでもどこでも（仕事中でも）確認できるようにしようと思います。
※ちなみに、ゲリラダンジョンとはキャラクターを強くできるボーナスステージみたいなものです。

### **やること**
1.パズドラのゲリラダンジョンのスケジュールを取ってくる
2.GoogleカレンダーAPIを利用してGoogleカレンダーに予定を反映する

### **用意したもの**
1.ゲリラダンジョンのスケジュール
API的なものが見つからなかったので、[ここのWEBページ](http://paznet.net/)から直接持ってくることにしました。
2.GoogleAPI
APIはライブラリとして提供されています。
https://github.com/google/google-api-php-client
※APIを利用する際は使用するためのリクエストや、認証キーなど事前に通しておく必要があります。[こちらのページ](http://wataame.sumomo.ne.jp/archives/6400)が詳しく記載しているのでご参考ください。
3.環境
言語はPHPを使用しました。

### **実装してみた**
長くなってしまいそうなので色々と省きますが、、
おおまかにやったことは下記のとおりです。
まずは、GoogleAPIのパッケージをcomposerで取得します。

```composer.json
    "require": {
        "laravel/framework": "5.0.*",
        "googleads/googleads-php-lib": "dev-master"
    },
```

強引な実装になっていますが、ゲリラダンジョンのスケジュールを取得します。

``` PdGetData.php
// サイト読み込み
$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に渡して完了です。

```GoogleCalender.php
/**
 * 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 カレンダー - 12月 7日 (月).png](https://qiita-image-store.s3.amazonaws.com/0/58362/49b125ec-a899-9927-0280-2462b29cb3bd.png)

注意点は、決して会社用のメールアドレスに間違って登録しないこと。
※高い確率でお叱りを受けることになります。

他にもGoogle提供のAPIは色々とあるので、今後共注目していきたいと思います。