Содержание
Я пиарюсь
Начнем с того, что у Telegram действительно полностью открытый клиентский код. К сожалению, мы не видим комиты каждый день прямо на GitHub, но у нас есть код под открытой лицензией. Архитектура Telegram подразумевает, что и Bot и API имеет практически такие же методы — https://core.telegram.org/methods.
На самом деле, Telegram представляет не просто чат-мессенджер, а социальную платформу, доступ к которой открыт для разного рода приложений. Они могут предоставлять дополнительные фишки пользователям, взамен используя готовую сеть пользователей и сервера для доставки сообщений. Звучит настолько привлекательно, что нам захотелось попробовать написать своего “клиента” для Телеграм.
Суть приложения
В основном мы занимаемся картами и навигацией, поэтому мы сразу смотрели что-нибудь связанные с геолокацией. Мне очень понравилось, что в Telegram, раньше всех остальных приложений, появился удобный способ делится местоположением в реальном времени (https://telegram.org/blog/live-locations) и я достаточно часто этим пользуюсь: помочь сориентироваться другу, показать дорогу и самое главное ответить на главный вопрос “Когда ты будешь?”. В принципе, этого хватает большинству людей, но как всегда есть сценарии, когда простых возможностей не хватает. Например, это может быть группа более 10 человек, с разными устройствами (некоторые устройства возможно не являются телефонами) и разными людьми. Этим людям было бы удобно обмениваться сообщениями в группе, а также видеть перемещения друг друга на карте.
Во главу угла мы поставили задачу создать дополнительную ценность для Telegram, а не пытаться использовать его не по назначению. Мы не хотели, чтобы люди у которых нет специального клиента Телеграм, видели в чате месиво сообщений или что-то невразумительное. У людей с “улучшенным” клиентом, появляются же дополнительные возможности, например:
- Более тонкое управление временем при отправке локации в реальном времени в чат.
- Просмотр местоположения контактов на карте.
- Подключение к чату маячковых устройств, через внешний 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 раза. Основная проблема — неправильный дизайн коммуникации.
- Почему-то вначале казалось хорошей идеей, если бот будет полноценным участником чата и отправлять сообщения. Но, это плохо и с точки зрения Privacy переписки и с точки зрения взаимодействия с ботом. Правильное решение, использовать Inline bots. Таким образом, гарантируется, что бот не видит ничего кроме своего Location и его можно использовать в любом чате. По-человечески говоря, некультурно тащить своего бота в какой-то общий чат, а нужно пообщаться с ботом один на один и настроить его, а дальше он сможет отправлять нужные сообщения в любой выбранный чат.
- В Telegram Message API есть исторически 2 типа взаимодействия: кнопки под текстом ( (inline buttons)[https://core.telegram.org/bots/2-0-intro#switch-to-inline-buttons] ) и ответы боту напрямую текстом. В общем, ответы с ботом безнадежно устарели. Кнопки немного сложнее с точки зрения реализации, но это полностью окупается удобством использования и именно их надо использовать для всего нетекстового ввода.
- В качестве примера бота можно посмотреть популярный @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 — подводные камни
- Регистрация/Login и Logout. При регистрации необходимо учесть разные сценарии: когда код доступа присылается SMS или в другой телеграм клиент, двухфакторную авторизацию и т.п. Самая большая сложность — это тестирование. Любая авторизация более 3-х раз вела к блокировке аккаунта на 24 часа, поэтому тестировать Logout было особенно весело. Несмотря на то, что регистрация нужна всего лишь один раз, наверное это самая сложная часть интеграции.
- Определить как и в каком порядке вычитывать сообщения. Любой клиент имеет доступ ко всем сообщениям во всех чатах, но вычитывать их надо последовательно. В нашем случае 99% сообщений нужно отбрасывать. Сначала мы почему-то сделали чтение всех сообщений за последние 3 дня при логине, но в дальнейшем это только вызвало проблемы и при рестарте у нас пропадали сообщения. Поэтому сейчас мы читаем только новые сообщения, а для тех сообщений, что нам нужны сохраняем id во внутренней БД.
Что получилось
Наверное, зная все подводные камни можно было бы все сделать в разы быстрее, но получилось где-то 1-2 месяца на трех человек. Финальное приложение можно найти в Google Play.
Главный вопрос в этой истории, насколько правильно это взаимодействие с точки зрения Телеграма и понравятся ли пользователям такого рода интеграции. В любом случае, сама идея нишевая и отдельных клиентов она уже нашла.
Буду рад ответить на ваши вопросы.
Боты «Телеграма» быстро вошли в жизнь почти каждого человека. Они делают общение в приложении легким и интересным.
Существующие боты работают на разных операционных системах. Сегодня поговорим о телеграм api.
Содержание
Языки программирования
Система «Эйпи» может работать на большом количестве языков программирования.
Пользователи, работающие с «Джава скрипт», могут применять Node.js Telegram Bot «Апи». Программа требует определенных умений. Одного знания программирования недостаточно.
Популярный язык для использования телеграм «Апи» – PHP. Язык логичен и специализирован для работы в web-среде.
Для работы Client «Апи» часто применяется Python (обладает высоким уровнем производительности).
Классический вариант api token на telegram – С++. Данный язык сложен, имеет огромное количество нюансов. Он является базой для большинства языков программирования. Находящиеся в нем инструменты позволяют работать с зеркалом, ключами (key), hash. Используемые при работе токены имеют дополнительную защиту, что важно для большинства абонентов.
Особенности работы с Bot API
Работа с помощником «Эйпи» имеет ряд особенностей, к которым можно отнести:
- Использование домена верхнего уровня – org.
- Обход блокировки.
- Плотная связь с прокси-сервером.
Указанные выше особенности являются основным отличием от работы с другими помощниками.
Пример использования бота
Кроме использования объектов, «Апи» имеет и другой набор функций, позволяющий выполнять отправку файлов, сообщений, стикеров в канал «Телеграм» и в личную переписку.
Для того чтобы создать робота в «Телеграме», следует воспользоваться сервисом @Botfather.
Процесс имеет такую поочередность:
- Зайдите в вышеуказанное приложение и пропишите /newbot.
- Введите имя бота и пользователя. Первое должно заканчиваться приставкой «bot».
- После получения token можно приступить к авторизации.
- Для запуска созданного робота нажмите кнопку /start.
Рассмотрим пример функционирования бота. Простой способ проверить робота – использовать location браузер. Для этого необходимо зайти в web-версию помощника и набрать следующую команду в браузере:
Во всплывшем окне отобразится следующее:
Используемые в коде значения chat»:{«id являются идентификаторами чата.
Далее прописываем:
В браузере отобразится строка:
Теперь приветствие отображается в чате мессенджера.
Как видите, создание «Эйпи» бота «Телеграм» с нуля – легкий процесс. Для его выполнения необходим минимальный запас знаний и желание. Если после прочтения статьи у вас остались вопросы, то рекомендуем купить пособие или узнать интересующую информацию в интернет.
Детальная инструкция видна на видео:
Часто в интернете вы встречаете непонятные сочетания английских символов, о которых все говорят в положительном ключе. К примеру, как можно понять рассуждения о каком-то telegram bot api, да еще и понимать, что значит фраза: «Зачем его написали на c#, лучше бы на delphi?». Впрочем, данная статья решит ваши проблемы и поможет вам быть в теме: не углубляясь в программистские дебри, мы сейчас все объясним.
План статьи:
Что такое telegram api
Для начала мы поговорим о том, что вообще скрывается под этой аббревиатурой. Чтобы вам было понятнее, сначала мы углубимся в истоки истории программирования. Когда-то давным-давно код писался полностью с нуля. То есть, для того, чтобы программа просто показала пользователю какое-то слово, разработчик должен был вручную написать это на машинном языке, используя только 0 и 1.
Конечно, всегда так продолжаться не могло, поэтому однажды было решено автоматизировать весь этот процесс, создав библиотеки со встроенным набором функций. То есть, для вывода «Привет» разработчик должен был просто написать «cout << “Привет”», а подключенный им файл сам переводил это в последовательность нулей и единиц.</p>
Осознав, что это довольно удобно, разработчики ввели понятие «API» ― встроенного интерфейса, позволяющего посылать операционной системе, компьютеру или еще чему-то команды на понятном для него языке. API автоматизировали создание игр или написание офисных программ, делая, к примеру, наложение текстуры на объект более простым.
Примером API может служить всем известный 1С
Для чего нужен телеграмм API
Теперь, когда вы поняли саму суть этого, перейдем к более конкретному примеру. А именно ― к интерфейсу ботов для телеграмм.
Client API в Telegram
29 марта 2022 violet
Большинство современных мессенджеров предоставляют своим пользователям API, предназначенные для различных задач. На примере Telegram посмотрим, как работать с API, что они умеют и чем могут быть полезны.
Если вы не зарегистрированы в Telegram — самое время зарегистрироваться. Вы можете не пользоваться аккаунтом в повседневности, но для учёбы он необходим. Возможно, вам будет удобно работать через десктопную версию приложения, её можно скачать с официального сайта: https://telegram.org/.
API в Telegram
У мессенджера Telegram есть два API — Bot API и Client API.
- Bot API предназначен для работы с ботами.
- Client API позволяет управлять вашим аккаунтом: отправлять от вашего имени сообщения, вступать в группы или изменять информацию в своём профиле.
Начнём с Client API.
Управление аккаунтом через Client API
Для работы с Client API необходима аутентификация по токену, получить его можно на специальном сайте Telegram.
Получение токена для Client API
Зайдите на https://my.telegram.org и введите номер телефона, привязанный к вашему аккаунту:
Запустите Telegram: вам придёт код подтверждения для сайта, введите его в поле на сайте и нажмите кнопку Next.
В открывшемся окне нажмите на ссылку API development tools и введите данные для создания нового приложения. Заполните как минимум поля App title, Short name и укажите платформу: Web.
В следующем окне скопируйте и сохраните значения api_id и api_hash.
Готово! Эти идентификаторы вы перенесёте в код, они будут передаваться в Client API с каждым вашим запросом — и Client API опознает вас как владельца определённого аккаунта.
Программный клиент Telegram
Отправлять запросы к Client API можно через ваш Telegram-клиент на телефоне или на компьютере или через программный клиент.
Для работы с Client API существует несколько популярных Python-библиотек, которые эмулируют работу приложения. С чем-то подобным вы сталкивались в теме «Тестирование Django»: класс Client()
в тестах эмулировал работу браузера, отправляя запросы и получая ответы от сервера.
Для создания программного клиента возьмём библиотеку pyrogram.
Создайте директорию /client_api, перейдите в неё, установите и активируйте виртуальное окружение, установите библиотеку pyrogram
:
mkdir client_api # Создаём директорию cd client_api # Переходим в эту директорию python3 -m venv venv # Создаём виртуальное окружение . venv/bin/activate # Активируем виртуальное окружение # Для Windows команда source venv/Scripts/activate pip3 install pyrogram # Устанавливаем библиотеку
Создайте и откройте файл /client_api/main.py в текстовом редакторе, перенесите в него код:
from pyrogram import Client api_id = <Ваш api_id> api_hash = "<Ваш api_hash>" with Client("my_account", api_id, api_hash) as app: # Первый параметр метода send_message — id (int) или имя (str) того пользователя, # которому будет отправлено сообщение. # Зарезервированное слово "me" означает ваш собственный аккаунт. app.send_message("me", "Привет, это я!")
Сохраните файл и запустите его:
python3 main.py
При первом запуске программы в командной строке будет запрошен номер телефона, на который зарегистрирован ваш Telegram-аккаунт. Введите номер в консоль, после этого на телефон или в Telegram придёт проверочный код. Скопируйте этот код и вставьте в командную строку. Эта процедура выполняется только один раз, после этого приложение будет зарегистрировано.
Из вашего приложения будет отправлено сообщение."me"
— это зарезервированное слово, заменяющее ID аккаунта, для которого выдан токен. Следовательно, сообщение будет отправлено из вашего аккаунта в ваш аккаунт; оно отобразится во вкладке «Избранное» в вашем мессенджере.
Если изменить "me"
на ID аккаунта вашего друга в Telegram, то сообщение уйдёт ему.
Получить ID по имени пользователя можно у справочного Telegram-бота @userinfobot. Чтобы найти этого бота, введите его имя в окно поиска над списком контактов в вашем мобильном или настольном клиенте Telegram.
Начните диалог с ботом: нажмите кнопку Start.
Для начала бот отправит вам информацию о вашем аккаунте: ID, имя (то, что указано в полях First и Last name) и язык.
Перешлите ему любое сообщение от человека, ID которого вам нужен. Чтобы переслать чьё-то сообщение — кликните по нему правой кнопкой мыши (если Telegram установлен на компьютере) и выберите вариант «Переслать сообщение» (Forward Message). Затем укажите, что сообщение следует переслать боту @userinfobot.
Если Telegram запущен на мобильном устройстве — вызовите меню долгим нажатием на сообщение и проделайте всё то же самое.
В ответ бот отправит информацию о пользователе: ID, имя (First name) и фамилию (Last name).
Список всех доступных методов библиотеки pyrogram доступен в документации.
Не увлекайтесь рассылкой сообщений через бота: в Client API есть лимит по количеству запросов. Если вы будете слишком часто отправлять сообщения, Telegram может принять вас за злоумышленника-спамера и забанить, лишить доступа к сервису. Telegram не раскрывает точных ограничений.
В первый раз блокировка продлится 24 часа, последующие будут длиться дольше. Во избежание блокировок мы бы предложили отправлять сообщения только на аккаунты из вашего контакт-листа и не отправлять суммарно более десяти сообщений в час.
Вы можете оставить комментарий, или Трекбэк с вашего сайта.
Шукюров Заур, разработчик @KinomanBot и @GaidarForum_bot, написал руководство по созданию простого чат-бота.
24 июня 2015 года разработчики Telegram открыли платформу для создания ботов (программ, которые выполняют определенные действия по заданному алгоритму). За полтора года работы платформы набралось много интересных чат-ботов, решающих множество проблем и позволяющих с пользой провести время в мессенджере.
Шаг 1: регистрация бота у @BotFather
Прежде чем начать писать код, нового бота нужно зарегистрировать у «папы всех ботов» — @BotFather, чтобы получить токен (ключ) для работы с Telegram API. Регистрация проходит в 5 простых этапов:
- Открываете чат с @BotFather.
- Вводите или выбираете из списка команду /newbot.
- Отправляете желаемое название для бота.
- Пишете юзернейм бота, по которому его будут находить через поиск. Обязательно на конце вашего юзернейма должно быть слово «bot» или «_bot». Например, NetologyRSSbot.
- По желанию можно сразу настроить полное или краткое описание, список команд и аватарку.
Результаты
11. После того, как вы протестируете бота и будете уверены в его работоспособности, можно отправлять его на всеобщее обозрение.
Благодаря удобному API, боты Telegram могут стать хорошей платформой для автоматизации рутинных действий, настройки уведомлений, удобному и быстрому получению информации и созданию игр. Бесплатными площадками для продвижения могут послужить каталоги ботов Telegram Bot Store, TeleChappy или 50bots. А анализировать активность пользователей можно с помощью бесплатного инструмента для аналитики ботов от Яндекса — Botan.
От редакции
PHP — один из самых популярных языков программирования. Его легко изучать, с ним легко работать, у него мощное сообщество. 5 мая «Нетология» запускает курс «PHP/SQL: back-end разработка и базы данных», где ведущие программисты расскажут об управляющих конструкциях, циклах, функциях, о строках и массивах. Вы узнаете все про реляционные базы данных и язык запросов SQL, научитесь устанавливать и настраивать веб-сервер nginx и php, управлять базами данных различной сложности. Ждем вас!
Оцените статью
Средняя оценка 3.3 / 5. Всего проголосовало 7
Темы: программирование
ли со статьей или есть что добавить?