Line botの導入の仕方
ここではrailsで実装したサーバーをHerokuで実行してLine botを作っています。
Gitのアカウントは持っている前提で進めます。持っていない人は以下のサイトが参考になると思います。
GitHubアカウント作成とリポジトリの作成手順 - Qiita
1. Developer用のLineアカウントをゲットする
2. Channel SecretとChannel Access Tokenをゲットする
以下サイトを参考にしてアカウント作成からChannel SecretとChannel Aceess Tokenをゲットしてみてくだい。
わずか5分。新LINE Messaging APIでbotを作ってみた手順全公開 - BITA デジマラボ
3. サーバープログラムの作成
今回はLineで呟いたものを返答してくれるbotを作成します。
まずはrailsの初期ファイル群を作成します。
rails new botApp
次にサーバープログラムを作成していきます。
公式サイトでも紹介されている以下のAPIを利用。
botApp/app/controllers/webhook_controller.rb
require 'line/bot' class WebhookController < ApplicationController protect_from_forgery with: :null_session # CSRF対策無効化 def client @client ||= Line::Bot::Client.new { |config| config.channel_secret = ENV["LINE_CHANNEL_SECRET"] config.channel_token = ENV["LINE_CHANNEL_TOKEN"] } end def callback body = request.body.read signature = request.env['HTTP_X_LINE_SIGNATURE'] # this statement maybe mistake. unless client.validate_signature(body, signature) error 400 do 'Bad Request' end end events = client.parse_events_from(body) events.each { |event| case event when Line::Bot::Event::Message case event.type when Line::Bot::Event::MessageType::Text message = { type: 'text', text: event.message['text'] } response = client.reply_message(event['replyToken'], message) when Line::Bot::Event::MessageType::Image, Line::Bot::Event::MessageType::Video response = client.get_message_content(event.message['id']) tf = Tempfile.open("content") tf.write(response.body) end end } render status: 200, json: { message: 'OK' } end end
次にGemfileを以下のように修正。
Gemfile
修正前
# Use sqlite3 as the database for Active Record get 'sqlite3'
修正後
gem 'sqlite3', group: :development # 本番ではpostgressを使用する gem 'pg', group: :production gem 'rails_12factor', group: :productio
また、
gem 'line-bot-api'
も追加。
*注意点
実はこれだけではForbidden 403というエラーが出たのであとで修正をします。
4. 作成したプログラムをgitにコミット
git init git add . git commit -m "initial commit"
5. Herokuへのデプロイ
まずはHerokuのアプリを登録するところを確保します。
heroku apps:create botAPPheroku
ここでbotAPPherokuは適当な名前で!他のひとが使っている名前は使えません。
次にこのスペースに先ほど作ったサーバープログラムを登録します。また、その際にLINE_CHANNEL_SECRETとLINE_CHANNEL_TOKENの変数も登録して下さい。
git push heroku master heroku config:set LINE_CHANNEL_SECRET="Lineのdeveloperアカウントで取得したchannel_secret" heroku config:set LINE_CHANNEL_TOKEN="Lineのdeveloperアカウントで取得したchannel_token"
git push heroku masterの時点でサーバーアプリは起動します。
6. Fixieアドオンを使う
このFixieアドオンを使うことでプロキシ経由の通信ができます。(Line botはHTTPSによる通信でないとできないためこのようなことをします。)
heroku addons:create fixie:tricycle
これによりherokuのアプリページにfixieアドオンが追加されています。
fixieアドオンのページに飛んでもらい右上のaccountをクリックするとプロキシURLとIPアドレスが作成されています。
これをメモしてください。
heroku config:set FIXIE_URL="example.com"
exmple.comにはプロキシURLを設定してください。
8. LineアカウントでコールバックURLとホワイトリストの設定
アカウントペーにcallback URLという欄があるので以下のように入力してください。隠れているところにはherokuに作ったアプリページ名を。
ホワイトリストは左のメニューバーに
「Server IP Whitelist」
があるので選択。
表示されるページにIPアドレスを入力できるスペースがあるので先ほどfixieで取得したIPアドレスを入力。
7. サーバーアプリのログを見る
heroku logs -t
ここで紐づけられたLineアカウントにコメントしてみましょー
おそらく何も返ってこないでしょう。
はい、足りないものがありました。
8. プログラムの修正
プロキシを通す際には設定がhttpクラスに設定が必要でした。
botApp/app/controllers/webhook_controller.rbに以下の行を追加。
module Line module Bot class HTTPClient def http(uri) proxy = URI(ENV["FIXIE_URL"]) http = Net::HTTP.new(uri.host, uri.port, proxy.host, proxy.port, proxy.user, proxy.password) if uri.scheme == "https" http.use_ssl = true end http end end end end ...
修正後、gitに追加、コミット、herokuへpushすると、、、
こんな感じでつぶやきが返ってきました。
次はこれをIFTTTとの連携に活かしてみます。
この記事は以下も参考にしました。