ローカル環境で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しておきましょう。
間違っている箇所あれば修正いたしますので、おねがいします!
はてなブログを始めました
ブログを書くのは4年ぶりです。
近況ですが、新卒から5年半勤めた会社を辞めて、フリーランスエンジニアとして活動しています。その宣伝のためにブログを再開したわけではないですが、いい機会なので色々とOUTPUTしていけたらと思います。