Как я писал telegram-бота и заливал его на удаленный сервер
Как только на территории РФ вступил в силу запрет на анонимность в мессенджерах, у меня дошли руки написать пост про telegram-бота. По ходу создания бота столкнулся с большим количеством проблем, которые пришлось решать по отдельности, и буквально выцеживать крупинки информации со всего интернета. И вот после нескольких месяцев страданий и мучений (кодинг – не основное моё занятие) я наконец-то закончил с ботом, разобрался со всеми проблемами и готов поведать свою историю Вам.
Первые шаги
Для начала нужно установить telegram на ПК и зарегистрироваться в мессенджере. Найти в поиске @BotFather – это отец всех ботов в telegram, именно он их создаёт. Пишем ему /newbot и отвечаем на два простых вопросов: имя бота и его username. После чего @BotFather поздравит нас с успешным созданием бота и отправит нам его token — 523870826:AAF0O8T-e7riRi8m6qlRz4pBKKdh0OfHKj8.

Внимание: token – единственный идентификационный ключ к боту. Нигде не выкладывайте его, иначе другие люди смогут управлять Вашим ботом. Бот с данным token на момент выкладывания статьи удалён.
Какой язык программирования выбрать для написания бота?
Тут я долго не заморачивался и остановился на Python, так как знаю его достаточно хорошо, да и удобная библиотека тоже присутствует. Я решил использовать PyTelagramBotAPI (на момент написания этой статьи последняя доступная версия 3.5.1).
Перейдём к первому коду.
Импортируем библиотеку PyTelegramBotAPI.
Напишем простую обработку сообщений с помощью декоратора bot.message_handler.
Поставим бота в режим постоянной обработки информации, приходящей от серверов telegram.
В переменной message telegram передаёт словарь (map) такого вида:
Также существуют другие декораторы, которые могут принимать аудиофайлы, видео, картинки, документы, геолокацию и т.д.

Вообще, telegram позволяет ботам производить очень много прикольных операций от создания пользовательских клавиатур до проведения платежей. Ссылка на официальную документацию Telegram.
Для сохранения данных о пользователях решил воспользоваться базой данных sqlite3.
Параллельные процессы запускал с помощью библиотеки threading. Например: функция расчета битв.
Дальше всё зависит только от Вашей фантазии.
Где запустить Вашего бота?
Свой собственный ПК не хочется оставлять включенным 24/7, да и не практично это. Поэтому я решил воспользоваться бесплатным сервисом heroku, но меня постигла неудача из-за выбранной мною БД. Оказалось, что при каждом перезапуске бота, heroku удаляет все коммиты sqlite3 за последний сеанс без исключений. После чего, я решил купить VDS (Virtual Dedicated Server, виртуальный выделенный сервер) – удаленный ПК, на котором выделяется определенная мощность и память под Вас, и к командной строке которого Вам даётся доступ. Чаще всего операционной системой такой машинки будет linux. Плата небольшая – 400 руб./месяц, так что без особых моральных страданий оплатил VDS на основе Debian GNU/Linux и начал разбираться с тем, как мне включить бота на удалённом сервере.
Как же подключаться к VDS?
Есть разные методы, я решил по SSH-соединению через Putty. Скачиваем Putty через официальный сайт и открываем. Вводим IP-address VDS и нажимаем open.

Должно открыться такое окно, где нужно ввести логин и пароль от сервера.

