40

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

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

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

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

4

5 回答 5

45

首先,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()

这是一个示例运行,使用来自 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 -
于 2013-01-27T18:43:26.203 回答
26

这是一个基本的 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 
于 2013-01-27T18:27:02.903 回答
2

我会使用:

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

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

python webhooks.py

这将允许你做你说你需要的一切。然而,它需要在您的存储库和挂钩中进行一些设置。

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

于 2015-03-13T00:25:52.430 回答
1

如果您使用的是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.')

如果您需要更多信息,这里有一个关于如何使用 Python 监听 webhook的精彩教程。

于 2020-07-20T08:28:45.317 回答
0

如果您正在寻找任何回购中的变化......

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'
  • 做一个循环,每隔一段时间检查一次,如果这个字符串发生了变化,那么你可以发起一个克隆/拉取请求或做任何你喜欢的事情
于 2021-08-06T19:49:08.070 回答