参考にした記事
Line Messaging API オウム返しBot(rails × heroku)
- オウム返しをしてくれるBOTを最速で作成しましょう!
- 所要時間目安30〜60分
環境構築
アカウント
まずはLINEのアカウントを作成しましょう
下記を参考に
https://developers.line.me/messaging-api/getting-started
LINE認証情報について
アカウント作成が完了したら以下にアクセス
https://business.line.me/ja/
LINE developersのBasic Informationに以下の記載があります
- Channel ID
- Channel Secret
- Channel Access Token
上記を控えておいて下さい
Heroku
fixieインストール
以下を参考に
LINE BOT をとりあえずタダで Heroku で動かす
こちらはHerokuの操作コマンドもまとめて掲載されています
LINE BOTを動かす環境を調べてみた
herokuアカウント作成後、fixieをインストール
heroku addons:create fixie:tricycle
アカウント設定を確認
- Proxy URL
- Outbound IPs
上記を控えておいて下さい
LINE developersでServer IP Whitelist設定
https://business.line.me/ja/
アカウントリストから対象のアカウントのLINE developersへアクセスして下さい
画面左のタブからServer IP Whitelistをクリック
上記で控えたOutbound Ips
をIP addressに設定して下さい
(/ 以降は一旦気にしないでください)
LINE developersでWebhook URL設定
LINE developersでServer IP Whitelist設定と同様に画面左のタブのBasic Informationクリック
Webhook URL
下記を追記してください
https://{ご自身のherokuアプリ名}.herokuapp.com:443/callback
Herokuのキー設定
herokuに環境変数の設定を行います
heroku config:add OUTBOUND_PROXY = '先ほどメモした設定値'
heroku config:add CHANNEL_SECRET = '先ほどメモした設定値'
heroku config:add CHANNEL_ACCESS_TOKEN = '先ほどメモした設定値'
実装
rails
gem
gem 'dotenv-rails'
gem 'faraday'
gem 'faraday_middleware'
// heroku用
group :production do
gem 'rails_12factor'
end
上記を追記して下さい
line_client
lib/line_client.rb
line_client.rbには主にLINEからの返信内容に関する、実装がされています
class LineClient
END_POINT = "https://api.line.me"
def initialize(channel_access_token, proxy = nil)
@channel_access_token = channel_access_token
@proxy = proxy
end
def post(path, data)
client = Faraday.new(:url => END_POINT) do |conn|
conn.request :json
conn.response :json, :content_type => /\bjson$/
conn.adapter Faraday.default_adapter
conn.proxy @proxy
end
res = client.post do |request|
request.url path
request.headers = {
'Content-type' => 'application/json',
'Authorization' => "Bearer #{@channel_access_token}"
}
request.body = data
end
res
end
def reply(replyToken, text)
messages = [
{
"type" => "text" ,
"text" => text
}
]
body = {
"replyToken" => replyToken ,
"messages" => messages
}
post('/v2/bot/message/reply', body.to_json)
end
end
上記の def reply(replyToken, text)
のtextにBotに対して入力した
文字列情報が格納されていて、Json型式で内容をそのまま返却する実装です
コントローラ
webhook_controller.rb
class WebhookController < ApplicationController
// Lineからのcallbackか認証
protect_from_forgery with: :null_session
CHANNEL_SECRET = ENV['CHANNEL_SECRET']
OUTBOUND_PROXY = ENV['OUTBOUND_PROXY']
CHANNEL_ACCESS_TOKEN = ENV['CHANNEL_ACCESS_TOKEN']
def callback
unless is_validate_signature
render :nothing => true, status: 470
end
event = params["events"][0]
event_type = event["type"]
replyToken = event["replyToken"]
case event_type
when "message"
input_text = event["message"]["text"]
output_text = input_text
end
client = LineClient.new(CHANNEL_ACCESS_TOKEN, OUTBOUND_PROXY)
res = client.reply(replyToken, output_text)
if res.status == 200
logger.info({success: res})
else
logger.info({fail: res})
end
render :nothing => true, status: :ok
end
private
# verify access from LINE
def is_validate_signature
signature = request.headers["X-LINE-Signature"]
http_request_body = request.raw_post
hash = OpenSSL::HMAC::digest(OpenSSL::Digest::SHA256.new, CHANNEL_SECRET, http_request_body)
signature_answer = Base64.strict_encode64(hash)
signature == signature_answer
end
end
res = client.reply(replyToken, output_text, user)
先程作成した line_client.rb
に入力値 output_text
を渡しています
ルート設定
config/routes.rb
Rails.application.routes.draw do
post '/callback' => 'webhook#callback'
end
デプロイ
一応Herokuのコマンドについては以下を参考に
Heroku コマンド・設定 メモメモ
git add .
git commit -m "任意のコメント"
git push heroku master
試してみよう
作成したLINE BOTを友だち追加してテストしてみましょう
うまく動かない場合は heroku logs -t
でエラー内容を確認しましょう
最後に
ここまでできてしまえば後は
https://devdocs.line.me/ja/#webhooks
上記のリファレンスを参考に
リファレンスには上記の実装方法など詳細に記載がありますのでいろいろなことを試してみましょう
わたしも先月はじめてLINE BOT作ってみましたが、
結構な時間を環境構築にかけてしまいました
わたしのように時間をかけないでいただけたら幸いです
つくってみて正直とってもおもしろかったですね
わたしはgoogleの検索エンジンと連携してCarouselで
表示することまでやってみました
まだまだできることが盛り沢山なのでいろいろ試したいですね