概要
LINEAPIでメッセージを送る場合、応答メッセージとプッシュメッセージの大きく2つに分けられます。
応答メッセージはオウム返しのような、ユーザーのアクションに対して応答するタイプで、プッシュメッセージはユーザーのアクションに関係なく、サーバーサイドからプログラムを実行し、メッセージを送れるタイプです。
ネット上の記事を見渡すと応答メッセージに関するLINEボットの記事がたくさんあるのに対し、プッシュメッセージについて書かれた記事があまりなかった印象を受けたのに加えある一定の需要がありそうなので書き残しておきます。
環境
- Ruby(2.2以上)
- Rails(5以上)
今回やりたいこと
公式のドキュメントに書いてあるようにヘッダーにアクセストークン、bodyに送りたい相手のユーザーID(ブロードキャストの場合不要)、メッセージの内容を格納してAPIを叩く(postする)ことでメッセージを送信できます。
このcurlコマンドの内容をRubyで書き換えることが今回のゴールです。
以上のことを踏まえて手順を細分化すると
- Line Developerで自分のアクセストークンとユーザーIDを取得
- curlコマンドを叩いてメッセージが自分のアカウントに送信できているか確認
- Rubyでコードを書く。
- リファクタリング(出来たら)
という流れになります。
一つ一つ見ていきましょう。
1.Line Developerで自分のアクセストークンとユーザーIDを取得
LINE Developerのマイページに書いてあるYour user IDが自分のアクセストークンに該当し Channel Access Tokenがアクセストークンに該当します。
詳しい記事は割愛しますので他の記事や公式ドキュメントをご参照ください。
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で書き換える
実際のコード(ブロードキャスト)
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で定期実行
namespace :push_message do
desc "line ブロードキャスト機能で友達全員に明日の予定をプッシュする"
task tomorrow_plans: :environment do
message = Message.new
message.broad_push
end
end
Herokuなどで決まった時刻に定期実行したい場合はrake taskで実行できるようにtaskに切り出しておくと便利です。
今回は
rake push_message:tomorrow_plans
のコマンドで実行出来ます。
まとめ
如何でしたでしょうか?
実用的なアプリを作りたい場合プッシュメッセージは案外使うケースが多いと思うので、是非参考にして頂けると幸いです。Lineが提供しているgemを使用して書くことも出来ますがこのようなシンプルにpostするだけなので短い処理であれば使う必要はないと思います。