ラベル LINE Bot の投稿を表示しています。 すべての投稿を表示
ラベル LINE Bot の投稿を表示しています。 すべての投稿を表示

2017年5月21日日曜日

LINE Notify を使ってみた

概要

LINE Notify は通知用のサービスで公式の LINE Notify という公式アカウントと友達になることで通知を受け取ることができます
通知だけ受け取るのであれば、とりあえず curl から使えたので通知の使い方を紹介します

環境

  • CentOS 7.3.1611
  • LINE Notify (2017/05/17 時点)

使い方

まず https://notify-bot.line.me/ja/ にアクセスします
自分の LINE アカウントでログインしましょう

そして「マイページ」からアクセストークンを発行します
トークンを発行するとスマホの LINE アプリ側にも通知が来ます
line_notify1.png

トークンを発行する際にトークンの名前と通知先のグループを選択する必要があります
トークルームは選択できないようです
今回は「1:1 で LINE Notify から通知を受け取る」を選択しました

トークンが発行できたらリクエストを組み立てます
と言っても以下で終わりです

curl -X POST -H 'Authorization: Bearer your-access-token' -F 'message=foobar' https://notify-api.line.me/api/notify

API リファレンスはこのページの通知系を参照しています
your-access-token の部分に先程取得したトークンを設定してください
あとはリクエストすれば OK です

アプリ側の LINE Notify 公式アカウントから通知が来ると思います
トークンの名称も square bracket に囲まれて付与されるようです
line_notify2.jpg

最後に

LINE Notify を試してみました
公式アカウントを使った通知方法なのでアイコンなどは変更できないようです

Messaging API と違ってサーバを立てたり IP を固定したりする必要がないので簡単に使うことができます
個人的な用途で使う簡単な通知を実装したいだけであればこれで十分かもしれません

また、LINE Notify にはサービスという概念もあり他の人が使える通知サービスを作成することもできます
その場合は認証系の API を使う必要があるようです
そっちもそのうち試せればなーと思います

2017年2月4日土曜日

Line::Bot::API を使って LINE ボットを作成してみた

概要

噂の LINE BOT API を Ruby で使ってみました
ボットのデプロイ先は Heroku を使っています

環境

  • heroku-toolbelt 3.43.5
  • line-bot-api 0.16
  • sinatra 1.4.7
  • LINE BOT API および Business アカウント (2016/07/08 時点)

Line Business アカウント (ボットアカウント) の取得

これが一番面倒かもしれません

https://business.line.me/ja/products/4/introduction
の一番下に「利用開始」があるので選択します

まず、Business アカウントを取得する前に既存の LINE アカウントで Business Center にログインできるようにする必要があります

スクリーンショットがなくて申し訳ないですが申し込みの流れとしては

  1. メールアドレスの登録
  2. 登録したアドレスに届くメールに記載されている確認用の URL をクリック
  3. 個人情報の登録

で Business Center にログインできるようになります
作成できたら https://business.line.me/ja/ から LINE アカウントでログインしてください

するとようやく Business アカウントを作成できる画面になるので作成します
これが所謂、ボットアカウントになるのでボット用の画像と名前を設定してあげてください
try_line_bot_setting_business_account.png

このあと英語の利用規約が表示されるので同意してアカウントを作成しましょう

Business アカウントを作成したあとでほしい情報は「Channel ID」「Channel Secret」「MID」の 3 つになります
try_line_bot_check_any_keys.png

とりあえずこの 3 つが確認できれば Business アカウントの作成は OK です

ボットアプリの作成

Sinatra + Line::Bot::API を使ってボットアプリを作成していきます
なぜボットを Sinatra で作らなければいけないかと言うと LINE のボットはメッセージの受信を HTTPS で受け取り、メッセージの送信を LINE BOT API の REST API をコールすることで実現しています

流れとしては

  1. LINE アプリで誰かがボットに会話
  2. 会話の情報がデプロイしたボットアプリに HTTPS で POST リクエストとして飛んで来る
  3. ボットがリクエストを受ける
  4. リクエストを処理したあとでレスポンスとして送信するメッセージを送るために LINE BOT API の REST API をコールする

という流れになります (今回は)
なので Sinatra でボットを Web アプリ化する必要があります

でアプリの全容は以下の通りです

  • mkdir -p /path/to/work/line_bot
  • cd /path/to/work/line_bot
  • bundle init
  • vim Gemfile
