Вызов функции с передачей переменной из запроса JSON-сообщения в Groupme Bot - PullRequest
0 голосов
/ 02 мая 2018

Итак, в боте GroupMe, над которым я работаю, бот получил возможность ответить, передав сообщения с оператором 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)

Ожидаемый рабочий процесс: человек в чате говорит в сообщении фразу "погода в {СИТИ}" бот запускает, фильтрует город из строки для вызова функции get_weather

1 Ответ

0 голосов
/ 02 мая 2018

Вы можете использовать регулярное выражение для этого, но это не так очевидно. Случай, который вы описали, легко пойман

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

Но поскольку вы пытаетесь создать чат-бота, сколько человек потрудились использовать заглавные буквы и знаки препинания в чатах? ..

Так что вам, вероятно, нужно будет выровнять какой-то предопределенный список названий городов (это не должно быть , что, я полагаю, большой) после того, как вы захватили то, что вы называете названием города.

...