在Groupme Bot

时间:2018-05-02 20:34:38

标签: python bots weather groupme

所以在我正在研究的GroupMe Bot中 - 我已经让机器人通过webhooks中的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'])

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

如果我试图解析此消息该怎么办。

“本周末奥斯汀的天气如何”

该短语的关键部分是“奥斯汀的天气”

所以我想在“in”之后接受这个词并将其解析为get_weather(city)

预期的工作流程: 聊天中的人说消息中带有“{CITY}中的天气”的短语 机器人触发器,过滤字符串中的城市以调用get_weather函数

1 个答案:

答案 0 :(得分:1)

你可以使用正则表达式,但那不是那么明显。 您描述的案例很容易被

抓住
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

但并非所有城市都有一个单词的名称。因此,诀窍是告诉城市名称何时结束并且“句子的其余部分”开始。例如,您可以依赖以大写字母开头的所有单词都是城市名称的一部分

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

但是,因为它是一个聊天机器人,你试图创建,好吧,有多少人在聊天中使用大写字母和标点符号?...

因此,您可能需要在捕获了您认为是城市名称的内容之后,与一些预定义的城市名称列表保持一致(我不应该 我认为)。