Как получить GitHub Webhooks в Python

Github предлагает отправить после получения крючки к URL по вашему выбору, когда есть активность в вашем РЕПО. Я хочу написать маленький Python command-line / background (т. е. нет GUI или webapp) приложение работает на моем компьютере (позже на NAS), который постоянно слышит для этих входящих почтовых запросов, и как только сообщение получил из Github он обрабатывает информацию JSON, содержащуюся внутри. Обработка json, как только я это не является проблемой. Сообщение может исходить из небольшого количества IP-адресов, заданных github; я планирую / надеюсь указать порт на своем компьютере, куда он должен быть отправлен.

проблема в том, что я недостаточно знаю о веб-технологиях, чтобы иметь дело с огромным количеством опций, которые вы найдете при поиске.. использую ли я Django, запросы, розетки,колбу, микрофраме...? Я не знаю, что означает большинство терминов, и большинство звучит так, как будто они предлагают слишком много/слишком велики, чтобы решить мою проблему - я просто потрясен и не знаю, с чего начать.

большинство учебников о POST / GET, которые я мог найти, похоже, связаны с отправкой или прямым запросом данных с веб-сайта, но не с постоянным прослушиванием.

Я чувствую, что проблема не очень сложная, и будет сводиться к паре строк, как только я знаю, куда идти/как это сделать. Может ли кто-нибудь предложить указатели/учебники/примеры/Пример кода?

4 ответов


вот основные web.py пример получения данных через POST и что-то с ним делать (в этом случае просто распечатайте его в stdout):

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()

Я опубликовал некоторые данные, используя бросок.это (после пересылки 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 

во-первых, веб-это запрос-ответ на основе. Поэтому что-то запросит вашу ссылку, и вы ответите соответствующим образом. Ваше серверное приложение будет постоянно прослушивать порт; вам не нужно беспокоиться об этом.

вот аналогичная версия в 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 -

Я хотел бы использовать:

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

вы можете настроить веб-сервер для его использования, или если вам просто нужен процесс, работающий там без веб-сервера, вы можете запустить интегрированный сервер:

python webhooks.py

Это позволит вам сделать все, что вы сказали, что вам нужно. Это, тем не менее, требует немного настройки в вашем репозитории и в ваших крючках.

поздно на вечеринку и бесстыдно автопроконцерна, к сожалению.


Я думаю, что этот проект ГИТ-веб-перехватчик (вы можете найти его в github) будет perfact.

это платформа git webhook с хорошим веб-интерфейсом на основе Flask + SQLAchemy + Celery + Redis + React, используемая в автоматическом развертывании / эксплуатации / обслуживании быстро. GitHub / GitLab / Gogs / GitOsc все поддерживаются.

как его использовать ? Это простое веб-приложение Flask, поэтому разверните его как простую колбу с gunicorn + nginx. Также поддерживается docker. Этот индексная страница, как показано ниже:

(Я не могу опубликовать img)

кроме того, вы можете увидеть демо-сайт здесь . Используйте учетную запись github для входа.