こんにちはこんにちは!エンジニアの永嶋です!
BOT API Trial Accountのご紹介 | LINE BUSINESS CENTER
運良く1万人の先着で登録することができたので翻訳BOT(日本語=>英語)を作って遊んでみました。herokuで公開してみたまとめ。
LINEでBOTの作成
何はともあれLINEのDeveloper画面からBOTを作成します。
設定しないといけないのはcallbackのところだけです。作ったBOTにメッセージがくるとこのURLがキックされます。気をつけるとこは以下。
- https必須
- ポート番号もつける(https://myserver.com:443/line_callback とかになる)
- ngrokとかのトンネルサービスだとうまく動かない
いつもこーゆーエンドポイント公開しないといけない系は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を使います。
完成!あとは公開するだけ!
アプリを公開して上記の設定を完了すれば動きます!簡単ですね!
Trial版ということでまだまだ機能は少ないのですが、すごい可能性を感じました。IOTとかにも使えそうです。以上まとめでしたー。
イタンジ株式会社ではエンジニアを募集しています
募集しています!一緒に開発しましょう!
不動産業界を怠惰・短気・傲慢な気持を持って徹底的に革新するエンジニア募集! - イタンジ株式会社の新卒・インターンシップ - Wantedly