Skip to content

irinfox/example_telebot

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Как сделать бота для телеграма.

Каждый шаг этой инструкции соответствует одному из коммитов в данном репозитории.

  1. Бот, работающий локально (первый коммит)

    1. Создадим пустого бота с помощью @BotFather - зададим ему имя и получим токен (ключ доступа)
    2. Установим питоновскую библиотеку pytelegrambotapi, с удобной обёрткой для телеграма. Это можно сделать, например, с помощью пакетного менеджера pip. Все установленные библиотеки будем записывать в requirements.txt, чтобы потом они автоматически устанавливались на сервере.
    3. Создадим файл main.py с примитивным ботом-повторюшкой. При запуске файла пароль от бота читается из переменных среды (чтобы не палить его в репозитории), создаются функции для ответа на сообщения, и бот запускается в режиме "polling" (когда ваша программа постоянно спрашивает Телеграм, нет ли обновлений)
    4. Чтобы протестировать его, надо вписать пароль в переменные среды (вбить в командной строкеset TOKEN=... на винде или export TOKEN=... на маке и линуксе), а дальше запустить в командной строке python main.py (предварительно перейдя в с помощью cd в папку с кодом) - и бот заработает!

    Весь репозиторий с минимальным ботом, работающим локально.

  2. Запуск бота на сервере heroku (второй коммит)

    1. Зарегистрируемся на heroku.com и создадим пустое приложение (я назвал его example-telebot).
    2. Привяжем приложение к вашему репозиторию с ботом на гитхабе скриншот. Если ещё потом и поставить галочку "Enable automatic deploys", то бот будет перезапускаться на heroku после каждого коммита автоматически.
    3. Чтобы heroku знал, что именно надо запускать, создадим для него файл Procfile с единственной строчкой web: python main.py
    4. Для продакшна режим polling не годится (неэффективен и частенько ломается), но на сервере бота можно запускать в другом режиме, "webhook", когда Telegram сам обращается к вашему серверу. Для этого сервер должен уметь обрабатывать запросы; мы добьемся этого, используя фреймворк Flask. Установим его также с помощью pip.
    5. Допишем файл main.py: теперь кроме бота появляется объект server, который передаёт сообщения боту в функции get_message.
    6. Сам сервер имеет смысл запускать только на heroku, поэтому мы будем выбирать между режимами webhook и polling в зависимости от аргумента командной строки poll. То есть теперь, чтобы запустить бота не на heroku, а на своем компьютере, нужно будет писать python main.py --polling
    7. Чтобы на heroku бот мог получить токен, его надо добавить в переменные среды heroku, примерно так.
    8. Теперь можно коммитить и пушить изменения, и за пару минут они приедут на heroku, и бот заработает оттуда.
  3. Исправление ошибок (3 и 4 коммиты)

    1. Я забыл добавить flask в requirements.txt, и на heroku бот сначала не запустился.
    2. После установки flask бот всё равно не запускался, и я добавил функцию webhook, чтобы его будить, открывая страничку приложения в браузере.

    Весь репозиторий с ботом, запускаемым на Heroku.

  4. Связывание приложения с базой данных mongodb (5 коммит).

    1. mongo может показаться необычным выбором, потому что это nosql база. Но мне и не хочется морочиться с sql; к тому же, в heroku mongo довольно объемная и дешёвая. Бесплатный аккаунт можно добавить так
    2. Открыв добавленную иконку mongo, перейдём в её админку, и создадим новую "коллекцию" (аналог таблицы) по имени logs.
    3. Обратите внимание, что теперь в переменных среды heroku появилась ещё одна, MONGODB_URI. Мы будем ей пользоваться, поэтому, если вы хотите запускать бота локально, её надо копировать себе в командную строку.
    4. Установим библиотеку pymongo и добавим её в requirements.txt.
    5. Модифицируем main.py: настроим доступ к таблице и создадим функцию-обёртку reply_with_log, которая бы и отвечала ботом, и записывала бы реплику пользователя и ответ на неё в таблицу logs.
    6. Чтобы убедиться, что логи действительно пишутся, создадим простенькую веб-страничку, которая бы визуализировала последние 10 сообщений и их общее число. У нас уже есть flask, и туда надо просто добавить новую функцию. Назовём её show_logs. Тут я генерирую html просто "вручную", но на самом деле во flask есть куда более удобные методы для этого (например, шаблоны jinja).
    7. В принципе, это всё. Вот ссылка на бота, на страничку с логами, на репозиторий. Клонируйте его, учитесь и веселитесь!

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 100.0%