Все вышеупомянутые данные выдаст компания, у которой Вы приобретёте VDS. Далее VDS – сервер.
Как установить на сервер все необходимые Вам языки программирования и библиотеки?
Тут все просто. Введя эти 5 команд в консоль сервера в данной последовательности, Вы установите на сервер python3, setuptools, pip3 и библиотеку pyTelegramBotAPI.
Все дополнительные библиотеки, которые не входят в основной пакет python3, также необходимо установить по принципу.
Как загрузить файлы с моего ПК на сервер?
Для начала создадим папку, в который будем заливать все необходимые файлы. На сервере пройдем в каталог /usr/local/bin и создадим папку bot.
У меня на ПК установлен windows, соответственно и команды будут для командной строки windows. Для начала необходимо пройти в каталог, где находится putty.exe.
Далее загружаем bot.py, который находится в каталоге C:\Users\Ilya\PycharmProjects\Bot (нужно подставить Ваш каталог) в каталог на сервере /usr/local/bin/bot.
Строчку root@123.123.12.12 нужно заменить на строчку вида login@IP_address, соответственно с Вашим логином и IP-адресом (упомянуты выше в разделе «Как же подключиться к VDS?»). Заменяя bot.py на названия других файлов, загрузите все необходимые.
Как скачать файлы с сервера на ПК?
Так же, как и при загрузке файлов на сервер в командной строке в каталог, где лежит putty.exe. И вводим эту команду, чтобы скачать файл database на рабочий стол Вашего ПК.
Как запустить бота?
Первый и самый простой вариант – зайти в каталог с исполняемым файлов и прописать python3 bot.py, но тогда при закрытии putty бот будет выключаться.
Второй вариант – запустить бота с помощью screen – модуль, который создаёт параллельные рабочие столы, но тогда бот не будет перезапускаться автоматически в случае падения, а это происходит часто – несколько раз в неделю из-за ночного перезапуска серверов telegram (в 3:00 по МСК).
Третий способ – systemd – cистемный менеджер, демон инициализации других демонов в Linux. Проще говоря, systemd запустит бота и будет перезапускать его в случае падения.
Создайте файл на Вашем ПК с именем bot.service с таким содержанием:
И загружаем его в нужный каталог:
Далее нужно прописать 4 команды в консоли сервера:
В моём случаи из-за определённых ошибок реализации, а конкретно многопоточности, пришлось переносить функцию для расчёта битв (battle_counter.py) в отдельного демона.
После чего должно появится сообщение примерно такого содержания:

Ваш бот запущен и готов к работе!
БЛАГОДАРНОСТИ
Это был мой первый относительно большой проект и я столкнулся с колоссальным количеством новых для меня проблем. Огромную благодарность хочу выразить Yurii Drake, который помог мне разобраться с ними!
Как запустить Python Telegram бота на VPS
Приветствую всех. Из этой статьи вы узнаете как запустить Telegram бота на виртуальном сервере, и настроить службу для его авто запуска и перезапуска.
Телеграм бот
Виртуальный сервер
Для демонстрации я буду использовать виртуальный сервер от Beget стоимостью 210 рублей в месяц. Вы можете использовать другого хостинг провайдера, или выбрать другую конфигурацию, в зависимости от вашего проекта.

Подключение к виртуальной машине
После того как вы создали VPS у вас откроется панель управления, где вы можете скопировать IP адрес машины и подключаться к ней по SSH.

Для этого можно использовать программу PuTTY или клиент OpenSSH, который входит в состав Windows 10. Для подключения по SSH выполните следующую команду:
И введите пароль который вы указали при создании VPS.
Подготовка сервера
После того как вы подключились к серверу, выполните команды которые обновят списки, и устаревшие пакеты до последней версии.
Загрузка и запуск бота
Перейдите в каталог home и создайте папку для вашего проекта выполнив команды.
Зайдите панель управления VPS и откройте Файловый менеджер.

Загрузите файлы вашего проекта на сервер, в моем случаи это только один файл main.py .

Установите зависимости вашего проекта, и запустите бота.
Примечание: Ubuntu 20.04 поставляется с установленной Python 3.8 из коробки, если для вашего проекта нужна другая версия, установите ее или используйте другую версию дистрибутива.
Теперь перейдите в Телеграм и протестируйте работу.

