Как написать бота для браузера на python
Веб-бот — это программа, которая автоматизирует ваши действия в интернете.
В этой статье, я объясню общий принцип создания ботов на Python, применив полученные знания, вы сможете создать бота который:
Создаем первого бота на Selenium.
Selenium — это библиотека для автоматизации действий в браузере.
Данный способ подойдет для любого сайта, однако, за все нужно платить. Selenium запускает браузер, отъедая огромный запас оперативной памяти. Используйте его только тогда, когда нужно выполнить JS код на странице.
Первым делом нужно установить библиотеку, для этого введите в консоли:
Далее, установите веб-драйвер под браузер Firefox отсюда. Также, необходимо установить браузер Mozilla Firefox, если еще не установлен.
Теперь напишем простейшего бота. Для этого, напишите следующий python скрипт.
Код скрипта описан в комментариях.
Далее, переместите файл скрипта, в одну папку с веб-драйвером geckodriver.exe
И запустите python скрипт. У вас должен открыться браузер.
В адресной строке видна иконка робота, это значит, что браузером управляет программа.
Хорошо, бот создан, но он бесполезен. Единственное на что он способен, это заходить на сайт. Давайте добавим ему новых функций. Например, сделаем так, чтобы бот лайкал посты на сайте.
Бот лайкающий посты на сайте.
Последовательность действий у нас следующая.
Первый пункт мы уже сделали, перейдем ко второму.
Пройтись по каждому из постов.
На этом этапе, нужно понимать разметку HTML.
Зайдите на сайт, и нажмите кнопку 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().
Бот завершен, запустите скрипт, и наслаждайтесь автоматизацией.
Делаем браузер невидимым
Бот работает и все-бы ничего, но своим окном бразуера, он перекрывает все остальные окна. К счастью, у Firefox есть headless режим, позволяющий пользоваться функциями бразура, не открывая окно браузера.
Добавьте следующий код перед инициализацией браузера:
Здесь, мы переопредили настройки браузера, осталось передать их, нашему браузеру.
Selenium – один из самых популярных фреймворков автоматизации тестирования. Несмотря на то, что Selenium поддерживает шесть популярных языков программирования, его можно использовать для волшебной реализации с наименьшим количеством кода в связке с Python.
Помимо автоматизированного веб-тестирования, веб-скрейпинг с Selenium на Python – крайне популярный вариант, который вы можете реализовать с меньшим количеством кода и ошибок на Python. Как QA-инженер, я по-прежнему использую другие языки программирования, такие как Java и JavaScript в связке с Selenium, но Python – мой основной инструмент для простых/комплексных задач веб-автоматизации.
Как я уже упоминал, Python – третий по популярности язык после HTML/CSS и JavaScript. Бот на Selenium с Python может широко использоваться для автоматизации различных сценариев и задач.
В этом руководстве я подробно расскажу, как создать автоматизированного бота на Selenium с Python. Знания окажутся для вас полезными, поскольку мы коснемся различных аспектов автоматизированного тестирования с Selenium.
Инструменты для создания бота
Одной из основных целей создания бота является использование возможностей, предлагаемых Selenium для автоматизации взаимодействия с web-элементами в DOM. Существует набор инструментов Selenium для автоматизации веб-браузеров, которые можно использовать для целого ряда задач автоматизации, такие как веб-скрейпинг, автоматизированное веб-тестирование, кросс-браузерное тестирование и т.д.
Итак, давайте посмотрим на основные инструменты, необходимые для создания бота с Selenium.
Selenium
Библиотека Python – обертка над Selenium WebDriver, обеспечивает соединение и простой API для написания функциональных тестов для автоматизации веб-задач, таких как нажатие на кнопки, навигация по страницам и заполнение форм.
Скрипт теста не взаимодействует напрямую с браузером. Selenium WebDriver - это ядро фреймворка Selenium. Как говорится в этом руководстве, Selenium WebDriver играет важную роль в соединении с браузером с помощью соответствующего драйвера браузера. Однако, вы можете еще глубже погрузиться в Selenium, если хотите узнать больше о его компонентах.
Если тесты должны выполняться в локальной Selenium Grid, на целевой машине должен быть установлен соответствующий драйвер браузера:
«Погоди, что?» – думаю, большинство читателей отреагирует на заголовок именно так.
В смысле «просто использовать Python в браузере»?
Все знают, что в браузерах работает только JavaScript.
Ну, выше приведен скриншот с исходным кодом моего личного сайта. Взгляните, возможно вы увидите для себя что-то новое.
А теперь, давайте поговорим о том, как и насколько хорошо это работает, а также обсудим ряд других альтернатив JavaScript.
Знакомство с Brython
Brython — это реализация Python3, написанная на JavaScript, которая позволяет писать код на Python для веба.
По сути, это JavaScript-библиотека, которая преобразует ваш код на Python в эквивалентный JS и исполняет его в рантайме.
Поскольку написание браузерного кода на Python звучит круто, я решил попробовать.
Разработка «Змейки» на Brython
Вот ссылка на мой сайт, где вы можете попробовать версии «Змейки» на JavaScript и Brython. А вот ссылка на GitHub c исходным кодом.
Для того, чтобы опробовать Brython, я решил написать классическую «Змейку».
Так как я не специалист по работе с Canvas в HTML и не разработчик игр, я решил использовать эту JavaScript-реализацию в качестве отправной точки. Когда-то я уже создавал свою «Змейку» на основе Canvas, но эта реализация более аккуратная и компактная.
А еще автор написал ее менее чем за 5 минут. Надо отдать должное Крису Делеону, это очень впечатляет.
Итак, я добавил к реализации Криса подсчет очков и сохранение лучшего результата, а также немного улучшил интерфейс (добавил кнопку паузы и кнопку с инструкциями). Затем я портировал игру на Brython.
Также я модифицировал его код, чтобы он работал в режиме strict , так как в реализации Криса используются вещи вроде неявных глобальных переменных, которые, на мой взгляд, не отражают того, как выглядит большая часть кода на JS (не критикую автора – он программировал на время). Я хотел получить хорошее сравнение кода на Brython и JS.
JavaScript оказался таким, и я не буду размещать этот код здесь, потому наша цель – сфокусироваться на Brython.
Несмотря на то, что большая часть кода на Brython была «дословным переводом» с JS, некоторые части (например, функционал подсчета очков) были написаны непосредственно на Brython, а затем реализованы на JS – чтобы посмотреть на отличия.
Окончательный результат выглядит следующим образом:
Итак, основываясь на этом фрагменте, давайте разберемся в базовых понятиях Brython
Подключение brython.js
Для использования Brython не требуется установка. Просто импортируйте скрипт внутри head :
Запуск Brython
Для того, чтобы Brython мог транслировать и исполнять код на Python так, будто это код на JS, нам нужно вызвать Brython как раз тогда, когда загрузится тело документа. Например, так:
Этот тег будет выполнять поиск тегов script c типом "text/python" и запускать их код.
API для работы с вебом
JavaScript по умолчанию дает доступ к объектам вроде document и window , необходимым в любом JS-проекте. Соответственно, Brython тоже должен иметь возможность работать с ними.
Для решения этой проблемы создатели Brython могли бы просто дать разработчикам возможность обращаться к этим объектам из кода на Python, но это привело бы к крикам дебаггеров о undefined variable и снижению производительности.
Таким образом, чтобы использовать эти API, мы должны импортировать их точно так же, как импортируем любой другой модуль на Python:
И вам не нужно выполнять команду pip install . В конце концов, вы вставляете все это в HTML! Просто добавьте требуемые импорты, с остальным разберется Brython.
Чтобы увидеть насколько хорошо все это работает, я попробовал использовать несколько различных методов из Web API: alert , setInterval , addEventListener и т.д. Все они сработали так, как должны были.
Встроенные объекты и методы JavaScript
В «Змейке», как только змея съест яблоко, нам нужно сгенерировать новое яблоко в случайном месте.
Однако, я не могу использовать модуль random из библиотеки Python*. Так как же я могу сгенерировать случайное число (без написания собственной библиотеки)?
Оказалось, что в Brython более широкая поддержка JavaScript, чем я думал. Смотрите:
Благодаря модулю javascript , если есть объект, к которому я могу получить доступ с помощью JS, то я могу получить к нему доступ с помощью Brython.
Если я импортирую JavaScript-библиотеку (jQuery, Bootstrap) и захочу использовать ее методы — я могу сделать это с помощью from javascript import . И, естественно, я также могу использовать встроенные JS-объекты, например, Date или String .
*По всей видимости, Brython поставляется с рядом стандартных библиотек Python, реализованных непосредственно на JavaScript, и если у какого-то модуля нет JS-версии, то вы все равно сможете импортировать его. Brython получит версию на чистом Python и код импортированного модуля будет работать вместе с кодом Brython. Впрочем, модуль random у меня не заработал – но я могу понять, почему.
Специфические конструкции
В Python, если я хочу распаковать список, я могу написать list2 = [*list1] . Также, если я хочу присвоить переменной значения исходя из некоторого условия, я могу написать foo = 10 if condition else 20 .
У этих конструкций есть эквиваленты в JavaScript: оператор spread ( [. arr] ) и тернарный оператор ( let foo = condition ? 10 : 20 ).
Но поддерживает ли их Brython?
Я попробовал их, и они отлично сработали. Вы можете увидеть, что распаковка списка из Python и условное присваивание используются в моем коде.
Отладка
Честно говоря, я думал, что отладка в Brython будет ужасной.
На самом деле все не так уж и плохо.
Конечно, я написал совсем небольшой и не очень сложный проект, но ошибки, брошенные Brython были в основном точными и довольно понятными.
Это верно, по крайней мере, в отношении синтаксических ошибок. Импорт модулей из библиотеки Python – совсем другая история.
Производительность
JavaScript Snake
Brython Snake
Как и ожидалось, код на Brython работает медленнее, чем JavaScript. В моем случае он был примерно в 1.7 раз медленнее.
Подозреваю, что в более сложных проектах Brython будет в несколько раз медленнее, чем чистый JS.
Тем не менее, вы можете выполнить транспиляцию вашего кода на Brython заранее и использовать на странице только JavaScript, который должен работать лучше.
Я действительно пытался использовать редактор Brython Editor для преобразования моего кода на Brython в JS и запуска получившегося кода на веб-странице, но из-за огромного количества ошибок я пока от этого отказался. Впрочем, я приложил к этому не слишком много усилий.
Заключительные мысли о Brython
Честно говоря, я был весьма впечатлен Brython. Вот несколько плюсов и минусов из моего собственного опыта работы с языком:
- Мне удалось написать «Змейку» без лишних хлопот, причем опыт отладки оказался на удивление положительным.
- В моем простом проекте Brython беспрепятственно взаимодействовал с нативными JavaScript-объектами, доступными на странице
- Я ценю тот факт, что мой код выглядит чище на Python, а также мне нравится, что я могу использовать полезные конструкции из Python для написания браузерного кода.
- В случае с моей игрой, хоть Brython загружается медленнее, чем JavaScript, пользователь этой разницы не замечает.
- Мне приятно видеть Python в исходном коде моего сайта.
- Брайтон работает значительно медленнее, чем чистый JS.
- Для использования Brython разработчику необходимо иметь опыт работы с JavaScript.
- Вы неизбежно столкнетесь с большим количеством ошибок и его сайту есть куда расти в плане удобства навигации и возможностей обучения
- У Brython отсутствует сильная экосистема и инструменты развития.
Тем не менее, я считаю, что в настоящее время Brython больше подходит для JavaScript-разработчиков, знакомых с Python и уставших от JS, а не для Python-разработчиков, которые хотят заниматься веб-разработкой, не изучая JavaScript.
Я думаю, что понимание JavaScript необходимо для того, чтобы хорошо работать с Brython. И если вы решите потратить время на изучение JavaScript, чтобы вам было легче писать на Brython, то вы можете просто использовать JavaScript.
Другие альтернативы JS в браузере
Причина, по которой я выбрал Brython, заключалась в том, что из большинства вариантов перехода от Python к JS, о которых я впервые узнал, он был единственным, у кого ведется активная разработка на GitHub. Большинство просмотренных мною транспайлеров из Python в JavaScript не имеют коммитов в течение нескольких лет.
Впрочем, есть и другие альтернативы.
Pyodide, например, кажется интересным вариантом. Он компилирует Python (вместе с его научными библиотеками) в WebAssembly, что позволяет ему запускаться в браузере.
WebAssembly, как следует из названия, является ассемблером для веба. Подобно тому, как ассемблер на наших компьютерах может работать в качестве посредника между языками высокого уровня и машинным кодом, WebAssembly делает то же самое в вебе.
Таким образом, можно написать компилятор, который будет переводить Python (или любой другой язык) в WebAssembly, что позволит ему работать в браузере.
Это амбициозный и перспективный проект, который, скорее всего, приведет к тому, что мы увидим все больше веб-разработок без JavaScript.
Тем не менее, он все еще находится в зачаточном состоянии (~3 года), так что, вероятно, потребуется некоторое время, прежде чем мы увидим, что JavaScript регулярно заменяется другими языками.
И пока мы этого ждем, вам придется воспользоваться инструментами вроде Brython, если вы действительно не можете иметь дело с JavaScript.
Но, честно говоря, это неплохое начало!
Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:
Эта статья — краткий рассказ о том, как с помощью подручных средств (Firefox) и Python можно осуществить успешную интеграцию Telegram-бота и внешнего сервиса.
Материал будет интересен тем, кто наслышан о Telegram'ных ботах, но не знает, как к ним подступиться и какие задачи с их помощью можно решать. Предполагается знание Python.
Картинка для привлечения внимания:
(ссылка на оригинал)
Из статьи вы узнаете:
1. Как с помощью браузера узнать, какой запрос отправляется на сервер при клике по кнопке?
Используя web tool вашего любимого браузера можно увидеть все запросы, которые отправляются из открытой страницы на сервер.
Удобной обёрткой над стандартным модулем urllib2 является библиотека requests . Подробнее на Хабре: "Библиотека для упрощения HTTP-запросов".
3. Как написать бота на Python?
Полнофункциональная обёртка реализована в библиотеке python-telegram-bot . Пока на Хабре эта библиотека не упоминалась.
Существует единая транспортная карта "Стрелка", которая позволяет сильно сэкономить на поездках из Москвы в область. Причина экономии в том, что стоимость проезда при оплате наличными оказывается на 20-30% выше, чем при оплате упомянутой транспортной картой.
Потребность в получении информации о балансе обычно появляется в момент оплаты поездки. Делать это с мобильного устройства через сайт не слишком удобно даже при использовании личного кабинета.
Возник вопрос: "Можно ли узнать баланс карты без лишних телодвижений?"
Известны как минимум два места, откуда можно получить информацию о балансе карты:
- Мобильное приложение
- Официальный сайт
Если ввести данную команду без изменений в консоли, то получим ожидаемый ответ в формате JSON:
Отложим вопрос разбора этого ответа на потом, а сейчас попробуем понять, какие аргументы реально нужны для получения корректного ответа.
Ответ ещё соответствует ожиданиям. Среди параметров, передаваемых с запросом есть cardnum , отвечающий за номер карты, и cardtypeid , название которого подсказывает, что он отвечает за тип карты. Если в необходимости первого параметра сомнений нет, то значимость типа карты под вопросом. Особенно при условии, что пользователь никак его не выбирает. Попробуем избавиться и от него:
Ожидания не оправдались. Значит, тип карты как-то участвует в формировании ответа. Беглый обзор js-скриптов выявил факт того, что данный параметр статичен, и его можно просто запомнить и использовать в дальнейшем при общении с сервером.
Описание ответа сервера
Посмотрим повнимательнее на ответ сервера:
Очевидно, что нужная нам величина — balance . Если при этом сравнить число с тем, что отобразилось в браузере после выполнения запроса, станет очевиден и тот факт, что величина эта имеет размерность копеек.
Общаемся с интерфейсом из Python
Выглядит хорошо. Но параметр cardnum мы собираемся менять, поэтому было бы здорово подняться на один уровень абстракции повыше и не формировать строку параметров самостоятельно. Поставим библиотеку requests и используем её:
Библиотека requests предоставляет метод json() для преобразования json-formatted ответа сервера в Python структуру данных.
Мы уже умеем получать необходимую нам информацию, используя пару строк кода на Python. Создадим функцию для получения информации о балансе карты. Запишем в файл checker.py следующий код:
Код подходит как для Python 2.x, так и для Python 3.x.
Теперь для того, чтобы получить данные о балансе, нам достаточно двух строк:
В представленном коде также используется библиотека logging . С примерами её использования на русском можно ознакомиться на Хабре.
Изначально задача стояла в том, чтобы удобно получать информацию о балансе с мобильного устройства. Если писать отдельное приложение, то у него должна быть функциональность добавить карту (текстовое поле ввода + кнопка) и получить информацию о балансе на добавленных картах (кнопка + текстовое поле вывода). Интерфейс не содержит никаких особенных элементов.
Требуемую функциональность оказывается возможным реализовать с помощью использования API Telegram для ботов.
Сложно ли написать бота?
В общем случае нет. Нам сейчас не требуется, чтобы бот умел вести светскую беседу. От него ожидается лишь поддержка ограниченного числа команд.
Создаём бота
Шаг 1. Получаем токен
Подробное описание ботов и их возможностей есть на странице "Bots: An introduction for developers". Там же есть информация о том, как создать своего бота. Для этого нужно обратиться за помощью к авторитету среди ботов: боту @BotFather .
Главное, что необходимо получить в результате общения с @BotFather — token для использования API.
Шаг 2. Ищем подходящую библиотеку-обёртку
Мы уже начали использовать Python. И даже умеем отправлять запросы к серверу. Можно реализовать свои методы взаимодействия с Telegram API. Но если это можем сделать мы, то наверняка кто-то сделал это до нас. Поищем подходящую библиотеку для работы с Telegram bot API. Поиск в любимом поисковике по ключевым словам "python telegram bot" показал, что есть библиотека-обёртка python-telegram-bot . Версия библиотеки на момент публикации: 3.3.
Использование обёртки предельно простое: необходимо создать методы с правильной сигнатурой и зарегистрировать их через метод addTelegramCommandHandler у правильного объекта. Примеры использования даны в описании библиотеки.
Шаг 3. Реализуем логику работы бота
Нашему боту в его минимальной рабочей конфигурации необходимо поддерживать команды:
- добавление карты по её номеру
- удаление карты по её номеру
- получение информации о балансе на картах
В переменную TOKEN необходимо поместить токен, полученный от @BotFather .
Шаг 4. Запускаем бота
Запуск получившегося strelka_bot.py приводит нашего бота в жизнь.
После добавления интересующих нас карт получить информацию об их балансах можно с помощью единственной команды /getcards .
Можно ещё добавить сохранение переменной users при изменении, чтобы не терять состояние при перезапуске бота. Для этого отлично подходит модуль shelve . Примеры использования указаны в конце страницы с документацией. Его использование не должно вызвать затруднения.
Исследуем возможности библиотеки python-telegram-bot
Посмотрим описание библиотеки python-telegram-bot . Там есть интересная функциональность JobQueue. Она позволяет выполнять отложенные и повторяемые задачи.
Как можно использовать возможность выполнять периодически запускаемые задачи? Видятся следующие возможные улучшения:
Реализацию варианта №3 можно увидеть в репозитории бота на Github.
С помощью использования библиотеки requests , API для ботов в Telegram и библиотеки python-telegram-bot удалось создать бота, который вовремя уведомляет пользователей о том, что баланс на их карточках упал до критически низких значений. Задача пополениния карты осталась за рамками, но функциональность "личного кабинета" на официальном сайте позволяет её комфортно решать с ПК.
На Github можно посмотреть более полную реализацию бота с использованием модуля shelve и функциональности JobQueue: strelka_telegram_bot.
Пользователь itspers в комментариях подсказал, что вернуть приложение "Стрелка" к жизни можно явным указанием требуемых прав в настройках. Методом подбора было установлено, что необходимы права 'Location' и 'Phone'.
Без бота это выглядело бы так:
- Вы открываете в веб-браузере YouTube.
- Ищете видео, которым хотите поделиться.
- Выбираете общий доступ.
- Возвращаетесь в мессенджер и, наконец, делитесь ссылкой.
Конечно, большинство из нас привыкло к вышеуказанному алгоритму, и это неплохо работает. Однако.
- Вы находитесь в мессенджере.
- Вводите @vid, а затем видео, которым хотите поделиться.
И это всего лишь одна из возможностей ботов. Разработчики Telegram проделали отличную работу и позволили пользователям создавать своих собственных ботов. Отвечая на вопрос, почему это может быть интересно, я могу сказать, что это самый простой способ получить представление об API.
Если это первый опыт, откройте новую вкладку в своем браузере и используйте URL-адрес: так вы отправите запрос на сервер Telegram. Пришедший ответ будет в формате JSON и чем-то напоминающим словарь Python. Вы должны увидеть что-то вроде этого:
Для ответа от бота замените chat_id на значение, которое получите с вызовом /getUpdates. У нас это 303262877. Текстовый параметр зависит от вас. Запрос должен выглядеть так:
Если ваша операционная система – Windows, но еще не установлен Python, скачайте его здесь. Без разницы, будет это версия 2.x или 3.x. Для примера мы будем использовать Python 3.x. На macOS и Linux обе версии уже установлены (либо минимум Python 2.x), поэтому нет необходимости дополнительно скачивать что-либо.
Следующий шаг – установка системы управления пакетами pip. Для Python 2.7.9 и выше, а также Python 3.4 и выше они уже предустановленны (равно как и для операционных систем macOS/Linux). Если нужно, вы всегда можете проверить это, используя в терминале команду pip –version. При отсутствии данной системы установите ее с помощью команды:
Интересная штука: разные версии Python работают с разными pip. Для обладателей macOS подойдет эта инструкция. Если же у вас ОС Windows, загрузите get-pip.py, откройте cmd, перейдите к скачанным файлам (директория) и выполните следующее:
Это было самое сложное. Осталось воспользоваться pip и установить пакет requests:
Дополнительно можно скачать PyCharm, хотя этот шаг и не относится к обязательным.
Если принцип API понятен, и у вас есть все необходимые инструменты, давайте создадим скрипт Python, который будет проверять наличие обновлений и отвечать на них желаемым текстом.
Словарь обновлений состоит из двух элементов - «ok» и «results». Нам нужен второй, который представляет собой список всех обновлений за последние 24 часа. Здесь вы можете посмотреть дополнительную информацию о библиотеке запросов. Основная идея заключается в том, что всякий раз, когда вам нужно получать, обновлять или удалять информацию на сервере, вы отправляете запрос и принимаете ответ.
Помните, как мы привязывали параметры с помощью ? и &? Вы можете сделать то же самое, добавив dict в качестве второго необязательного параметра для запросов get/post.
Telegram скрипт готов
Хотя мы добавили «тайм-аут» в 1 секунду, приведенный выше пример должен использоваться только в целях тестирования, поскольку он использует частые опросы. Это не очень хорошо для серверов Telegram. Есть еще два способа получить обновления через API – вебхуки и длинные опросы. Но так как мы проверяем обновления с использованием метода getUpdates, запросы будут частыми.
Поскольку мы использовали основной цикл, следует переключиться на длинные опросы. Изменим первую функцию, добавив параметр timeout. Тайм-аут сам по себе не сделает проверку скрипта для обновления реже. Кроме того, тайм-аут будет работать только в том случае, если последние обновления отсутствуют. Для отметки просмотренных обновлений нужно добавить параметр offset:
Теперь бот должен работать нормально, но немного изменим код
Неплохо было бы инкапсулировать использованные функции в класс. Модифицированная версия скрипта будет выглядеть таким образом:
Теперь у вас есть тысячи различных способов улучшать своего бота! Можно добавить дополнительные кнопки или даже настроить отправку медиафайлов.
Последний шаг – это как вишенка на торте, которая позволит сделать из вашего Telegram бота настоящего помощника: его необходимо развернуть на сервере. Скорее всего, у вас нет собственного сервера, и уж вряд ли вы захотите покупать для этого дорогостоящую аппаратуру. К счастью, существует множество облачных сервисов, на которых можно бесплатно разместить приложение. Давайте развернем небольшой скрипт на Heroku.
Прежде всего, вам нужна учетная запись на GitHub. Переходите на главную страницу и регистрируйтесь: это обязательный шаг для любого, кто действительно заинтересован в программировании. Помимо учетной записи GitHub, вам также необходимо установить Git.
Если у вас Linux, выполните следующую команду:
Для macOS и Windows можно произвести ручную установку программы. И, конечно же, не забудьте завести аккаунт на Heroku.
Устанавливаем virtualenv, используя команду:
Теперь вам нужно немного упорядочить свои файлы. Создайте новую папку, откройте терминал/cmd и перейдите в нее. Для инициализации в созданной папке virtualenv введите:
Название не имеет особого значения, однако лучше делать его максимально понятным. Перейдите в папку my_env. Следующий шаг – клонировать ваш репозиторий Git. Введите следующую команду:
Поместите свой скрипт в папку и вернитесь в my_env, чтобы запустить virtualenv.
Windows:
Linux/macOS:
При успешном запуске virtualenv командная строка должна начинаться с (my_env). Установите модуль requests, перейдя в папку репозитория:
Для создания зависимостей Heroku введите:
Создайте файл Procfile. В нем вы найдете инструкции для работы со своим скриптом. Имя должно быть Procfile или Procfile.windows, если это Windows. Не стоит включать в название .txt, .py или любые другие расширения. Содержимое файла должно быть следующим (измените my_bot на название вашего скрипта):
Добавьте файл __init__.py в свою папку. Файл может быть пустым, но он должен находиться там. Введите такую команду:
А теперь развернем нашего Telegram бота на Heroku. Потренируемся делать это через консоль. При возникновении проблем, обратитесь к руководству. Для Windows и macOS нужно установить интерфейс командной строки, используя этот гайд. Для Ubuntu используем команды:
Интересный факт: на моем домашнем компьютере все прошло без сучка и задоринки, а вот на ноутбуке последний шаг выполнить не удалось. Если вы столкнулись с такой же проблемой, проверьте терминал на наличие всех зависимостей. После выполните команды:
С этого момента ваше приложение должно работать на сервере Heroku. Если по какой-либо причине оно не работает, проверьте журналы, используя следующую команду:
Коды ошибок можно посмотреть здесь.
Да, используя бесплатный аккаунт, вы столкнетесь с определенными ограничениями. Но даже так после проделанных действий у вас будет полностью функциональный бот.
Читайте также: