LoginSignup
5
5

More than 5 years have passed since last update.

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

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

パズドラです。

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

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

1861-status-s.jpg

さて、やっと本題へ。
今年は仕事で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で取得します。

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

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

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

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5