Опросы v2.0

Создание бота

Для регистрации нового бота необходимо обратиться к боту BotFather. Для этого в строке поиска наберите BotFather и в показанных результатах найдите интересующего нас бота:

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

Выберите его и в диалоговом окне напишите команду /start и бот в ответном сообщение пришлет список всех доступных команд:

Нас интересует создание нового бота, поэтому выбираем команду /newbot. Команду можно как напечатать самостоятельно, так и выбрать мышью в сообщении и она автоматически отправится:

Первым шагом нам предлагают дать имя новому боту, оно может быть произвольным. Мы назовем его PocketAdmin:

Теперь требуется указать идентификатор бота (username), он должен заканчиваться на _bot и быть уникальным в системе. Мы укажем PocketAdminTech_bot:

На этом создание бота завершено. В последнем сообщении нам пришла ссылка на нашего нового бота t.me/PocketAdminTech_bot и токен (закрашен), необходимый для взаимодействия с API.

Обязательно сохраните токен и храните его в тайне!

Создание Telegram каналов и ботов.

Пакет предоставляет чистый интерфейс Python для Telegram Bot API. Он совместим с версиями Python 3.6+. Пакет также может работать с PyPy3 (официально не поддерживается), хотя раньше было много проблем.

В дополнение к эта библиотека содержит ряд высокоуровневых классов, которые делают разработку ботов простой и понятной. Эти классы содержатся в модуле .

Реализация чистого API без расширений доступна как отдельный пакет .

Установка пакета в виртуальное окружение:

# создаем виртуальное окружение, если нет
$ python3 -m venv .telegram --prompt TelegramBot
# активируем виртуальное окружение 
$ source .telegram/bin/activate
# ставим модуль python-telegram-bot
(TelegramBot):~$ python -m pip install -U python-telegram-bot
# или установка чистого API без расширений
(TelegramBot):~$ python -m pip install -U python-telegram-bot-raw

Пакет в основном будет разбираться на примерах. Содержание, обзорного/вводного материала по библиотеке ниже. Меню с материалами по всему разделу — справа. Поехали…

  • ;

    • ;
    • ;
  • ;

    • ;
    • ;
    • .

Автоматизируем работу браузера

Для разработки простейшей версии нашего Instagram бота мы будем использовать Selenium, инструмент для тестирования web интерфейсов, который по факту InstaPy использует «под капотом».

Для начала работы сначала установите Selenium. При его установке убедитесь, что вы также установили поскольку последняя версия . Это также означает, что на вашем компьютере должен быть установлен браузер Firefox.

Теперь создадим файл со следующим Python кодом:

from time import sleep
from selenium import webdriver

browser = webdriver.Firefox()
browser.get('https://www.instagram.com/')

sleep(5)
 
browser.close()

Запустим наш код на выполнение, и вы увидим, что открывается окно браузера Firefox, который самостоятельно переходит на страницу входа в Instagram. Вот построчный разбор этого кода:

  • Строка 1 и 2 импортируют и .
  • Строка 4 инициализирует экземпляр объекта драйвера браузера Firefox и передает ссылку на него переменной .
  • Строка 6 вводит в адресную строку брузера и осуществляет переход по этому адресу путем эмуляции нажатия Enter.
  • Строка 8 запускает интервал ожидания пять секунд, чтобы мы могли увидеть результат. В противном случае браузер будет мгновенно закрыт.
  • Строка 10 закрывает браузер.

Это Selenium версия классического Hello, World. Теперь мы готовы добавить в файл код, который позволит боту входить в ваш Instagram профиль. Но сначала подумаем о том, что необходимо сделать для того, чтобы войти в свой профиль. Для этого вы бы сделали следующее:

  1. Перейти по адресу .
  2. Кликнуть по ссылки для входа.
  3. Ввести свои учетные данные.
  4. Нажать кнопку входа.
from time import sleep
from selenium import webdriver

browser = webdriver.Firefox()
browser.implicitly_wait(5)
 
browser.get('https://www.instagram.com/')

login_link = browser.find_element_by_xpath("//a")
login_link.click()

sleep(5)
 
browser.close()

