超簡単にブラウザPush通知を実装する方法【サーバー編】

### 追記
[特定のユーザーにブラウザPush通知を送信する方法](http://qiita.com/shigekid/items/4c13051df3564cb9eadc)を書きました(4/10)

## はじめに
[前回](http://qiita.com/shigekid/items/34cbe874a4ec83ab59e3)はOneSignalの基本的な設定とOneSignalの管理画面上からPush通知を送るところまでを書きました。
今回は前回の記事の設定が終わっている前提で話を進めますので、まだの方は以下からどうぞ。
[超簡単にブラウザPush通知を実装する方法【ブラウザ編】](http://qiita.com/shigekid/items/34cbe874a4ec83ab59e3)

## 前回の続き
毎回Push通知を手動で送るのはさすがに面倒ですよね。更にセグメントを切って送るとなるともっと面倒で収集がつかないですよね。
というわけで今回はシステム的にOneSignalのAPIをサーバーから叩いて、Push通知を送ってみましょう。
尚、セグメントを切る方法は今回やろうと思ったのですが、ちょっとまとめきれなかったので次回にさせて頂きます。
すみません^^;

## 今回のゴール
`ruby web_push.rb`コマンドでWebPush通知を送れるようになることをゴールとします。

## 必要なもの
 - [前回](http://qiita.com/shigekid/items/34cbe874a4ec83ab59e3)の承認まで一通り終わってること
 - OneSignalから発行される**OneSignal App ID**（これは前回取得したものと同じものです）
 - OneSignalから発行される**REST API Key**
 - サーバーサイドのプログラミング
 - Railsが動く環境

## 1.OneSignalの準備
まずOneSignalのAppIDとREST API Keyを取得します。
画像を見てもらえればわかると思いますが、OneSignalの左メニューにある**App Settings > Keys & IDs**を選択してください。
<img width="1091" alt="スクリーンショット_2016-04-08_21_13_17.png" src="https://qiita-image-store.s3.amazonaws.com/0/1389/d32e043a-b4ff-c01a-4418-2394c014f8ae.png">
これでOneSignalの準備は完了です。

## 2.プログラミング
次にサーバーサイドのプログラミングです。
..が、OneSignalはとても優しいですね。[このページ](https://documentation.onesignal.com/docs/notifications-create-notification)のExamplesに色々な言語のサンプルコードがありますので是非参考にしてみてください。
今回のこの記事ではRubyを扱います。

以下サンプルコードです。Productionで使ってるコードを一部使い回してるので若干の冗長さや不要な場所はあるかと思いますが、多めに見てくださいw

```ruby:web_push.rb
require 'active_support/core_ext'
require 'active_support/json'
require 'net/http'

module WebPush
  ProductionOneSignalAppId="1 で取得したOneSignalAppID"
  ProductionSignalRestAPIKey="1 で取得したREST API Key"

  def notification!
    params = {
      app_id: ProductionOneSignalAppId,
      rest_api_key: ProductionSignalRestAPIKey,
      headings: {en: "notification test", ja: "通知テストですよ"},
      contents: {en: "This is notification test", ja: "通知のテストですよ"},
      included_segments: ["All"]
    }
    one_signal_web_push(params)
  end

  def one_signal_web_push(params)
    raise "AppId or RestAPIKey is required" if params[:app_id].blank? || params[:rest_api_key].blank?
    raise "ContentsIsNone" if params[:contents].blank?
    params[:isChromeWeb] = true
    uri = URI.parse('https://onesignal.com/api/v1/notifications')
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    request = Net::HTTP::Post.new(uri.path,
                              'Content-Type' => 'application/json',
                              'Authorization' => "Basic #{params[:rest_api_key]}")
    request.body = params.as_json.to_json
    return http.request(request)
  end
end

include WebPush
notification!
```

ソースコードの説明は特別行ないませんが、include WebPushとnotification!メソッドでプッシュ通知が送られます。
ちなみになるべく使い回しが効くようにmoduleにしておくので必要でしたらご活用ください。Railsなら最後の二行を消せば普通に使い回せるとは思います。


## 3.実行
`ruby web_push.rb`を実行してください。
そうすると・・・。

<img width="362" alt="スクリーンショット_2016-04-08_21_52_04.png" src="https://qiita-image-store.s3.amazonaws.com/0/1389/86895328-a36f-20be-e3e6-f236d0c5f5ee.png">

届きましたね。
これでサーバーサイドから好きなタイトルと本文を送信することは出来るようになりました。
オプションを変えればアイコンや遷移先のURLも変更可能ですし、セグメントを切って送ることもできます。
また、どれだけ長い文章を送っても、このウィンドウが大きくなるだけで文章が途中で強制的に切られるということはなさそうなので、ご安心ください（？）
今回は以上です、お疲れさまでした。
次回こそはセグメントを切って送る方法を書きます！