agiledog

プログラミングや金融、経済とか諸々

ローカル環境でwebhookを利用したいときに使えるサービス ultrahook!!

概要

ローカル開発環境でWebHookを使ったサービスを利用したい場合に便利なultrahookというサービスがありますので 紹介したいと思います

UltraHookの使い方紹介

$ echo "api_key: {api_key}" > ~/.ultrahook

を実行してください

  • gemのインストール こちらも登録後に送られるメールにかかれていますが

$ gem install ultrahook

でgemでinstallすればOKです。

以上で、Authenticatedされたultrahookコマンドが使えるようになるので

$ ultrahook stripe 3000/webhooks/

と任意のポートを指定してコマンドをたたきますとultrahookサービスが起動します。 以下のように表示されれば成功です

Authenticated as {Namespace} Forwarding activated... http://{Namespace}.ultrahook.com -> http://localhost:3000/webhooks

今回はrails環境でwebhookを利用することを想定しているため、railsデフォルトポート3000にしています。 以上、さくっと登録から起動までできました。 末尾の/webhooksは適当にpathを指定しています、任意です。

UltraHookの使い方紹介 補足

ホスト名がlocalhostじゃないんじゃワレと思われた方もいらっしゃるかもしれません。 その場合、以下のように任意のアプリ名{appname}をつけてコマンド実行してあげてください

$ ultrahook {appname} http://{hostname:port}/webhooks

Authenticated as {Namespace} Forwarding activated... http://{appname}.{hostname:port}.ultrahook.com -> http://{hostname:port}/webhooks

実際にwunderlistというTODO管理ツールAPIでWebHookが利用出来るので試してみる

こちらからアプリ登録を行って、client_idとaccess_tokenを取得しておいてください。

今回rubyでhttp通信させたいので、gemのfaradayを利用して httpクライアントを作ってちゃらっと書いてしまいます。

gem install 'faraday'
gem install 'json'
    client_id = your_client_id
    access_token = your_access_token
    url = "https://a.wunderlist.com"

      @conn = Faraday::Connection.new(:url => url) do |builder|
        builder.use Faraday::Request::UrlEncoded
        builder.use Faraday::Response::Logger
        builder.use Faraday::Adapter::NetHttp
      end

      params = {
      'list_id': {list_id} ,
      "url": "http://{appname}.stripe.{namespace}.ultrahook.com",
      "processor_type": "generic",
      "configuration": ""
      }

      response = @conn.post do |req|
              req.url 'api/v1/webhooks?' , params 
              req.body = params.to_json
              req.headers = {
                'X-Access-Token' => access_token,
                'X-Client-ID' => client_id,
                'Content-Type' => 'text/json',
              }
      end
      res = JSON.parse(response.body)
      res

返り値が以下のようで、idがふられたようですね。 =>{\"id\":XXXXXX,\"url\":\"http://stripe.XXXXX.ultrahook.com\",\"list_id\":XXXXXXXX}"

railsサーバを起動して、登録したwebhookのpostが受信できるかためしてみましょう。

[vagrant@localhost]$ rails s -b 0.0.0.0
=> Booting WEBrick
=> Rails 4.2.1 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2016-01-22 ] INFO  WEBrick 1.3.1
[2016-01-22 ] INFO  ruby 2.2.1 (2015-02-26) [x86_64-linux]
[2016-01-22 ] INFO  WEBrick::HTTPServer#start: pid=6140 port=3000

起動しましたね。では、webhookされるようにリストのステータスをなにかしら変更してみましょう。 試しにタスクを登録してみましょう。

きたきたー!!なんかきたー!!

Started POST "/webhooks/" for 127.0.0.1 at 2016-01-22 21:29:18 +0900
Processing by SampleController#hook as */*
Parameters: {"cause"=>nil, "operat ~略

受信できたとしても、その後になにかしたい人が大半だと思いますので routes.rbにアクションを追加してあげます。

post "/webhooks", :to => 'sample#hook'

これでsampleコントローラのhookメソッドが実行されるので、 JSONの中身でもみれるように実装してみましょうか。

class SampleController < ApplicationController

 skip_before_filter :verify_authenticity_token

 def hook

       json_request = JSON.parse(request.body.read)
       puts "json_request => #{json_request}"

 end

end

たぶん、こんな感じでとれると思います、 とれなかったらすみません、コメントください。 webhookで取得したJSONデータで例えばwunderlistから slackの通知や、trelloとの連携等がリアルタイムで可能になりそうですので、 また別エントリで書きたいと思います。

以上、長くなりましたが、無事、ローカル環境に転送してくれて、 ローカル開発環境で作業がすすめられそうですね!

最後に、使わない場合にはWebhookはdeleteしておきましょう。

間違っている箇所あれば修正いたしますので、おねがいします!