Обратите внимание на следующие строки нашего кода:

  • Строка 5 устанавливает пятисекундный интервал времени ожидания. Если Selenium не может найти элемент то, он будет ожидать пять секунд, в течение которых будут догружаться элементы страницы, и потом попытается снова сделать это.
  • Строка 9 находит элемент ссылки , который содержит текст . В нашем коде это делается с использованием синктаксиса XPath, но существуют и другие методы как это вы можете сделать.
  • Строка 10 эмулирует «клик» на найденном элементе для входа в наш профиль.

На странице входа login page расположены три нужных нам элемента:

  1. Поле ввода имени пользователя;
  2. Поле ввода пароля;
  3. Кнопка входа.

Изменим наш скрипт таким образом, чтобы он находил эти элементы, вводил наши учетные данные, а затем нажал кнопку входа в профиль:

from time import sleep
from selenium import webdriver

browser = webdriver.Firefox()
browser.implicitly_wait(5)

browser.get('https://www.instagram.com/')
 
login_link = browser.find_element_by_xpath("//a")
login_link.click()

sleep(2)
 
username_input = browser.find_element_by_css_selector("input")
password_input = browser.find_element_by_css_selector("input")

username_input.send_keys("<your username>")
password_input.send_keys("<your password>")

login_button = browser.find_element_by_xpath("//button")
login_button.click()

sleep(5)

browser.close()

Посмотрим, что изменилось в нашем коде:

  1. Строка 12 задерживает выполнение кода в течение двух секунд для того, чтобы страница полностью загрузилась.
  2. Строки 14 и 15 находят элементы полей ввода имени пользователя и пароля по их CSS селекторам. Для этих целей вы можете использовать любой другой метод, который вам наиболее предпочтителен.
  3. Строки 17 и 18 вводят имя пользователя и пароль в соответствующие поля ввода. Не забудьте заполнить и вашими данными!
  4. Строка 20 находит кнопку входа, используя синтаксис XPath.
  5. Строка 21 нажимает на кнопку входа.

Запустите скрипт, и вы автоматически войдете в свой профиль Instagram. Для того, что бы окно браузера не закрылось по истечении 5 секунд уберите или закомментируйте строки и .

И так мы хорошо начали с написания своего бота в Instagram. Если вы продолжите писать этот скрипт, то все остальные манипуляции с вашим профилем будут выглядеть очень похожи. Чтобы найти «понравившиеся» сообщения, прокрутите вниз вашу ленту постов, найдите кнопку «Нравится» по ее селектору CSS, нажмите на нее, найдите элемент раздела комментариев, оставьте комментарий и далее продолжайте в том же направлении.

Хорошей новостью является то, что все эти шаги могут быть выполнены более быстрым и надежным способом с использованием библиотеки InstaPy . Но прежде чем перейти к использованию Instapy, необходимо еще кое-что узнать про нее, чтобы лучше понять, как она работает: шаблон объекта страницы (Page Object Pattern).

Создание плагинов

В папке plugins есть пример плагина в файле example.py, отвечающий на команду .
В нём подробно расписана структура плагина. Для примера работы plugin.data или plugin.temp_data
вы можете посмотреть memo.py, weather.py. Для примера цикличных задач friends.py.
Там есть и другие плагины, код которых можно просмотреть для понимания того, что можно сделать с помощью бота.

Каждый плагин должен иметь экземпляр класса Plugin (из plugin_system) под именем (обязательно) plugin.
Все команды, на которые подписывается плагин, должны быть в нижнем регистре.

Вот пример простого плагина:

# Импортируем класс Plugin
from plugin_system import Plugin
# Создаём объект класса, через него мы будем "подписываться" на команды
plugin = Plugin('Плагин для еды')

# Использование async и await обязательно, т.к. бот асинхронный
@plugin.on_command('еда')
async def test(msg, args):
    # Отвечаем пользователю
    await msg.answer('Где еда?!')

Вы можете использовать db, который является экземпляром peewee_async.Manager.
В database.py хранятся основные модели бд.
Каждый плагин может создавать свои модели после импорта database с помощью, например, такого объявления:

Помле этого можно рассматривать как обычную модель.

Плагины размещаются в папке . Если два плагина имеют одинаковые команды — они обрабатываются в обоих плагинах.
Плагины могут работать со всеми методами API ВКонтакте.

Полный код бота

# mastrobot_example2.py
import datetime
import math
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters

