GitHub 提供了 Webhooks 功能,允许开发者在仓库发生特定事件时接收 HTTP 请求通知。如果你有大量的 GitHub 仓库,并希望为它们统一添加 Webhook,手动操作将是一项繁琐的任务。本文介绍了如何利用 Python 脚本实现一键为所有 GitHub 仓库添加 Webhook,以及如何一键删除这些 Webhook。
1. 准备工作
在开始之前,你需要确保以下准备工作已完成:
- 获取 GitHub Access Token:你需要拥有一个具有足够权限的 GitHub 帐户,并生成一个 Access Token,用于通过 API 访问你的仓库。注意保管好你的 Access Token,不要泄露给他人。
- 准备 Webhook 地址:你需要准备一个用于接收 Webhook 通知的 URL 地址,可以是你自己搭建的服务器或者第三方服务。
2. 添加 Webhook 的 Python 脚本
下面是一个 Python 脚本,可以一键为你的所有 GitHub 仓库添加 Webhook:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| import requests import json
def create_webhook(repo_name, webhook_url, access_token): headers = { "Authorization": f"token {access_token}", "Accept": "application/vnd.github.v3+json", } data = { "name": "web", "active": True, "events": ["*"], "config": {"url": webhook_url, "content_type": "json"}, } response = requests.post( f"https://api.github.com/repos/{repo_name}/hooks", headers=headers, data=json.dumps(data), ) if response.status_code == 201: print(f"成功为 {repo_name} 创建 Webhook") else: print(f"无法为 {repo_name} 创建 Webhook。状态码: {response.status_code}") print(response.text)
def main(): access_token = "你的access_token" webhook_url = "你的Webhook地址"
page = 1 per_page = 30
while True: response = requests.get( "https://api.github.com/user/repos", headers={"Authorization": f"token {access_token}"}, params={"per_page": per_page, "page": page}, ) if response.status_code == 200: repos = response.json() if not repos: break for repo in repos: repo_name = repo["full_name"] create_webhook(repo_name, webhook_url, access_token) page += 1 else: print(f"无法获取仓库列表。状态码: {response.status_code}") print(response.text) break
if __name__ == "__main__": main()
|
3. 删除 Webhook 的 Python 脚本
如果需要删除已添加的 Webhook,可以使用以下 Python 脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| import requests import json import time
def delete_webhook(repo_name, webhook_url, access_token): headers = { "Authorization": f"token {access_token}", "Accept": "application/vnd.github.v3+json", }
response = requests.get( f"https://api.github.com/repos/{repo_name}/hooks", headers=headers, ) if response.status_code == 200: webhooks = response.json() for webhook in webhooks: if webhook["config"]["url"] == webhook_url: response_delete = requests.delete( f"https://api.github.com/repos/{repo_name}/hooks/{webhook['id']}", headers=headers, ) if response_delete.status_code == 204: print(f"成功删除 {repo_name} 的指定 Webhook") else: print( f"无法删除 {repo_name} 的指定 Webhook。状态码: {response_delete.status_code}" ) print(response_delete.text) break else: print(f"{repo_name} 中未找到指定的 Webhook") else: print(f"无法获取 {repo_name} 的 Webhooks。状态码: {response.status_code}") print(response.text)
time.sleep(2)
def delete_all_webhooks(webhook_url, access_token): page = 1 per_page = 30
while True: response = requests.get( "https://api.github.com/user/repos", headers={"Authorization": f"token {access_token}"}, params={"per_page": per_page, "page": page}, ) if response.status_code == 200: repos = response.json() if not repos: break
for repo in repos: repo_name = repo["full_name"] delete_webhook(repo_name, webhook_url, access_token) page += 1 else: print(f"无法获取仓库列表。状态码: {response.status_code}") print(response.text) break
if __name__ == "__main__": access_token = "你的access_token" webhook_url = "你的Webhook地址"
delete_all_webhooks(webhook_url, access_token)
|
注意事项和使用须知
- Access Token 安全性:请妥善保管你的 Access Token,不要泄露给他人,因为它具有对你的 GitHub 仓库进行操作的权限。
- 网络请求频率:GitHub 的 API 有请求频率限制,过
于频繁的请求可能会被拒绝。为了避免这种情况,建议在脚本中添加适当的延迟,以减缓请求频率。
- 脚本参数修改:在使用脚本之前,你需要根据自己的情况修改脚本中的 Access Token 和 Webhook 地址参数。
- 异常处理:脚本中包含了部分异常处理,但仍有可能因为网络或其他原因导致请求失败,建议在实际使用中注意查看日志,及时处理异常情况。
免责声明
本文所提供的脚本仅供参考和学习之用,使用者应对其在实际生产环境中可能产生的任何后果负全部责任。在使用之前,请务必仔细阅读并理解 GitHub 的 API 使用条款和隐私政策。