Python Twilio错误-prolog中不允许出现内容.架构验证警告



与之前的SO查询类似,我有一个webhook接收器,用于侦听POST。我向我的Twilio号码发送了一条WhatsApp消息,Twilio向webhook接收器发送了POST,服务器代码处理了请求,然后向Twilio返回了一个响应对象。该代码从Airtable上的活动日历中提取一些项目,并应通过Twilio将其发送到WhatsApp。

webhook测试Postman是否正常。然而,WhatsApp不会返回POST请求的结果,我收到了来自Twilio调试器的以下警告:

sourceComponent     "14100"
line                "1"
ErrorCode           "12200"
LogLevel            "WARN"
Msg                 "Content is not allowed in prolog."
EmailNotification   "false"
parserMessage       "Content is not allowed in prolog."
cols                "1"

我的完整代码在这里:

from flask import Flask, request
import requests
import json
from airtable import Airtable
from datetime import datetime
from twilio.twiml.messaging_response import MessagingResponse
base_key = 'BASE_KEY'
table_name = 'Events Calendar'
api_key = 'API_KEY'
airtable = Airtable(base_key, table_name, api_key)
API_URL = "https://api.airtable.com/v0/BASE_KEY/Events%20Calendar?maxRecords=3&filterByFormula=IS_AFTER(%7BDate%7D,NOW())"
headers = {
"Authorization": "Bearer API_KEY"
}
app = Flask(__name__)
@app.route('/bot', methods=['POST'])
def accessdb():
incoming_msg = request.values.get('Body', '').lower()
resp = MessagingResponse()
msg = resp.message()
responded = False

if 'next' in incoming_msg:
def pretty(d):
date = datetime.strptime(d["Date"], "%Y-%m-%dT%H:%M:%S.%fZ")
return f'''Date: {date.strftime("%A, %d. %B %Y %I:%M%p")}
Title: {d['Title']}
Description: {d['Description']}
'''
pages = airtable.get_iter(maxRecords=3, formula="Date >= NOW()", sort=["Date"], fields=('Date', 'Title', 'Description'))
mylist = [] 

for page in pages:
for record in page:
if 'fields' not in record:
continue
fields = record['fields']
mylist.append(pretty(fields))
return "n".join(mylist)
elif 'what' in incoming_msg:
msg.body("Please enter 'next' to get the next events.")
responded = True
elif not responded:
msg.body("I don't know about that, sorry!")
return str(resp)
if __name__ == '__main__':
app.run()

上面的代码被部署到Heroku,我可以使用curl或Postman来调用webhook,并成功地产生以下结果:

Date: Wednesday, 07. October 2020 06:00PM
Title: Social Distancing Dance Party: Slow Motion
Description: Slow Motion is the yang to the Saturday Dance Party's yin
Date: Thursday, 08. October 2020 08:00AM
Title: Free Online Meditation Mornings
Description: 20-30 minute meditation. Donations can be made at https://example.com
Date: Saturday, 10. October 2020 07:00PM
Title: Social Distancing Dance Party
Description: A party in your very own kitchen

但是从Twilio调用webhook会产生前面给出的错误。

前面的SO回答建议返回如下查询结果:return twilioResponse.ToString()

我对语法没有信心,并尝试了以下操作:

for page in pages:
for record in page:
if 'fields' not in record:
continue
fields = record['fields']
mylist.append(pretty(fields))
return "n".join.twilioResponse.ToString(mylist)

然而,当我尝试以上操作时,失败如下:

return "n".join.twilioResponse.ToString(mylist)
AttributeError: 'builtin_function_or_method' object has no attribute 'twilioResponse'

如果能朝着正确的方向推动,我们将不胜感激。非常感谢。

这里是Twilio开发人员的传道者。

我认为这里的问题是,当你发送机器人";下一个";它的响应是一系列结果,而不是TwiML,这正是Twilio所期望的。如果用户发送";什么";或者其他任何事情,所以没有太多改变。

你需要带上这个代码:

for page in pages:
for record in page:
if 'fields' not in record:
continue
fields = record['fields']
mylist.append(pretty(fields))
return "n".join(mylist)

而不是最后的return,将您构建的字符串设置为TwiML响应中的消息,如下所示:

for page in pages:
for record in page:
if 'fields' not in record:
continue
fields = record['fields']
mylist.append(pretty(fields))
msg.body("n".join(mylist))

现在,您将事件列表设置为要发送的消息,它将通过方法末尾的return str(resp)行以TwiML的形式返回给Twilio。

顺便说一句,我认为您不需要在整个条件中使用responded布尔值。相反,你可以用else来完成你的条件,它会捕捉到你以前没有匹配过的任何情况。像这样:

else:
msg.body("I don't know about that, sorry!")

如果这有帮助,请告诉我。

最新更新