Как сделать telegram бота на python

Zoloto585CPA

Основы создания Telegram бота на Python

Как создать Telegram bot на Python основы

В этой статье мы разберём, как создать простой Telegram bot на языке программирования Python, но тут будут только основы, которые скорее для новичков, чем для профессионалов.

Также если вас интересует разработка ботов, но на JavaScript, то можете посмотреть статью: «Telegram bot на JavaScript», ещё скажу, что по сути мы будем делать бота из этой статьи, только на Python.

Установка Telegram API:

Для начала нужно скачать нужный API, для создания бота, но перед этим рекомендуется сделать виртуальное окружение, для этого прочитайте статью «Создание Virtual Environments Python».

После того как это сделали скачиваем telegram bot API на Python, это делается как обычно через pip install.

На этом установка закончилась.

Регистрация Telegram бота:

Перед созданием, нужно получить токен для бота, для этого напишите боту @BotFather.

botFather

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

Получение токена для API, чтобы создать Telegram bot на Python

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

Создание Telegram bot на Python:

Теперь перейдём к самому интересному, это к написанию кода, для этого создадим файл где всё будет хранится, я его назову «main.py», в начале в нём делаем импорт и создаём переменную для токена.

Здесь мы подключаем API и специальную библиотеку «types», которая нам нужна для создания кнопок к сообщениям, но кроме этого у неё есть и другие возможности.

Потом объявляем переменную для токена, и создаём бота.

Следующие, пишем не большую функцию для создания кнопок.

Здесь первым делом мы должны сделать специальный массив, для хранения кнопок, используя types.InlineKeyboardMarkup() , потом делаем две кнопки, тут самое интересное, то какие параметры используются при создание, первый, это текст кнопки, а второе, callback_data , то какое значение оно будет возвращать при нажатие.

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

Первым делом у нас идёт декоратор, который срабатывает при получение команды «/start», которые обозначаются в параметре commands, который является списком и можно обозначить таким образом несколько команд.

Потом создаём функцию для отправки сообщения, в ней первым делом получаем наши кнопки, потом через функцию send_message() , мы отправляем сообщение.

Примечание:

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

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

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

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

Если все верно, то открываем картинку и отправляем её с помощью функции send_photo() , тут все такие же параметры как и при отправки обычного сообщения, только есть photo, которому задаём картинку и вместо text , для текста сообщения, используем caption , дальше закрываем картинку.

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

Пишем Бот для Telegram на Python.

Давно хотелось попробовать создать простенького бота для Telegram, по этому поехали.

Самым первым делом нам надо собственно зарегистрировать(создать) бота. Для этого качаем Telegram на компьютер. Затем находим пользователя BotFather (такая забавная отсылка к Крестному Отцу).

Пишем команду /newbot . Далее нас просят ввести Имя бота, далее просят ввести Имя пользователя для Бота ( имя под каким он будет в телеге). После этого вы получите bot<token> для использования API . Каждому боту при создании присваивается уникальный токен вида 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

Все запросы к Telegram Bot API должны осуществляться через HTTPS в следующем виде: https://api.telegram.org/bot<token>/НАЗВАНИЕ_МЕТОДА . Допускаются GET и POST запросы . Ответ придёт в виде JSON-объекта, в котором всегда будет булево поле ok и опциональное строковое поле description , содержащее человекочитаемое описание результата. (Это не я придумал, это написано в манулае).

Писать всю работу с Bot API мы будем на Питоне с использование библиотеке requests . Давайте воспользуемся первым методом (он же является тестовым можно сказать) getMe .

Простой способ тестирования токена аутентификации вашего бота. Не требует параметров. Возвращает основную информацию о боте в виде пользовательского объекта.

getMe

Нам вернеться словарь с данными (поле result)

Окей , бот работает. Давайте теперь ему что нибудь напишем )

Теперь давайте получим обновления от бота методом getupdates .

getupdates(offset, limit 0-100 , timeout) Этот метод используется для получения обновлений через long polling . Ответ возвращается в виде массива объектов Update. Входящие обновления будут храниться на сервере до тех пор, пока вы их не обработаете. offset &#8212; Идентификатор первого обновления, которое будет возвращено. Должно быть больше на единицу, чем самый высокий среди идентификаторов ранее полученных обновлений. По умолчанию возвращаются обновления, начиная с самого раннего неподтвержденного обновления. Обновление считается подтвержденным, как только get Updates вызывается со смещением выше, чем его update_id. Отрицательное смещение можно задать для получения обновлений, начиная с-offset update из конца очереди обновлений. Все предыдущие обновления будут забыты.

