如何使用Python列出GitHub仓库的Webhook URL?
当然可以!不管用PyGitHub(官方维护的GitHub Python库)还是直接用requests调用GitHub REST API,都能搞定获取和更新仓库Webhook的需求,完全不用依赖付费库。下面给你两个方案的示例代码,你可以根据自己的习惯选择:
方案一:使用PyGitHub库
PyGitHub封装了GitHub API的大部分操作,用起来更简洁,不用自己拼接接口URL。
首先安装库:
pip install pygithub
示例代码:
from github import Github # 替换成你的GitHub个人访问令牌(PAT),需要勾选repo:webhook权限 ACCESS_TOKEN = "your_github_pat_token" OWNER = "your_org_or_username" REPO_NAME = "target_repository_name" TARGET_WEBHOOK_URL = "https://your-new-webhook-url.com" # 初始化GitHub客户端 g = Github(ACCESS_TOKEN) try: # 获取目标仓库 repo = g.get_repo(f"{OWNER}/{REPO_NAME}") # 获取仓库所有Webhook webhooks = repo.get_hooks() print("当前仓库的所有Webhook:") for hook in webhooks: print(f"Webhook ID: {hook.id}, 当前URL: {hook.config['url']}") # 找到需要更新的Webhook(示例用旧URL匹配,也可以直接用ID过滤) OLD_WEBHOOK_URL = "https://old-webhook-url.com" for hook in webhooks: if hook.config["url"] == OLD_WEBHOOK_URL: # 更新Webhook的URL hook.edit(config={"url": TARGET_WEBHOOK_URL}) print(f"已更新Webhook ID {hook.id}的URL为: {TARGET_WEBHOOK_URL}") break except Exception as e: print(f"操作出错:{str(e)}")
方案二:使用requests直接调用GitHub REST API
如果不想额外安装库,直接用requests调用API也很灵活,适合轻量场景。
示例代码:
import requests ACCESS_TOKEN = "your_github_pat_token" OWNER = "your_org_or_username" REPO_NAME = "target_repository_name" TARGET_WEBHOOK_URL = "https://your-new-webhook-url.com" OLD_WEBHOOK_URL = "https://old-webhook-url.com" # API基础路径 BASE_URL = f"https://api.github.com/repos/{OWNER}/{REPO_NAME}" headers = { "Authorization": f"token {ACCESS_TOKEN}", "Accept": "application/vnd.github.v3+json" } try: # 第一步:获取仓库所有Webhook response = requests.get(f"{BASE_URL}/hooks", headers=headers) response.raise_for_status() # 检查请求是否成功 webhooks = response.json() print("当前仓库的所有Webhook:") for hook in webhooks: print(f"Webhook ID: {hook['id']}, 当前URL: {hook['config']['url']}") # 第二步:找到需要更新的Webhook并修改URL target_hook_id = None for hook in webhooks: if hook["config"]["url"] == OLD_WEBHOOK_URL: target_hook_id = hook["id"] break if target_hook_id: # 发送更新请求(如果需要保留secret、content_type等配置,要在这里一并写上) update_data = { "config": { "url": TARGET_WEBHOOK_URL } } update_response = requests.patch( f"{BASE_URL}/hooks/{target_hook_id}", json=update_data, headers=headers ) update_response.raise_for_status() print(f"已成功更新Webhook ID {target_hook_id}的URL!") else: print("未找到匹配的旧Webhook URL,请检查输入。") except requests.exceptions.RequestException as e: print(f"API请求出错:{str(e)}")
重要注意事项
- 权限要求:你的PAT需要勾选
repo:webhook(私有仓库)或public_repo(公开仓库)权限,否则会返回403错误。 - Webhook过滤方式:示例里用旧URL匹配,你也可以直接用Webhook的ID(更准确),如果知道目标ID的话可以跳过遍历步骤。
- 配置保留:更新Webhook时,如果需要保留原有的secret、content_type等配置,要在更新参数里把这些字段也带上,否则会被重置。
内容的提问来源于stack exchange,提问作者José Enrique Hernández
相关产品推荐
相关产品推荐

