我正在尝试通过网络挂钩(烧瓶)跟踪用户以前的操作。我通过创建一个字典来完成此操作,该字典将用户 ID 作为键读取,然后不断替换每个新操作的值(我只需要最后一个操作)。但是,当我查看 Heroku 服务器上的日志时,似乎发现这非常困难......它要么在 previous_payload 变量中放置一个完全不同的有效负载(这实际上不是最后一个操作),要么它决定它没有更长的时间注册发件人ID,因此值为0。我不确定这是因为我如何设置字典(虽然我看不到如何设置)还是因为服务器速度很慢,这导致延迟和混淆持有先前事件的变量。
这段代码应该同步执行,因此可以跟踪 - 那么为什么prior_payload似乎不是线性的?
是否有任何人可以建议或看到我在代码中犯的可能导致这种情况的错误的替代方法?
重要的部分是下面的代码,但只是为了上下文,send_qresponse 函数只是根据用户的操作(回发/快速回复等)将发布请求发送回服务器。
我需要跟踪先前事件的主要原因是因为我问了用户几个问题,并且为了记录他们刚刚回答了一个开放式问题,我检查了他们所做的最后一个事件。
提前致谢!
import os
import sys
import json
import time
import requests
from flask import Flask, request
prior_payload = {}
app = Flask(__name__)
@app.route('/', methods=['POST'])
def webhook():
log(prior_payload.keys())
log(prior_payload.values())
# endpoint for processing incoming messaging events
data = request.get_json()
if data["object"] == "page":
for entry in data["entry"]:
time = entry['time']
for messaging_event in entry["messaging"]:
sender_id = str(messaging_event["sender"]["id"])
if sender_id not in prior_payload.keys():
prior_payload[sender_id] = 0
if messaging_event.get("message"): # someone sent us a message
if "attachments" in messaging_event['message']:
sender_id = str(messaging_event["sender"]["id"])
recipient_id = messaging_event["recipient"]["id"]
payload = "uploaded random file"
mistake_message(sender_id, payload ,prior_payload[sender_id])
user_input(sender_id, payload, time, prior_payload[sender_id])
elif messaging_event["message"]["text"] == 'done' or messaging_event["message"]["text"] == 'Done':
sender_id = str(messaging_event["sender"]["id"])
payload = messaging_event["message"]["text"]
send_qresponse(sender_id, payload)
user_input(sender_id, payload, time, prior_payload[sender_id])
elif "quick_reply" in messaging_event["message"]:
sender_id = str(messaging_event["sender"]["id"])
payload = messaging_event["message"]["quick_reply"]['payload']
prior_payload[sender_id] = None
prior_payload[sender_id] = str(payload)
send_qresponse(sender_id, payload)
user_input(sender_id, payload, time, prior_payload[sender_id])
elif messaging_event['message']['text'] == "ready" or messaging_event['message']['text'] == "Ready":
sender_id = str(messaging_event["sender"]["id"])
payload = messaging_event["message"]["text"]
send_qresponse(sender_id, payload)
user_input(sender_id, payload, time, prior_payload[sender_id])
elif prior_payload[sender_id] == "ready_vacancies":
sender_id = str(messaging_event["sender"]["id"])
prior_payload[sender_id] = "second_question"
recipient_id = messaging_event["recipient"]["id"]
payload = "second_question"
send_qresponse(sender_id, payload)
user_input(sender_id, payload, time, prior_payload[sender_id])
elif prior_payload[sender_id] == "second_question":
sender_id = str(messaging_event["sender"]["id"])
prior_payload[sender_id] = "third_question"
recipient_id = messaging_event["recipient"]["id"]
payload = "third_question"
send_qresponse(sender_id, payload)
user_input(sender_id, payload, time, prior_payload[sender_id])
elif prior_payload[sender_id] == "third_question":
sender_id = str(messaging_event["sender"]["id"])
prior_payload[sender_id] = "fourth_question"
recipient_id = messaging_event["recipient"]["id"]
payload = "fourth_question"
send_qresponse(sender_id, payload)
user_input(sender_id, payload, time, prior_payload[sender_id])
elif prior_payload[sender_id] == "fourth_question":
sender_id = str(messaging_event["sender"]["id"])
prior_payload[sender_id] = "fifth_question"
recipient_id = messaging_event["recipient"]["id"]
payload = "fifth_question"
send_qresponse(sender_id, payload)
user_input(sender_id, payload, time, prior_payload[sender_id])
elif prior_payload[sender_id] == "fifth_question":
sender_id = str(messaging_event["sender"]["id"])
prior_payload[sender_id] = "linkedin_url"
recipient_id = messaging_event["recipient"]["id"]
payload = "linkedin_url"
send_qresponse(sender_id, payload)
user_input(sender_id, payload, time, prior_payload[sender_id])
else:
sender_id = str(messaging_event["sender"]["id"])
recipient_id = messaging_event["recipient"]["id"]
payload = str(messaging_event["message"]["text"])
mistake_message(sender_id, payload)
user_input(sender_id, payload, time, prior_payload[sender_id])
if messaging_event.get("delivery"): # delivery confirmation
pass
if messaging_event.get("optin"): # optin confirmation
pass
if messaging_event.get("postback"): # user clicked/tapped "postback" button in earlier message
sender_id = str(messaging_event["sender"]["id"])
recipient_id = messaging_event["recipient"]["id"]
payload = str(messaging_event['postback']['payload'])
prior_payload[sender_id] = str(payload)
send_qresponse(sender_id, payload)
user_input(sender_id, payload, time, prior_payload[sender_id])
return "ok", 200