STATE = None
BIRTH_YEAR = 1
BIRTH_MONTH = 2
BIRTH_DAY = 3

# function to handle the /start command
def start(update, context):
    first_name = update.message.chat.first_name
    update.message.reply_text(f"Hi {first_name}, nice to meet you!")
    start_getting_birthday_info(update, context)

def start_getting_birthday_info(update, context):
    global STATE
    STATE = BIRTH_YEAR
    update.message.reply_text(
        f"I would need to know your birthday, so tell me what year did you born in...")

def received_birth_year(update, context):
    global STATE

    try:
        today = datetime.date.today()
        year = int(update.message.text)

        if year > today.year:
            raise ValueError("invalid value")

        context.user_data = year
        update.message.reply_text(
            f"ok, now I need to know the month (in numerical form)...")
        STATE = BIRTH_MONTH
    except:
        update.message.reply_text(
            "it's funny but it doesn't seem to be correct...")

def received_birth_month(update, context):
    global STATE

    try:
        today = datetime.date.today()
        month = int(update.message.text)

        if month > 12 or month < 1:
            raise ValueError("invalid value")

        context.user_data = month
        update.message.reply_text(f"great! And now, the day...")
        STATE = BIRTH_DAY
    except:
        update.message.reply_text(
            "it's funny but it doesn't seem to be correct...")

def received_birth_day(update, context):
    global STATE

    try:
        today = datetime.date.today()
        dd = int(update.message.text)
        yyyy = context.user_data
        mm = context.user_data
        birthday = datetime.date(year=yyyy, month=mm, day=dd)

        if today - birthday < datetime.timedelta(days=0):
            raise ValueError("invalid value")

        context.user_data = birthday
        STATE = None
        update.message.reply_text(f'ok, you born on {birthday}')

    except:
        update.message.reply_text(
            "it's funny but it doesn't seem to be correct...")

# function to handle the /help command
def help(update, context):
    update.message.reply_text('help command received')

# function to handle errors occured in the dispatcher
def error(update, context):
    update.message.reply_text('an error occured')

# function to handle normal text
def text(update, context):
    global STATE

    if STATE == BIRTH_YEAR:
        return received_birth_year(update, context)

    if STATE == BIRTH_MONTH:
        return received_birth_month(update, context)

    if STATE == BIRTH_DAY:
        return received_birth_day(update, context)

# This function is called when the /biorhythm command is issued
def biorhythm(update, context):
    print("ok")
    user_biorhythm = calculate_biorhythm(
        context.user_data)

    update.message.reply_text(f"Phisical: {user_biorhythm}")
    update.message.reply_text(f"Emotional: {user_biorhythm}")
    update.message.reply_text(f"Intellectual: {user_biorhythm}")

def calculate_biorhythm(birthdate):
    today = datetime.date.today()
    delta = today - birthdate
    days = delta.days

    phisical = math.sin(2*math.pi*(days/23))
    emotional = math.sin(2*math.pi*(days/28))
    intellectual = math.sin(2*math.pi*(days/33))

    biorhythm = {}
    biorhythm = int(phisical * 10000)/100
    biorhythm = int(emotional * 10000)/100
    biorhythm = int(intellectual * 10000)/100

    biorhythm = (phisical == 0)
    biorhythm = (emotional == 0)
    biorhythm = (intellectual == 0)

    return biorhythm

def main():
    TOKEN = "insert here your token and don't share it with anyone!"

    # create the updater, that will automatically create also a dispatcher and a queue to
    # make them dialoge
    updater = Updater(TOKEN, use_context=True)
    dispatcher = updater.dispatcher

    # add handlers for start and help commands
    dispatcher.add_handler(CommandHandler("start", start))
    dispatcher.add_handler(CommandHandler("help", help))
    # add an handler for our biorhythm command
    dispatcher.add_handler(CommandHandler("biorhythm", biorhythm))

    # add an handler for normal text (not commands)
    dispatcher.add_handler(MessageHandler(Filters.text, text))

    # add an handler for errors
    dispatcher.add_error_handler(error)

    # start your shiny new bot
    updater.start_polling()

    # run the bot until Ctrl-C
    updater.idle()


if __name__ == '__main__':
    main()

Пришло время проверить его:

