ローカル環境でwebhookを利用したいときに使えるサービス ultrahook!!
概要
ローカル開発環境でWebHookを使ったサービスを利用したい場合に便利なultrahookというサービスがありますので 紹介したいと思います
UltraHookの使い方紹介
APIキーをコマンドで登録 登録後に送られるメールにかかれていますが、
$ 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しておきましょう。
間違っている箇所あれば修正いたしますので、おねがいします!