一键为你的所有Github仓库增加Webhook

前往我的博客获得最佳体验,:https://blog.w1ndys.top/posts/697195e9

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:

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",
    }
    # 构建 Webhook 数据
    data = {
        "name": "web",
        "active": True,
        "events": ["*"],
        "config": {"url": webhook_url, "content_type": "json"},
    }
    # 发送 POST 请求创建 Webhook
    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 和 Webhook 地址
    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 脚本:

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",
    }

    # 获取指定仓库的 Webhooks
    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:
                # 删除指定 Webhook
                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)  # 等待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 和 Webhook 地址
    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 使用条款和隐私政策。

  • 31
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值