はじめに
「プログラムとLINEを連携して通知したい」って思ったことはないでしょうか。
ググると、すぐにLINE Notifyがヒットし、そのまま登録、APIドキュメントを読むと、curl
コマンドでターミナルから通知が出来そうだということまではわかります。
でも、Webアプリに組み込むならプログラムを書いて実装したいのに良く分からない…
そんな思いを持つあなたに向けて記事を書きました。
今回はターミナルで任意の文字列を入力して、自分のLINEに通知するところまでをゴールとしていますが、これを応用すればあとは変数を変えるだけで、Rubyを使用したアプリケーションに組み込むための第一ステップがクリアでき、目的の「プログラムとLINEを連携して通知」が出来るきっかけになるのではと思います。
この記事が役に立つ方
- LINE Notifyを使ってみたい
- HTTPクライアントは
HTTPClient
を使いたい - Ruby初心者
この記事のメリット
- LINE Notifyを使ったプログラムの書き方が分かる
-
HTTPClient
の使い方が分かる
環境
- macOS Catalina version 10.15.1
- シェル:zsh
- Ruby 2.6.3
- HTTPクライアント:
HTTPClient
【事前準備】トークンの取得からHTTPリクエストに必要な情報のメモまで
1. LINE Notifyにログイン・マイページに移動
右上から普段使っているLINE IDでログイン可能です。
ログイン後、「マイページ」に移動して下さい。
2. トークンを発行する
マイページ下部の「トークンを発行する」をクリックして下さい。
「トークン名」を任意で入力し、通知するトークンルームを選択します。
今回は試すだけなので、
- トークン名を「test」
- 通知するトークンルームを「1:1でLINE Notifyから通知を受け取る」
として自分だけが受け取るようにします。
3. トークンをメモする
トークンは発行時にしか確認が出来ないので、必ずコピペでどこかにメモしておきましょう。
※メモし忘れたらやり直しです。
以下のように、マイページで「連携中サービス」に「From:test」が出ていれば準備はOKです。
今回使用する機能
LINE Notify API Documentの真ん中あたりにある「通知系」
POST https://notify-api.line.me/api/notify
が今回使用する機能です。
では、次はこのAPIドキュメントに記載のcurl
コマンドを確認します。
curl
コマンドで送る場合
もしプログラムを書く必要がなくて、ターミナルから送れるだけで満足!という方はここでおしまいです!
POST https://notify-api.line.me/api/notify
の最下部に以下curl
コマンドがサンプルとして記載されています。
メモしたトークンが合致するかの確認も含め、無事に通知が来るかどうか、一度試してみるといいと思います。
curl -X POST -H "Authorization: Bearer 取得したトークン" -F "message=送りたい文章" https://notify-api.line.me/api/notify
このcurl
コマンドをHTTPClient
を使って実装したものが本題のRubyプログラムです。
自分はHTTPメッセージの構造について理解が不十分だったので、ここから苦労しました。
以下、自分が理解するために活用したサイトです。
また、英語ですがこちらの動画も1分半でコンパクトにまとまっていて、わかりやすかったです。
Parts of an HTTP Request - YouTube
ちなみに、Ruby標準搭載のHTTPクライアントnet/http
を使用して実装する場合は、以下サイトにコピペすると一瞬でRubyプログラムが仕上がります。便利!
curl-to-ruby: Convert curl commands to ruby’s net/http
LINE Notify API Documentからメモしておく情報
HTTPリクエストを作成・送信するため、
リクエストメソッド・ヘッダ・パラメータが必要です。
LINE Notify API Documentで必要な部分を以下にキャプチャしておきました。
まとめると、今回のLINE通知に必要な情報は以下の通りです。
これらをプログラム上で反映させる必要があります。
項目 | 要素 | 値 |
---|---|---|
リクエストメソッド | - | POST |
リクエストヘッダ | Content-type | multipart/form-data |
リクエストヘッダ | Authorization | Bearer 取得したトークン |
リクエストパラメータ | message |
gets (標準入力) |
HTTPClientの使用方法についての理解には以下サイトを使用しました。(英語です)
Ruby HTTPClient tutorial
プログラム
では、実際のプログラムに移ります。
各行の意味はコメントをご参照下さい。
require 'httpclient'
# 定数を定義し、freezeで変更不可とする
URL = "https://notify-api.line.me/api/notify".freeze
TOKEN = "自分で取得したトークン".freeze
# httpclientを使ってリクエストの雛形を作成する
client = HTTPClient.new
# URIを指定
uri = URI.parse(URL)
# LINE Notify指定のリクエストヘッダを指定
header = {
"Content-type" => "multipart/form-data",
"Authorization" => "Bearer #{TOKEN}"
}
# 標準入力(ターミナル上でキーボードからの入力)を促す
puts "LINEで送信したい文章を入力してEnterを押して下さい"
# 表示するメッセージをクエリとして代入。その他画像等もここで入れることが出来る。
query = {
"message" => gets # `gets`で標準入力を受け取る
}
# POSTリクエストを作成し、レスポンスを`res`に代入
res = client.post(uri, query, header)
# リクエストだからといって、`res = client.request`とするとダメ。シンプルにpost。
# 引数を(uri, header, query)と順番を間違えてもエラーになる。
# レスポンスステータスコードを確認する
puts res.body
実行結果
無事動作するか確認してみましょう。
”status”:200
が出て、自分のLINEに通知が来れば大成功!
$ ruby line-notify.rb
LINEで送信したい文章を入力してEnterを押して下さい
お疲れ様でした! # 任意の文字列を入力
{"status":200,"message":"ok"}
おわりに
自分用に学習時間を記録するWebアプリを作成中で、一日の終わりにLINEで学習時間を通知する機能を実装したかったので、LINE Notifyを使ってみることにしたんですが...
HTTPの理解が全然出来ていなかったことでずっと400
や401
エラーと格闘してました。
書いたおかげで思考整理が出来てスッキリ!理解も深まりました!
ちなみに、HTTPClient
って人気ないんでしょうか?
ネット上ではnet/http
を使用した記事が多く、基本的に英語のドキュメントばかりだったので、ひと苦労でした。
参考にさせて頂いたサイト(いつもありがとうございます)
LINE Notify
Ruby HTTPClient tutorial
curl-to-ruby: Convert curl commands to ruby’s net/http
HTTP メッセージ - HTTP | MDN
Parts of an HTTP Request - YouTube
module function Kernel.#gets (Ruby 2.6.0)
超簡単LINE notify を使ってみる - Qiita