More than 1 year has passed since last update.

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を指定する。

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が通知される。


終わり

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

「SlackのWebhook使おうぜ!」

と言われたら

「ユーザーが投稿などをした際に、Slackが指定したURLにPOSTリクエストしてくれるから、それ使おうぜ!」

と言っているものだと思えば良いと思います。