LINE BOT APIを使って翻訳BOTを作ってみたよ!!

こんにちはこんにちは!エンジニアの永嶋です!

LINEのBOT APIがtrialで公開されましたね!

BOT API Trial Accountのご紹介 | LINE BUSINESS CENTER

運良く1万人の先着で登録することができたので翻訳BOT(日本語=>英語)を作って遊んでみました。herokuで公開してみたまとめ。

LINEでBOTの作成

何はともあれLINEのDeveloper画面からBOTを作成します。

LINE developers

設定しないといけないのはcallbackのところだけです。作ったBOTにメッセージがくるとこのURLがキックされます。気をつけるとこは以下。

いつもこーゆーエンドポイント公開しないといけない系はngrokを使っているのだけど、これだとうまくいかなかった。

Herokuにアプリ公開

別にHerokuじゃなくてもいいんですけど普段使っていて楽なのでRailsアプリで作成。以下がcallbackで呼ばれるコントローラーの内容です。適当に作ったので全部コントローラーに書くなよとかいうツッコミはナシでお願いしますw

引っかかりそうなのは最初の署名検証くらいですかね。あとprotect_from_forgeryの行を入れないとCSRFのもにゃもにゃで落ちます。APIリクエストまわりはドキュメント読んで頑張れば普通に動きます。

LINE Developers - BOT API - Overview

翻訳にはMicrosoftの翻訳APIを使っています。実はLINEよりこっちのほうがわかりずらくて大変だったwこのへんの記事が参考にしました。

Microsoft Translator APIを使ってみる - Qiita

class CallbackController < ApplicationController
    protect_from_forgery with: :null_session

    def index
        ## ちゃんとLINEから来たリクエストか署名で検証する
        channel_secret = ENV["LINE_CHANNEL_SECRET"]
        http_request_body = request.raw_post
        hash = OpenSSL::HMAC::digest(OpenSSL::Digest::SHA256.new, channel_secret, http_request_body)
        signature = Base64.strict_encode64(hash)
        if signature != request.headers["X-LINE-CHANNELSIGNATURE"]
            render json: [], status: :ng
            return
        end

        ## だれからのメッセージかとその内容
        from = params[:result][0][:content][:from]
        text = params[:result][0][:content][:text]

        ## 翻訳結果をメッセージ
        translated = translate(text)
        line_messaging(from, translated)
        render json: [], status: :ok
    end

    private
        def line_messaging to, text
            RestClient.proxy = ENV["FIXIE_URL"]
            request_headers = {
                "Content-Type": "application/json",
                "X-Line-ChannelID": ENV["LINE_CHANNEL_ID"],
                "X-Line-ChannelSecret": ENV["LINE_CHANNEL_SECRET"],
                "X-Line-Trusted-User-With-ACL": ENV["LINE_CHANNEL_MID"]
            }
            request_params = {
                to: [to],
                toChannel: 1383378250, # この値はFIXらしいです
                eventType: "138311608800106203", # この値はFIXらしいです
                content:{
                    contentType: 1,
                    toType: 1,
                    text: text
                }
            }
            RestClient.post 'https://trialbot-api.line.me/v1/events', request_params.to_json, request_headers
        end

        def translate text
            request_params = {
                client_id: ENV["MS_CLIENT_ID"],
                client_secret: ENV["MS_CLIENT_SECRET"],
                scope: "http://api.microsofttranslator.com",
                grant_type: "client_credentials"
            }
            res = RestClient.post 'https://datamarket.accesscontrol.windows.net/v2/OAuth2-13', request_params
            access_token = JSON.parse(res)["access_token"]

            request_params = {
                appId: "Bearer #{access_token}",
                from: "ja",
                to: "en",
                text: text
            }
            res = RestClient.get 'https://api.microsofttranslator.com//V2/Ajax.svc/Translate', params: request_params
            res.scan(/".*"/).first.gsub(""", "")
        end

end

Server IP Whitelistの設定

BOT APIは特定のIPからのリクエストしか受け付けてくれません。なのでそのIPを設定します。HerokuでアウトのIPを固定にするには Fixie というAddonを使います。

LINE developers2

完成!あとは公開するだけ!

アプリを公開して上記の設定を完了すれば動きます!簡単ですね!

Trial版ということでまだまだ機能は少ないのですが、すごい可能性を感じました。IOTとかにも使えそうです。以上まとめでしたー。

イタンジ株式会社ではエンジニアを募集しています

募集しています!一緒に開発しましょう!

不動産業界を怠惰・短気・傲慢な気持を持って徹底的に革新するエンジニア募集! - イタンジ株式会社の新卒・インターンシップ - Wantedly