getUpdates?offset = -1

Тут полно всякой информации. Например имя кто послал сообщение &#171;first_name&#187;:&#187;Semen&#187;,&#187;type&#187;:&#187;private&#187; , текст сообщения &#171;text&#187;:&#187;\u041f\u0440\u0438\u0432\u0435\u0442 \u0436\u0435\u043b\u0435\u0437\u044f\u043a\u0430 .

Но нам потребуется сейчас только chat — "id":689692596 индификатор чата что бы ответить и поле "text":"/start" собственно само сообщение. Еще нам нужно поле "update_id":565003055 , мы потом будем его использовать. Перепишем нашу функцию что бы она делала запроси и из ответа возвращала нужные нам поля.

Не монго поясню как мы получили данные : нам вернулся словарь. Мы взяли последний элемент [-1] словаря result в нем нашли значения словаря message в нем взяли словарь chat в нем получили элемент id и т.д. Немного сложно, но надо проcто ответ разложить в более понятой форме

JSON (англ. JavaScript Object Notation) — текстовый формат обмена данными, основанный на JavaScript. Как и многие другие текстовые форматы, JSON легко читается людьми.

Набор пар ключ: значение . В различных языках это реализовано как запись, структура, словарь, хеш-таблица, список с ключом или ассоциативный массив

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

sendMessage ( chat_id, text ) Использовать этот метод для отправки текстовых сообщений. При успешном выполнении возвращается отправленное сообщение.

https://api.telegram.org/bot<Token>/ sendmessage?chat_id=123456&text=Ваш текст

Финишная прямая. Теперь нам надо как то обрабатывать запросы и выдавать что то полезное. Например заголовки статей с сайта 3Dnew, к стати парсер для этого сайта мы писали в этой статье, его и будем использовать. А команда для парсинга будет у нас /3dnews .

Вот мы и написали очень простого бота для Телеграм используя только API. Продолжение следует )))

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Создание телеграм-бота с веб-интерфейсом при помощи Python и Replit

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

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

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

Необходимые приготовления

Для получения максимальной пользы от этого руководства читателю нужно:

  • знать язык программирования Python
  • иметь аккаунт в Телеграм и установить клиентскую часть на свой компьютер
  • иметь аккаунт в Replit или создать его прямо сейчас.

Также было бы полезно, если бы вы были знакомы с базой данных Replit, но это не критично.

Регистрация бота

Для начала нам нужно зарегистрировать нашего бота в Telegram, чтобы сгенерировать учетные данные, которые мы будем использовать для подключения к Telegram API. Каждый бот должен быть привязан к конкретной учетной записи пользователя. Это можно сделать с помощью официального управляющего бота Telegram под названием «BotFather».

Zoloto585CPA

Для этого сначала войдите в ваш аккаунт и в поиске наберите @bot . Обязательно выберите подтвержденный аккаунт (у которого справа будет голубая галочка), в противном случае мы можем провести беседу с кем-то совсем другим.

bot father

BotFather

Для активации BotFather нажмите на кнопку Start :

bot father start

Для начала рабочего процесса создания нового бота мы должны отправить в BotFather команду /newbot .

Бот у нас спросит следующие данные:

  • имя бота, которое будет отображаться в верхней части чата нового бота, например, «Replit Quick-start Tutorial».
  • имя пользователя, которое будет использоваться для уникальной ссылки на этого бота, например, «@replit_tutorialbot».

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

token

Токен

Как только мы ответим на все вопросы, BotFather отправит нам наш токен аутентификации, который будет выглядеть примерно так:

Обратите внимание, что вся строка (до двоеточия и после) является токеном.

Создание интерфейса бота

Теперь мы можем приступить к написанию той части программы, которая обрабатывает запросы из Telegram. Создадим новую repl-среду, а в качестве языка программирования выберем Python.

new repl

Наш бот должен взаимодействовать с Telegram. Для этого нам понадобится доступ к Telegram REST API. Есть много способов сделать это, но в рамках данной статьи мы будем использовать удобную библиотеку, обернутую обернута вокруг API.