# frozen_string_literal: true
# A sample Gemfile
source "https://rubygems.org"

gem 'sinatra', '1.4.7'
gem 'line-bot-api'
  • vim app.rb
require 'sinatra'
require 'line/bot'

class HTTPProxyClient
  def http(uri)
    proxy_class = Net::HTTP::Proxy(ENV["FIXIE_URL_HOST"], ENV["FIXIE_URL_POST"], ENV["FIXIE_URL_USER"], ENV["FIXIE_URL_PASSWORD"])
    http = proxy_class.new(uri.host, uri.port)
    if uri.scheme == "https"
      http.use_ssl = true
    end

    http
  end

  def get(url, header = {})
    uri = URI(url)
    http(uri).get(uri.request_uri, header)
  end

  def post(url, payload, header = {})
    uri = URI(url)
    http(uri).post(uri.request_uri, payload, header)
  end
end

def client
  @client ||= Line::Bot::Client.new { |config|
    config.httpclient = HTTPProxyClient.new
    config.channel_id = ENV["LINE_CHANNEL_ID"]
    config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
    config.channel_mid = ENV["LINE_CHANNEL_MID"]
  }
end

get '/' do
  "Hello, world"
end

post '/callback' do
  signature = request.env['HTTP_X_LINE_CHANNELSIGNATURE']
  unless client.validate_signature(request.body.read, signature)
    error 400 do 'Bad Request' end
  end

  receive_request = Line::Bot::Receive::Request.new(request.env)

  receive_request.data.each { |message|
    case message.content
    # Line::Bot::Receive::Message
    when Line::Bot::Message::Text
      puts message.content[:text]
      client.send_text(
        to_mid: message.from_mid,
        text: message.content[:text],
      )
    # Line::Bot::Receive::Operation
    when Line::Bot::Operation::AddedAsFriend
      puts 'send_sticker'
      client.send_sticker(
        to_mid: message.from_mid,
        stkpkgid: 2,
        stkid: 144,
        stkver: 100
      )
    end
  }

  "OK"
end
  • vim config.ru
require 'bundler'
Bundler.require

require './app'
run Sinatra::Application
$stdout.sync = true

で必要なファイルを作成したら、とりあえず OK です
ローカルで動作確認するのであれば

  • bundle install && bundle exec rackup config.ru

でエラーがでなければ OK です
実際にアクセスして動作確認するのは Heroku にデプロイしてから行います

Heroku へのデプロイ

ターミナル上でコマンドを実行してデプロイしていきます

  • cd /path/to/work/line_bot
  • git init
  • git add .
  • git commit -m “Initial Commit”
  • heroku create –app your-line-bot
  • heroku git:remote –app your-line-bot
  • git push heroku master
  • heroku config:set LINE_CHANNEL_ID=1111111111 LINE_CHANNEL_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx LINE_CHANNEL_MID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx –app your-line-bot

でとりあえずデプロイしましょう
設定している環境変数は Business アカウントを作成した際に取得した 3 つの情報を入力してください

Business アカウントのコールバック URL の設定

Business アカウントの設定画面にコールバック URL を設定する画面があります
このコールバック URL はボットに対して話かけた際にリクエストされるメッセージ受信用の URL になります
なので、ここには先程 Heroku にデプロイしたアプリの URL を設定します

try_line_bot_setting_callback_url.png

こんな感じで Heroku のアプリ名に合わせて設定すれば OK です
今回の場合、/callback でボット用のリクエストを受け取るので上記のように設定してください

Fixie アドオンの追加

Heroku で使う場合にはこの設定が必ず必要です
Fixie は Heroku からリクエストがある場合に送信元の IP を固定化するために使う Heroku のアドオンです

メッセージを送信するためには LINE BOT API をコールするのですが、API は送信元の IP アドレスをホワイトリストで管理して、その IP からしか叩けないようになっています

なので Fixie を挟んで Heroku からのリクエスト IP を固定化することで LINE BOT API をコールできるようにします

Heroku で Fixie アドオンを使うためにはまず Heroku アカウントにクレッジットカードを登録する必要があります
クレッジットカードを登録しますが Fixie 自体は無料で利用することができます

https://dashboard.heroku.com/account/billing

