Ruby on rails でLine push（プッシュ）メッセージ（ブロードキャスト）を送る

## 概要
LINEAPIでメッセージを送る場合、応答メッセージとプッシュメッセージの大きく２つに分けられます。
応答メッセージはオウム返しのような、ユーザーのアクションに対して応答するタイプで、プッシュメッセージはユーザーのアクションに関係なく、サーバーサイドからプログラムを実行し、メッセージを送れるタイプです。

ネット上の記事を見渡すと応答メッセージに関するLINEボットの記事がたくさんあるのに対し、プッシュメッセージについて書かれた記事があまりなかった印象を受けたのに加えある一定の需要がありそうなので書き残しておきます。


## 環境
- Ruby(2.2以上)
- Rails(5以上)

## 今回やりたいこと
[公式のドキュメント](https://developers.line.biz/ja/docs/messaging-api/sending-messages/#methods-of-sending-message)に書いてあるようにヘッダーにアクセストークン、bodyに送りたい相手のユーザーID（ブロードキャストの場合不要）、メッセージの内容を格納してAPIを叩く(postする)ことでメッセージを送信できます。

このcurlコマンドの内容をRubyで書き換えることが今回のゴールです。

以上のことを踏まえて手順を細分化すると
1. Line Developerで自分のアクセストークンとユーザーIDを取得
2. curlコマンドを叩いてメッセージが自分のアカウントに送信できているか確認
3. Rubyでコードを書く。
4. リファクタリング（出来たら）

という流れになります。
一つ一つ見ていきましょう。

## 1.Line Developerで自分のアクセストークンとユーザーIDを取得
LINE Developerのマイページに書いてあるYour user IDが自分のアクセストークンに該当し Channel Access Tokenがアクセストークンに該当します。
詳しい記事は割愛しますので他の記事や[公式ドキュメント](https://developers.line.biz/ja/docs/messaging-api/channel-access-tokens/)をご参照ください。

## 2.curlコマンドで確認

### ブロードキャスト（友達全員に送信）の場合
```
curl -v -X POST https://api.line.me/v2/bot/message/broadcast \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer {channel access token}' \
-d '{
    "messages":[
        {
            "type":"text",
            "text":"Hello, world1"
        },
        {
            "type":"text",
            "text":"Hello, world2"
        }
    ]
}'
``` 

この該当部分（ヘッダーのアクセストークン）を変更しメッセージが遅れてるか確認。

### マルチキャスト（特定の複数ユーザーに送信）の場合

```
curl -v -X POST https://api.line.me/v2/bot/message/multicast \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer {channel access token}' \
-d '{
    "to": ["U4af4980629...","U0c229f96c4..."],
    "messages":[
        {
            "type":"text",
            "text":"Hello, world1"
        },
        {
            "type":"text",
            "text":"Hello, world2"
        }
    ]
}'
```
この場合は送りたい相手のユーザーIDが必要です。
自分のIDはマイページから確認できますが友達のIDは友だち追加やメッセージの受信をトリガーにIDを取得できるコードを書いて格納するのが一般的です。

その他の送信方法は公式ドキュメントをご参照ください。

## 3.Rubyで書き換える

### 実際のコード（ブロードキャスト）
``` message.rb
class Message
    def broad_push
        require 'net/http'
        require 'uri'
        require 'json' 

        token = ENV["LINE_CHANNEL_TOKEN"]
        # post先のurl
        uri = URI.parse('https://api.line.me/v2/bot/message/broadcast')
        http = Net::HTTP.new(uri.host,uri.port)
        http.use_ssl = true

        # Header
        headers = {
            'Authorization'=>"Bearer #{token}",
            'Content-Type' =>'application/json',
            'Accept'=>'application/json'
        }
        send_message = #自分が送りたいメッセージ
        # Body
        params = {"messages" => [{"type" => "text", "text" => send_message}]}

        response = http.post(uri.path, params.to_json, headers)
    end
end
```
今回はブロードキャストで実装しましたが他のマルチキャスト等も流れはほとんど同じで、bodyとurlを変更するだけで実装できます。

今回は環境変数を格納するにあたり.envファイルで管理しています。（githubに間違えてプッシュしないように）
Rails環境下でしか使えないのでお気をつけください。

## rake taskで定期実行
``` push_message.rb
namespace :push_message do
    desc "line ブロードキャスト機能で友達全員に明日の予定をプッシュする"
    task tomorrow_plans: :environment do 
        message = Message.new 
        message.broad_push
    end
end
```
Herokuなどで決まった時刻に定期実行したい場合はrake taskで実行できるようにtaskに切り出しておくと便利です。

今回は

``` command 
rake push_message:tomorrow_plans 
```
のコマンドで実行出来ます。



[rake taskの解説記事](https://qiita.com/suzuki-koya/items/787b5562d2ae1a215d94)

## まとめ
如何でしたでしょうか？
実用的なアプリを作りたい場合プッシュメッセージは案外使うケースが多いと思うので、是非参考にして頂けると幸いです。Lineが提供しているgemを使用して書くことも出来ますがこのようなシンプルにpostするだけなので短い処理であれば使う必要はないと思います。