読者です 読者をやめる 読者になる 読者になる

Ola Kae Tode Tai

すべてのエンジニアに、追い風を祈る。

LINE BOT APIでボットを作ってみた

プログラミング

f:id:kironono:20160409194855p:plain

LINEのメッセージングAPIがオープン化されるようで、その一歩としてボットアカウント用の開発APIである「BOT API Trial Account」が公開されたみたいです。

2016年4月7日現在、先着10000アカウント分のBOTアカウント(TRIAL_BOT)が無償で提供されています。

BOT API Trial Account の取得は LINE BUSINESS CENTER から登録することで利用できるようになります。

business.line.me

本日登録したところ、BOT API Trial Accountを作成できたので Ruby / Rails でEchoボットを作ってみました。

API呼び出しを試してみる

BOT API Trial Account を作成すると、LINE Developers の管理画面からBOT APIのトークン等が取得できます。また Callback URL を設定することで、BOTがメッセージを受信したときに、HTTPS POSTで任意のURLを呼び出してくれます。

f:id:kironono:20160409200822p:plain

とりあえず、BOTアカウントが作成できているか確認するには、BOT自身のプロフィールを取得するAPIを叩いてみるとよいかもです。

$ curl -H "X-Line-ChannelID: {Channel ID}" \
-H "X-Line-ChannelSecret: {Channel Secret}" \
-H "X-Line-Trusted-User-With-ACL: {MID}" \
-XGET https://trialbot-api.line.me/v1/profiles?mids={MID}

正しくAPIが呼べると下のようなレスポンスが得られます。

{
  "contacts":[
    {
      "displayName":"tricolore",
      "mid":"{MID}",
      "pictureUrl":"http://dl.profile.line-cdn.net/0m01541c4d725102ba8dc4186ec8d2f1818c16fd2c19f9",
      "statusMessage":""
    }
  ],
  "count":1,
  "display":1,
  "pagingRequest":{
    "start":1,
    "display":1,
    "sortBy":"MID"
  },
  "start":1,
  "total":1
}

APIの呼び出し元のIPアドレスはServer IP Whitelistで事前に設定しておく必要がある点に注意が必要です。

EchoボットをRailsアプリとして作る

github.com

module LineBotApi

  class Client
    TO_CHANNEL = 1383378250
    EVENT_TYPE = "138311608800106203"
    EVENT_URL = 'https://trialbot-api.line.me/v1/events'
    attr_accessor :channel_id, :channel_secret, :channel_mid, :proxy

    def initialize(options = {})
      options.each do |key, value|
        instance_variable_set("@#{key}", value)
      end
    end

    def credentials
      {
        "X-Line-ChannelID": channel_id,
        "X-Line-ChannelSecret": channel_secret,
        "X-Line-Trusted-User-With-ACL": channel_mid,
      }
    end

    def send_text_message(to, message)
      RestClient.proxy = proxy unless proxy.nil?
      request_headers = credentials.merge({
        "Content-Type": "application/json",
      })
      request_params = {
        to: [to],
        toChannel: TO_CHANNEL,
        eventType: EVENT_TYPE,
        content: {
          contentType: 1,
          toType: 1,
          text: message,
        }
      }
      RestClient.post EVENT_URL, request_params.to_json, request_headers
    end

  end
end
class MessageReceivesController < ApplicationController

  protect_from_forgery with: :null_session
  before_action :get_client

  def callback
    params[:result].each do |result|
      from = result[:content][:from]
      text = result[:content][:text]
      @client.send_text_message(from, text) if text.present?
    end
    render json: [], status: :ok
  end

  private

  def get_client
    options = {
      channel_id: ENV['LINE_CHANNEL_ID'],
      channel_secret: ENV['LINE_CHANNEL_SECRET'],
      channel_mid: ENV['LINE_CHANNEL_MID'],
      proxy: ENV['FIXIE_URL'],
    }
    @client = LineBotApi::Client.new(options)
  end

end

こんな感じでコントローラとLINE BOT API呼び出し部分を作って、Herokuにデプロイしてみました。

Callback URLの設定

Callback URL に設定できるのは、https のみのようです。さらに、 https://example.com:443/callback のようにポート番号も含めないと登録できませんでした。

また、利用するSSL証明書によってはCallback URLが呼び出されないようです。(Rapid SSL はダメな模様) 今回Herokuにデプロイしたので、最初から有効になっている https://{app-name}.herokuapp.com を使いました。

Server IP Whitelist の設定

BOT API の呼び出し元IPアドレスを予め登録して置かなければなりませんが、Herokuの場合IPアドレスが変わってしまうので、Fixie アドオンを使います。 Fixieを経由することでアウトバウンドのIPアドレスを固定することができます。

f:id:kironono:20160409202813p:plain

2種類のアウトバウンドIPアドレスが発行されるので2つともWhitelistに登録しておきます。

試してみる

LINE Developers の管理画面に表示されているQRコードから友達追加をして、トーク画面を開きます。

f:id:kironono:20160409204028p:plain

適当にメッセージを送るとそのままオウム返しするボットが出来上がりました。

単純なテキストメッセージのみ試してみましたが、画像、動画、スタンプの送信、リッチメッセージの送信等いろいろできるみたいです。

正式にメッセージングAPIがオープン化されるまで、トライアルアカウントはきっと使えると思うのでいろいろ試してみようと思います。 ちなみに、トライアルアカウントは友だち登録可能なユーザー数が50名までに制限されているのであくまでお試し用途ですね。