ここからクレッジットカードを登録します
登録できたら

  • cd /path/to/work/line_bot
  • heroku addons:create fixie:tricycle –app your-line-bot

でデプロイしたアプリに Fixie を追加することができます
追加に成功すると

Your IP addresses are xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx

という感じで固定 IP が払い出されるのでこれを Business アカウントのホワイトリストに追加してあげます

その前に Heroku 上にデプロイしたアプリにも Fixie のアクセス情報を渡す必要があるので heroku config:set で渡してあげます

  • cd /path/to/work/line_bot
  • heroku config:set FIXIE_URL_HOST=xxxxxxxxxxxx.usefixie.com FIXIE_URL_PORT=80 FIXIE_URL_USER=fixie FIXIE_URL_PASSWORD=xxxxxxxxxxxxx

おそらく、上記で変更する部分は「FIXIE_URL_HOST」と「FIXIE_URL_PASSWORD」の部分だと思います
これらの設定は「FIXIE_URL」という環境変数の値をバラバラにしただけなので、わからない場合は heroku config で FIXIE_URL の値を確認してください

Business アカウントのホワイトリストの設定

左メニュー上段に「Server IP Whitelist」という項目があるのでここで設定します
Fixie によって払いだされた IP をそのまま Add すれば OK です

try_line_bot_setting_white_list.png

設定は以上で完了です
いよいよ動作確認してみましょう

動作確認

ようやくこれでボットと会話できるようになります
ボットと会話するためにはボットと友達になる必要があります

Business アカウントの情報の一覧に QR コードがあります
これをスマホの LINE アプリで読み込むことでボットと友達になれます

友だち -> 右上追加アイコン -> QR コード

で読み取れば友だちに追加されます
追加されたらトークしてみましょう

以下のような感じでボットから返事が返ってくれば OK です
try_line_bot_result_line_app.png

Heroku のにデプロイした Sinatra アプリのアクセスログにも以下のように出力されていると思います
try_line_bot_result_heroku_logs.png

最後に

紹介は以上です
簡単にできると思ったんですが、Heroku の場合は Fixie を導入しなければいけなかったりと結構ハマりポイントがありました

触ってみた感じだとレスポンスを返す際に、他の API と絡めてうまい感じに返せると結構おもしろいボットが作れるんじゃないかと思いました

あとは cron 等で定期的にメッセージを送信できることができたりするともっといいなと思いました
メッセージ受信 -> 送信の流れではなく、いきなり送信というのができるようにすればできなくはないと思います

まだトライアルなので、今後どうなるかも気になるところです

Tips

その他、気になった点を紹介します

  • Heroku 上のアプリが寝てしまうとレスポンスが遅くなる
  • デバッグする方法

基本は Heroku 上のログを見れば OK です
今回 puts を入れていますが puts の出力も Heroku 上のログに出るので、適当に突っ込みながらデバッグするといいと思います
/callback に POST のリクエストが来て 200 を返していれば受信は OK です
送信に関しては Fixie をちゃんと経由してリクエストしているかを確認する必要があります
https://dashboard.usefixie.com/#/logs で自分の Fixie の利用状況を確認することができるので、ここで「//trialbot-api.line.me:443」にアクセスしているログが出ているか確認するといいと思います
もし出ていない場合は Heroku の環境変数がちゃんと設定されていない必要があるので heroku config で確認してください

参考 URL

2016年10月19日水曜日

LINE Messaging API をとりあえず試してみた

概要

10.18 に LINE BOT API Trial Account の廃止とともに LINE Messaging API が公開になりました
さっそく Messaging API を試してみたので紹介します

環境

  • LINE@ Manager 2016/10/19 時点の UI
  • LINE Developers 2016/10/19 時点の UI
  • Ruby 2.2.3p173
  • gem 2.4.5.1
    • sinatra 1.4.7
    • line-bot-api 1.0.0
  • Heroku + Fixie

LINE Business Center での作業

まずは、ボット用のアカウントの作成を行います

LINE Business Center へのログイン

LINE Business Center のサービス一覧から Messaging API を選択し Messaging API のトップ画面を表示したら「Messaging API を始める」を選択しましょう
try_line_msging_api_top_page.png

すると LINE Business Center にログインする画面になるのでログインしてください
このアカウントは普段スマホ等で利用している LINE アプリの ID/PW になります
try_line_msging_api_login.png