Telegram bot

Поздравляем! Telegram-бот на Python полностью готов. 

Настройка

  1. Перейдите в папку с ботом
  2. Установить зависимости из файла
    Возможные команды для установки:
  3. Запустите бота, чтобы он создал файл (после чего он выключится)
    Возможные команды для запуска(из консоли, из папки с ботом):
  4. В замените на access_token группы или и на логин и пароль аккаунта ВК соответственно. И уберите перед введёнными данными
    Если ввести и то и другое — бот будет работать как группа, и сможет использовать методы VK API пользователя.
    Можно вводить несколько аккаунтов, но отвечать бот будет со всех без разбора, так что рекомендуется вводить только 1 группу и 1 пользователя максимум!
    Без данных пользователя некоторые плагины могут не работать! Например, !скажи не будет работать!
  5. Там же в вы можете ввести PROXY в указанном формате, но не гарантированно, что ВК пустит вас без подтверждения телефонного номера с этого PROXY, что бот автоматически не делает.
  6. Можете запускать бота, как в п.3. Теперь бот должен работать!

Важно: плагины будут загружены из репозитория с плагинами: https://github.com/VKBots/vbot-plugins

Параметры при запуске бота из командной строки:

— только обновление плагинов

— обновление плагинов перед запуском.

Примеры:

— обновление плагинов перед запуском бота

— только обновление плагинов

Чтобы переустановить плагин — удалите его из папки .
Некоторые плагины содержат в своей папке , где вы можете настраивать эти плагины.

Текущая версия бота: 6.0

Функционал для логирования

Согласно тексту справки, бот должен уметь делать две вещи:

  1. Если вы отправляете сообщение боту, он должен где-то его сохранить.
  2. При отправке боту команды он должен отправить вам последнее сообщение.

Для этого мы будем использовать встроенную в Replit базу данных ключ-значение. Начнем с импорта API:

from replit import db

Модуль db — это объект, который ведет себя как словарь, но сохраняет свое содержимое между запусками. Он также сериализует свои ключи в виде строк.

Мы хотим хранить зарегистрированные сообщения в определенном порядке, но объект по своей сути не упорядочен (будучи словарем). Поэтому мы создадим вспомогательную функцию, которая может получать самый большой ключ (при условии, что мы будем использовать только числовые индексы). Добавим эту функцию перед определением функции :

def latest_key():
    ks = db.keys()
    if len(ks):
        return max(map(int, ks))
    else:
        return -1 

Функция получает все ключи из нашей базы данных (модуль ). Если в ней есть ключи, они преобразуются в целые числа и возвращается максимальное из них. Если ключей нет, то возвращается .

Теперь мы можем создать обработчик, который записывает сообщения пользователей в базу данных. Добавим эту функцию после задания функции :

def log(update: Update, context: CallbackContext) -> None:
    db = update.message.text 

Этот обработчик получает последний ключ из базы данных, увеличивает его на единицу и создает новую пару ключ — сообщение.

Однако это не может быть выполнено, пока мы не зарегистрируем обработчик. Поэтому добавьте следующую строку после других строк :

dispatcher.add_handler(MessageHandler(Filters.text & ~Filters.command, log))

Можно заметить, что вместо метода используется . Это более общий обработчик, который выбирает сообщения на основе предоставленных вами флагов. В данном случае он обрабатывает сообщения, содержащие только текст, но не команды.

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

def fetch(update: Update, context: CallbackContext) -> None:
    update.message.reply_text(db.get(str(latest_key()), 'No Messages yet.'))

Мы можем зарегистрировать его вместе с обработчиками остальных команд. Добавьте данную строку после уже существующих строк :

dispatcher.add_handler(CommandHandler("fetch", fetch))

Настройка

  1. Перейдите в папку с ботом
  2. Установить зависимости из файла
    Возможные команды для установки:
  3. Запустите бота, чтобы он создал файл (после чего он выключится)
    Возможные команды для запуска(из консоли, из папки с ботом):
  4. В замените на access_token группы или и на логин и пароль аккаунта ВК соответственно. И уберите перед введёнными данными
    Если ввести и то и другое — бот будет работать как группа, и сможет использовать методы VK API пользователя.
    Можно вводить несколько аккаунтов, но отвечать бот будет со всех без разбора, так что рекомендуется вводить только 1 группу и 1 пользователя максимум!
    Без данных пользователя некоторые плагины могут не работать! Например, !скажи не будет работать!
  5. Там же в вы можете ввести PROXY в указанном формате, но не гарантированно, что ВК пустит вас без подтверждения телефонного номера с этого PROXY, что бот автоматически не делает.
  6. Можете запускать бота, как в п.3. Теперь бот должен работать!

