とあるプロダーツプレイヤーの徒然日記

とあるプロダーツプレイヤーが徒然なるままによしなし事をそこはかとなく書きつくろいます

LINEBotって簡単じゃない?

本日は

最近、巷で流行りのBotですが、LINEボットって本当に簡単にできるんです。 ちょっと、会社で紹介する機会があったのでこちらでも。

まずは申請しましょう

https://business.line.me/ja/

申請画面

f:id:yamadagenki:20160623233303p:plain

こんな画面になる

f:id:yamadagenki:20160623233313p:plain

こんな画面になる(続き)

f:id:yamadagenki:20160623233247p:plain

この辺の値が大事

f:id:yamadagenki:20160623233254p:plain

ここのURLをちゃんと設定する

f:id:yamadagenki:20160623233240p:plain

ここのURLは

SSLじゃなくては行けないらしい。 ※巷では、Let's Encryptではダメとかいう都市伝説があるが、都市伝説です。

routes.rbを設定する

  # line bot
  post '/callback' => 'bot#callback'

設定を書く

CHANNEL_ID = ENV['LINE_CHANNEL_ID']
CHANNEL_SECRET = ENV['LINE_CHANNEL_SECRET']
CHANNEL_MID = ENV['LINE_CHANNEL_MID']

controllerを書く

# rubocop:disable all
def callback
  render nothing: true, status: 470 unless validate_signature? #アクセス制限
  result = params[:result][0]
  text_message = result['content']['text'] #送信された単語
  from_mid = result['content']['from'] #送信された相手

  client = Line::Bot::Client.new do |config|
    config.channel_id     = CHANNEL_ID
    config.channel_secret = CHANNEL_SECRET
    config.channel_mid    = CHANNEL_MID
  end

  client.send_text([送信先MID], text: text_message) #※※補足あり

  render nothing: true, status: :ok
end
# rubocop:enable all

LINEからのアクセスのみ許す

  # LINEからのアクセスか確認.
  # 認証に成功すればtrueを返す。
  def validate_signature?
    signature = request.headers['X-LINE-ChannelSignature']
    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

ちなみに

こんな便利なgemがある http://qiita.com/gogotanaka/items/9885ef202066e5d6eff9

gem 'line-bot'

言葉以外いろいろできる

client.send_text(["uxxxxxxxxxxxxx"],
  text: "Hi!"
)

client.send_image(["uxxxxxxxxxxxxx"],
  originalContentUrl: "http://example.com/original.jpg",
  previewImageUrl: "http://example.com/preview.jpg"
)

client.send_video(["uxxxxxxxxxxxxx"],
  originalContentUrl: "http://example.com/original.jpg",
  previewImageUrl: "http://example.com/preview.jpg"
)

client.send_audio(["uxxxxxxxxxxxxx"],
  originalContentUrl: "http://example.com/original.m4a",
  contentMetadata: {
    "AUDLEN" => "240000"
  }
)

更にちなみに

ユーザローカルという会社で人工知能会話APIを提供している(無料)

http://www.userlocal.jp/news/201605101/

スクリーンショット 2016-06-23 23.12.11.png (1.4 MB)

結果

f:id:yamadagenki:20160623233833p:plain