У цьому керівництві ми розберемо процес написання простого Telegram-бота на Python і його запуску на сервері Heroku. Але спершу давайте з'ясуємо, навіщо взагалі потрібні боти і чому вам варто написати свого.
вступ
Ось стандартний алгоритм дій без бота:
Так, багато хто звик робити саме так. Однак бот дозволить діяти наступним чином:
Зручно, чи не так? І це лише одна з можливостей.
Telegram дозволяє користувачам створювати своїх ботів. Відповімо на питання «Чому мені варто написати свого?» - це, мабуть, найпростіший спосіб зрозуміти, що таке API.
Круто, починаємо писати бота?
Про все по порядку. Спершу потрібно зареєструватися в Telegram. Найбільш зручно використовувати веб-клієнт для знайомства з основними принципами роботи ботів і API.
Відкрийте програму, знайдіть @BotFather і почніть розмову. Надішліть команду / newbot і дотримуйтесь інструкцій. Після виконання перших кроків ви отримаєте:
Власне, ось і все. На даному етапі ваш бот повністю пасивний.
Вам потрібно почати бесіду з ботом. Введіть в пошуковому рядку його ім'я і натисніть на кнопку / start. Написати користувачеві, наприклад, «Привіт». Це перше повідомлення дуже важливо, оскільки воно стане першим оновленням, яке отримає ваш бот.
Якщо ви в перший раз працюєте з API, то розібратися вам допоможе браузер. Відкрийте нову вкладку і скористайтеся Telegram API, перейшовши за посиланням:
Спробуйте отримати відповідь від вашого бота, підставивши в якості chat_id значення, отримане після виклику / getUpdates (в нашому прикладі - 303 262 877). Текст повідомлення може бути будь-яким. Запит повинен виглядати приблизно так:
І коли ж буде код?
Якщо ви користуєтеся Windows і у вас не встановлений Python, скачати його можна з офіційного сайту. Взагалі версія не важлива, але в цій статті буде використовуватися Python 3.x. Якщо ж у вас Linux або macOS, то обидві версії (або, як мінімум, Python 2.x) вже встановлені.
Потім потрібно встановити pip. У версіях вище Python 2.7.9 і Python 3.4, а також на macOS / Linux він вже є. Перевірити це можна командою pip --version в терміналі. Якщо ж з якихось причин він відсутній, встановити його можна за допомогою команди:
Заковика в тому, що різні версії Python використовують різні pip. Якщо у вас macOS, ви можете спробувати слідувати порадам з Stack Overflow. У випадку з Windows вам потрібно завантажити get-pip.py. відкрити командний рядок, перейти в директорію зі скачаним файлом і виконати команду:
Найскладніше позаду. Встановимо пакет requests за допомогою pip:
А тепер - код
Тепер, коли ви зрозуміли, що таке API, і встановили всі необхідні інструменти, напишемо скрипт, який буде перевіряти оновлення і відповідати на нові повідомлення.
Спершу бот повинен перевірити оновлення. Перше повідомлення можна розцінювати як найсвіжіше, але getUpdates повертає всі оновлення за останні 24 години. Напишемо невеликий скрипт, щоб отримати саме останнє оновлення:
Словник оновлень складається з двох елементів: ok і results. Нас цікавить друга частина - список всіх оновлень, отриманих ботом за останні 24 години.
Дізнатися більше про бібліотеку requests можна, прочитавши документацію. По суті, кожен раз, коли вам потрібно отримати, оновити або видалити інформацію, що зберігається на сервері, ви відправляєте запит і отримуєте відповідь.
Тепер потрібно додати ще 2 функції. Перша буде діставати chat_id з оновлення, а друга - відправляти повідомлення.
Пам'ятайте, як ми об'єднували параметри за допомогою. і . Ви можете зробити те ж саме, додавши словник в якості другого додаткового параметра в функціях get / post з пакета requests.
Скрипт готовий, але він не ідеальний. Головним мінусом є необхідність запускати його кожен раз, коли ми хочемо, щоб бот відправив повідомлення. Виправимо це. Щоб бот слухав сервер і отримував оновлення, нам потрібно запустити основний цикл. На новому рядку, після import requests. додайте from time import sleep. Після цього замініть дві останні рядки на наступний код:
Хоча ми і додали таймаут в 1 секунду, приклад вище можна використовувати тільки в навчальних цілях, оскільки він використовує часті опитування (short polling). Це погано впливає на сервера Telegram, тому їх потрібно уникати. Є ще два способи отримання оновлень через API - довгі опитування (long polling) і вебхукі (webhooks). Якщо ми будемо використовувати спосіб отримання оновлень через getUpdates без параметрів, то запити будуть відбуватися занадто часто.
Тепер бот повинен працювати нормально, але його все ще можна поліпшити. Давайте інкапсуліруем всі функції в один клас. Має вийти щось на зразок цього:
Останній штрих - оголосимо змінні і навчимо бота пристойним манерам. Зробимо так, щоб бот вітав вас раз в день, при цьому фраза повинна залежати від часу доби. Для цього додайте наступний код в ваш скрипт:
Тепер ви можете покращувати бота так, як захочете. Можна, наприклад, налаштувати відправку медіафайлів або додати власні кнопки.
Влаштуй Деплой
Останнім кроком буде розгортання вашого бота на сервері. Напевно у вас його немає, та й купувати не хочеться - але це необов'язково. Зараз існує безліч безкоштовних хмарних рішень, з яких ми виберемо Heroku.
На macOS і Windows його потрібно завантажити і встановити вручну. І не забудьте зареєструватися на Heroku.
Тепер вам потрібно навести порядок в файлах. Створіть нову папку і перейдіть в неї в терміналі або командному рядку. Ініціалізуйте в ній virtualenv:
Ім'я не має значення, але краще зробити його інтуїтивно зрозумілим. Перейдіть в папку my_env.
Тепер вам потрібно склоніровать git-репозиторій. Введіть наступну команду:
Помістіть скрипт в папку, отриману в результаті виконання команди git clone.
Поверніться в папку my_env і запустіть virtualenv:
Якщо ви успішно запустили virtualenv. запрошення командного рядка має починатися з (my_env).
Перейдіть в папку сховища та ще раз встановіть модуль requests:
Тепер потрібно створити список залежностей Heroku. Це не складно. Введіть:
Створіть Procfile. У цьому файлі вам потрібно розмістити інструкції по роботі з вашим скриптом. Файл обов'язково має бути Procfile (Procfile.windows у випадку з Windows). У нього не повинно бути інших розширень. Вміст файлу повинна бути таким (замініть my_bot на ім'я вашого скрипта):
Додайте файл __init__.py в вашу папку. Він може бути порожнім, але він повинен там бути.
Надішліть Комміт зі змінами в репозиторій:
Тепер розгорнемо бота на Heroku. Можна використовувати і панель управління на сайті, але ми потренуємося робити все через консоль. Якщо ви зіткнетеся з якимись проблемами, зверніться до цього керівництву.
Розглянемо лише ті дії, які потрібні для розгортання програми. Якщо ви користуєтеся macOS або Windows, встановіть інтерфейс командного рядка, слідуючи гайду.
Якщо ви користуєтеся Ubuntu, використовуйте наступні команди:
Якщо виникнуть помилки, перевірте, чи присутні всі залежності.
Тепер виконайте наступні команди:
З цього моменту ваше програма має працювати на сервері Heroku. Якщо щось піде не так, перевірити логи можна наступним чином: