Webhookとは?

  • 70
    いいね
  • 0
    コメント

Webhookを利用した記事はよく見かけますが
そもそもWebhook自体が何なのか、何を指しているのかよくわからなかったため、
それに関しての備忘録です。

Webhookとは?

  • アプリケーションの更新情報を他のアプリケーションへリアルタイム提供する仕組みや概念のこと。
  • イベント(リポジトリにプッシュなど)発生時、指定したURLにPOSTリクエストする仕組みのこと。

Webhookの説明を見ると「通知する、Webhookを送る」などの言葉が用いられているが、
これはPOSTリクエストのことを指している

Webhookを利用すると何ができるのか?

GitHubやSlackなどのサービスのWebhookを利用すると、ユーザーはサービス側がPOSTリクエストするURLを指定できる。
つまりサービスがPOSTリクエストしたパラメータに対しての処理(パラメータをSlackに通知など)を自由に指定できる。

例えばGitHubのWebhookはリポジトリにプッシュ時、コミット情報をパラメータとしてPOSTリクエストする。
そのため、プッシュ時にコミット情報をSlackに通知をしたり、メールに通知できる。

上記の通り、サービスは特定のイベント発生時にPOSTリクエストするだけなので
「GitHubのWebhookを利用して、コミット情報をSlackに通知する」
ではなく
「GitHubのWebhookを利用して、GitHubのPOSTリクエスト先にコミット情報をSlackに通知するURLを指定する
と言った方が厳密には正しい。

GitHubのWebhookを利用してみる

GitHubのWebhookを利用して、Commit AuthorをSlackに通知するURLをPOSTリクエスト先に指定してみる。
※あくまでWebhookの説明記事のため、具体的な説明は割愛します。

リポジトリの「Settings」を開き、左メニューの「Webhooks」を開く。
「Payload URL」がPOSTリクエスト先のため、そこにCommit AuthorをSlackに通知するURLを指定する。

webhook.jpg

GitHubはPOSTリクエスト時にcommit情報などのパラメータを送信してくれるため、
以下のような処理が実行されるURLを指定すると

import slackweb

def lambda_handler(event, context):
    slack = slackweb.Slack(url="https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX")
    commiter = event['commits'][0]['committer']['username']
    text = "{0} pushed".format(commiter)
    slack.notify(text=text)

リポジトリにプッシュ時、SlackにCommit Authorが通知される。
push.jpg

終わり

長々と書きましたが、やってることはただのPOSTリクエストです。

「SlackのWebhook使おうぜ!」
と言われたら
「ユーザーが投稿などをした際に、Slackが指定したURLにPOSTリクエストしてくれるから、それ使おうぜ!」
と言っているものだと思えば良いと思います。