takuocean’s diary

備忘録がメインなので、説明が足りないことも多い。もう少し詳しくという人はコメントをお願いします。

IFTTTとLine message apiとの連携

以前、Line botの作り方を示しました。Line botはLine message apiを利用して実現しています。

takuocean.hatenablog.com

さて、この場合はLineから送られてきたメッセージに何か返答をすることができますが、Line@の管理者からは能動的に何か送ることはできません。
実際はLine@から何か送りたい場合があると思います。例えば、IFTTTというサービスと連携させてLine@に何か投稿したいとか。
ちなみにIFTTTはネットワークのサービスを連携させるサービスです。例えば、Twitterに投稿した内容をFacebookにも投稿するとか、Flickrで投稿した画像をTwitterFacebookInstagramにそれぞれ同じものを投稿する。または投稿の際にLineやGmailで通知を送るなどです。具体的には以下のサイトを参考にしてください。

http://hoomey.net/ifttt_study_1/

今回はそのやり方を紹介します。

今回やること

Flickrで投稿した画像をLine@でも投稿する

ただし、IFTTTを利用する場合Flickrの投稿をIFTTTを通して直接Line@に投稿することはできません。 Flickr -> IFTTT -> Maker -> 用意したサーバー -> Line@
の順に情報を送ります。

そのためにIFTTTでの設定以外にサーバーを準備し、その中で動くサ―バープログラムが必要になります。 サーバーはLine botの作り方を参考にしてください。また、サーバーからLine@にリクエストを投げるのもほとんどLine botのプログラムを流用することでできます。

1. IFTTTの設定をする

まずはIFTTTの右上にある自分のアカウント名をクリックし、さらに「New Applet」を選択してください。 f:id:takuocean:20161205221023j:plain

次に、「This」を選択します。 f:id:takuocean:20161205221026j:plain

選択後出てくる検索画面で「Flickr」と入力し、表示されたFlickrアイコンを選択します。 f:id:takuocean:20161205221027j:plain

ここではFlickrに画像が何か投稿したら何かアクションをしたいので、「Any new public photo」を選択して下さい。 f:id:takuocean:20161205221037j:plain

次に、「That」を決めていきます。 f:id:takuocean:20161205221039j:plain

検索画面で「Maker」と入力し、表示されたMakerのアイコンを選択します。 f:id:takuocean:20161205221041j:plain

次の画面では選択肢はひとつしかありません。 f:id:takuocean:20161205221043j:plain

最後にMakerでどのようなリクエストをサーバーに送るか設定します。
自分のサーバーのURL。Line botで作ったサーバーと同じものを使うなら https://自分の作成したアプリ名.herokuapp.com.:443/callback


Post


application/json

{{OriginalSourceUrl}}

f:id:takuocean:20161205222315j:plain

設定ができたら、「Create action」を選択し、最後に「Finish」を選択してIFTTTの設定は終了になります。

サーバープログラムの作成

require 'line/bot'

module Line
  module Bot
    class HTTPClient
      def http(uri)
        proxy = URI(ENV["FIXIE_URL"])
        http = Net::HTTP.new(uri.host, uri.port, proxy.host, proxy.port, proxy.user, proxy.password)
        if uri.scheme == "https"
          http.use_ssl = true
        end

        http
      end
    end
  end
end


class WebhookController < ApplicationController

  protect_from_forgery with: :null_session # CSRF対策無効化

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

  def callback
    body = request.env["rack.input"].gets

    message = {
      type: 'image',
      originalContentUrl: body,
      previewImageUrl: body
    }
    client.push_message("ここはUser Id", message)
    render status: 200, json: { message: 'OK' }
  end
end

User IdはLine@に紐づいたIDです。 ちゃんとした調べ方が分からなかったので以前作ったLine botプログラムを動作させた際に、受信したリクエストのBodyをまずputs関数で表示させました。 そして、表示させたものからUser Idのタグを探し、ID番号を抽出しました。その値を使っています。

結果としてFlickrで画像を投稿したら f:id:takuocean:20161205230153p:plain

以下のようにLineにも投稿されます。
f:id:takuocean:20161205230151p:plain