Исходный код Телеграма: на каком языке программирования написан

Я пиарюсь

image

Начнем с того, что у Telegram действительно полностью открытый клиентский код. К сожалению, мы не видим комиты каждый день прямо на GitHub, но у нас есть код под открытой лицензией. Архитектура Telegram подразумевает, что и Bot и API имеет практически такие же методы — https://core.telegram.org/methods.

На самом деле, Telegram представляет не просто чат-мессенджер, а социальную платформу, доступ к которой открыт для разного рода приложений. Они могут предоставлять дополнительные фишки пользователям, взамен используя готовую сеть пользователей и сервера для доставки сообщений. Звучит настолько привлекательно, что нам захотелось попробовать написать своего “клиента” для Телеграм.

Суть приложения

В основном мы занимаемся картами и навигацией, поэтому мы сразу смотрели что-нибудь связанные с геолокацией. Мне очень понравилось, что в Telegram, раньше всех остальных приложений, появился удобный способ делится местоположением в реальном времени (https://telegram.org/blog/live-locations) и я достаточно часто этим пользуюсь: помочь сориентироваться другу, показать дорогу и самое главное ответить на главный вопрос “Когда ты будешь?”. В принципе, этого хватает большинству людей, но как всегда есть сценарии, когда простых возможностей не хватает. Например, это может быть группа более 10 человек, с разными устройствами (некоторые устройства возможно не являются телефонами) и разными людьми. Этим людям было бы удобно обмениваться сообщениями в группе, а также видеть перемещения друг друга на карте.

Во главу угла мы поставили задачу создать дополнительную ценность для Telegram, а не пытаться использовать его не по назначению. Мы не хотели, чтобы люди у которых нет специального клиента Телеграм, видели в чате месиво сообщений или что-то невразумительное. У людей с “улучшенным” клиентом, появляются же дополнительные возможности, например:

  1. Более тонкое управление временем при отправке локации в реальном времени в чат.
  2. Просмотр местоположения контактов на карте.
  3. Подключение к чату маячковых устройств, через внешний API (Bot).

Как мы это делали

К счастью, весь код, который мы пишем — Open-Source, поэтому я сразу могу дать ссылку на его реализацию — Реализация Bot и Реализация Telegram Client на Kotlin.

Bot — основы
   // Gradle implementation "org.telegram:telegrambots:3.6"    TelegramBotsApi telegramBotsApi = new TelegramBotsApi();    telegramBotsApi.registerBot(new TelegramLongPollingBot() {...});

Основная особенность передачи location, что его надо часто обновлять, и боту необходимо редактировать уже отправленные сообщения. Если бы не было такой возможности, то Bot бы просто заспамил чат и это, конечно, был бы Epic Fail. Слава богу, Telegram предоставляет права боту редактировать сообщения на протяжении 24 часов (минимум, возможно и дольше).

Передать сообщение можно многими способами. Есть тип Plain Text, Venue, Location, Game, Contact, Invoice и т.д. Казалось, что для нашей задачи отлично подходит Location, но вскрылась неприятная особенность. Location можно передать только с одного устройства для одного аккаунта или бота одновременно! Представьте у вас 2 телефона и с двух телефонов вы отправили свой Location в один чат. Так вот, на сервере случится ошибка и первый Location Sharing просто остановится. Казалось бы, это явно неральный случай, но представьте, у вас много китайских маячков, которые умеют отправлять Location по заданному URL, но они не умеют отправлять прямо в Telegram. Вы пишите Bot, который забирает с сервера и пушит в телеграм. Вот тут и вылазит, то что Bot не сможет отправить больше одного сообщения маячка с типом Location. Получается, это отлично подходит для единоразовой отправки, но не подходит для Live Location.

Решение простое — отправлять текстовые сообщения, а клиент будет парсить текст и показывать локации на карте. К сожалению в стандартном клиенте Telegram будут видны только текстовые сообщения, но там можно вставить ссылку, чтобы открыть карту.

Bot — Подводные камни

К сожалению, Bot пришлось переписывать аж 2.5 раза. Основная проблема — неправильный дизайн коммуникации.

  1. Почему-то вначале казалось хорошей идеей, если бот будет полноценным участником чата и отправлять сообщения. Но, это плохо и с точки зрения Privacy переписки и с точки зрения взаимодействия с ботом. Правильное решение, использовать Inline bots. Таким образом, гарантируется, что бот не видит ничего кроме своего Location и его можно использовать в любом чате. По-человечески говоря, некультурно тащить своего бота в какой-то общий чат, а нужно пообщаться с ботом один на один и настроить его, а дальше он сможет отправлять нужные сообщения в любой выбранный чат.
  2. В Telegram Message API есть исторически 2 типа взаимодействия: кнопки под текстом ( (inline buttons)[https://core.telegram.org/bots/2-0-intro#switch-to-inline-buttons] ) и ответы боту напрямую текстом. В общем, ответы с ботом безнадежно устарели. Кнопки немного сложнее с точки зрения реализации, но это полностью окупается удобством использования и именно их надо использовать для всего нетекстового ввода.
  3. В качестве примера бота можно посмотреть популярный @vote_bot или наш @osmand_bot.
Telegram Client

Найти примеры готовых telegram client, кроме основного, нам не удалось, но достаточно простая структура tdlib помогла нам создать базовый клиент буквально за пару дней.

Настройка Gradle:

task downloadTdLibzip {     doLast {         ant.get(src: 'https://core.telegram.org/tdlib/tdlib.zip', dest: 'tdlib.zip', skipexisting: 'true')         ant.unzip(src: 'tdlib.zip', dest: 'tdlib/')     } }  task copyNativeLibs(type: Copy) {     dependsOn downloadTdLibzip     from "tdlib/libtd/src/main/libs"     into "libs" }  task copyJavaSources(type: Copy) {     dependsOn downloadTdLibzip     from "tdlib/libtd/src/main/java/org/drinkless/td"     into "src/org/drinkless/td" } dependencies {     implementation fileTree(dir: 'libs', include: ['*.jar']) }

Практически все внутренности Телеграмма написаны на С++ и с точки зрения Android виден только класс API на 1.5 Мб прокси методов TdApi.java. Путем сопоставления документации ботов и названия методов, можно достаточно просто сориентироваться куда двигаться.

Инициализация клиента с global handler:

fun init(): Boolean {     return if (libraryLoaded) {         // create client         client = Client.create(UpdatesHandler(), null, null)         true     } else {         false     } }

Запрос фото пользователя:

private fun requestUserPhoto(user: TdApi.User) {     val remotePhoto = user.profilePhoto?.small?.remote     if (remotePhoto != null && remotePhoto.id.isNotEmpty()) {         downloadUserFilesMap[remotePhoto.id] = user         client!!.send(TdApi.GetRemoteFile(remotePhoto.id, null)) { obj ->             when (obj.constructor) {                 TdApi.Error.CONSTRUCTOR -> {                     val error = obj as TdApi.Error                     val code = error.code                     if (code != IGNORED_ERROR_CODE) {                         listener?.onTelegramError(code, error.message)                     }                 }                 TdApi.File.CONSTRUCTOR -> {                     val file = obj as TdApi.File                     client!!.send(TdApi.DownloadFile(file.id, 10), defaultHandler)                 }                 else -> listener?.onTelegramError(-1, "Receive wrong response from TDLib: $obj")             }         }     } }
Telegram Client — подводные камни
  1. Регистрация/Login и Logout. При регистрации необходимо учесть разные сценарии: когда код доступа присылается SMS или в другой телеграм клиент, двухфакторную авторизацию и т.п. Самая большая сложность — это тестирование. Любая авторизация более 3-х раз вела к блокировке аккаунта на 24 часа, поэтому тестировать Logout было особенно весело. Несмотря на то, что регистрация нужна всего лишь один раз, наверное это самая сложная часть интеграции.
  2. Определить как и в каком порядке вычитывать сообщения. Любой клиент имеет доступ ко всем сообщениям во всех чатах, но вычитывать их надо последовательно. В нашем случае 99% сообщений нужно отбрасывать. Сначала мы почему-то сделали чтение всех сообщений за последние 3 дня при логине, но в дальнейшем это только вызвало проблемы и при рестарте у нас пропадали сообщения. Поэтому сейчас мы читаем только новые сообщения, а для тех сообщений, что нам нужны сохраняем id во внутренней БД.

Что получилось

Наверное, зная все подводные камни можно было бы все сделать в разы быстрее, но получилось где-то 1-2 месяца на трех человек. Финальное приложение можно найти в Google Play.

image

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

Буду рад ответить на ваши вопросы.

Высокая безопасность мессенджера Telegram – это его визитная карточка. Для обеспечения анонимности людей используется особая авторская технология кодирования, которая уже стала признана в профессиональной среде разработчиков и программистов.

Однако о языке программирования Telegram говорят намного меньше, и это незаслуженно. Разберемся, на каком языке написан Телеграм и что делает его таким безопасным.

Содержание

Технические характеристики Telegram

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

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

Язык программирования

Официально считается, что написан Telegram на языке С++. Это логично, ведь он прямо совместим с обычным С, который принят и используется для написания мобильных приложений на базе Android и iOS.

Однако ряд программистов высказывает предположения, что для запуска мессенджера было произведено смешение Java, C++ и фреймворков Java. Насколько это убеждение верно, неизвестно из-за того, что команда разработчиков не комментировала данный вопрос.

Важно! На базе С++ мессенджер существует с 2013 года. С регулярными свежими обновлениями приложения он только немного дорабатывается, а не создается с нуля. Полностью код переписывался лишь раз для официального веб-клиента Telegram X на языке программирования Swift.

Интерфейс

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

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

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

Технология шифрования

Для передачи сообщений используется протокол шифрования MTProto. Для авторизации и аутентификации – алгоритмы RSA-2048, DH-2048. При коммуникации одного человека с другим содержание текста личных сообщений шифруется при помощи симметричного AES (Advanced Encryption Standard) и случайно генерируемого ключа, который есть только у сервера и адресата.

Ключ навсегда удаляется примерно через 10 минут после получения сообщения и не хранится постоянно на сервере. С переходом на протокол MTProto два точка ноль применяется криптографический хеш-алгоритм SHA-256.

Режим секретных чатов использует более надежный тип end-to-end кодирования, при котором ключ для чтения сообщений вообще не пересылается на сервер и доступен только для отправителя и получателя. Для реализации этой функции пользуются алгоритмом AES-256 в режиме IGE.

Внимание! При удалении сообщения в переписке оно также совсем стирается с сервера.

Исходный код «Телеграм»

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

Предназначение

Благодаря открытому программному интерфейсу приложения любой заинтересованный человек может получить доступ к сервису библиотеки данных TDLib и заняться созданием на его основе собственного веб-клиента. При этом не надо решать проблему того, на каком языке программирования написан Телеграм, поскольку предлагается сразу несколько версий с поддержкой Javascript, C++ и C#.

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

Как пользоваться

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

Справка! Скачать код для последнего обновления приложения невозможно, потому что именно его никогда даже не публикуют. К скачиванию доступны только старые варианты официальных клиентов для всех платформ.

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

Официальные и неофициальные клиенты

Среди официальных клиентов доступны следующие:

  • Вариант для мобильных устройств:
    • Telegram для Андроид;
    • Telegram для ios;
    • Telegram для Windows Phone.
  • Desktop-вариант:
    • Telegram для Windows/Linux;
    • Telegram для macOS.
  • Веб-вариант:
    • Telegram Web-version;
    • Telegram Chrome app.

Единственный официальный веб-клиент группы разработчиков под эгидой Павла Дурова – это проект Telegram X.

Неофициальных кастомных клиентов в разы больше, например:

  • Plus Messenger;
  • Vidogram;
  • Loopy for Telegram;
  • TechGram;
  • Mobogram;
  • Unigram и др.

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

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

Детальная информация видна на видео:

Время на прочтение: 4 минут(ы)

На вопрос «Почему Open Source делает лучше?» прозвучал следующий ответ:

«Так как исходные коды выложены на GitHub, и любой может свободно изучить их, мы получаем очень ценную обратную связь от сторонних инженеров. … нам показали, как сэкономить три мегабайта пространства просто сжав графику внутри приложения. Мы подумали: „Отлично! Наше и так одно из самых маленьких, а теперь мы сможем сделать его ещё меньше“. Мы очень благодарны этим людям и продолжаем получать ценные советы от сообщества».

Павел продолжил:

«За время существования мы проводили конкурсы по взлому нашего шифрования. В первый раз мы попросили людей перехватить трафик и расшифровать его. Участникам не удалось добиться этой цели, зато один из них обнаружил потенциальную уязвимость в нашем механизме шифрования данных. Потенциально мы — Telegram, не третьи лица, могли видеть секретные чаты. Этот парень получил от нас 100 000 USD. Его находка лежала вне рамок конкурса, но всё равно была очень важна, а мы считаем, что должны поощрять подобную обратную связь».

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

«Если вы зайдете в настройки приложения, там есть специальное место, где вы можете задать нам вопрос. Пишите там, что угодно, ваше сообщения попадает к команде поддержки, которая рассматривает все отклики. Мы довольно быстро поняли, что со всем сразу мы не справимся, поэтому пригласили волонтеров. Это люди, которым нравится Telegram, которые располагают свободным временем и хотят использовать это время, помогая другим разобраться, что такое Telegram. Мы не делаем волонтерами всех подряд. Если хочет стать волонтером, сначала он должен пройти тест и ответить на наши вопросы, некоторые из них весьма коварные».

Изменение политики WhatsApp зимой этого года, который сообщил о передаче данных пользователей в Facebook, значительно ускорило рост числа пользователей Telegram, что не смогло остаться без реакции со стороны Facebook.

«WhatsApp от Facebook, похоже, перешёл на скрытый маркетинг. Недавно редакторы «Википедии» обнаружили несколько платных ботов, которые добавляли предвзятую информацию в статью о WhatsApp в «Википедии». Мы также обнаружили ботов, которые распространяют неточную информацию о в социальных сетях», — сообщил Дуров.

По его словам, боты распространяли три мифа о работе мессенджера: «исходный код не открытый», «Telegram — русский и полностью контроллируется ФСБ» и «Telegram не зашифрован».

Читайте также:  Вторая жизнь старого компьютера. Практическое руководство.

Дуров заявил, что все клиентские приложения Telegram имеют открытый исходный код с 2013 года, а чаты шифруются с момента запуска мессенджера. Открытый исходный код позволяет любому пользователю, обладающему необходимыми знаниями, провести независимый аудит исходного кода мессенджера Telegram, что является гарантией “прозрачности” и отсутствия скрытых функций, чем не могут похвастаться многие другие популярные приложения.

«Telegram не имеет ни серверов, ни офисов в России и был заблокирован там с 2018 по 2020 год», — добавил он.

Со временем будет доступно больше исходных кодов. Следите за обновлениями.

Официальные приложения

Telegram для Android

Официальное Android приложение, посмотрите полное описание на Google Play Market. Распространяется по лицензии GNU GPL v. 2 или выше. GitHub »

Telegram для iPhone

Распространяется по лицензии GNU GPL v. 2 или выше. GitHub »

Читайте также:  SpeedLight Web Viewer – новый “лёгкий” веб-вьюер для Second Life

Telegram для macOS

Нативный  клиент. Распространяется по лицензии GNU GPL v. 2. GitHub »

Telegram для браузеров

Javascript клиент для браузеров. Mac, Windows, Linux. Распространяется по лицензии GNU GPL v. 3. GitHub »

Telegram Desktop

Базирующийся на Qt десктопный клиент. Mac, Windows, Linux. Распространяется по лицензии GNU GPL v. 3. GitHub » Сайт разработчика.

Telegram для WP

Распространяется по лицензии GNU GPL v. 2 or later. Доступен здесь »

Неофициальные приложения

Telegram CLI (Неофициальный)

Интерфейс командной строки Linux для Telegram. Распространяется по лицензии GNU GPL v. 2. GitHub »

Unigram (Неофициальный)

UWP Telegram клиент, который работает на мобильных, компьютерах и Xbox One. Распространяется по лицензии GNU GPL v. 3 или выше. GitHub »

MadelineProto (Неофициальный)

PHP MTProto Telegram клиент. Распространяется по лицензии GNU AGPL v. 3 GitHub »

По материалам: www.nixp.ru

Читайте также:

  • Сообщество Reddit и чат Техномагия
  • Группа в  — Космос 2.0: виртуальные миры (Second Life, Sansar, Sinespace, etc)
  • Как превратить старый персональный компьютер или  в мощную игровую систему без обновления «железа»?  Читайте здесь->

Читайте также:  Голливудский актер обыграл Стивена Хокинга в квантовые шахматы

Присоединяйтесь к нашему -каналу: https://t.me/technomagic и группе в Facebook.

Sovrn

Вам будет интересно:

Интенсив «Научитесь собирать информацию с сайтов с помощью парсера на Python» tproger.ru События и курсы на tproger.ru

Ну вот и всё, простенький бот в Телеграмме на языке Python готов.

Docker

Сейчас мало кто не слышал про Docker, но если вдруг не слышали — вот хорошая статья. Для нашего проекта потребуется самый простой Dockerfile:

FROM python:3.8  # set work directory  WORKDIR /usr/src/app/  # copy project  COPY . /usr/src/app/  # install dependencies  RUN pip install --user aiogram  # run app  CMD ["python", "bot.py"]

Каталог проекта должны при этом содержать следующие файлы:

  • bot.py;
  • Dockerfile.

Для локальных тестов достаточно установить Docker (linux, mac, windows), после чего в папке проекта собрать и запустить контейнер с помощью команд:

docker build -t my_app  docker run -d my_app  

my_app — это просто название нашего контейнера, вместо которого можно использовать другое имя.

-d — специальный флаг, который запускает контейнер в фоне и позволяет дальше работать в терминале. Это называется detached mode.

Деплой на AWS

Прежде всего нам понадобится аккаунт на Docker Hub. Это аналог GitHub, только не с исходниками кода, а с уже созданными контейнерами. Работа с Docker Hub выглядит достаточно просто:

  1. Локально или с помощью пайплайнов собрали контейнер.
  2. Загрузили его на докер хаб.
  3. В любом удобном месте скачали его. Это может быть локальная машина, VPS сервер или облачный провайдер по типу AWS.
  4. Запустили.

Пройдёмся по этим шагам. Везде, где указано , надо вставлять свой юзернейм, использованный при регистрации на докерхабе. Если это ваша первая публикация на докерхаб, для начала потребуется залогиниться с помощью docker login.

Билдим контейнер:

docker build -t /my_app

Загружаем его на докерхаб:

docker push /my_app

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

docker run -d /my_app

Далее загрузим наш контейнер в AWS Elastic Beanstalk. Для этого потребуется аккаунт на AWS. Если его нет, необходимо зарегистрироваться. Вас попросят ввести данные карты для верификации, но переживать не стоит, ведь мы воспользуемся бесплатным годовым триалом. Чтобы поиграться, этого более чем достаточно, а вот если вы захотите вывести проект в продакшен, следует перейти на VPS — это даст больше контроля и гибкости.

  • Переходим в Elastic Beanstalk, на вкладку Applications, и создаём новое приложение:
  • Называем приложение, теги оставляем пустыми:
  • Создаём для приложения environment:
  • Выбираем Worker environment:
  • В качестве платформы выбираем Docker:
  • В пункте Application code нужно загрузить JSON-файл с конфигурацией Docker-образа. Сам файл:
Dockerrun.aws.json  {   "AWSEBDockerrunVersion": "1",   "Image": {     "Name": "/my_app",     "Update": "true"   },  "Ports": [   {     "ContainerPort": 5000,     "HostPort": 8000   }  ]  }  
  • Создаём окружение:
  • AWS начинает создавать окружение, просто ждём завершения процесса:
  • Если всё прошло успешно, вы увидите индикатор успешного запуска приложения:

Проверяем работу нашего Telegram bot:

Успех!

Заключение

Поздравляем! Теперь вы знаете, как писать роботов для Telegram на Python.

Бота можно дополнять другими функциями, например, добавить отправку файлов, опрос или клавиатуру.

Кстати, в телеграмме есть аж целых два типа клавиатур:

  1. Классическая RelpyKeyboardMarkup, у которой кнопки располагаются под полем ввода сообщения:
  2. Более современная InlineKeyboardMarkup, которая привязывается к конкретному сообщению:

Но и это полностью рабочий Телеграм-бот на Python: дополните словарём, и получите полноценную беседу. Также можете опробовать функциональность нашего Telegram-бота.

В «настоящих проектах» не обойтись без базы данных. Тут на помощь приходит docker-compose, который позволяет объединить несколько контейнеров в один сервис. Таким образом, например, можно создать приложение и положить его в контейнер, а базу данных, как отдельный сервис, поместить в другой контейнер, и с помощью docker-compose наладить между ними связь.

Также для более серьёзной разработки лучше использовать выделенный виртуальный сервер (VPS): он даёт гораздо больше гибкости и свободы, чем тот же AWS. А самое главное, он более приближён к «боевой» разработке. Схема работы тут будет даже проще, чем с AWS: вам просто нужно установить Docker, спуллить образ с Docker Hub и запустить его.

В этой статье мы реали­зуем прос­той, но край­не полез­ный про­ект на Python — бота для Telegram. Боты — это неболь­шие скрип­ты, которые могут вза­имо­дей­ство­вать с API, что­бы получать сооб­щения от поль­зовате­ля и отправ­лять информа­цию в раз­ные чаты и каналы.

Python для новичков

Ес­ли ты сов­сем не ори­енти­руешь­ся в Python, то отличным началом будет проч­тение трех ввод­ных ста­тей, которые я пуб­ликовал в «Хакере» этим летом, либо посеще­ние кур­са «Python для нович­ков», который я нач­ну вес­ти для читате­лей «Хакера» уже сов­сем ско­ро — 30 нояб­ря.

  • Python с абсо­лют­ного нуля. Учим­ся кодить без скуч­ных кни­жек
  • Python с абсо­лют­ного нуля. Учим­ся работать со стро­ками, фай­лами и интерне­том
  • Python с абсо­лют­ного нуля. Работа­ем с ОС, изу­чаем регуляр­ные выраже­ния и фун­кции

Что­бы соз­дать бота, нам нуж­но дать ему наз­вание, адрес и получить токен — стро­ку, которая будет однознач­но иден­тифици­ровать нашего бота для сер­веров Telegram. Зай­дем в Telegram под сво­им акка­унтом и откро­ем «отца всех ботов», BotFather.

Жмем кноп­ку «Запус­тить» (или отпра­вим / start), в ответ BotFather приш­лет нам спи­сок дос­тупных команд:

  • / newbot — соз­дать нового бота;
  • / mybots — редак­тировать ваших ботов;
  • / setname — сме­нить имя бота;
  • / setdescription — изме­нить опи­сание бота;
  • / setabouttext — изме­нить информа­цию о боте;
  • / setuserpic — изме­нить фото ава­тар­ки бота;
  • / setcommands — изме­нить спи­сок команд бота;
  • / deletebot — уда­лить бота.

От­пра­вим бате‑боту коман­ду / newbot, что­бы соз­дать нового бота. В ответ он поп­росит ввес­ти имя будуще­го бота, его мож­но писать на рус­ском. Пос­ле вво­да име­ни нуж­но будет отпра­вить адрес бота, при­чем он дол­жен закан­чивать­ся на сло­во bot. Нап­ример, xakepbot или xakep_bot. Если адрес будет уже кем‑то занят, BotFather нач­нет изви­нять­ся и про­сить при­думать что‑нибудь дру­гое.

Ког­да мы наконец най­дем сво­бод­ный и кра­сивый адрес для нашего бота, в ответ получим сооб­щение, в котором пос­ле фра­зы Use this token to access the HTTP API будет написа­на стро­ка из букв и цифр — это и есть необ­ходимый нам токен. Сох­раним ее где‑нибудь на сво­ем компь­юте­ре, что­бы потом исполь­зовать в скрип­те бота.

Для вза­имо­дей­ствия с Telegram API есть нес­коль­ко готовых модулей. Самый прос­той из них — Telebot. Что­бы уста­новить его, набери

pip install pytelegrambotapi

В Linux, воз­можно, понадо­бит­ся написать pip3 вмес­то pip, что­бы ука­зать, что мы хотим работать с треть­ей вер­сией Python.

Эхо-бот

Для начала реали­зуем так называ­емо­го эхо‑бота. Он будет получать от поль­зовате­ля тек­сто­вое сооб­щение и воз­вра­щать его.

import telebot # Создаем экземпляр ботаbot = telebot.TeleBot('Здесь впиши токен, полученный от @botfather') # Функция, обрабатывающая команду /start@bot.message_handler(commands=["start"])def start(m, res=False): bot.send_message(m.chat.id, на связи. Напиши мне что-нибудь )') # Получение сообщений от юзера@bot.message_handler(content_types=["text"])def handle_text(message): bot.send_message(message.chat.id, 'Вы написали: ' + message.text) # Запускаем ботаbot.polling(none_stop=True, interval=0)

За­пус­кай скрипт и ищи в поис­ке Telegram сво­его бота по адре­су, который ты при­думал ранее. Запус­каем бота кноп­кой «Запус­тить» (Start) или коман­дой / start и можем убе­дить­ся в том, что он работа­ет и воз­вра­щает сооб­щения.

image
При­мер работы эхо‑бота

Wikipedia-бот

Да­вай научим нашего бота не прос­то отсы­лать сооб­щения обратно, а чему‑нибудь поин­терес­нее. Нап­ример, по вве­ден­ному сло­ву давать статью на Википе­дии. Здесь нам поможет модуль Wikipedia:

pip install wikipedia

Го­товим код.

import telebot, wikipedia, re # Создаем экземпляр ботаbot = telebot.TeleBot('Здесь впиши токен, полученный от @botfather') # Устанавливаем русский язык в Wikipediawikipedia.set_lang("ru") # Чистим текст статьи в Wikipedia и ограничиваем его тысячей символовdef getwiki(s): try: ny = wikipedia.page(s) # Получаем первую тысячу символов wikitext=ny.content[:1000] # Разделяем по точкам wikimas=wikitext.split('.') # Отбрасываем всЕ после последней точки wikimas = wikimas[:-1] # Создаем пустую переменную для текста wikitext2 = '' # Проходимся по строкам, где нет знаков «равно» (то есть все, кроме заголовков) for x in wikimas: if not('==' in x): # Если в строке осталось больше трех символов, добавляем ее к нашей переменной и возвращаем утерянные при разделении строк точки на место if(len((x.strip()))>3): wikitext2=wikitext2+x+'.' else: break # Теперь при помощи регулярных выражений убираем разметку wikitext2=re.sub('([^()]*)', '', wikitext2) wikitext2=re.sub('([^()]*)', '', wikitext2) wikitext2=re.sub('{[^{}]*}', '', wikitext2) # Возвращаем текстовую строку return wikitext2 # Обрабатываем исключение, которое мог вернуть модуль wikipedia при запросе except Exception as e: return энциклопедии нет информации об этом' # Функция, обрабатывающая команду /start@bot.message_handler(commands=["start"])def start(m, res=False): bot.send_message(m.chat.id, 'Отправьте мне любое слово, и я найду его значение на Wikipedia') # Получение сообщений от юзера@bot.message_handler(content_types=["text"])def handle_text(message): bot.send_message(message.chat.id, getwiki(message.text)) # Запускаем ботаbot.polling(none_stop=True, interval=0)

image
При­мер работы Wikipedia-бота

Другие статьи в выпуске: image

Xakep #272. Приручаем WinAFL

  • Содержание выпуска
  • Подписка на «Хакер»-70%

www

При соз­дании сле­дующих ботов мы будем исполь­зовать нес­коль­ко тек­сто­вых фай­лов с кон­тентом. Ска­чать их мож­но с моего сай­та.

Бот с двумя виртуальными кнопками

Во мно­гих Telegram-ботах для выбора каких‑то дей­ствий исполь­зуют­ся так называ­емые вир­туаль­ные кноп­ки. Давай поп­робу­ем сде­лать себе такие же!

Пред­положим, что у нас есть два фай­ла facts. txt и thinks. txt, которые содер­жат спи­сок инте­рес­ных фак­тов и поговор­ки. На каж­дой стро­ке фай­лов находит­ся по одно­му фак­ту или поговор­ке.

Сде­лаем бота, в котором будут две кноп­ки: «Фак­ты» и «Поговор­ки». Если нажать любую, бот отпра­вит поль­зовате­лю соот­ветс­тву­ющее сооб­щение.

info

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

import telebotimport randomfrom telebot import types # Загружаем список интересных фактовf = open('data/facts.txt', 'r', encoding='UTF-8')facts = f.read().split('n')f.close() # Загружаем список поговорокf = open('data/thinks.txt', 'r', encoding='UTF-8')thinks = f.read().split('n')f.close() # Создаем ботаbot = telebot.TeleBot('Здесь твой токен, полученный от @botfather') # Команда start@bot.message_handler(commands=["start"])def start(m, res=False): # Добавляем две кнопки markup=types.ReplyKeyboardMarkup(resize_keyboard=True) item1=types.KeyboardButton("Факт") item2=types.KeyboardButton("Поговорка") markup.add(item1) markup.add(item2) bot.send_message(m.chat.id, 'Нажми: nФакт для получения интересного фактаnПоговорка для получения мудрой цитаты ', reply_markup=markup) # Получение сообщений от юзера@bot.message_handler(content_types=["text"])def handle_text(message): # Если юзер прислал 1, выдаем ему случайный факт if message.text.strip() == 'Факт' : answer = random.choice(facts) # Если юзер прислал 2, выдаем умную мысль elif message.text.strip() == 'Поговорка': answer = random.choice(thinks) # Отсылаем юзеру сообщение в его чат bot.send_message(message.chat.id, answer) # Запускаем ботаbot.polling(none_stop=True, interval=0)

image
При­мер работы бота, зна­юще­го фак­ты и поговор­ки

Бот, ведущий Telegram-канал с анекдотами

Пре­дыду­щие боты посыла­ли юзе­ру сооб­щения тог­да, ког­да получа­ли от него коман­ды или фра­зы. Но что, если нам нужен бот, который будет пери­оди­чес­ки и в авто­мати­чес­ком режиме пос­тить что‑то в наш канал?

Да­вай сде­лаем бота, который получа­ет спи­сок анек­дотов из фай­ла и каж­дый час пос­тит в канал один из этих анек­дотов. Для это­го нам нуж­но соз­дать свой канал в Telegram, добавить в под­писчи­ки канала нашего бота и наз­начить его адми­нис­тра­тором канала с пра­вом пуб­ликовать сооб­щения.

Файл с анек­дотами дол­жен лежать в пап­ке data рядом со скрип­том бота.

import telebotimport time # Токен, который выдает @botfatherbot = telebot.TeleBot('Здесь твой токен, полученный от @botfather')# Адрес телеграм-канала, начинается с @CHANNEL_NAME = '@адрес_твоего_канала' # Загружаем список шутокf = open('data/fun.txt', 'r', encoding='UTF-8')jokes = f.read().split('n')f.close() # Пока не закончатся шутки, посылаем их в каналfor joke in jokes: bot.send_message(CHANNEL_NAME, joke) # Делаем паузу в один час time.sleep(3600) bot.send_message(CHANNEL_NAME, "Анекдоты закончились :-(")

image
При­мер работы бота, ведуще­го канал с анек­дотами

Чат-бот «Маша»

Те­перь давай сде­лаем прос­тей­шего чат‑бота, который будет бол­тать с поль­зовате­лем. Для это­го мы под­готовим файл boltun. txt, содер­жащий стро­ки с воп­росами (в начале таких строк пос­тавим мет­ку u:) и отве­тами на них в сле­дующей стро­ке.

u: как зовутМаша меня зовут!u: сколько тебе летМне уже 18, честно-честно!

Файл boltun. txt помес­тим в пап­ку data рядом со скрип­том бота. Для поис­ка похожих воп­росов исполь­зуем модуль fuzzywuzzy, который поз­воля­ет срав­нивать, нас­коль­ко похожи меж­ду собой две стро­ки. Естес­твен­но, спер­ва этот модуль нуж­но уста­новить:

pip install fuzzywuzzypip install python-Levenshtein

Ни­же при­веден исходный код бота. Пос­ле его запус­ка напиши боту «При­вет» и поп­робуй с ним пооб­щать­ся. Естес­твен­но, это не искусс­твен­ный интеллект и набор его отве­тов огра­ничен фра­зами из фай­ла boltun. txt.

import telebotimport osfrom fuzzywuzzy import fuzz # Создаем бота, пишем свой токенbot = telebot.TeleBot('Здесь твой токен, полученный от @botfather') # Загружаем список фраз и ответов в массивmas=[]if os.path.exists('data/boltun.txt'): f=open('data/boltun.txt', 'r', encoding='UTF-8') for x in f: if(len(x.strip()) > 2): mas.append(x.strip().lower()) f.close() # С помощью fuzzywuzzy вычисляем наиболее похожую фразу и выдаем в качестве ответа следующий элемент спискаdef answer(text): try: text=text.lower().strip() if os.path.exists('data/boltun.txt'): a = 0 n = 0 nn = 0 for q in mas: if('u: ' in q): # С помощью fuzzywuzzy получаем, насколько похожи две строки aa=(fuzz.token_sort_ratio(q.replace('u: ',''), text)) if(aa > a and aa!= a): a = aa nn = n n = n + 1 s = mas[nn + 1] return s else: return 'Ошибка' except: return 'Ошибка' # Команда «Старт»@bot.message_handler(commands=["start"])def start(m, res=False): bot.send_message(m.chat.id, на связи. Напиши мне Привет )') # Получение сообщений от юзера@bot.message_handler(content_types=["text"])def handle_text(message): # Запись логов f=open('data/' + str(message.chat.id) + '_log.txt', 'a', encoding='UTF-8') s=answer(message.text) f.write('u: ' + message.text + 'n' + s +'n') f.close() # Отправка ответа bot.send_message(message.chat.id, s) # Запускаем ботаbot.polling(none_stop=True, interval=0)

image
При­мер работы чат‑бота

Выводы

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

В сле­дующей статье мы рас­смот­рим работу с Telegram-ботами более под­робно: научим­ся делать ботов, работа­ющих через веб‑хуки, при­нимать опла­ту от поль­зовате­лей и вза­имо­дей­ство­вать с базой дан­ных SQLite.

Так­же при­зываю тебя не откла­дывать и записы­вать­ся на курс «Python для нович­ков», где мы от прос­тей­ших понятий перей­дем к соз­данию пер­вых инте­рес­ных про­ектов. Стар­туем уже сов­сем ско­ро!

Курс по Python

Курс «Python с нуля» нап­равлен на изу­чение основ и базовых кон­цепций прог­рамми­рова­ния. Пос­ле него ты смо­жешь лег­ко углу­бить­ся в любую из ИТ‑сфер: веб‑раз­работ­ку, ана­лиз дан­ных, безопас­ность при­ложе­ний и так далее. Про­дол­житель­ность кур­са — два кален­дарных месяца. Уро­ки будут про­водить­ся два раза в неделю (втор­ник и чет­верг, ори­енти­ровоч­но в 17:00 по Мос­кве), каж­дый по одно­му ака­деми­чес­кому часу. Пери­оди­чес­ки будут выдавать­ся домаш­ние задания.

За­писать­ся на курс

← Ранее Интерпол сообщил об аресте 1000 человек, связанных с киберпреступностью Далее → HTB Intelligence. Пентестим Active Directory от MSA до KDC

Оцените статью
Рейтинг автора
4,8
Материал подготовил
Егор Новиков
Наш эксперт
Написано статей
127
А как считаете Вы?
Напишите в комментариях, что вы думаете – согласны
ли со статьей или есть что добавить?
Добавить комментарий