Текущая версия бота: 5.0

Новый старый бот

Перейдем в каталог с нашими сертификатами и создадим файлы и . В последнем создадим переменную , в которую передадим токен нашего бота. Открываем .Импортируем 2 библиотеки, зададим необходимые константы и создадим экземпляр бота:

Обратите внимание, что Telegram поддерживает всего 4 различных порта при работе с самоподписанными сертификатами. Теоретически, это означает, что на одной машине может быть запущено не больше 4 ботов на вебхуках

Практически, это поправимо, но об этом — в следующий раз.

Создадим класс, реализующий экземпляр веб-сервера. Это, в принципе, стандартный код, который от бота к боту сильно меняться не будет:

Посмотрите на название функции: . Это, по сути, обозначает последнюю часть URL. Поясню на примере: если бы мы хотели получать обновления на адрес , то функцию выше мы бы назвали . index — это аналог отсутствия какой-либо дополнительной маршрутизации. Зачем менять это значение на другое, рассказано здесь 12, сейчас это не нужно.Итак, что мы видим в коде выше? Принимаем входящие запросы по URL , получаем содержимое и прогоняем через набор хэндлеров. Кстати, о них. Т.к. мы реализуем простейших echo-бот, хэндлер нам нужен всего один:

Внимательный читатель всё же заметит одно отличие, о котором я говорить не буду 😉 Заодно ещё один повод открыть документацию.

Далее, отправим серверу наш самоподписанный сертификат и “обратный адрес”, по которому просим сообщать обо всех новых сообщениях:

Наконец, укажем настройки нашего сервера и запустим его!

Обратите внимание на последнюю строку. Наш сервер в качестве “корня” будет прослушивать адрес вида “ip-адрес/токен_бота”, относительно которого index — это и есть этот адрес

Может, немного криво пояснил, но позднее вам всё станет предельно ясно, сейчас не нужно загромождать голову лишней информацией.

Запустим бота и напишем ему парочку сообщений. Затем посмотрим в окно терминала:


Лог сервера

Если код статуса равен , значит, всё в порядке и бот получил сообщения от сервера.

На сегодня всё.

← Урок №3
Урок №5 →

Создание скелета бота

Теперь, когда все настроено, мы можем приступить к программированию! Начнем с нашего файла :

import os

from telegram import Update #upm package(python-telegram-bot)
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext  #upm package(python-telegram-bot)


def help_command(update: Update, context: CallbackContext) -> None:
    htext = '''
Welcome
Send a message to store it.
Send /fetch to retrieve the most recent message'''
    update.message.reply_text(htext)


def main():
    updater = Updater(os.getenv("TOKEN"))

    dispatcher = updater.dispatcher
    dispatcher.add_handler(CommandHandler("start", help_command))
    dispatcher.add_handler(CommandHandler("help", help_command))

    updater.start_polling()

    updater.idle()


if __name__ == '__main__':
    main() 

Сначала мы импортируем модуль , чтобы получить доступ к токену как переменной окружения.

Затем мы импортируем некоторые классы из библиотеки Telegram.

Комментарии, начинающиеся с , не являются обязательными. Они используются Replit для загрузки правильного пакета. В общем случае это не нужно, но здесь необходимо, потому что подобных библиотек Telegram очень много.

Функция запускается всякий раз, когда пользователь отправляет нам команду или . Команда также выполняется автоматически, когда новый пользователь запускает ваш бот (как мы ранее запускали ). Бот будет знать, как использовать эту функцию, потому что мы сообщим ему об этом позже в теле функции .

В функции main мы инициализируем экземпляр класса , который использует наш токен.

updater = Updater(os.getenv("TOKEN"))

— это класс, который будет постоянно проверять Telegram на наличие новых сообщений в нашем боте.

