Автор оригинала: Victory Akaniru.
В первой части этой серии из двух частей мы задались целью автоматизировать эти задачи
- Посетите Brainyquote
- Найдите и скопируйте случайную цитату о совершенстве с сайта.
- Разместите цитату на слабом канале.
мы смогли создать веб-скребок, который позволял нам очищать веб-сайт от цитат и сохранять их в файл JSON. В этой второй части серии статей мы соберем все это вместе, создав slackbot, который будет периодически публиковать одну из цитат, которые мы выбросили на слэк-канал!
Если вы пропустили первую часть вы можете найти ее здесь
Продукт
Slackbot: Здесь мы посетим страницу slack apps и создадим бота , связанного с каналом slack.
Slack api backend: Используя slacks open API, мы напишем некоторые функции python, которые при вызове отправляют сообщение на канал.
Apscheduler: Наконец, мы напишем еще одну функцию, которая поможет нам вызывать эти функции API через определенные промежутки времени.
Начиная с первой части, все, что вам нужно на данный момент, – это слабое рабочее пространство, вы можете легко создать его бесплатно здесь или просто встроить бота в любое рабочее пространство, создав канал, с которым вы можете играть.
Часть 2: Слэкбот
Чтобы начать работу, посетите slack модал должен появиться следующим образом
- Введите имя вашего приложения
- Выберите рабочую область разработки(нажмите кнопку рабочая область, где будет установлен бот)
Нажмите кнопку создать приложение
, и вы перейдете на эту страницу
Теперь нам нужно установить scope
для нашего бота
Области действия дают вашему боту разрешение делать такие вещи, как отправка сообщения в рабочей области разработки.
Перейдите к OAuth & Permissions
на боковой панели, чтобы добавить области в ваше приложение
Прокрутите вниз до раздела Bot Token Scopes
и нажмите кнопку Добавить область OAuth
.
Выберите или выполните поиск chat:write
scope, чтобы предоставить вашей лодке разрешение на публикацию сообщений в каналах, членом которых она является. после этого вы должны увидеть баннер успеха.
Далее мы должны установить бота в ваше рабочее пространство, прокрутив его в верхней части страницы OAuth & Permissions
и нажав зеленую кнопку Install App to Workspace
.
После описанного выше шага вы должны перейти на нижеприведенную страницу. Все, что вам нужно сделать, это нажать кнопку разрешить
.
Наконец, скопируйте свой токен бота, он вам понадобится для связи с slack API.
Следующие шаги… Нам нужно написать наш бэкэнд-код для взаимодействия со slack. мы будем делать это в той же папке, где мы создали наш web scrapper
вы можете найти этот код, если у вас его нет, нажав здесь
- cd clonedOrExistingProject - mkdir bot - cd scrapping-tool - touch __init__.py builder.py post_message.py
Создайте и активируйте виртуальную среду, если у вас ее еще нет
- virtualenv --python=python3 venv - source venv/bin/activate
В builder.py
файл добавьте следующий код
def construct_payload(HEADER_BLOCK, DIVIDER_BLOCK, MESSAGE_BLOCK): return { "channel": "your-channel-id-goes-here", "username": "name-of-your-app", "icon_emoji": ":robot_face:", "text": ":wave: Your daily dose of motivation has arrived", "blocks": [HEADER_BLOCK, DIVIDER_BLOCK, MESSAGE_BLOCK], }
У Slack есть инструмент под названием block builder kit, он в основном используется для создания уценок, которые можно использовать для стилизации внешнего вида сообщений на slack. Попробуйте это здесь .
Для нас мы создали функцию, которая принимает различные блоки из набора block builder kit, и в конце концов мы хотим иметь что-то похожее на это
Из кода мы прошли внутрь
- Канал: Идентификатор канала Slack, куда мы хотим пригласить вашего бота(вы можете скопировать его со своего канала slack, обязательно пригласите бота на этот канал)
- Имя пользователя: это будет имя приложения, которое вы создали ранее
- Текст: будет то, что появляется во всплывающем окне уведомления slack.
- Блоки: содержит различные части сообщения, заголовок, разделительную линию и само сообщение.
Давайте начнем с создания нашей функции генератора случайных цитат, этот файл будет считывать наши ранее отброшенные кавычки json и возвращать любую случайную при вызове функции. в корневом каталоге вашего проекта выполните команду
- mkdir utils - touch __init__.py random_quote.py
В файл random_quote добавьте следующий код
import random import json def random_quotes_generator(): with open('quotes.json', 'r') as f: quotes_dict = json.load(f) quote = random.choice(quotes_dict) return quote
Этот файл создает функцию random_quotes_generator
считывает наши цитаты из файла json и с помощью модуля random python возвращает одну случайную цитату при вызове.
Затем мы создаем нашу функцию post message. Установите эти пакеты
pip3 install slack dotenv
slack
для взаимодействия с slack API и dotenv
для загрузки в наш бот секретного токена.
Перейдите к post_message.py
файл и сообщение следующего кода.
import os from slack import WebClient from dotenv import load_dotenv from bot.builder import construct_payload from utils.random_quote import random_quotes_generator load_dotenv() SLACK_BOT_TOKEN = os.getenv("SLACK_BOT_TOKEN") # Initialize a Web API client slack_web_client = WebClient(token=SLACK_BOT_TOKEN) def post_quote_to_channel(): quote = random_quotes_generator() author = quote['author'] link = f"https://www.brainyquote.com{quote['author-link']}" # Get the onboarding message payload message = construct_payload({ "type": "section", "text": { "type": "mrkdwn", "text": "*Your daily dose of motivation* :blush:" } }, { "type": "divider" }, { "type": "section", "text": { "type": "mrkdwn", "text": f"The test of the artist does not lie in the will with which he goes to work, but in the excellence of the work he produces... *By <{link}|{author}>*" } }) # Post the onboarding message in Slack response = slack_web_client.chat_postMessage(**message)
Так что же мы здесь делаем?..
Мы импортировали несколько сторонних пакетов, вашу функцию message builder
и наш random_quotes_generator
.
Мы также загружаем в наш SLACK_BOT_TOKEN
, создаем файл .env
используем ключ SLACK_BOT_TOKEN
и устанавливаем его на ваш токен бота.
- Мы инициализировали slack WebClient и создали
post_quote_to_channel
внутри которого мы вызываем нашу функцию генератора случайных чисел и сохраняем ее в переменнойquote
. - Мы создаем ссылку на страницу каждого автора.
- Затем мы создаем наше сообщение, вызывая функцию
construct_payload
, экспортированную из файла message builder и передавая все необходимые параметры. - Наконец, мы вызываем функцию
chat_postMessage
из веб-клиента slack и передаем наше сконструированное сообщение.
Вы можете проверить, что это работает сейчас, вызвав функцию на вашем терминале, выполнив эту команду
Последним шагом в этом процессе было бы создание нашего планировщика для периодического вызова post_quote_to_channel
. для этого нам нужно установить несколько пакетов, создать сервер flask и нашу функцию планировщика.
В корневой папке вашего проекта создайте новый файл app.py
и выполните следующие команды
pip3 install APScheduler Flask
- cd bot - mkdir jobs - touch __init__.py scheduler.py
В папке both/jobs
найдите файл scheduler.py
файл и вставить в следующий код
from apscheduler.schedulers.background import BackgroundScheduler # jobs from bot.post_message import post_quote_to_channel scheduler = BackgroundScheduler() scheduler.add_job( post_quote_to_channel, 'interval', seconds=10 )
Здесь мы импортируем Background Scheduler
из пакета scheduler и инициализируем его.
- Мы также импортируем функцию
post_quote_to_channel
из файлаpost_message
в папку бота. - При этом мы вызываем функцию
add_job
из планировщика, передаем функциюpost_quote_to_channel
, строкуinterval
и временной интервал всекундах
. чтобы узнать больше о планировщике приложений, нажмите здесь
с этим у нас есть готовая функция планировщика.
Сведение всего этого воедино
В app.py
файл, который мы создали ранее, разместите следующий код
import os import time from flask import Flask from bot.jobs.scheduler import scheduler # Initialize a Flask app to host the events adapter app = Flask( __name__ ) if __name__ == " __main__": scheduler.start() print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C')) try: # This is here to simulate application activity (which keeps the main thread alive). while True: time.sleep(5) except (KeyboardInterrupt, SystemExit): # Not strictly necessary if daemonic mode is enabled but should be done if possible scheduler.shutdown()
Здесь мы импортируем наш планировщик, создаем сервер flask и вызываем нашу функцию планировщика. мы также используем изящный трюк от StackOverflow, чтобы сохранить наш основной поток живым.
Запустите программу
Если бы мы все сделали правильно, то начали бы получать котировки в нашем слабом канале каждые 10 секунд.
Вы можете чирикать временной интервал в соответствии с вашими потребностями.
Вот и все, ребята, благодаря этим сериям мы смогли охватить несколько микро-навыков
- создание слэкбота
- выскабливание веб-сайта
- планирование задач
Эти навыки могут быть применены отдельно или объединены для создания крутого продукта.
Я хотел бы услышать ваши отзывы и вопросы, не стесняйтесь оставлять комментарии.
Чтобы просмотреть полный код нажмите здесь