这似乎与我之前提出的问题类似。但是,我对代码做了很多修改,这改变了我所遇到的问题。为了提供上下文,我在烧瓶上构建了一个whatsapp Twilio聊天机器人。这个想法是,如果用户输入某个关键字,他们将根据输入的内容收到一条消息。
除此之外,我还创建了一个函数来尝试限制一个人在24小时内可以发出/接收的请求/响应的数量。因此,用户从其第一次操作开始的24小时内只能使用该聊天机器人5次。
这是我为此聊天机器人编写的代码,我添加了注释以解释逻辑,因此更容易发现我犯的任何错误并包括我正在使用的所有库:
from flask import Flask, request
from twilio.twiml.messaging_response import MessagingResponse
from datetime import datetime
import pytz
import re
app = Flask(__name__)
@app.route('/bot', methods=['POST'])
def bot():
incoming_msg = request.values.get('Body', '').lower()
resp = MessagingResponse()
#extract phone number from ngrok
number = request.values.get('From', '')
#remove non numerical values
cleaned_number = re.sub('[^0-9]', '', number)
msg = resp.message()
responded = False
# this will store information about user session such as the time of user's first request and request counter
sessionStorage = {}
# addng user to session storage with current time and sett ing request counter to 0
def add_user(user,time,counter):
sessionStorage[user] = {}
# time when first session starts
sessionStorage[user][time] = datetime.now(pytz.timezone('Africa/Harare'))
sessionStorage[user][counter] = 0
# checking if user can perform a request and updating time if required
def request_check(user,time,counter):
difference = sessionStorage[user][time] - datetime.now(pytz.timezone('Africa/Harare'))
# check if it has been 24 hours after first request, if so then reset request counter and set last request time to current time
sessionStorage[user][counter] = 0
sessionStorage[user][time] = datetime.now(pytz.timezone('Africa/Harare'))
# if user requests exceed 5 then do not allow any more requests
if sessionStorage[user][counter] > 5:
return False
# in other cases allow user to continue requesting
return True
# function to increment request counter for current user
def increment_request_counter(user, counter):
sessionStorage[user][counter] += 1
if request_check(user=cleaned_number, time=datetime.now(pytz.timezone('Africa/Harare')), counter=0):
if incoming_msg == 'help':
output = 'This is a chatbot designed to send XYZ.'
msg.body(output)
responded = True
# returns sender's number
if 'test' in incoming_msg:
msg.body(cleaned_number)
responded = True
if 'first' in incoming_msg:
text = 'First test text'
msg.body(text)
responded = True
if 'second' in incoming_msg:
text = 'Second test text'
msg.body(text)
responded = True
if not responded:
msg.body('Not programmed to return this text')
return str(resp)
increment_request_counter(user=cleaned_number)
if __name__ == '__main__':
app.run(debug=True)
当我尝试输入关键字时。例如whatsapp上的“ first”,我在Pycharm终端中收到以下错误消息:
File "C:\Users\User\Documents\GitHub\gradientboostwhatsapp\venv\lib\site-packages\flask\app.py", line 1935, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Users\User\Documents\GitHub\gradientboostwhatsapp\bot.py", line 46, in bot
if request_check(user=cleaned_number, time=datetime.now(pytz.timezone('Africa/Harare')), counter=0):
File "C:\Users\User\Documents\GitHub\gradientboostwhatsapp\bot.py", line 33, in request_check
difference = sessionStorage[user][time] - datetime.now(pytz.timezone('Africa/Harare'))
KeyError: '27652581300'