Прежде чем мы продолжим, нам нужно сделать наш токен доступным для использования нашим ботом. Создайте переменную среды под названием TOKEN , щелкнув значок замка на боковой панели, как показано ниже, и вставьте свой токен бота, который вы получили ранее, например 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5 :

env variables

Создание переменной среды

Это гарантирует, что наш токен доступен как переменная среды и что к нему не смогут получить доступ люди, имеющие доступ к нашей среде repl (в бесплатной версии она открыта для всех, &#8212; прим. переводчика).

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

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

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

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

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

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

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

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

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

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

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

Важно знать, что start_polling &#8212; это неблокирующая функция. Это означает, что код в ней не прекращает выполнение. Он будет исполняться, пока программа не завершится.

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

Марк Лутц «Изучаем Python»

Скачивайте книгу у нас в телеграм

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

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

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

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

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

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

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

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

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

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

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

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

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

Создаем веб-интерфейс

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

Этот код создает небольшое Flask-приложение. Импорт модуля Flask обеспечивает среда программирования Replit. В этом уроке мы сделаем только одну страницу.

Мы сообщаем Flask , каким образом должна быть доступна страница при помощи специальных декораторов. Декоратор @app.route (‘/’) говорит, что когда пользователь обращается к https://example.com , его будет обслуживать этот обработчик. В этом случае переменная page будет иметь значение по умолчанию None .

Декоратор @app.route(‘/<int:page>’) говорит, что когда пользователь обращается к чему-то вроде https://example.com/4 , он откроет страницу 4 записанных сообщений. В этом случае переменной page будет присвоено значение 4 .

Но пока это работать не будет, потому что шаблон home.html еще не существует. Давайте создадим его прямо сейчас в папке с названием templates (т.е. templates/home.html ):

Этот шаблон будет выводить страницу записанных сообщений и ссылки на следующую или предыдущую страницу. Он требует наличия переменной page и массива messages , который будет отображаться в виде списка. Шаблон также принимает переменные «prev_page» и «next_page», которые мы используем для создания ссылок на предыдущую и следующую страницу, если они существуют, конечно. Все они присутствуют в нашей функции маршрутизации, когда мы запускаем render_template .

Как нам рассчитать максимальное количество страниц?

То есть мы делим количество ключей в нашей базе данных Replit на десять и округляем его в большую сторону. Мы также можем использовать это число по умолчанию. Таким образом, если кто-то вызовет простой маршрут « / », мы просто отобразим последнюю страницу.

Мы знаем, что последние сообщения всегда будут «самыми последними», потому что мы отсортировали их в порядке возрастания в предыдущей строке.

Переменные prev_page и next_page всегда содержат в себе значение текущей страницы, уменьшенное либо соответственно увеличенное на единицу, если они являются действительными номерами страниц. В противном случае им присваивается значение None , чтобы шаблон их не отображал.

Собираем все воедино

Если мы запустим нашу программу сейчас, веб-приложение Flask еще не будет работать. Flask должен прослушивать запросы аналогично библиотеке Telegram. Чтобы запустить сервер Flask, мы вполне можем в конце нашей программы использовать app.run() .

Проблема в том, что эта строка кода при нормальных обстоятельствах никогда не будет достигнута, потому что у нас есть строка updater.idle() , блокирующая наш код до нее. Чтобы решить эту проблему, мы можем заменить эту строку строкой, которая запускает наш сервер Flask на первом уровне. Строка updater.idle() у нас присутствовала лишь для того, чтобы предотвратить преждевременное завершение программы. Теперь то же самое будет делать сервер Flask . Итак, давайте произведем замену:

Параметры host и port , установленные в эти значения, позволяют среде Replit получить доступ к серверу и обычно будут отображать окно с содержимым нашей страницы. Теперь мы можем просматривать сообщения, отправленные пользователями через бот.

Сделайте все это сами

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

Что дальше?

Попробуйте использовать команду /setcommands в BotFather , чтобы добавить быстрое меню для команд в вашем боте. Здесь описаны все команды по работе с этим ботом.

Если бы мы хотели получить доступ к имени пользователя &#8212; отправителя сообщения, мы могли бы получить к нему доступ так же, как и к тексту сообщения:

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

Zoloto585CPA

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

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