【问题标题】:How do I receive Github Webhooks in Python如何在 Python 中接收 Github Webhooks
【发布时间】:2013-01-10 07:31:07
【问题描述】:

Github 提供在您的存储库中有活动时将 Post-receive hooks 发送到您选择的 URL。 我想写一个small Python 命令行/后台(即没有GUI 或webapp)应用程序在我的计算机(后来在NAS)上运行,它不断监听那些传入的 POST 请求,一旦从 Github收到 POST,它就会处理其中包含的 JSON 信息。一有json就处理它是没有问题的。 POST可以来自github给出的少量IP;我计划/希望在我的计算机上指定一个应该发送的端口。

问题是,我对 Web 技术的了解不够,无法处理您在搜索时发现的大量选项。我是否使用 Django、Requests、套接字、Flask、微框架...?我不知道所涉及的大多数术语是什么意思,而且大多数听起来好像它们提供了太多/太大而无法解决我的问题 - 我只是不知所措,不知道从哪里开始。

我能找到的大多数关于 POST/GET 的教程似乎都关注从网站发送或直接请求数据,而不是持续监听它。

我觉得这个问题并不难,一旦我知道去哪里/怎么做,就会归结为几行。任何人都可以提供指针/教程/示例/示例代码吗?

【问题讨论】:

  • web.py 是我要开始的地方。
  • 问题是,我不想/不需要提供网页。
  • 然后使用普通的 werkzeug(flask 使用它作为后端)
  • 我自己在做这件事。我可能会使用 Tornado 来做这件事,主要是因为 Tornado 已经安装在需要监听的系统上。任何微型 HTTP 服务器框架都应该没问题。我的一个朋友发誓webobj
  • 我如何从 bash 中获取此帖子数据?

标签: python github post webhooks


【解决方案1】:

首先,Web 是基于请求-响应的。所以有些东西会请求你的链接,你会做出相应的回应。您的服务器应用程序将持续监听端口;您不必担心。

这是Flask(我选择的微框架)中的类似版本:

from flask import Flask, request
import json

app = Flask(__name__)

@app.route('/',methods=['POST'])
def foo():
   data = json.loads(request.data)
   print "New commit by: {}".format(data['commits'][0]['author']['name'])
   return "OK"

if __name__ == '__main__':
   app.run()

这是一个示例运行,使用 example from github:

运行服务器(以上代码保存在sample.py):

burhan@lenux:~$ python sample.py 
 * Running on http://127.0.0.1:5000/

这里是对服务器的请求,基本上github会做什么:

burhan@lenux:~$ http POST http://127.0.0.1:5000 < sample.json
HTTP/1.0 200 OK
Content-Length: 2
Content-Type: text/html; charset=utf-8
Date: Sun, 27 Jan 2013 19:07:56 GMT
Server: Werkzeug/0.8.3 Python/2.7.3

OK # <-- this is the response the client gets

这是服务器的输出:

New commit by: Chris Wanstrath
127.0.0.1 - - [27/Jan/2013 22:07:56] "POST / HTTP/1.1" 200 -

【讨论】:

  • 我认为github示例的链接不正确。
  • 在撰写本文时(3 年多前)是正确的。
【解决方案2】:

这是一个基本的 web.py 示例,用于通过 POST 接收数据并对其进行处理(在这种情况下,只需将其打印到标准输出):

import web

urls = ('/.*', 'hooks')

app = web.application(urls, globals())

class hooks:
    def POST(self):
        data = web.data()
        print
        print 'DATA RECEIVED:'
        print data
        print
        return 'OK'

if __name__ == '__main__':
    app.run()

我使用hurl.it 向它发布了一些数据(在我的路由器上转发 8080 之后),并看到以下输出:

$ python hooks.py 
http://0.0.0.0:8080/

DATA RECEIVED: 
test=thisisatest&test2=25

50.19.170.198:33407 - - [27/Jan/2013 10:18:37] "HTTP/1.1 POST /hooks" - 200 OK

您应该能够为您的 JSON 处理换出打印语句。

要指定端口号,请使用额外的参数调用脚本:

$ python hooks.py 1234 

【讨论】:

  • 好的,我接受了这个答案,因为这是我首先尝试的,并且对于第一次实现来说效果令人满意。稍后我可能会按照问题评论中的建议将其切换为普通 Werkzeug。
  • 我也是 webhook 和 python 的新手,我想了解,我是否需要使用作为 webhook 提供者的 URL,这些 URL 与普通 API 不同吗?托管此应用后持续监听的调用机制是什么?
【解决方案3】:

我会使用:

https://github.com/carlos-jenkins/python-github-webhooks

您可以配置一个网络服务器来使用它,或者如果您只需要在没有网络服务器的情况下运行一个进程,您可以启动集成服务器:

python webhooks.py

这将允许您做您所说的所有事情。不过,它需要在您的存储库和挂钩中进行一些设置。

晚会和无耻的自动促销,对不起。

【讨论】:

【解决方案4】:

如果您使用的是 Flask,这里有一个非常简单的代码来监听 webhook:

from flask import Flask, request, Response

app = Flask(__name__)

@app.route('/webhook', methods=['POST'])
def respond():
    print(request.json) # Handle webhook request here
    return Response(status=200)

以及使用 Django 的相同示例:

from django.http import HttpResponse
from django.views.decorators.http import require_POST

@require_POST
def example(request):
    print(request.json) # Handle webhook request here
    return HttpResponse('Hello, world. This is the webhook response.')

如果您需要更多信息,请参阅how to listen for webhooks with Python 上的精彩教程。

【讨论】:

    【解决方案5】:

    如果您想查看任何 repo 中的更改...

    1.如果你own你想看的repo

    • 在您的存储库页面中,转到设置
    • 点击 webhook,新建 webhook(右上角)
    • 给它你的 ip/endpoint 并根据你的喜好设置一切
    • 使用任何服务器获取通知

    2。不是你的回购

    response = requests.get("https://github.com/fire17/gd-xo/commits/master.atom").text
    response.split("<updated>")[1].split("</updated>")[0]
    '2021-08-06T19:01:53Z'
    
    • 创建一个循环,每隔一段时间检查一次,如果这个字符串发生了变化,那么你可以发起一个克隆/拉取请求或做任何你喜欢的事情

    【讨论】:

      猜你喜欢
      • 2020-04-13
      • 2017-02-22
      • 1970-01-01
      • 2018-05-02
      • 1970-01-01
      • 2014-12-08
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多