Python - можно отправлять сообщения только при обнаружении ключевого слова в ОБА ключевых списках? - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть сценарий Python, который обнаруживает ключевое слово из списка ключевых слов keywords = ['camera', 'nikon'] и затем отправляет сообщение Slack, как показано ниже:

Ключевое слово Камера Обнаружено

'Реддит постurl '

' комментарий reddit, который содержит ключевое слово '

Если скрипт обнаруживает ключевое слово из второго списка ключевых слов color_keywords = ['red', 'blue'], он публикует следующее

Keyword camera обнаружено

'Reddit post url'

'комментарий Reddit, содержащий ключевое слово'

Цвет был обнаружен

У меня вопрос, могу ли я как-то получитьскрипт, поэтому он ТОЛЬКО отправляет сообщение, если ключевое слово из КАЖДОГО списка ключевых слов найдено?Таким образом, если он находит только ключевое слово из первого списка, он будет игнорироваться, если он находит одно из второго списка, он также будет игнорироваться.но если он найдет ключевое слово в списках ОБА, он отправит сообщение слабому.

Ниже приведен мой текущий код

MSG_TEMPLATE = """Keyword *{keyword}* detected
https://www.reddit.com{permalink}
```{comment_body}```"""

keywords = ['camera', 'nikon', 'canon']  
color_keywords = ['blue', 'red']

with open(save_path, 'r') as fp:
    alerted_comments = json.load(fp)

    for comment in comment_stream:
        if comment.id in alerted_comments:
            continue

        if comment.author:  # if comment author hasn't deleted
            if comment.author.name in ignore_users:
                continue

        if any(kw.lower() in comment.body.lower() for kw in keywords):
            found_kws = [kw for kw in keywords if kw.lower() in comment.body.lower()]

            msg = MSG_TEMPLATE.format(
                keyword=found_kws[0],
                permalink=comment.permalink,
                comment_body=comment.body
            )

            if any(kw.lower() in comment.body.lower() for kw in color_keywords):
                msg += "\n<!here> *A color was detected*"

            slack_data = {'text': msg, 'mrkdwn': True,}

            response = requests.post('https://hooks.slack.com/services/TB7AH6U2G/xxxxxxx/0KOjl9251TZExxxxxxxx',
                                             data=json.dumps(slack_data), headers={'Content-Type': 'application/json'})

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 24 ноября 2018

Конечно!Код ниже приведен для краткости:

def find_keywords(comment, word_list):
    """:returns: List of matching keywords present in the comment, or the empty list"""
    return [word for word in word_list if word.lower() in comment.body.lower()]

for comment in comment_stream:
    if not should_be_ignored(comment):
        found_kws = find_keywords(comment, keywords)
        found_colors = find_keywords(comment, color_keywords)

        if found_kws and found_colors:
            # At this point, we're guaranteed to have *both* one or more keywords *and* one or more colors
            send_message(comment, found_kws, found_colors)

Ключевым моментом здесь является следующее: вы создаете списки совпадений сначала , а затем после проверяете их, чтобы принять решениеесли вы хотите отправить сообщение.В этом случае, только если оба списка не пусты, вы перейдете к отправке сообщения.

(Реализация should_be_ignored() и send_message(), конечно, оставлена ​​в качестве упражнениячитателю. :))

РЕДАКТИРОВАТЬ: Завершить реализацию исходного кода:

def send_message(comment, keywords, colors):
    assert keywords and colors, "At this point, we should *only* be calling this function if we have at least one keyword and one color"

    MSG_TEMPLATE = """Keyword *{keyword}* and color *{color}* detected
    https://www.reddit.com{permalink}
    ```{comment_body}```"""
    msg = MSG_TEMPLATE.format(
        keyword=keywords[0],
        color=colors[0],
        permalink=comment.permalink,
        comment_body=comment.body
    )
    slack_data = {'text': msg, 'mrkdwn': True,}
    response = requests.post('https://hooks.slack.com/services/TB7AH6U2G/xxxxxxx/0KOjl9251TZExxxxxxxx',
                             data=json.dumps(slack_data), headers={'Content-Type': 'application/json'})


def should_be_ignored(comment, alerted):
    return comment.id in alerted or (comment.author and comment.author.name in ignore_users)


def find_keywords(comment, word_list):
    """:returns: List of matching keywords present in the comment, or the empty list"""
    return [word for word in word_list if word.lower() in comment.body.lower()]


keywords = ['camera', 'nikon', 'canon']  
color_keywords = ['blue', 'red']

with open(save_path, 'r') as fp:
    alerted_comments = json.load(fp)

for comment in comment_stream:
    if not should_be_ignored(comment, alerted_comments):
        found_kws = find_keywords(comment, keywords)
        found_colors = find_keywords(comment, color_keywords)

        if found_kws and found_colors:
            # At this point, we're guaranteed to have *both* one or more keywords *and* one or more colors
            send_message(comment, found_kws, found_colors)

Обратите внимание, что все, что я сделал (за исключением нового требования, что у нас есть и (и цвет, и ключевое слово перед отправкой сообщения) предназначены для извлечения некоторой части вашей бизнес-логики в функции should_be_ignored() и send_message(), надеюсь, проясняя смысл основной части кода.Это должно быть заменой образца, с которого вы начали.

...