Когда получает новое сообщение, он передает его в класс . Тот проверяет, есть ли у нас подходящий обработчик для данного сообщения. Как уже упоминалось выше, нужно задать обработчик для команд и . Мы cделаем это при помощи функции , например:

dispatcher.add_handler(CommandHandler("start", help_command))

и

dispatcher.add_handler(CommandHandler("help", help_command))

Чтобы не усложнять задачу, команда и команда имеют здесь один и тот же обработчик, но при желании для обработки каждой из них вы можете использовать разные функции.

Затем нам нужно сказать классу , чтобы он начал проверку новых сообщений. Мы это сделаем при помощи следующей строки.

updater.start_polling()

Важно знать, что — это неблокирующая функция. Это означает, что код в ней не прекращает выполнение

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

Другими словами, если мы оставим это в качестве последней строки функции , код будет выполнен, а затем немедленно завершится, потому что больше ничего не блокирует его. Поэтому, чтобы наш бот не прекращал прослушку, мы используем строку , чтобы заблокировать скрипт, пока мы слушаем.

Пятиминутка ненависти к telebot или Привет, aiogram!

Как вы знаете, во всех предыдущих уроках использовалась библиотека pyTelegramBotAPI, именуемая в коде telebot. В 2015-2017 годах, возможно, она ещё была актуальна, но прогресс не стоит на месте. А telebot, увы, стоит. Кривая реализация поллинга, проблемный next_step_handler, медленная поддержка новых версий Bot API и т.д.

В течение 2019 года я постепенно переносил своих ботов на другой фреймворк, который по многим пунктам превосходит pyTelegramBotAPI, и имя ему – aiogram. «Почему?», спросит меня уважаемый читатель. Что ж, приведу следующие аргументы:

  • это полноценный фреймворк, т.е. позволяет сделать больше полезных вещей;
  • асинхронный, что делает его быстрее в некоторых задачах;
  • поддерживается Python 3.7+ и выше, что сподвигнет обновить свой старенький интерпретатор и использовать новые возможности языка;
  • множество встроенных «помощников» (синтаксический «сахар»), улучшающих читабельность кода;
  • оперативные обновления (поддержка новых опросов появилась в тот же день, что и в самом Bot API);
  • русскоязычный чат поддержки и обсуждений, где сидит, в том числе, и сам разработчик фреймворка;
  • мой любимый пункт: нормально работающий поллинг.

Прокомментирую последний пункт: в настоящий момент почти все мои боты работают на aiogram-ном поллинге и не падают ежедневно, как в случае с pyTelegramBotAPI.

Введение получилось очень большим, поэтому давайте уже перейдём к делу.

Почему python?

Вы можете написать бот Telegram Chat на любом языке, который вы хотите. Некоторые из основных вариантов, кроме Python, будут Java, PHP или Ruby. Если вы более знакомы с другим языком программирования высокого уровня, вы можете предпочесть использовать это вместо этого, но Python – хороший выбор по нескольким причинам:

  • Python может сделать запросы HTTP очень кратко и просто через модуль запросов. Получение контента от URL (как мы будем контролировать нашу телеграмму BOT), потребуется еще много линий Java, чем эквивалент Python.
  • Python является самым популярным языком для обработки натурального языка и обучения машине: хотя мы не будем использовать любой из них для нашего простого бота, оба они будут необходимы для более продвинутого бота. Таким образом, если вы хотите продлить бот, приятно садиться на Python.
  • Python имеет хорошую поддержку для обслуживания веб-контента: когда мы хотим расширить наш бот, чтобы позволить ему получить много сообщений в секунду, Python имеет зрелые технологии, такие как WSGI для достижения «веб-масштаба».
  • Python Portable – мы можем легко запускать один и тот же код на Linux, MacOS или Windows.

Обучение и запуск бота

