2017-03-16 4 views
2

私はPythonの初心者で、api.aiから情報を受け取り、APIに渡してから返されるJSONからの確認メッセージを返します。Python Webhook:URL +ペイロードを渡す

app.py:

#!/usr/bin/env python 

from __future__ import print_function 
from future.standard_library import install_aliases 
install_aliases() 

from urllib.parse import urlparse, urlencode 
from urllib.request import urlopen, Request 
from urllib.error import HTTPError 

import json 
import os 
import sys 
import logging 

from flask import Flask, render_template 
from flask import request 
from flask import make_response 

# Flask app should start in global layout 
app = Flask(__name__) 
app.logger.addHandler(logging.StreamHandler(sys.stdout)) 
app.logger.setLevel(logging.ERROR) 

@app.route('/webhook', methods=['POST']) 

def webhook(): 
    req = request.get_json(silent=True, force=True) 

    print("Request:") 
    print(json.dumps(req, indent=4)) 

    res = processRequest(req) 

    res = json.dumps(res, indent=4) 
    # print(res) 
    r = make_response(res) 
    r.headers['Content-Type'] = 'application/json' 
    return r 

def processRequest(req): 
    if req.get("result").get("action") != "bookMyConference": 
     return {} 

    #oauth 
    orequest = req.get("originalRequest") # work down the tree 
    odata = orequest.get("data") # work down the tree 
    user = odata.get("user") # work down the tree 
    access_token = user.get("access_token") 

    #data 
    result = req.get("result") # work down the tree 
    parameters = result.get("parameters") # work down the tree 
    startdate = parameters.get("start-date") 
    meetingname = parameters.get("meeting-name") 

    payload = { 
     "start-date": startdate, 
     "end-date": startdate, 
     "meeting-name": meetingname 
    } 

    # POST info to join.me 
    baseurl = "https://api.join.me/v1/meetings" 
    p = Request(baseurl) 
    p.add_header('Content-Type', 'application/json; charset=utf-8') 
    p.add_header('Authorization', 'Bearer ' + access_token) #from oauth 
    jsondata = json.dumps(payload) 
    jsondataasbytes = jsondata.encode('utf-8') # needs to be bytes 
    jresult = urlopen(p, jsondataasbytes).read() 
    data = json.loads(jresult) 
    res = makeWebhookResult(data) 
    return res 

def makeWebhookResult(data): 

    speech = "Appointment scheduled!" 

    print("Response:") 
    print(speech) 

    return { 
     "speech": speech, 
     "displayText": speech, 
     # "data": data, 
     "source": "heroku-bookmyconference" 
    } 


if __name__ == '__main__': 
    port = int(os.getenv('PORT', 5000)) 

    print("Starting app on port %d" % port) 

    app.run(debug=False, port=port, host='0.0.0.0') 

編集4:ここで私は私のHerokuのログに取得していますエラーです:

2017-03-21T19:06:09.383612+00:00 app[web.1]: HTTPError: HTTP Error 400: Bad Request

答えて

0

processRequest()内urlibモジュールを使用して、hereからの借入次のようにurlopenにペイロードを追加することができます:

モジュールを使用している場合

物事はより簡潔得る:

headers = {'content-type': 'application/json'} 
result = requests.post(yql_url, data=json.dumps(payload), headers=headers) 
data = result.json() 

EDIT:join.me docsを見てjoin.me API

に固有のいくつかの詳細を追加し、あなたが取得する必要がありますあなたのヘッダーに追加するアクセストークン。アクセストークンを取得するには、アプリの認証コードも必要です。手動でアプリの認証コードを取得することも、リダイレクトを連鎖させることもできます。

ご利用のブラウザでこのURLを試して、コールバックパラメータからcodeを取得してください。アクセストークンを取得するには

auth_url = 'https://secure.join.me/api/public/v1/auth/oauth2' \ 
    + '?client_id=' + client_id \ 
    + '&scope=scheduler%20start_meeting' \ 
    + '&redirect_uri=' + callback_url \ 
    + '&state=ABCD' \ 
    + '&response_type=code' 
print(auth_url) # try in browser 

:あなたのjoin.me credsをを使用して

token_url = 'https://secure.join.me/api/public/v1/auth/token' 
headers = {'content-type': 'application/json'} 
token_params = { 
    'client_id': client_id, 
    'client_secret': client_secret, 
    'code': auth_code, 
    'redirect_uri': callback_url, 
    'grant_type': 'authorization_code' 
} 
result = requests.post(token_url, data=json.dumps(token_params), headers=headers) 
access_token = result.json().get('access_token') 

を次に/会議へのポストのためのあなたのヘッダが見えるように必要があるでしょう:

headers = { 
    'content-type': 'application/json', 
    'Authorization': 'Bearer ' + access_token 
} 
+0

私は」私のprocessRequest()コールにそれを追加しましたが、私は現在、 "ステータス"を打つときにこのエラーを受け取ります:{ "code":206、 "errorType": "partial_content"、 " errorDet ails ":" Webhook呼び出しに失敗しました。エラーメッセージ:Webhook応答が空でした。 ' – beaconhill

+0

'data'は復帰時にどのように見えますか?いくつか[フォーマット](https://discuss.api.ai/t/webhook-error-206/976/7)が必要なようです。 – brennan

+0

もっと元の投稿に編集を加えました。私はアクセストークンを通過していないので、401を取得しています。リクエストからアクセスするにはどうすればよいですか? – beaconhill

関連する問題