如何绕过GitHub的20个Webhook限制?Ngrok中转方案可行吗?
方案可行性分析
这个方案完全可行。GitHub Webhook支持将事件发送到公开可访问的端点,Ngrok能把本地Flask服务暴露到公网,作为中间层接收GitHub的POST请求后,转发到多个拉取代码的端点,正好可以绕过GitHub单仓库20个Webhook的限制。
你的代码问题及修正
目前的代码存在多处语法和逻辑错误,直接运行会失效,具体问题和修正后的代码如下:
代码里的问题
return 'Test post'放在函数最开头,导致后续所有逻辑都不会执行request.get_header()是错误方法,正确获取请求头用request.headers,且后续调用时拼写错误(header应为headers)- 重复导入
json模块 print(hello)中hello未定义,会触发NameErrorrequests.post的参数应为headers而非header,且未正确处理请求体和签名头
修正后的代码
from flask import Flask, request, jsonify import requests app = Flask(__name__) # 配置需要转发的多个端点 TARGET_ENDPOINTS = [ "https://XXX:8443/modules/git/public/web-hook.php?uuid=1e51f92e-b17e-42df-638d-f", # 可以添加更多端点 ] @app.route("/webhook", methods=['GET', 'POST']) def webhook(): # 处理GitHub的GET验证请求(可选,部分场景需要) if request.method == 'GET': return 'Webhook receiver is running', 200 # 获取GitHub发送的请求体和头信息 try: payload = request.get_json() # 保留关键请求头,尤其是GitHub的签名头用于端点验证 forward_headers = { 'Content-Type': 'application/json', 'X-Hub-Signature-256': request.headers.get('X-Hub-Signature-256'), 'X-GitHub-Event': request.headers.get('X-GitHub-Event') } # 转发到所有目标端点 for endpoint in TARGET_ENDPOINTS: response = requests.post( endpoint, json=payload, # 直接传json,无需手动dumps headers=forward_headers ) # 可选:打印转发结果用于调试 print(f"转发到 {endpoint} 状态码: {response.status_code}") return jsonify({"status": "success", "message": "已转发到所有端点"}), 200 except Exception as e: print(f"转发出错: {str(e)}") return jsonify({"status": "error", "message": str(e)}), 500 if __name__ == '__main__': # 生产环境建议关闭debug,指定端口并启用SSL(如果需要) app.run(debug=True, port=5000)
额外建议
- 验证GitHub签名:在接收请求时,用GitHub提供的Webhook密钥验证
X-Hub-Signature-256头,避免处理恶意请求 - 异步转发:如果目标端点较多,同步转发会导致响应延迟,GitHub可能重复触发Webhook。可以用
threading或celery实现异步转发 - 日志记录:添加详细的日志记录,方便排查转发失败的问题
- 生产环境部署:不要用
app.run(debug=True)部署到生产环境,改用Gunicorn或UWSGI等WSGI服务器,配合Ngrok稳定运行
内容的提问来源于stack exchange,提问作者Cazeh
相关产品推荐
相关产品推荐

