Я пытаюсь создать веб-крючок для Dialogflow, который использует API Календаря Google для назначения встреч. Поэтому веб-крючок должен принять запрос JSON от DialogFlow, поместить его в требуемый формат API Google и вызвать API Google. Для этого я использую межсерверную аутентификацию.
У меня проблемы с тем, что я получаю ошибку 500 («webhook называется failed»). Из журналов ошибок видно, что он не может найти файл JSON, который содержит ключ аутентификации. Я не понимаю почему, потому что он находится в том же репозитории Github, который содержит webhook (он называется g_calendar2.py). Путь, вставленный в файл python, является тем, который я получаю, когда открываю JSON на Github и нажимаю «копировать путь». Аутентификация прошла нормально, когда я запустил ее локально.
У кого-нибудь есть идеи? Спасибо!
g_calendar2.py
from google.oauth2 import service_account
import googleapiclient.discovery
import datetime
from httplib2 import Http
from oauth2client import file, client, tools
from flask import Flask, request, abort, make_response
import json
import re
import os
app=Flask(__name__)
@app.route('/webhook', methods=['POST'])
def webhook():
req = request.get_json(silent=True, force=True)
print(json.dumps(req, indent=4))
res = processRequest(req)
res = json.dumps(res, indent=4)
r = make_response(res)
r.headers['Content-Type'] = 'application/json'
return r
def processRequest(req):
info=req.get("queryResult").get("parameters")
datetime=info.get("date-time")
data=datetime
def getEmails(str):
email_address=info.get("email")
str = str(email_address)
regex = r'([\w0-9._-]+@[\w0-9._-]+\.[\w0-9_-]+)'
return re.findall(regex, str, re.M|re.I)
emails=getEmails(str)
SCOPES = ['https://www.googleapis.com/auth/calendar']
SERVICE_ACCOUNT_FILE = '**Reponamedummy**/**filenamedummy**.json'
credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
service = googleapiclient.discovery.build('calendar', 'v3', credentials=credentials)
event = {
'start': {
'dateTime': data,
'timeZone': 'Asia/Kuala_Lumpur',
},
'end': {
'dateTime': '2018-09-06T14:10:14+08:00',
'timeZone': 'Asia/Kuala_Lumpur',
},
'attendees':
[{'email': str(emails[0])}]
}
response = service.events().insert(calendarId='ssar.developer@gmail.com', body=event).execute()
return 'Event has been created.'
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')
Журналы ошибок
2018-08-31T08:20:19.704681+00:00 heroku[web.1]: State changed from starting to up
2018-08-31T08:21:04.742356+00:00 app[web.1]: {
2018-08-31T08:21:04.742402+00:00 app[web.1]: "responseId": "bd0ed761-466a-463a-b01f-41d664e4e5bf",
2018-08-31T08:21:04.742404+00:00 app[web.1]: "queryResult": {
2018-08-31T08:21:04.742408+00:00 app[web.1]: "queryText": "Slot for the 3rd of September, 3 p.m. samudrirao@gmail.com",
2018-08-31T08:21:04.742409+00:00 app[web.1]: "parameters": {
2018-08-31T08:21:04.742411+00:00 app[web.1]: "email": "samudrirao@gmail.com",
2018-08-31T08:21:04.742413+00:00 app[web.1]: "date": "",
2018-08-31T08:21:04.742414+00:00 app[web.1]: "date-time": "2018-09-03T12:00:00+08:00"
2018-08-31T08:21:04.742415+00:00 app[web.1]: },
2018-08-31T08:21:04.742417+00:00 app[web.1]: "allRequiredParamsPresent": true,
2018-08-31T08:21:04.742419+00:00 app[web.1]: "fulfillmentText": "Alright, you want to book for this date and time?",
2018-08-31T08:21:04.742420+00:00 app[web.1]: "fulfillmentMessages": [
2018-08-31T08:21:04.742421+00:00 app[web.1]: {
2018-08-31T08:21:04.742423+00:00 app[web.1]: "text": {
2018-08-31T08:21:04.742424+00:00 app[web.1]: "text": [
2018-08-31T08:21:04.742425+00:00 app[web.1]: "Alright, you want to book for this date and time?"
2018-08-31T08:21:04.742426+00:00 app[web.1]: ]
2018-08-31T08:21:04.742427+00:00 app[web.1]: }
2018-08-31T08:21:04.742429+00:00 app[web.1]: }
2018-08-31T08:21:04.742430+00:00 app[web.1]: ],
2018-08-31T08:21:04.742431+00:00 app[web.1]: "intent": {
2018-08-31T08:21:04.742437+00:00 app[web.1]: "name": "projects/linibot-9070f/agent/intents/5cb9cdd4-502c-4306-86a8-73e03e263d8f",
2018-08-31T08:21:04.742438+00:00 app[web.1]: "displayName": "Appointment Booking"
2018-08-31T08:21:04.742439+00:00 app[web.1]: },
2018-08-31T08:21:04.742441+00:00 app[web.1]: "intentDetectionConfidence": 1.0,
2018-08-31T08:21:04.742442+00:00 app[web.1]: "languageCode": "en"
2018-08-31T08:21:04.742443+00:00 app[web.1]: },
2018-08-31T08:21:04.742444+00:00 app[web.1]: "originalDetectIntentRequest": {
2018-08-31T08:21:04.742445+00:00 app[web.1]: "payload": {}
2018-08-31T08:21:04.742446+00:00 app[web.1]: },
2018-08-31T08:21:04.742448+00:00 app[web.1]: "session": "projects/linibot-9070f/agent/sessions/483fa518-f3ee-e3e3-805d-35187044d201"
2018-08-31T08:21:04.742449+00:00 app[web.1]: }
2018-08-31T08:21:04.744563+00:00 app[web.1]: [2018-08-31 08:21:04,742] ERROR in app: Exception on /webhook [POST]
2018-08-31T08:21:04.744566+00:00 app[web.1]: Traceback (most recent call last):
2018-08-31T08:21:04.744567+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/flask/app.py", line 2292, in wsgi_app
2018-08-31T08:21:04.744568+00:00 app[web.1]: response = self.full_dispatch_request()
2018-08-31T08:21:04.744570+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/flask/app.py", line 1815, in full_dispatch_request
2018-08-31T08:21:04.744571+00:00 app[web.1]: rv = self.handle_user_exception(e)
2018-08-31T08:21:04.744572+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/flask/app.py", line 1718, in handle_user_exception
2018-08-31T08:21:04.744573+00:00 app[web.1]: reraise(exc_type, exc_value, tb)
2018-08-31T08:21:04.744575+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/flask/_compat.py", line 35, in reraise
2018-08-31T08:21:04.744576+00:00 app[web.1]: raise value
2018-08-31T08:21:04.744577+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
2018-08-31T08:21:04.744579+00:00 app[web.1]: rv = self.dispatch_request()
2018-08-31T08:21:04.744580+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/flask/app.py", line 1799, in dispatch_request
2018-08-31T08:21:04.744581+00:00 app[web.1]: return self.view_functions[rule.endpoint](**req.view_args)
2018-08-31T08:21:04.744582+00:00 app[web.1]: File "/app/g_calendar2.py", line 22, in webhook
2018-08-31T08:21:04.744584+00:00 app[web.1]: res = processRequest(req)
2018-08-31T08:21:04.744585+00:00 app[web.1]: File "/app/g_calendar2.py", line 57, in processRequest
2018-08-31T08:21:04.744586+00:00 app[web.1]: credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
2018-08-31T08:21:04.744590+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/google/oauth2/service_account.py", line 209, in from_service_account_file
2018-08-31T08:21:04.744591+00:00 app[web.1]: filename, require=['client_email', 'token_uri'])
2018-08-31T08:21:04.744597+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/google/auth/_service_account_info.py", line 71, in from_filename
2018-08-31T08:21:04.744599+00:00 app[web.1]: with io.open(filename, 'r', encoding='utf-8') as json_file:
2018-08-31T08:21:04.744605+00:00 app[web.1]: FileNotFoundError: [Errno 2] No such file or directory: '**Reponamedummy**/**filenamedummy**.json'
2018-08-31T08:21:04.745327+00:00 app[web.1]: 10.103.217.221 - - [31/Aug/2018:08:21:04 +0000] "POST /webhook HTTP/1.1" 500 291 "-" "Apache-HttpClient/4.5.4 (Java/1.8.0_181)"
2018-08-31T08:21:04.743647+00:00 heroku[router]: at=info method=POST path="/webhook" host=saloon-bot2.herokuapp.com request_id=676b00bc-5840-4c39-a5c2-b29ea62980bb fwd="35.193.216.215" dyno=web.1 connect=0ms service=4ms status=500 bytes=456 protocol=https