次に組織を選択する画面になるので組織情報を選択します
会社を登録したい場合には新規で追加しても良いですが、今回は個人で進めるのですでにある下の欄にある個人名義の組織を選択すれば OK です
try_line_msging_api_choise_org.png

ボット用のアカウントの作成

次の画面でボットのアカウントを作成することができます
名前、アイコンを適当に決めたらアカウントの業種を選択しましょう
今回は「個人」「個人 (IT・コンピュータ)」を選択しました
例えばグルメ情報を配信するボットなのであれば「飲食店・レストラン」とかを大業種に選択すると良いと思います
try_line_msging_api_input_bot_info.png

「確認する」をクリックすると確認画面になるので、問題なければ「申し込む」で申し込んでください

LINE@ Manager での作業

作成したアカウントが Messaging API を使えるための設定を行っていきます

Messaging API を有効にする

アカウントの登録が完了した画面から「LINE@ Manager」に移動できるので移動してください
LINE@ Manager は作成したアカウントの設定やメッセージの管理ができる所謂コンパネになります
アカウントごとに準備されているので、アカウントごとに切り替える必要があります

アクセスできたら左メニューから「アカウント設定」->「Bot 設定」と選択します
「API を利用する」というボタンが右ペインに表示されると思うので、選択し Messaging API を利用できるようにします
try_line_msging_api_enable_api.png

ちなみに上記を実施した後、LINE Business Center のアカウントリストを見ると Messaging API がアカウントに追加されていることがわかります
try_line_msging_api_confirm_status.png

リクエスト設定 を有効にする

引き続き LINE@ Manager で作業します
「アカウント設定」->「Bot 設定」を選択します

リクエスト設定という欄があると思うので「利用する」にチェックを入れて「保存」を選択します
try_line_msging_api_enable_webhook.png

これは何の設定かと言うと、ボットに話かけた際に実際に何か処理をするサーバに対して Webhook を送信することで、そちらで具体的な処理が開始できるようにしています
もちろんこの Webhook で送信される情報にボットに話しかけた際のメッセージや誰から話かけれたかなどの情報が含まれています

またこの画面で同時に以下の詳細設定を変更することができます

  • Botのグループトーク参加
  • 自動応答メッセージ
  • 友だち追加時あいさつ

必要であれば変更しましょう
今回はとりあえずデフォルトのまま進めます

LINE Developers での作業

実際にボットが動作するサーバのための設定を行います

Channel Access Token の確認

LINE Business Center のアカウントリストから「LINE Developers」を選択してください
すると LINE Developers という新たな管理画面に移動します
try_line_msging_api_move_developers.png

LINE Developers では主にチャネルと呼ばれる Messaging API を呼び出すために必要なボットの認証情報やサーバの設定を行います

「Basic Information」に「Channel Access Token」という欄があります
そこの「ISSUE」というボタンをクリックすると認証に必要なトークンが表示されるのでメモしておきましょう
try_line_msging_api_issue_token.png

Webhook URL と Server IP Whitelist の設定

ボット用のアプリケーションをデプロイしたサーバの情報を設定する必要があります
先にアプリケーションを作成する必要があるので後述します

アプリケーションの作成

ではボットのアプリケーションを作成していきます
今回は Ruby の line-bot-sdk-ruby を使ってアプリケーションを開発しデプロイ先は Heroku とします

アプリケーションの開発

とりあえずオウム返しするボットアプリケーションを作成してみます

  • cd /path/to/work
  • bundle init
  • vim Gemfile
gem 'sinatra'
gem 'line-bot-api'
  • bundle install
  • vim app.rb
require 'sinatra'
require 'line/bot'

class HTTPProxyClient
  def http(uri)
    proxy_class = Net::HTTP::Proxy(ENV["FIXIE_URL_HOST"], ENV["FIXIE_URL_POST"], ENV["FIXIE_URL_USER"], ENV["FIXIE_URL_PASSWORD"])
    http = proxy_class.new(uri.host, uri.port)
    if uri.scheme == "https"
      http.use_ssl = true
    end

    http
  end

  def get(url, header = {})
    uri = URI(url)
    http(uri).get(uri.request_uri, header)
  end

  def post(url, payload, header = {})
    uri = URI(url)
    http(uri).post(uri.request_uri, payload, header)
  end
end

