web-dev-qa-db-ja.com

PythonでGithub Webhookを受け取る方法

Githubは、レポジトリにアクティビティがあるときに、選択したURLに 受信後フック を送信することを提案しています。コンピューターで実行しているsmallPythonコマンドライン/バックグラウンド(GUIまたはwebappなし)アプリケーションを作成したい(後でNASで)、着信POST要求を継続的にlistenし、POSTが1回になるとGithubから受信した、含まれるJSON情報を処理します。 jsonを処理したらすぐに処理できます。 POSTは、githubによって指定された少数のIPから取得できます。コンピューターのポートを送信する場所を指定する予定です。

問題は、検索時に見つけた膨大な数のオプションに対処するためのWebテクノロジーについて十分に知らないことです。Django、リクエスト、ソケット、フラスコ、マイクロフレームワークを使用しますか?関係する用語の大部分が何を意味するのかわかりません。また、ほとんどの場合、問題を解決するには大きすぎたり大きすぎたりするように聞こえます-私は単に圧倒され、どこから始めればいいのかわかりません。

私が見つけることができるPOST/GETに関するほとんどのチュートリアルは、Webサイトからのデータの送信または直接要求に関係しているように見えますが、それを継続的にリッスンすることには関係していないようです。

問題は本当に難しいものではなく、どこに行けば/どのようにすればよいかがわかれば、数行に要約されます。誰でもポインター/チュートリアル/例/サンプルコードを提供できますか?

32
Christoph

POSTを介してデータを受信し、それで何かを行うための基本的なweb.pyの例を次に示します(この場合は、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を転送した後)を使用してデータをPOSTすると、次の出力が表示されました。

$ 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処理のためにprintステートメントを交換できるはずです。

ポート番号を指定するには、追加の引数を使用してスクリプトを呼び出します。

$ python hooks.py 1234 
22
ford

まず、ウェブはリクエスト/レスポンスベースです。そのため、何かがリンクを要求し、それに応じて応答します。サーバーアプリケーションは、ポートで継続的にリッスンします。心配する必要はありません。

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 -
34
Burhan Khalid

私は使うだろう:

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

Webサーバーを使用するように構成できます。または、Webサーバーなしでそこで実行するプロセスが必要な場合は、統合サーバーを起動できます。

python webhooks.py

これにより、必要なことをすべて実行できるようになります。それにもかかわらず、リポジトリとフックに少しセットアップする必要があります。

パーティーと恥知らずな自動プロモーションに遅れて、ごめんなさい。

1
Havok