Содержание
- 1 Сервис API Telegram
- 2 Что такое Telegram API Bot
- 3 Особенности работы с Bot API
- 4 Пример использования бота
- 5 Создаем клиент Telegram
- 6 Собираем данные об участниках
- 7 Собираем сообщения
- 8 Есть ли у вас опыт работы с Telegram API?
- 9 Подготовка к установке MadelineProto
- 10 Как правильно использовать MadelineProto с Laravel
- 11 Пример работы MadelineProto на Laravel
- 12 Что такое API
- 13 Для чего нужен телеграмм API
- 14 Какой язык скриптов использует мессенджер
- 15 Что такое json и как он связан с API
- 16 Выводы
Боты «Телеграма» быстро вошли в жизнь почти каждого человека. Они делают общение в приложении легким и интересным.
Существующие боты работают на разных операционных системах. Сегодня поговорим о телеграм api.
Сервис API Telegram
Сервис api telegram org создан для разработчиков, которые хотят написать собственные приложения на основе мессенджера. Исходные кодировки каждого абонента имеют открытый доступ, поддерживают все принципы безопасности. Для начала работы с «Эйпи» следует выполнить регистрацию приложения и разработчика.
Что такое Telegram API Bot
Telegram API Bot.
Боты и разнообразные программы дали еще больший толчок к развитию мессенджера. Они могут быть созданы любым пользова-телем со средним уровнем знания програм-мирования.
Telegram api бот – это небольшая утилита для программирования собственного bot api. Поддерживает русскоязычный клиент.
Если «Апи» – это встроенный интерфейс для взаимодействия приложения и ОС, то Telegram API позволяет посылать команды «Телеграма» компьютеру на понятном языке.
Предназначение
«Апи» состоит из команд и объектов, необходимых для выполнения установки «Телеграм-бота». Используя имеющийся интерфейс, вы получите возможность самостоятельно создавать помощников, которые будут выполнять отведенные им функции при каждом запуске Telegram.
Боты telegram на «Эйпи» могут выполнять следующие операции:
- Работать с документацией.
- Посылать и получать файлы от других роботов или клиентов.
- Скачивать видео, фильмы, музыку, книги.
- Отправлять, принимать message.
- Загружать фото, видео, аудиокниги.
Элементы управления
Робот «Телеграм» API имеет простые элементы управления, представляющие собой объекты JSON. Проще говоря, они выражаются в виде заданных по неким правилам строк. Применение такого алгоритма позволяет выполнять быстрый обмен данными. Он достигается путем использования набора «ключ:значение».
Управление может осуществляться по следующим методам:
- Получение информации и поиск обновлений.
- Работа в чате.
- Передача разнообразных элементов.
- Написание и отправка сообщений.
- Обновление базы онлайн флибусты.
- Online режим.
- Работа с платежной информацией, расчетными операциями (обменник, расчетные безналичные и наличные операции).
Telegram bot 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 являются идентификаторами чата.
Далее прописываем:
В браузере отобразится строка:
Теперь приветствие отображается в чате мессенджера.
Как видите, создание «Эйпи» бота «Телеграм» с нуля – легкий процесс. Для его выполнения необходим минимальный запас знаний и желание. Если после прочтения статьи у вас остались вопросы, то рекомендуем купить пособие или узнать интересующую информацию в интернет.
Детальная инструкция видна на видео:
06 ноября 2019 Рассказываем, как собрать данные участников и сообщения из чатов/каналов Telegram с помощью Python и библиотеки Telethon. 26
Вводим пришедший в Telegram численно-буквенный код и попадаем на страницу регистрации нового приложения. Заполняем форму, достаточно первых двух граф:
В результате попадаем на страницу конфигурации приложения. Находим оба параметра, а также доступные MTProto-сервера и открытые (публичные) ключи.
Избегая проблем с безопасностью, сохраняем учетные данные в отдельном файле config.ini
следующей структуры:
[Telegram] api_id = Telegram-API-ID api_hash = Telegram-API-Hash username = Your-Telegram-Username
Поле username
далее будет использоваться лишь для автоматического сохранения сессии под именем username.session
. Одному клиенту соответствует одна сессия, учтите это в случае запуска нескольких клиентов.
Создаем клиент Telegram
Начнем с импорта библиотек.
import configparser import json from telethon.sync import TelegramClient from telethon import connection # для корректного переноса времени сообщений в json from datetime import date, datetime # классы для работы с каналами from telethon.tl.functions.channels import GetParticipantsRequest from telethon.tl.types import ChannelParticipantsSearch # класс для работы с сообщениями from telethon.tl.functions.messages import GetHistoryRequest
Встроенные модули configparser и json применяем соответственно для чтения параметров и вывода данных. Из библиотеки Telethon импортируем класс клиента Telegram и класс исключений. Внутренний модуль connection
необходим при использовании прокси-сервера. Остальные элементы модуля telethon.tl
используются для запросов необходимых нам списков (участников канала/чата и их сообщений).
Теперь считаем учетные данные из config.ini
:
# Считываем учетные данные config = configparser.ConfigParser() config.read("config.ini") # Присваиваем значения внутренним переменным api_id = config['Telegram']['api_id'] api_hash = config['Telegram']['api_hash'] username = config['Telegram']['username']
Создадим объект клиента Telegram API:
client = TelegramClient(username, api_id, api_hash)
При необходимости прописываем прокси. При использовании протокола MTProxy прокси задается в виде кортежа (сервер, порт, ключ)
.
proxy = (proxy_server, proxy_port, proxy_key) client = TelegramClient(username, api_id, api_hash, connection=connection.ConnectionTcpMTProxyRandomizedIntermediate, proxy=proxy)
Запускаем клиент:
client.start()
При первом запуске платформа запросит номер телефона, и вслед – код подтверждения. Так же, как если бы вы входили в учетную запись в приложении или браузере.
Для сбора, обработки и сохранения информации мы создадим две функции:
dump_all_participants(сhannel)
заберет данные о пользователях администрируемого нами сообществаchannel
;dump_all_messages(сhannel)
соберет все сообщения. Для этой функции достаточно, чтобы у вас был доступ к сообществу (необязательно быть администратором).
Обе функции будут вызываться в теле функции main
, в которой пользователь передаст ссылку на интересующий источник:
url = input("Введите ссылку на канал или чат: ") channel = await client.get_entity(url)
Касательно написания вызова функций стоит оговориться, что Telethon является асинхронной библиотекой. Поэтому в коде используются операторыasync и await. В связи с этим функция main
полностью будет выглядеть так:
async def main(): url = input("Введите ссылку на канал или чат: ") channel = await client.get_entity(url) await dump_all_participants(channel) await dump_all_messages(channel)
Заметим, что из-за асинхронности Telethon может некорректно работать в средах, использующих те же подходы (Anaconda, Spyder, Jupyter).
Рекомендуемым способом управления клиентом является менеджер контекстов with
. Его мы запустим в конце скрипта после описания вложенных в main
функций.
with client: client.loop.run_until_complete(main())
Собираем данные об участниках
Telegram не выводит все запрашиваемые данные за один раз, а выдает их в пакетном режиме, по 100 записей за каждый запрос.
async def dump_all_participants(channel): """Записывает json-файл с информацией о всех участниках канала/чата""" offset_user = 0 # номер участника, с которого начинается считывание limit_user = 100 # максимальное число записей, передаваемых за один раз all_participants = [] # список всех участников канала filter_user = ChannelParticipantsSearch('') while True: participants = await client(GetParticipantsRequest(channel, filter_user, offset_user, limit_user, hash=0)) if not participants.users: break all_participants.extend(participants.users) offset_user += len(participants.users)
Устанавливаем ограничение в 100, начинаем со смещения 0, создаем список всех участников канала all_participants
. Внутри бесконечного цикла передаем запрос GetParticipantsRequest
.
Проверяем, есть ли у объекта participants
свойство users
. Если нет, выходим из цикла. В обратном случае добавляем новых членов в список all_participants
, а длину полученного списка добавляем к смещению offset_user
. Следующий запрос забирает пользователей, начиная с этого смещения. Цикл продолжается до тех пор, пока не соберет всех фолловеров канала.
Самый простой способ сохранить собранные данные в структурированном виде – воспользоваться форматом JSON. Базы данных, такие как MySQL, MongoDB и т. д., стоит рассматривать лишь для очень популярных каналов и большого количества сохраняемой информации. Либо если вы планируете такое расширение в будущем.
В JSON-файле можно хранить и всю информацию о каждом пользователе, но обычно достаточно лишь нескольких параметров. Покажем на примере, как ограничиться набором определенных данных:
all_users_details = [] # список словарей с интересующими параметрами участников канала for participant in all_participants: all_users_details.append({"id": participant.id, "first_name": participant.first_name, "last_name": participant.last_name, "user": participant.username, "phone": participant.phone, "is_bot": participant.bot}) with open('channel_users.json', 'w', encoding='utf8') as outfile: json.dump(all_users_details, outfile, ensure_ascii=False)
Итак, для каждого пользователя создается свой словарь данных и добавляется в общий список all_user_details
, который записывается в JSON-файл.
Собираем сообщения
Ситуация со сбором сообщений идентична сбору сведений о пользователях. Отличия сводятся к трем пунктам:
- Вместо клиентского запроса
GetParticipantsRequest
необходимо отправитьGetHistoryRequest
со своим набором параметров. Так же, как и в случае со списком участников запрос ограничен сотней записей за один раз. - Для списка сообщений важна их последовательность. Чтобы получать последние сообщения, нужно правильно задать смещение в
GetHistoryRequest
(с конца). - Чтобы корректно сохранить данные о времени публикации сообщений в JSON-файле, нужно преобразовать формат времени.
Итоговый код:
import configparser import json from telethon.sync import TelegramClient from telethon import connection # для корректного переноса времени сообщений в json from datetime import date, datetime # классы для работы с каналами from telethon.tl.functions.channels import GetParticipantsRequest from telethon.tl.types import ChannelParticipantsSearch # класс для работы с сообщениями from telethon.tl.functions.messages import GetHistoryRequest # Считываем учетные данные config = configparser.ConfigParser() config.read("config.ini") # Присваиваем значения внутренним переменным api_id = config['Telegram']['api_id'] api_hash = config['Telegram']['api_hash'] username = config['Telegram']['username'] proxy = (proxy_server, proxy_port, proxy_key) client = TelegramClient(username, api_id, api_hash, connection=connection.ConnectionTcpMTProxyRandomizedIntermediate, proxy=proxy) client.start() async def dump_all_participants(channel): """Записывает json-файл с информацией о всех участниках канала/чата""" offset_user = 0 # номер участника, с которого начинается считывание limit_user = 100 # максимальное число записей, передаваемых за один раз all_participants = [] # список всех участников канала filter_user = ChannelParticipantsSearch('') while True: participants = await client(GetParticipantsRequest(channel, filter_user, offset_user, limit_user, hash=0)) if not participants.users: break all_participants.extend(participants.users) offset_user += len(participants.users) all_users_details = [] # список словарей с интересующими параметрами участников канала for participant in all_participants: all_users_details.append({"id": participant.id, "first_name": participant.first_name, "last_name": participant.last_name, "user": participant.username, "phone": participant.phone, "is_bot": participant.bot}) with open('channel_users.json', 'w', encoding='utf8') as outfile: json.dump(all_users_details, outfile, ensure_ascii=False) async def dump_all_messages(channel): """Записывает json-файл с информацией о всех сообщениях канала/чата""" offset_msg = 0 # номер записи, с которой начинается считывание limit_msg = 100 # максимальное число записей, передаваемых за один раз all_messages = [] # список всех сообщений total_messages = 0 total_count_limit = 0 # поменяйте это значение, если вам нужны не все сообщения class DateTimeEncoder(json.JSONEncoder): '''Класс для сериализации записи дат в JSON''' def default(self, o): if isinstance(o, datetime): return o.isoformat() if isinstance(o, bytes): return list(o) return json.JSONEncoder.default(self, o) while True: history = await client(GetHistoryRequest( peer=channel, offset_id=offset_msg, offset_date=None, add_offset=0, limit=limit_msg, max_id=0, min_id=0, hash=0)) if not history.messages: break messages = history.messages for message in messages: all_messages.append(message.to_dict()) offset_msg = messages[len(messages) - 1].id total_messages = len(all_messages) if total_count_limit != 0 and total_messages >= total_count_limit: break with open('channel_messages.json', 'w', encoding='utf8') as outfile: json.dump(all_messages, outfile, ensure_ascii=False, cls=DateTimeEncoder) async def main(): url = input("Введите ссылку на канал или чат: ") channel = await client.get_entity(url) await dump_all_participants(channel) await dump_all_messages(channel) with client: client.loop.run_until_complete(main())
Если для анализа сообщений потребуются не все записи, задайте их число в переменной total_count_limit
. Если нужна только сборка сообщений канала, достаточно закомментировать вызов await dump_all_participants(channel)
.
Таким образом, с помощью Python и Telethon мы написали скрипт, собирающий и сохраняющий данные и реплики участников сообществ Telegram.
Есть ли у вас опыт работы с Telegram API?
</p></ol>
</p>
</p>
</p>
</p>
</p></ol>
</p>
</p>
</p>
</p>
</p>
</p>
</p></picture>
Эта заметка не про Bot API, а про Core API Telegram, с помощью которого можно создавать полноценные клиенты для месседжера, и конечно же любой другой софт, например для сбора данных из Телеграма. Основная проблема заключается в том, что общение с серверами Telegram осуществляется по специальному протоколу разработанным внутри компании — MTProto. Именно благодаря этому протоколу данный месседжер и славится своей безопасностью и шифрование данных.
Вас мучают вопросы: как использовать Telegram Api на PHP? Как вызывать функции? Очень много примеров использования telegram api для бота, а как использовать обычное api telegram? Зарегистрировал приложение, получил api_id и api_hash, как получить все сообщения из телеграм-канала? https://core.telegram.org/method/messages.getHistory Как вызвать этот метод? Как реализовать авторизацию с помощью API Telegram? Тогда эта статья для вас! Естественно, разбирать нюансы протокола MTProto в данной заметке я не буду. Для работы с ним буду пользоваться PHP-библиотекой MadelineProto, доступной всем желающим на GitHub. Однако, нельзя просто так взять и воспользоваться библиотекой. Есть как минимум три нюанса, которые нужно решить.
Подготовка к установке MadelineProto
Во-первых, нужен установленный Python, будет достаточно версии 2.7.
Во-вторых, библиотека не помечена как стабильная, поэтому для подключения её через composer к существующему проекту нужно немного отредактировать composer.json:
"minimum-stability": "dev",
Для того, чтобы composer не ругался на отсутствие стабильных версий зависимостей. Без указания этой директивы во время установки библиотеки будет получена примерно такая ошибка:
Your requirements could not be resolved to an installable set of packages. Problem 1 - Installation request for danog/madelineproto ^2.0 -> satisfiable by danog/madelineproto[2.0]. - danog/madelineproto 2.0 requires danog/primemodule dev-master -> satisfiable by danog/primemodule[dev-master] but these conflict with your requirements or minimum-stability. Installation failed, reverting ./composer.json to its original content.
Затем нужно указать git-репозиторий библиотеки:
"repositories": [ { "type": "git", "url": "https://github.com/danog/phpseclib" } ],
и только затем можно устанавливать саму либу:
composer require danog/madelineproto
Если во время установки зависимостей появится ошибка на подобии такой:
github Failed to clone via https, ssh protocols, aborting.
error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
То вам нужно обновить версию git.
Регистрация приложения для Telegram API
Теперь нужно зарегистрировать приложение в разделе API development tools и получить App api_id и App api_hash.
Как правильно использовать MadelineProto с Laravel
В-третьих, на сегодняшний день (2017-02-10) мне не удалось запустить MadelineProto из коробки, т.к. начинали сыпаться ошибки типа:
DataCenter: Connecting to DC 2 (main server, ipv4, tcp_full)... Exception: stream_set_timeout() expects parameter 1 to be resource, null given in Socket.php:153 DataCenter: Connection failed, retrying connection on port 443... Exception: stream_set_timeout() expects parameter 1 to be resource, null given in Socket.php:153 DataCenter: Connection failed, retrying connection on port 80... Exception: stream_set_timeout() expects parameter 1 to be resource, null given in Socket.php:153 DataCenter: Connection failed, retrying connection on port 88... Exception: stream_set_timeout() expects parameter 1 to be resource, null given in Socket.php:153 DataCenter: Connection failed, retrying connection on port 443 without the proxy... Exception: stream_set_timeout() expects parameter 1 to be resource, null given in Socket.php:153 DataCenter: Connection failed, retrying connection on port 80 without the proxy... Exception: stream_set_timeout() expects parameter 1 to be resource, null given in Socket.php:153 DataCenter: Connection failed, retrying connection on port 88 without the proxy... Exception: stream_set_timeout() expects parameter 1 to be resource, null given in Socket.php:153 Exception: Undefined offset: 2 in MsgIdHandler.php:77 CallHandler: An error occurred while calling method help.getNearestDc: Undefined offset: 2 in MsgIdHandler on line 77. Recreating connection and retrying to call method... Exception: Undefined offset: 2 in MTProto.php:641 In MTProto.php line 641: Undefined offset: 2
На самом деле здесь нет ничего фатального, просто фреймворк Laravel по-умолчанию перехватывает все ошибки и при отсуствии должных обработчиков завершает скрипт даже при наличии не критичных ошибок. Возможно такое поведение присутствует и в других фреймворках. Можно изменить уровень ошибок, добавив в метод AppProvidersAppServiceProvider::boot() строку:
error_reporting(0);
Но тогда есть вероятность пропустить некритичные ошибки своего приложения.
Вторым способом устранения ошибок будет правка исходника /vendor/danog/madelineproto/src/danog/MadelineProto/Connection.php, а именно нужно закомментировать 3 строки в конструкторе в условии
case 'tcp_full':
// $this->sock->setOption(SOL_SOCKET, SO_RCVTIMEO, $timeout); // $this->sock->setOption(SOL_SOCKET, SO_SNDTIMEO, $timeout); // $this->sock->setBlocking(true);
В коммите 56c0d431768c04009ae9aa3151715b5e6399ec4d эти строки находятся на 105-107 строках файла. Источник проблемы был найден с помощью отладчика xDebug. Проблема заключалась в том, что методы $this->sock->setOption() и $this->sock->setBlocking() пытались работать с ещё не созданным объектом $this->sock->sock. Если у вас возникнут другие ошибки, то с помощью отладчика вы их легко обнаружите и исправите.
Также в библиотеку могут быть зашиты устаревшие или не актуальные IP-адреса серверов Телеграма. Их всегда можно посмотреть на странице API development tools и передать в ModelineProto через конструктор danogMadelineProtoAPI().
Список всех параметров которые можно изменить в этой библиотеке можно посмотреть в массиве $default_settings метода danogMadelineProtoMTProto::parse_settings().
В идеале нужно зарегистрировать для приложения новую чистую учётную запись, но для тестирования и отладки вполне сгодится любая уже имеющаяся учётка Телеграма.
Пример работы MadelineProto на Laravel
Как делать запросы к Telegram API на PHP?
Приведу простой пример кода на базе консольной команды для Laravel:
public function handle() { // Если файл с сессией уже существует, использовать его if(file_exists( env('TELEGRAM_SESSION_FILE') ) ) { $madeline = new API( env('TELEGRAM_SESSION_FILE') ); } else { // Иначе создать новую сессию $madeline = new API([ 'app_info' => [ 'api_id' => env('TELEGRAM_API_ID'), 'api_hash' => env('TELEGRAM_API_HASH'), ] ]); // Задать имя сессии $madeline->session = env('TELEGRAM_SESSION_FILE'); // Принудительно сохранить сессию $madeline->serialize(); // Начать авторизацию по номеру мобильного телефона $madeline->phone_login( env('TELEGRAM_PHONE') ); // Запросить код с помощью консоли $code = readline('Enter the code you received: '); $madeline->complete_phone_login($code); } $messages = $madeline->messages->getHistory(['peer' => '@ANY_CHANNEL_ID', 'offset_id' => 0, 'offset_date' => 0, 'add_offset' => 0, 'limit' => 10, 'max_id' => 0, 'min_id' => 0, 'hash' => 0, ]); foreach($messages['messages'] as $msg) { dump($msg); } }
Для тех, кто не умеет в Laravel, кратко поясню. Вызовы env() — это запросы значений из файла конфигурации, можно заменить их на константы или захардкодить. Собственно:
TELEGRAM_SESSION_FILE — любое значение, которое можно использовать в качестве имени файла.
TELEGRAM_API_ID и TELEGRAM_API_HASH — Данные из API development tools.
TELEGRAM_PHONE — мобильный номер существующий учётки, например, +7XXXXXXXXXX.
Теперь пояснения о происходящем в коде. Сессия — достаточно важный объект клиента, без него при каждом запуске скрипта авторизовываться и вводить код из сообщения, который Telegram высылает либо в смс либо через сам месседжер. Также на этапе авторизации происходит вся знаменитая шифровочная телеграм-магия. Процесс не быстрый, на моём тестовом стенде он мог затягиваться на минуты.
В результате работы скрипта в консоль будет выведено огромное количество отладочной информации, на которую можно не обращать внимания. При первом запуске сессии нужно будет авторизоваться в месседжере:
API: Running APIFactory... API: MadelineProto is ready! API: Serializing MadelineProto... Login: Sending code... Login: Code sent successfully! Once you receive the code you should use the complete_phone_login function. Enter the code you received: ... Login: Logging in as a normal user... MTProto: Trying to copy authorization from dc 2 to dc 1 MTProto: Trying to copy authorization from dc 2 to dc 3 MTProto: Trying to copy authorization from dc 2 to dc 4 ResponseHandler: Parsing updates received via the socket...
После чего можно полноценно использовать все возможности Telegram Core API, например, $messages = $madeline->messages->getHistory().
Данный метод возвращает сообщения из канала в обратном хронологическом порядке, т.е. начиная с самых свежих. Подробнее о параметрах этого метода можно узнать на страницах официальной документации MadelineProto. Заметьте, параметры MadelineProto могут отличаться от параметров официальной документации самого Telegram.
Здравствуйте! Часто в интернете вы встречаете непонятные сочетания английских символов, о которых все говорят в положительном ключе. К примеру, как можно понять рассуждения о каком-то telegram bot api, да еще и понимать, что значит фраза: «Зачем его написали на c#, лучше бы на delphi?». Впрочем, данная статья решит ваши проблемы и поможет вам быть в теме: не углубляясь в программистские дебри, мы сейчас все объясним.
Содержание
Что такое API
Для начала мы поговорим о том, что вообще скрывается под этой аббревиатурой. Чтобы вам было понятнее, сначала мы углубимся в истоки истории программирования. Когда-то давным-давно код писался полностью с нуля. То есть, для того, чтобы программа просто показала пользователю какое-то слово, разработчик должен был вручную написать это на машинном языке, используя только 0 и 1.
Конечно, всегда так продолжаться не могло, поэтому однажды было решено автоматизировать весь этот процесс, создав библиотеки со встроенным набором функций. То есть, для вывода «Привет» разработчик должен был просто написать «cout << “Привет”», а подключенный им файл сам переводил это в последовательность нулей и единиц.
Осознав, что это довольно удобно, разработчики ввели понятие «API» ― встроенного интерфейса, позволяющего посылать операционной системе, компьютеру или еще чему-то команды на понятном для него языке. API автоматизировали создание игр или написание офисных программ, делая, к примеру, наложение текстуры на объект более простым.
Примером API может служить всем известный 1С
Для чего нужен телеграмм API
Теперь, когда вы поняли саму суть этого, перейдем к более конкретному примеру. А именно ― к интерфейсу ботов для телеграмм.
Наш Компьютер выяснил, что он позволяет:
- Программировать своего бота.
- Задавать ему различные команды взаимодействия с пользователями.
- Получать удобный доступ.
Фактически без API программисты ботов должны были бы каждый раз писать свой собственный искусственный интеллект. С его же использованием все становится гораздо проще.
В этом API есть уже готовые функции вывода и ввода текста, ответов на прописанные вопросы и прочего подобного. То есть, фактически разработчику остается только вписать свой текст, если речь идет о совсем примитивном роботе.
Найти этот API можно на официальном сайте телеграмма ― правда, он не на русском языке.
Какой язык скриптов использует мессенджер
Если вы серьезно взялись за задачу написать робота, то первое, что вам приходит в голову ― это вопрос: «А на каком языке тут все работает? Есть ли какой-то встроенный язык вроде apibridge?».
На самом деле ответить на этот вопрос однозначно нельзя.
Для выполнения всех своих функций мессенджер применяет:
- Язык, на котором и пишутся все команды для роботов.
- HTML. Он применяется для создания всеми любимых и недавно появившихся игр.
- JavaScript. Применяется для некоторых скриптов.
Подробнее об этом вы сможете узнать на официальном сайте.
Что такое json и как он связан с API
Наконец, последнее, что нужно знать, чтобы понимать, как функционирует мессенджер и его боты, ― это что такое json. Под этим понятием скрывается протокол обмена данными между пользователем и компьютером.
То есть, вы пишете код своего робота, а телеграмм в ответ присылает такой объект, сообщая, что метод добавлен успешно.
Выводы
Если подходить к этому с такой примитивной точки зрения, все сразу же становится ясно и понятно. Конечно, для работы с этим элементом необходимы более глубокие знания, получить которые вы сможете на различных специализированных ресурсах и форумах.
11 July 2018, 20:13 MSKИтак, снова пост про Телеграм. Я уже рассказывал, как отправлять сообщения от имени бота (в том числе, через прокси) и как сделать бота, который умеет принимать сообщения.Отправлять сообщения в Телеграм от бота очень просто, но есть крайне неудобная проблема: из-за ограничений Telegram Bot API бот не может писать первым. То есть, сначала пользователь, которому вы собрались что-нибудь отправить, должен первым написать вашему боту любое сообщение. Это ограничение вполне разумно и предотвращает спам сообщениями от ботов, но очень мешает честным людям. Например, отправлять сервисные сообщения с информацией о заказе в интернет-магазине.Решение этой проблемы только одно: не использовать ботов. Придётся всё делать с обычного аккаунта.Копаться в подробностях телеграмовского протокола MTProto не нужно, как оказалось, всё уже сделано до нас. Для PHP существует чудесная библиотека MadelineProto. Её мы и будем использовать, ниже пошаговая инструкция.1. Регистрируем аккаунт, с которого будет осуществляться отправка сообщений. Можно использовать существующий (но лучше сделать новый).2. Нужно зарегистрировать приложение. Просто формальная процедура. Для этого идём на сайт https://my.telegram.org/, логинимся через ваш аккаунт в Телеграме. Лучше всего, чтобы этот аккаунт не совпадал с акаунтом из пункта 1. Далее переходим на страницу https://my.telegram.org/apps, заполняем поля (платформа — Web, остальное не так важно), отправляем форму. Всё готово — приложение создано. Вас перенаправит на страницу настроек, запоминаем оттуда поля App api_id и App api_hash, остальное не нужно.3. Теперь нужно установить библиотеку MadelineProto. Делается это очень легко. Создаём на веб-сервере папку, в неё помещаем php-файл (например, index.php) со следующим содержимым:
if (!file_exists('madeline.php')) { copy('https://phar.madelineproto.xyz/madeline.php', 'madeline.php'); } include 'madeline.php'; $MP = new danogMadelineProtoAPI('session.madeline'); $MP->start();
Созданный скрипт должен иметь права на запись в папку. Библиотека требует PHP 7, но у меня всё завелось на PHP 5.6.4. Запускаем созданный php-файл из браузера. На первом шаге выбираем Manually, затем вставляем значения полей App api_id и App api_hash из пункта 2, ждём, выбираем User, указываем телефонный номер акаунта из пункта 1, получаем на него смс, вводим код, готово — вы залогинились в Телеграме из вашего веб-приложения.5. Переходим непосредственно к программированию. Весь код мы будем дописывать в имеющийся php-файл из пункта 3. У библиотеки MadelineProto есть хорошая документация, но некоторые моменты не очень понятны с первого раза.Для отправки сообщений нужно использовать метод sendMessage:
$MP->messages->sendMessage(['peer' => '', 'message' => '']);
Здесь peer — ID получателя, message — текст сообщения. И вот тут есть загвоздка: а где, собственно, взять айдишник пользователя, которому мы будем слать сообщения, если мы знаем только номер телефона?Для этого проще всего добавить телефон получателя во внутренний список контактов. Делается это так:
$contact = ['_' => 'inputPhoneContact', 'client_id' => 0, 'phone' => '+79xxxxxxxxx', 'first_name' => '', 'last_name' => '']; $import = $MP->contacts->importContacts(['contacts' => [$contact]]); // $import['imported'][0]['user_id'] - ID пользователя
Здесь мы указываем phone — номер телефона, first_name и last_name — имя и фамилия (можно указать любые, это не важно). В переменной $import[’imported’][0][’user_id’] будет содержаться ID нашего получателя. Хорошо бы его куда-нибудь сохранить у себя, чтобы можно было использовать дальше.После этого мы вызываем метод sendMessage и передаём ему полученный ID. Также в качестве peer можно передать никнейм (например, @name). Собственно, это всё!Использовать данный метод для рассылки спама бесполезно — аккаунт довольно быстро заблокируют по жалобам пользователей.Используемые источники:
- https://stelegram.ru/faq/servis-telegram-api
- https://proglib.io/p/pishem-prostoy-grabber-dlya-telegram-chatov-na-python-2019-11-06
- https://evilinside.ru/kak-na-php-rabotat-s-telegram-core-api-mtproto/
- https://nashkomp.ru/telegramm-api
- https://kirkizh.ru/2018/07/telegram-php-list/