def client
  @client ||= Line::Bot::Client.new { |config|
    config.httpclient = HTTPProxyClient.new
    config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
    config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
  }
end

get '/' do
  "Hello, world"
end

post '/callback' do
  body = request.body.read

  signature = request.env['HTTP_X_LINE_SIGNATURE']
  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']
        }
        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
  }
  "OK"
end
  • vim config.ru
require 'bundler'
Bundler.require

require './app'
run Sinatra::Application
$stdout.sync = true

でアプリケーションの開発は OK です
IP を固定化して動作させる必要があるためローカルでは動作しません
今回は Heroku 上で動作させるので Heroku にデプロイしていきます

アプリケーションのデプロイ

ターミナルから Heroku にデプロイしていきます

  • cd /path/to/work/
  • git init
  • git add .
  • git commit -m "Initial Commit"
  • heroku create --app your-line-bot
  • heroku git:remote --app your-line-bot
  • git push heroku master
  • heroku config:set LINE_CHANNEL_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx LINE_CHANNEL_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx --app your-line-bot

でデプロイできます
今回は新規で Heroku 上にアプリケーションをデプロイしています

Fixie アドオンの有効化

過去 に Heroku + Fixie を紹介したのでそれと全く同じ手順で有効にしてください

heroku config で設定する項目も同じなので Fixie を有効後に Fixie の Host と ID/PW を設定してください
有効時に Fixie から払い出された IP アドレスをメモしておいてください

再び Webhook URL と Server IP Whitelist の設定

アプリケーションをデプロイできれば、LINE Developers で Webhook URL と Server IP Whitelist の設定ができます

まず Webhook URL は Heroku にデプロイしたアプリの /callback にアクセスする URL を設定してください
一番下に「Edit」ボタンがあるのでクリックします
Webhook URL の欄にデプロイしたアプリケーションの URL を入力し「Save」します
try_line_msging_api_config_webhook.png

次に Server IP Whitelist を登録します
左メニューから「Server IP Whitelist」を選択し Fixie から払い出された IP アドレスを設定していきます
try_line_msging_api_config_white_ips.png

Fixie の IP アドレスはコマンドラインでアドオンを追加したときに確認できます
もし、忘れてしまった場合は https://dashboard.usefixie.com/#/account で確認することができます

動作確認

まずは今回作成したボット用のアカウントと LINE アプリで友達になりましょう
QR コードを読み込むなり適当に友達になるボタンをサイトに配置してスマホでアクセスして友達になってください

今回のボットの場合友達になった瞬間メッセージが届くと思います
これは今回の Messaging API で新たに追加になった「友だち追加時あいさつ」の機能を ON にしているためです

適当にメッセージを送信してみましょう
するとボットがオウム返ししてくると思います
しかもそのときにまた謎のメッセージが返ってくると思いますがこれは「自動応答メッセージ」機能を無期限で ON にしているためどんなメッセージに対しても必ず返してしまいます

この辺の「友だち追加時あいさつ「自動応答メッセージ」を OFF にしたい場合は先ほど紹介した LINE@ Manager から Bot 設定で詳細設定を変更できるので試してみたください
try_line_msging_api_test_bot.png

最後に

新しくなった LINE Messaging API を試してみました

前回の BOT API Trial Account に比べて機能が拡充したのと LINE@ Manager なる管理画面が増えたおかげで、自動応答のメッセージや定期配信などがプログラミングなしで行えるようになったのは、嬉しい点だと思います
導入障壁が低くなったという感じも少し感じました

ただ、API の互換性やイベント名前などプログラミングレベルでは結構互換性が崩れていたので、前のボットをそのまま利用するのは厳しいと思います

一番自分が厄介だなと感じたのは、機能うんぬんよりも「LINE Business Center」とか「LINE@ Manager」とか「LINE Developers」とか「Messaging API」とか「Channels」とか言葉がたくさん出てくるところでした
要するにそれらの概念が非常にイメージしにくかったです
試してみるとそれぞれがどういう意味でどういう機能を持っているかわかるのですが、初見だと言葉だけで意味や概念を理解するのは少し大変なんじゃないかなと思いました

とりあえず基本の動作方法はわかったので、この後は新しく追加になったグループ投稿やリッチコンテンツ作成などを試してみたいと思います
そして、せっかくなので LINE BOT AWARDS 2016 にも参加してみたいと思います

参考サイト