在 Groupme Bot 中使用来自 JSON 消息请求的传递变量调用函数

Calling function with passing variable from JSON message request in Groupme Bot

所以在我正在处理的 GroupMe Bot 中 - 我已经让机器人通过在 webhook 中传递带有 if 语句的消息来响应。

def webhook():

# 'message' is an object that represents a single GroupMe message.
message = request.get_json()
speaker = message['name'] 


# If hypefact! is spoken, return random fact
# This code replies once and then calls another function that replies again
if 'hypefact!' in message['text'].lower() and not sender_is_bot(message):
    reply(speaker + ' - Here is your Hype Fact: ')
    reply(fact_delivery())

下面是get_weather

的函数
def get_weather(city):

## Bunch of stuff happens

reply(weatherData['currently']['summary'] + ', ' + str(
    weatherData['currently']['apparentTemperature']) + degree_sign + 'F. ' + weatherData['hourly'][
          'summary'] + '\n\n' + weatherData['daily']['summary'])

如果一个短语是 "in message['text']",它将触发一个动作,因为它在消息中。

如果我试图让它解析这条消息会怎么样。

"Whats the weather in Austin this weekend"

该短语的关键部分是 "weather in Austin"

所以我想把 "in" 之后的词解析为 get_weather(city)

预期工作流程: 聊天中的人在消息中说出带有 "weather in {CITY}" 的短语 bot 触发器,从字符串中过滤城市以调用 get_weather 函数

您可以为此使用正则表达式,但这不是很明显。 你描述的情况很容易被

import re

text = "Whats the weather in Austin this weekend"
match = re.search('[Ww]eather in (?P<city>\w+)', text)

if match:
    print(match.groupdict())  #  {'city': 'Austin'}
else:
    pass # the text does not contain "weather in {CITY}" pattern

但并不是所有的城市都是一字之名。所以诀窍是告诉城市名称何时结束和 "the rest of the sentence" 开始。例如,您可以相信所有以大写字母开头的单词都是城市名称的一部分

text2 = "Whats the weather in New York this weekend"
match2 = re.search('[Ww]eather in (?P<city>([A-Z]\w+\W+)+)', text2)

if match2:
    print(match2.groupdict())  #  {'city': 'New York '}
else:
    pass # the text does not contain "weather in {CITY}" pattern

但由于您要创建的是一个聊天机器人,那么,有多少人不厌其烦地在聊天中使用大写字母和标点符号?..

因此,在您捕获了您认为是城市的城市之后,您可能需要与一些预定义的城市名称列表保持一致(我想它不应该 那么 大)名字.