You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:52:55