一、webhooks是什麼
webhooks是一種實現在web api跟web service之間的釋出訂閱的輕量級的模式;當服務中心某個事件發生的時候,就會向訂閱者傳送一個POST請求形式的通知,這個POST請求中會包含事件的相關資訊。
webhooks是一種與外部系統進行互動的簡單的輕量級的方式,目前已經有Dropbox、Github、PayPal等很多服務提供了webhooks功能。
二、體驗Github中的webhooks
在Github中,我們可以在組織機構、程式碼倉庫、Github App上設定webhooks;當我們訂閱的事件放生的時候,Github會傳送一個http post請求到配置的URL,從而可以觸發CI builds、更新備份映象、部署程式碼等。
配置訂閱web伺服器
web伺服器主要用於監聽Github的push事件,並返回傳入的json資料
from flask import Flask, request
import hashlib
import hmac
app = Flask(__name__)
@app.route("/push", methods=["POST"])
def push():
secret = 'github_webhooks'
from_signature = request.headers.get('X-Hub-Signature-256')
cal_signature = 'sha256=' + hmac.new(str.encode(secret), request.data, digestmod=hashlib.sha256).hexdigest()
if cal_signature == from_signature:
return 'True'
else:
return 'False'
啟動web伺服器
mango@mango-ubuntu:~/文件/blogs/webhook$ export FLASK_APP=hooks
mango@mango-ubuntu:~/文件/blogs/webhook$ flask run
* Serving Flask app "hooks"
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
開放本地web server to internet
下載ngrok並解壓之後執行,完成公網URL和本地URL的對映
ngrok http 5000
ngrok by @inconshreveable (Ctrl+C to quit)
Session Status online
Session Expires 1 hour, 42 minutes
Version 2.3.40
Region United States (us)
Web Interface http://127.0.0.1:4040
Forwarding http://fde0-110-251-30-176.ngrok.io -> http://localhost:5000
Forwarding https://fde0-110-251-30-176.ngrok.io -> http://localhost:5000
Connections ttl opn rt1 rt5 p50 p90
2 0 0.00 0.00 0.01 0.01
配置webhooks
將得到的外網URL填寫到Payload URL中
http://fde0-110-251-30-176.ngrok.io/push
ContentType選擇 application/json
為了提高安全性,填寫Secret,其他保持預設設定儲存即可
測試webhooks
點選最左側的Webhooks選項,在右邊就可以看到新增的webhooks裡邊,點進去之後,選擇上方的Recent Deliveries標籤頁;
在裡邊可以看到每次的觸發記錄,點進去可以看到請求和回應的header及傳送的資料,當然你也可以redelivery
request header
Request URL: http://fde0-110-251-30-176.ngrok.io/push
Request method: POST
Accept: */*
content-type: application/json
User-Agent: GitHub-Hookshot/945516b
X-GitHub-Delivery: 034ea5a0-429c-11ec-9315-aa9e0e849aaa
X-GitHub-Event: ping
X-GitHub-Hook-ID: 327865514
X-GitHub-Hook-Installation-Target-ID: 357383239
X-GitHub-Hook-Installation-Target-Type: repository
X-Hub-Signature: sha1=fb0aba301c9af7463cc7e3ff7be0a1f9dccd1938
X-Hub-Signature-256: sha256=10c1e266aabfa7ce519ceb0c543988f6d19d12b16e5f336a54367682319f1111
response header
Content-Length: 6728
Content-Type: application/json
Date: Thu, 11 Nov 2021 03:06:05 GMT
Server: Werkzeug/2.0.1 Python/3.9.5