在 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
但由于您要创建的是一个聊天机器人,那么,有多少人不厌其烦地在聊天中使用大写字母和标点符号?..
因此,在您捕获了您认为是城市的城市之后,您可能需要与一些预定义的城市名称列表保持一致(我想它不应该 那么 大)名字.
所以在我正在处理的 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
但由于您要创建的是一个聊天机器人,那么,有多少人不厌其烦地在聊天中使用大写字母和标点符号?..
因此,在您捕获了您认为是城市的城市之后,您可能需要与一些预定义的城市名称列表保持一致(我想它不应该 那么 大)名字.