Авто запуск и перезапуск телеграм бота
Создайте systemd службу для бота.
Нажмите CTRL+S и CTRL+X что бы сохранить и выйти.
Выполните эти две команды что бы запустить службу.
Ваш бот запушен. Перейдите в Телеграм и убедитесь в этом.
Заключение
Ваш бот будет всегда запускаться при старте системы, и перезапускается при возникновении ошибки. Для примера вы можете специально вызвать исключения в одной из функций обернутой обработчиком, и отследить ее в журнале командой:
Подготовка рабочего места в Windows и Linux. Virtual Environment (venv). Ответы на вопросы
Весь текст ниже появился как попытка дать универсальный ответ на те вопросы, которые дорогие читатели присылали и продолжают присылать раз за разом. Здесь не будет кода, связанного с ботами напрямую, а лишь советы по организации процесса написания. И, конечно же, не нужно воспринимать это как истину в последней инстанции, напротив, выбирайте те инструменты и подходы к разработке, которые лично вам кажутся удобными. Важная деталь: текст написан в конце 2019 года. Достаточно вступительных слов, поехали!
Предположим, вы уже немного знаете язык Python 3 (забудьте про Python 2.7, он мёртв), умеете писать простенькие программы и хотите взяться за разработку ботов. Где это делать? В чём писать код? Как правило, у большинства начинающих программистов основной операционкой используется Microsoft Windows. С неё и начнём, но сперва…
Virtual environment
Вы когда-нибудь пользовались VirtualBox? Например, чтобы «пощупать» другие операционные системы или просто установить какой-нибудь подозрительный софт. Python Virtual environment (далее — venv) чем-то напоминает «виртуалку». При его использовании создаётся копия выбранного интерпретатора Питон, а все устанавливаемые модули хранятся изолированно от общесистемных, тем самым, упрощается их обновление, удаление или изменение. Часто venv позволяет избежать ошибок, связанных с обратной совместимостью некоторых библиотек, а также обойтись без конфликтов с системными модулями. Работа с venv будет подробнее описана ниже в разделе Linux, но использовать его мы будем везде.
Windows
Первым делом, разумеется, нужно скачать сам интерпретатор Python. На момент написания этого текста актуальной версией является Python 3.8.1. В качестве каталога установки я рекомендую использовать что-то простое, вроде C:\Python38. Где писать код — личное дело каждого, конечно, но я всё же рекомендую использовать специальную среду разработки под названием PyCharm Community Edition. Бесплатной версии (та самая Community) более чем достаточно. После установки и первичной настройки выберите пункт File -> New Project. Укажите имя вашего первого проекта, а ниже укажите «New environment using virtualenv», ниже в качестве интерпретатора путь к python.exe каталога с Питоном (например, C:\Python38\python.exe).
Создание нового проекта в PyCharm
После запуска откройте вкладку Terminal в левом нижнем углу и установите библиотеку pytelegrambotapi (не telebot!). Для любителей тыкать мышкой есть более запутанный вариант: File -> Settings -> Project <имя проекта>-> Project Interpreter -> кнопка «+» в правой части экрана.
Установка библиотеки через терминал в PyCharm
Прекрасно, теперь начинайте творить! Создайте первый файл с исходником, нажав правой кнопкой мышки по имени проекта в списке файлов, затем New и Python File.
Создание нового файла кода в PyCharm
Запустить код можно, выбрав сверху пункт Run, затем снова Run…, но с многоточием, и затем выбрав созданный ранее файл.
Как залить файлы на сервер?
Для копирования файлов на удалённый сервер (обычно там стоит Linux), я использую замечательную бесплатную программу WinSCP, причём в ней присутствует режим автоматической синхронизации файлов, чтобы при любом изменении в локальном каталоге обновлялось содержимое на удалённой машине, избавляя вас от необходимости копировать всё вручную.
Скриншот программы WinSCP
При помощи WinSCP можно даже просто подключиться к серверу и подправить файл «на лету», не забудьте только потом перезапустить бота!
Linux
Если Linux у вас используется вместо Windows, то работа с PyCharm будет точно такой же, поэтому второй раз писать не имеет смысла. Далее рассмотрен процесс запуска в терминале на удалённом сервере. Прекрасно, вы написали бота и хотите где-то его запустить. Например, арендовали сервер у Scaleway/DigitalOcean/AWS/etc. Запустили сервер, подключились к нему по SSH, а там чёрный экран и терминальная Linux-сессия. Во-первых, давайте посмотрим, какой интерпретатор у нас выбран по умолчанию, введя команду python3 .
Хорошим правилом будет иметь на сервере ровно ту же версию Python, что и на своей локальной машине, во избежание различных неприятностей. Если версия на сервере ниже 3.7 и/или ниже той, что установлена локально, лучше всего будет установить её отдельно. Очень рекомендую вот эту статью, по которой я для себя написал простой скрипт для автоматизации рутинных действий. Итак, интерпретатор установлен, теперь пора создать каталог, куда положим файлы бота. Выполните по очереди следующие команды:
В результате должно получиться примерно то же самое, что на скриншоте ниже, с той лишь разницей, что я прервал процесс установки библиотеки для читабельности. Обратите внимание, что после подгрузки файла venv/bin/activate, перед названием пользователя и текущего каталога появится приписка (venv), означающая, что мы «вошли» в виртуальное окружение и устанавливаем библиотеки именно в него.
Создание venv в Linux-терминале
Что произошло выше? Во-первых, мы создали каталог с названием mybot и перешли в него. Во-вторых, мы использовали Python версии 3.7 (в вашем случае это может быть не так), чтобы создать виртуальное окружение в подкаталоге venv. В-третьих, мы «активировали» venv и выполнили в нём нужную нам команду. Внутри venv команды pip и python точно знают, к какому именно интерпретатору они относятся, поэтому путаницы вроде «я установил библиотеку для Python 3.5, а запускаю из-под Python 3.7» попросту не будет. Наконец, в-четвёртых, мы деактивировали venv, поскольку он напрямую нам больше не нужен. Чтобы сделать жизнь ещё приятнее, давайте настроим автозагрузку бота, чтобы при возникновении ошибок или при перезапуске сервера он вновь запускался, избавляя нас от необходимости постоянно проверять всё вручную. Для этого мы воспользуемся подсистемой инициализации systemd, которая всё больше распространена в современных Linux-дистрибутивах. Прежде, чем описать службу systemd, откройте главный файл с ботом, в котором прописан его запуск и добавьте в качестве первой строки следующий код: #!venv/bin/python
Сохраните файл, закройте его и выполните команду chmod +x имяфайласботом.py , чтобы сделать его исполняемым. Теперь создайте файл mybot.service, и скопируйте туда следующий текст:
Отредактируйте поля Description , WorkingDirectory и ExecStart , сохраните и закройте файл. Далее скопируйте его в каталог /etc/systemd/system , введя свой пароль при необходимости (если сидите не из-под рута, что правильно, то ваш юзер должен иметь возможность выполнять команды от имени sudo). Затем выполните следующие команды для включения автозагрузки и запуска бота (опять-таки, требуются права суперпользователя):
Наконец, проверьте состояние вашего бота командой systemctl status mybot . Его статус должен быть Active (running) зелёного цвета (если поддерживается разноцветный режим).
Проверка статуса бота через systemd
Как редактировать файлы на сервере?
Если что-то нужно подправить небольшое, то неплохим вариантом остаётся старое доброе подключение по SSH и использование редакторов вроде micro, nano или даже vim с emacs. Но если вдруг у вас в качестве локальной машины применяется Linux, то крайне рекомендую редактор Visual Studio Code (https://code.visualstudio.com) с дополнением Remote-SSH. В этом случае, вы сможете прямо в VS Code открывать каталоги на сервере и редактировать файлы в удобном окружении и с подсветкой синтаксиса. К сожалению, насколько мне известно, расширение Remote-SSH не работает в Windows, но впоследствии этот недочёт будет устранён.
Ответы на часто задаваемые вопросы (FAQ)
Хочу научиться писать ботов. С чего мне начать?
Прежде всего, пожалуйста, изучите хотя бы немного сам язык Python. Он довольно простой, но перед созданием ботов стоит понять азы. Конкретнее: переменные, циклы, функции, классы, обработка исключений, работа с файлами и файловой системой.
Можно ли писать ботов на телефоне?
Да кто ж вам запретит-то? Но лучше от этого никому не будет, поверьте. Будет трудно, неудобно и контрпродуктивно. Используйте нормальный компьютер.
[pyTelegramBotAPI] Ошибка AttributeError: module ‘telebot’ has no attribute ‘TeleBot’!
На 99% уверен, что вы установили библиотеку telebot вместо pytelegrambotapi. С учётом всего вышесказанного проще создать новое окружение venv, перенести туда нужные файлы и установить именно pytelegrambotapi, при этом в исходниках должно остаться import telebot.
Как мне держать бота запущеным в Windows?
Запустите бота в PyCharm, не закрывайте приложение и не выключайте комп. Почти шутка. По-моему, Windows — не самая лучшая операционка для подобных вещей, проще арендовать сервер у европейских провайдеров, заодно не будет геморроя с варварами из Российского Консорциума Неадекватов.
Библиотека pyTelegramBotAPI не поддерживает новые фичи Bot API!
К сожалению, упомянутая библиотека в 2019 году развивалась гораздо медленнее, чем хотелось. Если вы уже чувствуете себя уверенным ботописателем, подумайте о переходе на альтернативы вроде aiogram.
В завершение хочется напомнить, что если у вас возникли замечания, предложения или вопросы, вы всегда можете открыть issue на Github или прийти к нам в чатик.
Telegram-бот: от первой строчки до размещения
Эта статья о том, как создать Telegram-бот для автоматизации нескольких рутинных задач. Если вас интересует только код, то вот ссылка. Он несложный, и его вполне можно понять самостоятельно.
Что этот бот будет делать?
Отправлять письма
Это совсем не тупо, но мне кажется, надо пояснить. Всю дорогу по ходу учебы мне нужно было отправлять кучу писем, и все они должны были быть определенного формата. К тому же gmail просто бесит, он красный и все такое! При помощи бота я смогу отправлять письма через чат. Я просто пишу в чат, а бот пусть форматирует это и отправляет по мейлу.
Сохранять всякое разное
Я очень много использую Telegram и часто натыкаюсь там на интересные для меня ссылки или просто на полезную информацию. Хотелось бы, чтобы бот сохранял все то, что я ему пересылаю, в базе данных SQL.

Что мы будем использовать при создании бота
Для API Telegram есть оболочки практически на любом языке программирования. Начиная от Python, PHP и Java и заканчивая Node.js. Мы, разумеется, будем использовать Python. Код данной оболочки находится здесь, можете убедиться сами. Также можно поучаствовать в развитии данного проекта (если сможете, конечно). Оболочки для других языков можно найти здесь.
Конечно плагиат!
Наш бот
Чат с BotFather для получения ключей API
Создание Telegram-бота это весьма забавный процесс так как, собственно, весь он строится на вашем общении с Telegram-ботом. Зовут этого бота BotFather (Бот-Отец). В приложении Telegram его можно найти по имени и начать с ним беседу.
Для начала беседы наберите /start .
Надеюсь, Бота-матери не существует….
Вы увидите список команд, при помощи которых можно создавать боты, редактировать их и управлять ними. Так как мы зашли в первый раз, то выбираем /newbot .
После введения команды /newbot вам предстоит выбрать имя и ник (username) для вашего бота. Имя — это то, как пользователи будут видеть этого бота в своем контакт-листе. А ник — имя, по которому этот бот можно будет найти в приложении Telegram. Это то же самое как и ник в Twitter, он должен быть уникальным, и чем короче, тем лучше.
Сделав это, вы получите API-ключ для вашего бота. С помощью него Telegram сможет ассоциировать написанный вами код именно с этим конкретным ботом. У каждого бота есть свой API- ключ, и вы не должны им ни с кем делиться. В противном случае ваш бот можно будет взломать и осуществить злодейские планы.
Именно!
Начнем с того, что импортируем все необходимое.
Предназначение библиотек logging и sqlite3 вполне видно из их названий. Они будут использоваться для логирования и сохранения всего, что нам потребуется. В файле sensitive содержаться мои учетные данные, а в telegram.ext хранятся все необходимые обработчики.
Updater — это класс, в котором используется telegram.ext.Dispatcher. Он предоставляет интерфейс для telegram.Bot, чтобы можно было сосредоточиться исключительно на программировании бота. Его цель — получать обновления от Telegram и доставлять их указанному диспетчеру. Он также запускается в отдельном потоке, поэтому пользователь может взаимодействовать с ботом, например, из командной строки. Диспетчер поддерживает обработчики для различных типов данных: обновления от Telegram, основные текстовые команды и даже произвольные типы. Класс Updater может быть использован как служба опроса, а для получения обновлений можно использовать вебхук (webhook). Это достигается с помощью классов WebhookServer и WebhookHandler .
CommandHandler — это класс для обработки команд Telegram. Команды — это сообщения Telegram, начинающиеся с / , за которыми, возможно, следует символ @ , имя бота и / или дополнительный текст.
MessageHandler — класс для обработки Telegram-сообщений. Они могут содержать текст, различные медиафайлы или обновления статуса.
ConversationHandler — это класс для ведения диалога с одним пользователем путем управления четырьмя коллекциями других обработчиков. Обратите внимание, что ни сообщения в каналах Telegram, ни групповые взаимодействия с несколькими пользователями не управляются экземплярами данного класса.
Команды
Для каждой команды написана отдельная функция. А все остальное — для работы с SQL и строками.
Я — великий «программист»!
Иметь дело с электронной почтой несколько сложнее (на самом деле нет — если вы используете ConversationHandler ). Чтобы полностью понять идею того, как значения из одной функции передаются другую и в ней обрабатываются, прочитайте вот это.
Пожалуйста, прекратите!
Как вы могли заметить, функцию send_mail() я импортировал из модуля mail . Для отправки почтовых сообщений используется протокол SMTP.
Разумеется, для отправки электронной почты через протокол SMTP вы должны иметь имя пользователя и пароль. Вот хорошее пособие на данную тему.
Вот и всё?
Вообще-то нет. Вам еще осталось все это запустить.
У меня дома все не на месте…
Размещение кода
Для размещения кода существует множество способов. Выбор зависит от того, как и насколько много вы будете этот код использовать.
Сие никому не ведомо…
-
: бесплатно и просто. Откройте терминал и в нем запустите файл с вашим ботом. Но не ждите, что он будет работать долго. : не будем изобретать колесо. Вот здесь дана пошаговая инструкция по размещению на сервисе Heroku.
Вот здесь также собраны инструкции по размещению Telegram-ботов.

Английский для программистов
Наш телеграм канал с тестами по английскому языку для программистов. Английский это часть карьеры программиста. Поэтому полезно заняться им уже сейчас