AberSheeran
Aber Sheeran

Coding-WebHook

起笔自
所属文集: 程序杂记
共计 1497 个字符
落笔于

由于我写的网站样式在频繁的更改,每次我都要去服务器上执行git pull,很麻烦,于是查了一下Coding的文档写了WebHook。

WebHook是什么?

WebHook 是Coding/Github之类的网站,提供的一个服务。

以Coding为例,它可以为你的库设定五种监听事件,在这些事件发生的时候就会发送一个POST请求到最上方指定的网址。

编写

根据Coding开发者文档,在项目的settings.py里加上在Coding里填写的令牌。

# WebHook Settings
# https://open.coding.net/webhooks-v2/

WebHook_Token = "iloveyou"

编写一个视图函数来处理请求,在此处要注意,Coding的内容类型一定要是application/json,不然会因为中文的编码问题导致sha1计算错误。并且该视图函数一定要加@csrf_exempt来绕过Django的防CSRF攻击中间件。

Django获取Header信息的方式是HTTP_加上全部大写的名称(-要换成_)

import subprocess
import hmac
from hashlib import sha1

from django.http import JsonResponse, HttpResponseForbidden
from django.views.decorators.csrf import csrf_exempt

from . import settings


@csrf_exempt
def webhook(request):
    event = request.META.get("HTTP_X_CODING_EVENT")
    signature = request.META.get("HTTP_X_CODING_SIGNATURE", "").replace("sha1=", "")
    mac = hmac.new(settings.WebHook_Token.encode("ASCII"), msg=request.body, digestmod=sha1)
    if not hmac.compare_digest(str(mac.hexdigest()), str(signature)):
        return HttpResponseForbidden("What do you want to do?")
    if event == "ping":
        return JsonResponse({"message": "pong"})
    elif event == "push":
        subprocess.Popen("git pull", cwd=settings.BASE_DIR, shell=True)
    return JsonResponse({"message": "success"})

在服务器更新之后,尝试ping一下,如果出现绿色对号则成功了。如果出现其他的,可以点击修改,看发送记录详情。

如果你觉得本文值得,不妨赏杯茶
Django静态文件访问错误
Django CSRF保护问题