Рубрики
Без рубрики

Тот, где мы строим веб – скраппер и слэкбот-Часть 2

В этой статье я расскажу о своем процессе создания slackbot и отправки сообщений на канал через определенные промежутки времени

Автор оригинала: Victory Akaniru.

В первой части этой серии из двух частей мы задались целью автоматизировать эти задачи

  • Посетите Brainyquote
  • Найдите и скопируйте случайную цитату о совершенстве с сайта.
  • Разместите цитату на слабом канале.

мы смогли создать веб-скребок, который позволял нам очищать веб-сайт от цитат и сохранять их в файл JSON. В этой второй части серии статей мы соберем все это вместе, создав slackbot, который будет периодически публиковать одну из цитат, которые мы выбросили на слэк-канал!

Если вы пропустили первую часть вы можете найти ее здесь

Продукт

  • Slackbot: Здесь мы посетим страницу slack apps и создадим бота , связанного с каналом slack.

  • Slack api backend: Используя slacks open API, мы напишем некоторые функции python, которые при вызове отправляют сообщение на канал.

  • Apscheduler: Наконец, мы напишем еще одну функцию, которая поможет нам вызывать эти функции API через определенные промежутки времени.

  • Начиная с первой части, все, что вам нужно на данный момент, – это слабое рабочее пространство, вы можете легко создать его бесплатно здесь или просто встроить бота в любое рабочее пространство, создав канал, с которым вы можете играть.

Часть 2: Слэкбот

Чтобы начать работу, посетите slack модал должен появиться следующим образом

Alt Text
  • Введите имя вашего приложения
  • Выберите рабочую область разработки(нажмите кнопку рабочая область, где будет установлен бот)

Нажмите кнопку создать приложение , и вы перейдете на эту страницу

Alt Text

Теперь нам нужно установить scope для нашего бота

Области действия дают вашему боту разрешение делать такие вещи, как отправка сообщения в рабочей области разработки.

Перейдите к OAuth & Permissions на боковой панели, чтобы добавить области в ваше приложение

Прокрутите вниз до раздела Bot Token Scopes и нажмите кнопку Добавить область OAuth .

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

Далее мы должны установить бота в ваше рабочее пространство, прокрутив его в верхней части страницы OAuth & Permissions и нажав зеленую кнопку Install App to Workspace .

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

Alt Text

Наконец, скопируйте свой токен бота, он вам понадобится для связи с 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, и в конце концов мы хотим иметь что-то похожее на это

Alt Text

Из кода мы прошли внутрь

  • Канал: Идентификатор канала 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 секунд.

Вы можете чирикать временной интервал в соответствии с вашими потребностями.

Вот и все, ребята, благодаря этим сериям мы смогли охватить несколько микро-навыков

  • создание слэкбота
  • выскабливание веб-сайта
  • планирование задач

Эти навыки могут быть применены отдельно или объединены для создания крутого продукта.

Я хотел бы услышать ваши отзывы и вопросы, не стесняйтесь оставлять комментарии.

Чтобы просмотреть полный код нажмите здесь