Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

Вот базовый пример 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()

Я отправил некоторые данные к нему с помощью 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.

Чтобы указать номер порта, вызовите script с дополнительным аргументом:

$ python hooks.py 1234 

Ответ 2

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

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

[email protected]:~$ python sample.py 
 * Running on http://127.0.0.1:5000/

Вот запрос на сервер, в основном, что github будет делать:

[email protected]:~$ 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 -

Ответ 3

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

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

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

python webhooks.py

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

Поздно к партии и бесстыдной автопромоции, извините.

Ответ 4

Я думаю, что этот проект git -webhook (вы можете искать его в github) будет безупречным.

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

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

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

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