40

Githubは、リポジトリにアクティビティがある場合に、選択したURLに受信後フックを送信することを提案します。コンピューター(後でNAS上で)で実行される小さなPythonコマンドライン/バックグラウンド(つまり、GUIやWebアプリなし)アプリケーションを作成したいと思います。このアプリケーションは、着信POSTリクエストを継続的にリッスンし、GithubからPOSTを受信するとに含まれるJSON情報を処理します。私がそれを持っているとすぐにjsonを処理することは問題ありません。POSTは、githubによって指定された少数のIPから取得できます。送信先のコンピューター上のポートを指定することを計画/希望しています。

問題は、検索時に見つけた膨大な数のオプションを処理するためのWebテクノロジーについて十分に理解していないことです。Django、Requests、sockets、Flask、microframeworksを使用していますか?関係する用語のほとんどが何を意味するのかわかりません。ほとんどの場合、問題を解決するには多すぎる/大きすぎるように聞こえます。私は単に圧倒され、どこから始めればよいのかわかりません。

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

問題はそれほど難しいものではないと感じており、どこに行くのか、どのように行うのかがわかれば、2、3行に要約できます。誰かがポインタ/チュートリアル/例/サンプルコードを提供できますか?

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

これは、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 
于 2013-01-27T18:27:02.903 に答える
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 に答える