pushoverでいつでもどこでも呼ばれる環境をつくる

このエントリーは[ドワンゴアドベントカレンダー 17日目](http://qiita.com/advent-calendar/2014/dwango)のエントリーです。
昨日は@saitenさんの[iOS - AppleWatch向け動画プレイヤーを作ろう](http://qiita.com/saiten/items/89f6c1ec2d9f5cac2e75)でした。

クリスマスまで後1週間となりました。35歳の誕生日プレゼントに[水30ダースもらった](http://instagram.com/p/wfP7o0vO13/)[@regtan](https://twitter.com/regtan)です。こんにちわ。\_:(´ཀ`」∠):\_ 
ドワンゴではこれまでコミュニケーションツールとして[IRC](http://dic.nicovideo.jp/a/irc)を利用していました。現在は[Slack](https://slack.com/)へと徐々に移行されてきています。IRC時代はIRCサーバーが外部からアクセスできないところにあったため、帰宅後や離席しているときに呼ばれても通知を受け取ることができませんでした。[ZNC](http://wiki.znc.in/ZNC)などのIRCプロキシでログをとっておいても反応できるのは翌日以降となっていました。
連絡をとりたいときに電話すればいいじゃないかということになるのですが、何らかの事情で電話に出ることができないかもしれません。(そもそも[うちのチームメンバー](http://seiga.nicovideo.jp/book/)が電話というツールが苦手という問題もあります)
そこで簡単にIRC経由で自分を呼び出すことのできるbotを作成しました。これで安心していつでもどこでも通知を受け取ることができますね！

# 準備するもの
- お好みのiOS端末
    - push notificationを受ける端末です。公衆回線に繋がる奴のほうが便利です
    - android端末でもandroid版Pushover notificationをインストールすればOKです
    - desktop notificationもあるので最悪モバイル端末無くてもなんとか・・・
- Pushover Notification
    - https://itunes.apple.com/jp/app/pushover-notifications/id506088175
    - アプリ内課金で¥500
- hubot
    - https://hubot.github.com/
    - irc adapterを使ってIRCに接続します
- hubotを動かすサーバー
    - hubotの動作環境としてnodeやredisが必要となりますのでそれぞれよしなにインストールしてください
    - 一般のご家庭にあるサーバーのスペックで十分です

# Pushoverのアカウント作成とUser keyの発行
[Pushover](https://pushover.net/)のサイトにいってSign upを行ってください。ログイン後に表示されるダッシュボードにUser keyが表示されますのでこれを控えておきます。
![Pushover__Home-8.png](https://qiita-image-store.s3.amazonaws.com/0/8860/e49017b2-41ed-9014-f403-ab3b751c9933.png)
また、User Keyの下に表示されるmail addressにメールを送ってもpush notificationを送ることができます。何かと便利ですね。
QuietHoursを設定するとその時間はpush notificationが送られても、端末のバイブレーションや音をならさないようにしたり、バッジの数字をインクリメントするだけという色々捗る設定が可能です。クリスマスを迎えるリア充の皆様は活用すればよいでしょう。そんな奴はタイムゾーンの設定間違えて正しく設定できなければいいと思います。

# アプリケーションの登録とAPI tokenの発行
次にpushoverにnotificationのrequestを行うアプリケーションの設定を行います。ダッシュボードの下のRegister an applicationをクリックします。![Pushover__Create_New_Application_Plugin.png](https://qiita-image-store.s3.amazonaws.com/0/8860/666cb533-cbe3-4c0a-8d2a-15a09c2a9ca9.png)

- Name
    - アプリケーションの名前です。通知を受けた端末上に表示されます
- Type
    - アプリケーションの種類です。今回はApplicationにします。
    - その他PluginやScriptなどがあります
- Desctription/URL
    - 概要とURLを入力します。URLは無ければレポジトリのURLでも記入すればOKです。
- Icon
    - 必要に応じてuploadして設定します。これも通知を受けた端末上に表示されます。
    - デフォルトは青いPのアイコン

利用規約・APIの使う時の諸注意を確認してチェックをいれてCreate Applicationをクリックします。
ダッシュボードから先ほど作成したアプリケーションを開くとAPI tokenが表示されます
![Pushover__View_Application-6.png](https://qiita-image-store.s3.amazonaws.com/0/8860/1840e114-4fa1-8488-02eb-3b387338fef7.png)

# hubot側の設定
npmで[node-pushover-client](https://www.npmjs.com/package/node-pushover-client)が提供されているのでこれを利用します。hubotが特定のフレーズに反応してpushover apiにリクエストをするという簡単な作りになります。これが簡単なhubot-scriptのサンプルとなります。[call-regtan.coffee]( https://gist.github.com/regtan/27fa7959f4718c7ae8bb)

```coffeescript:call-regtan.coffee
pushoverClient = new push({user:YOUR_USER_TOKEN,token:YOUR_API_TOKEN})
```

この部分を上で取得したuser token/api tokenに書き換えてください。また、連続して呼び出されるのを防ぐために、pushoverで通知された時間をredisに記録し、一定時間以内は呼び出せないようにしてあります。これで突然のbot戦争に巻き込まれても安心ですね。

# 色々注意しておきたいところ
- pushover apiのrate limit
    - 1アプリケーションにつき7500req/month
    - そんなに呼ばれる前にサービスのあり方や仕事の仕方を考え直しましょう
    - [採用情報｜株式会社ドワンゴ](http://info.dwango.co.jp/recruit/)
- pushover apiの連続呼び出しについて
    - [Pushover: API](https://pushover.net/api#friendly)
    - 5秒開ける必要があります
    - http status 500が帰ってきます
- http status 4xxが帰ってきたら
    - [Pushover: API](https://pushover.net/api#friendly)
    - お前のrequestは間違っているのだからすぐにやめろ とのことです。

# まとめ
pushoverはこのようにアプリケーションを作成しなくてもcurlやメール送信でpush notificationを送信することができます。たとえば、実行に時間がかかる処理を流して、終了時にpush notificationを受け取るなどのことも可能です。
受け取る側もQuietHoursを設定することでプライベートな時間を邪魔されず通知を受け取ることが可能です。送る側も特に意識せずに呼び出すことができてとても便利ですね。

# 明日は
[ドワンゴアドベントカレンダー](http://qiita.com/advent-calendar/2014/dwango)18日目 @ixixiさんです。どうぞお楽しみに！