После того, как заполнены и валидированы тренировочные данные, настроена конфигурация (https://rasa.com/docs/rasa/model-configuration) можно приступать непосредственно к обучению чат-бота. Это делается с помощью простой команды:

После успешного обучения модель, как правило, сохраняется в папку “models”.

Шпаргалка с полным списком команд rasa:

Команда

Что делает

rasa init

Создает новый проект с примерами тренировочных для обучения модели, действиями и конфигурационными файлами.

rasa train

Обучает модель, используя nlu-файл и истории диалогов, сохраняет обученную модель в ./models.

rasa interactive

Запускает сессию с интерактивным обучением с возможностью обучения модели в процессе диалога с чат-ботом.

rasa shell

Загружает обученную модель и позволяет поговорить с ассистентом в командной строке.

rasa run

Запускает сервер с обученной моделью.

rasa run actions

Запускает action сервер, используя Rasa SDK.

rasa visualize

Визуализирует истории диалогов.

rasa test

Тестирует обученную модель на тестовых данных, хранящихся в файлах, название которых начинается с “test_”.

rasa data split nlu

Делит NLU-данные на трейн и тест в отношении 80/20.

rasa data convert

Конвертирует обучающие данные.

rasa data validate

Проверяет domain, NLU и истории диалогов на несоответствия.

rasa export

Экспортирует диалоги из tracker store в event broker.

rasa x

Локально запускает Rasa X.

rasa -h

Показывает все возможные команды.

Поговорить с обученным ассистентом в командной строке можно запустив команду:

Команда rasa shell —debug позволит запустить чат-бот в режиме debug и посмотреть логи ошибок. Аргумент -m MODEL (путь до модели) или —model MODEL позволяет явно указать модель. По умолчанию rasa shell запускается, используя последнюю модель из папки “models”. Подробнее с аргументами и командами можно ознакомиться здесь.

Бот лайкающий посты на сайте.

Последовательность действий у нас следующая.

  1. Зайти на сайт under-prog.ru (открыть браузер)
  2. Пройтись по каждому из постов.
  3. Нажать кнопку лайк, если она не нажата.
  4. Закрыть браузер.

Первый пункт мы уже сделали, перейдем ко второму.

Пройтись по каждому из постов.

Зайдите на сайт, и нажмите кнопку F12.

У вас откроются инструменты разработчика. Изучив разметку, мы понимаем, что все посты находятся в теге article.

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

Данный селектор указывает:

  • На элемент с тегом a
  • который находится находится внутри тега h2 с классом entry-title
  • тот, в свою очередь, находится внутри тега header с классом entry-header
  • тег header находится внутри тега div с классом blog-entry-content
  • тот, находится в теге div
  • тег div находится внутри тега article

Теперь, дополним бота.

Разберем новую функцию.

Данная функция ищет элементы по css селектору. В результате своей работы, она возвращает массив элементов.

В-общем, мы из этого массива, достали первый элемент, и при помощи функции get_attribute(), получили значение атрибута href (ссылка на пост).

И вывели его на экран.

Запустите скрипт, в консоли должна появится ссылка на первый пост.

Если закинуть массив элементов в цикл, то получится извлечь ссылки на все посты.

Отлично, ссылки на все посты получены, осталось всем этим постам, поставить лайк.

Нажать кнопку лайк, если она не нажата

Сначала перекопируем наши ссылки в отдельный массив. Замените это:

На это:

Далее напишем код, отвечающий за нажатие кнопки лайк.

Разберем данные строки.

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

Далее, при помощи функции find (стандартная функция python), мы получаем индекс подстроки ‘wp_ulike_btn_is_active‘, если не удалось найти подстроку, функция find возвращает -1, этим мы и воспользовались в нашем условии. Т.е. если атрибут ‘class‘ не содержит подстроку ‘wp_ulike_btn_is_active‘, то.

Кликаем по кнопке лайк.

Осталось закрыть браузер, делается это с помощью функции quit().

Бот завершен, запустите скрипт, и наслаждайтесь автоматизацией.

Заключение

Бот для Телеграма на Python – вещь непростая. Для создания его самостоятельно вам нужно понять, как работает эта сторона мессенджера, скрытая от глаз обычного пользователя. И если вы далеки от компьютерной сферы, это будет сложно. Но если вам не хватает конструкторов и денег на то, чтобы заплатить профессионалам, почему бы не попытаться?

Читайте далее:

Польза Телеграм ботов для каналов: как облегчить себе жизнь

Анонимный чат в Телеграм. В чем особенности и как его использовать?

Учимся пересылать сообщения в Телеграм с помощью бота

Где взять и как использовать виртуальный номер для Телеграма?

Опросы в Телеграм: зачем нужны и как создавать?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector