Un Webhook est une fonction de rappel basée sur HTTP qui permet une communication événementielle légère entre deux interfaces de programmation d’applications (API). Le client fournit une URL unique à l’API du serveur et spécifie les événements qu’il souhaite connaître. Une fois le Webhook configuré, le client n’a plus besoin d’interroger le serveur ; lorsque l’événement spécifié se produit, le serveur envoie automatiquement la charge utile pertinente à l’URL du Webhook du client.
Le Webhook peut être un élément important de l’automatisation, et sa mise en œuvre est simple (une seule requête HTTP, pouvant être intégrée n’importe où). En Chine, Feishu, DingTalk et WeChat d’entreprise prennent tous en charge l’envoi de messages via Webhook.
Ce sont les avantages, mais l’inconvénient est que les paramètres de la requête HTTP ne sont pas unifiés, car c’est trop simple, il n’y a pas de normes de protocole, chaque plateforme a sa propre façon de faire, par exemple, sur une plateforme, le message s’appelle “msg”, sur une autre, cela pourrait être “message” ou “text”. Pour vraiment tirer parti des Webhooks, il est nécessaire de mettre en place son propre service d’analyse et de traitement des Webhooks, heureusement, ce n’est pas compliqué. Cet article prendra l’exemple du Webhook Github, basé sur Flask, pour analyser et pousser vers WeChat d’entreprise.
Cependant, si vous n’avez pas de besoins hautement personnalisés et que vous souhaitez simplement utiliser le Webhook Github sans utiliser d’autres plateformes, vous pouvez utiliser Dingling, qui peut transférer le Webhook Github vers WeChat d’entreprise. Dingling ne peut envoyer que des messages au format Markdown (qui ne peuvent pas être consultés directement dans WeChat), c’est pourquoi je l’ai abandonné.
2 Webhook CloudFlare
Le corps du message du Webhook CloudFlare est très simple, comme suit :
1
{"text":"CloudFlare est vraiment une conscience de l'industrie !"}
Utilisez Flask pour analyser et transférer le message vers WeChat d’entreprise :
Déployez le processus Flask sur le serveur et entrez l’adresse sur Cloudflare, comme indiqué ci-dessous
Après avoir enregistré et testé, vous devriez recevoir un court message de test sur WeChat d’entreprise.
3 Webhook Github
Si le Webhook de CloudFlare est un court message, alors Github veut vous transmettre toutes les informations du site, avec des dizaines de paramètres, mais aucun n’est en langage naturel, il est donc nécessaire de les analyser selon vos besoins. Le code suivant commence par déterminer le type d’événement, puis extrait les informations nécessaires en fonction du type d’événement pour les transférer. Le contenu analysé ci-dessous inclut les actions push, release, issue, pull, etc.
@app.route('/github',methods=['POST'])defgithub():githubEvent=request.headers['x-github-event']ifgithubEvent=='push':respority=request.json['repository']['name']branch=request.json['ref'].split('/')[-1]commits=request.json['commits']forcommitincommits:author=commit['author']['name']message=commit['message']data={"msgtype":"text","text":{"content":f"{respority} quelqu'un a soumis du code\nBranche : {branch}\nAuteur : {author}\nMessage de soumission : {message}"}}r=requests.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key='+config['API_KEY_2'],json=data)return'success',200ifgithubEvent=='issues':action=request.json['action']ifaction=='opened':respority=request.json['repository']['name']issue=request.json['issue']title=issue['title']body=issue['body']user=issue['user']['login']data={"msgtype":"text","text":{"content":f"{respority} quelqu'un a soumis un issue\nTitre : {title}\nContenu : {body}\nSoumis par : {user}"}}r=requests.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key='+config['API_KEY_2'],json=data)ifaction=='closed':respority=request.json['repository']['name']issue=request.json['issue']title=issue['title']body=issue['body']user=issue['user']['login']data={"msgtype":"text","text":{"content":f"{respority} quelqu'un a fermé un issue\nTitre : {title}\nContenu : {body}\nSoumis par : {user}"}}r=requests.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key='+config['API_KEY_2'],json=data)ifaction=='reopened':respority=request.json['repository']['name']issue=request.json['issue']title=issue['title']body=issue['body']user=issue['user']['login']data={"msgtype":"text","text":{"content":f"{respority} quelqu'un a rouvert un issue\nTitre : {title}\nContenu : {body}\nSoumis par : {user}"}}r=requests.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key='+config['API_KEY_2'],json=data)return'success',200ifgithubEvent=='pull_request':action=request.json['action']ifaction=='opened':respority=request.json['repository']['name']pull_request=request.json['pull_request']title=pull_request['title']body=pull_request['body']user=pull_request['user']['login']data={"msgtype":"text","text":{"content":f"{respority} quelqu'un a soumis un pull request\nTitre : {title}\nContenu : {body}\nSoumis par : {user}"}}r=requests.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key='+config['API_KEY_2'],json=data)ifaction=='closed':respority=request.json['repository']['name']pull_request=request.json['pull_request']title=pull_request['title']body=pull_request['body']user=pull_request['user']['login']data={"msgtype":"text","text":{"content":f"{respority} quelqu'un a fermé un pull request\nTitre : {title}\nContenu : {body}\nSoumis par : {user}"}}r=requests.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key='+config['API_KEY_2'],json=data)ifaction=='reopened':respority=request.json['repository']['name']pull_request=request.json['pull_request']title=pull_request['title']body=pull_request['body']user=pull_request['user']['login']data={"msgtype":"text","text":{"content":f"{respority} quelqu'un a rouvert un pull request\nTitre : {title}\nContenu : {body}\nSoumis par : {user}"}}r=requests.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key='+config['API_KEY_2'],json=data)return'success',200ifgithubEvent=='release':action=request.json['action']ifaction=='published':respority=request.json['repository']['name']release=request.json['release']tag_name=release['tag_name']body=release['body']user=release['author']['login']data={"msgtype":"text","text":{"content":f"{respority} quelqu'un a publié un release\nVersion : {tag_name}\nContenu : {body}\nPublié par : {user}"}}r=requests.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key='+config['API_KEY_2'],json=data)return'success',200ifgithubEvent=='ping':data={"msgtype":"text","text":{"content":"test du webhook github"}}r=requests.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key='+config['API_KEY_2'],json=data)return'success',200ifgithubEvent=='create':ref_type=request.json['ref_type']ifref_type=='branch':respority=request.json['repository']['name']branch=request.json['ref']user=request.json['sender']['login']data={"msgtype":"text","text":{"content":f"{respority} quelqu'un a créé une branche\nBranche : {branch}\nCréé par : {user}"}}r=requests.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key='+config['API_KEY_2'],json=data)ifref_type=='tag':respority=request.json['repository']['name']tag=request.json['ref']user=request.json['sender']['login']data={"msgtype":"text","text":{"content":f"{respority} quelqu'un a créé un tag\ntag : {tag}\nCréé par : {user}"}}r=requests.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key='+config['API_KEY_2'],json=data)return'success',200ifgithubEvent=='delete':ref_type=request.json['ref_type']ifref_type=='branch':respority=request.json['repository']['name']branch=request.json['ref']user=request.json['sender']['login']data={"msgtype":"text","text":{"content":f"{respority} quelqu'un a supprimé une branche\nBranche : {branch}\nSupprimé par : {user}"}}r=requests.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key='+config['API_KEY_2'],json=data)ifref_type=='tag':respority=request.json['repository']['name']tag=request.json['ref']user=request.json['sender']['login']data={"msgtype":"text","text":{"content":f"{respority} quelqu'un a supprimé un tag\ntag : {tag}\nSupprimé par : {user}"}}r=requests.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key='+config['API_KEY_2'],json=data)return'success',200ifgithubEvent=='pull_request_review':action=request.json['action']ifaction=='submitted':respority=request.json['repository']['name']pull_request=request.json['pull_request']title=pull_request['title']body=pull_request['body']user=pull_request['user']['login']review=request.json['review']state=review['state']data={"msgtype":"text","text":{"content":f"{respority} quelqu'un a soumis un pull request review\nTitre : {title}\nContenu : {body}\nSoumis par : {user}\nÉtat : {state}"}}r=requests.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key='+config['API_KEY_2'],json=data)return'success',200ifgithubEvent=='pull_request_review_comment':action=request.json['action']ifaction=='created':respority=request.json['repository']['name']pull_request=request.json['pull_request']title=pull_request['title']body=pull_request['body']user=pull_request['user']['login']comment=request.json['comment']comment_body=comment['body']data={"msgtype":"text","text":{"content":f"{respority} quelqu'un a soumis un commentaire de pull request review\nTitre : {title}\nContenu : {body}\nSoumis par : {user}\nContenu : {comment_body}"}}r=requests.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key='+config['API_KEY_2'],json=data)return'success',200# if githubEvent == 'check_run':# action = request.json['action']# if action == 'created':# respority = request.json['repository']['name']# check_run = request.json['check_run']# name = check_run['name']# conclusion = check_run['conclusion']# data = {# "msgtype": "text",# "text": {# "content": f"{respority} quelqu'un a soumis un check run\nNom : {name}\nÉtat : {conclusion}"# }# }# r = requests.post(# 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key='+config['API_KEY_2'],# json=data)# return 'success', 200ifgithubEvent=='check_suite':action=request.json['action']ifaction=='completed':respority=request.json['repository']['name']check_suite=request.json['check_suite']conclusion=check_suite['conclusion']data={"msgtype":"text","text":{"content":f"{respority} quelqu'un a soumis un check suite\nÉtat : {conclusion}"}}r=requests.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key='+config['API_KEY_2'],json=data)return'success',200
Une fois le serveur et Github configurés, vous pouvez consulter les informations de push détaillées dans l’historique.