How Can I get my app id in Telegram API?
I am trying to get my app id from Telegram API by using the method register.saveDeveloperInfo , but I cannot find the way to do it.
I’m using de MTProto Java library.
This is what I had done by now:
- I made my own register.saveDeveloperInfo implemmentation in Java.
- I call the method with the corrects params (https://core.telegram.org/api/obtaining_api_id)
- The method returns a true boolean but I have not received the sms with my app_id.
- When I enter in my app section of the telegram web (https://core.telegram.org/myapp) shows the «Your app is not ready yet» message.
Anyway, I’m trying to use the app_id from the source code of the official client but I can’t send or receive message.
Создание и развертывание ретранслятора Telegram каналов, используя Python и Heroku
В данной инструкции построим Python приложение для зеркалирования сообщений из Telegram каналов и развернем его на облачной платформе Heroku.
Идея проста — получить сообщение и тут же переотправить или переслать его.
Ввиду ограниченности Bot API, нет возможности добавить бота в канал, где вы не администратор. Поэтому будем использовать клиентский API, заходя на нужные каналы вручную (хотя и этот шаг можно автоматизировать).
По ходу действий нам понадобятся:
- Аккаунт Telegram. Лучше перестраховаться и завести отдельный аккаунт, благо на сервисах приема SMS его цена составляет
Для работы с клиентским API необходимо создать приложение Telegram. Сделать это можно по ссылке. Здесь нас интересуют два значения: api_id и api_hash.
Полученные значения api_id и api_hash занесем во вновь созданный файл переменных окружения .env:
При использовании системы контроля версий, не забудьте добавить файл .env в список исключения.
Создадим папку проекта. Все последующие действия будем делать в ней.
Настроим виртуальное Python окружение для изоляции приложения от других глобальных зависимостей системы:
Активируем виртуальное окружение:
Последующая установка новых Python пакетов будет производиться в данном виртуальной окружении.
В качестве библиотеки для взаимодействия с Telegram API будем использовать Telethon:
Для загрузки значений переменных окружения установим пакет python-dotenv:
Создадим файл config.py, где будем хранить и загружать переменные окружения в память приложения:
Скрипт авторизации, целью которого является получение идентификатора сессии, выглядит следующим образом:
После ввода номера телефона и кода, пришедшего в приложение Telegram, получаем заветный идентификатор сессии, который добавим в файл .env.
Теперь, используя вновь полученный идентификатор сессии, авторизуемся для дальнейшего взаимодействия с Telegram API:
Присоединившись к каналу, серверы Telegram начинают слать нам соответствующие обновления (новые сообщения, отредактированные сообщения и др.). Остается лишь перенаправить их в наш канал.
Определим идентификаторы канала-источника (SOURCE_CHANNEL) и канала-приемника (TARGET_CHANNEL):
Каналы имеют обыкновение менять свои ссылки, но что остается неизменным — это их идентификаторы (число с префиксом -100). Узнать идентификатор можно с помощью Telegram бота @messageinformationsbot, переслав ему любое сообщение из интересующего вас канала.
Следуя примеру из документации, добавим обработчик новых сообщений:
Для каждого нового сообщения в функцию handler_new_message приходит объект типа NewMessage, содержащий поле message с необходимой нам информацией. Т.к. нам необходимы обновления только от определенных каналов, при определении обработчика передадим ему параметр chats, содержащий идентификатор либо список идентификаторов каналов.
Для успешной отправки сообщений в Telegram канал необходимо, чтобы аккаунт, которым авторизовались в приложении, имел на это соответствующие права.
В случае переотправки пришедших сообщений (использование метода client.send_message), при отредактированном сообщении в канале-источнике, можем отредактировать его и в канале-приемнике.
Для реализации редактирования необходимо знать какое именно сообщение редактировать, поэтому при добавлении нового сообщения, нужно сохранить идентификаторы исходного и копии сообщения. В дальнейшем по идентификатору сообщения из источника сможем определить идентификатор сообщения в нашем канале.
Установим базу данных Postgres, если этого не было сделано ранее. Сама установка не должна вызвать сложностей:
- Для вашей операционной системы скачать установщик;
- Запустить его, оставив параметры по умолчанию. Единственное, что стоит запомнить это логин и пароль пользователя базы данных:
- Добавить к переменной окружения PATH путь к используемым файлам Postgres.
Для Windows: C:\Program Files\PostgreSQL\<ВЕРСИЯ>\bin, инструкция по установке переменных окружения.
Далее первоначальное взаимодействие с базой будем производить с помощью утилиты psql:
Для хранения соответствий идентификаторов определим простейшую таблицу BINDING_ID:
Создадим таблицу BINDING_ID в консоли утилиты psql командой:
Взаимодействие с базой данных будем производить с помощью пакета psycopg2:
В файл .env добавим строку подключения к базе данных вида:
В случае развертывания на Heroku и использования Postgresql дополнения, для приложения в облаке переменная окружения DATABASE_URL устанавливается автоматически. Поэтому при развертывании в облаке DATABASE_URL устанавливать не нужно.
Для работы с базой данных определим следующие базовые функции: добавление соответствия идентификаторов сообщений (insert) и поиск идентификатора сообщения-клона по идентификатору оригинального сообщения (find_by_id):
В функцию обработчика новых сообщений добавим сохранение идентификаторов сообщений в базе данных:
Тогда редактирование сообщений будет выглядеть следующим образом:
Ознакомиться с текущим вариантом проекта можно по ссылке ниже:
Для случая зеркалирования «один к одному» у нас все готово и можно переходить к развертыванию.
Когда каналов-источников и каналов, в которые необходимо пересылать сообщения, больше чем один, необходимо задать их взаимное соответствие.
Задавать карту соответствий прямо в коде — не вариант, поэтому для значения новой переменной окружения (CHANNELS_MAPPING) введем специальный формат записи:
Теперь вместо ранее заданных переменных SOURCE_CHANNEL и TARGET_CHANNEL имеем CHANNELS_MAPPING:
Для дальнейшей работы из строкового значения CHANNELS_MAPPING нужно получить представление в виде словаря (dict). Сделать это можно, разобрав строку по составляющим ее элементам с помощью регулярных выражений (модуль re) либо с помощью парсера грамматик (модуль pyparsing). В данном случае воспользуемся вторым вариантом.
Установим модуль pyparsing:
Так как входная строка для разбора состоит из отдельных элементов, для каждого такого элемента определим свою грамматику:
- Основной элемент — идентификатор канала, состоящий из префикса -100 и последующих цифр:
- Список каналов:
Подробнее о модуле pyparsing можно узнать в документации.
После составления грамматики, формируем результат разбора строки в виде словаря, где ключи — исходные каналы, значения — список целевых каналов (функция parse_string):
Инициализация переменной CHANNELS_MAPPING:
Расширим таблицу BINDING_ID двумя столбцами: идентификатор канала-зеркала (mirror_channel_id) и идентификатор канала-источника (channel_id):
Использование Telegram Core API (MTProto) на PHP
Эта заметка не про 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. Однако, нельзя просто так взять и воспользоваться библиотекой. Есть как минимум три нюанса, которые нужно решить.
Подготовка к установке M adelineProto
Во-первых, нужен установленный Python, будет достаточно версии 2.7.
Во-вторых, библиотека не помечена как стабильная, поэтому для подключения её через composer к существующему проекту нужно немного отредактировать composer.json:
Для того, чтобы composer не ругался на отсутствие стабильных версий зависимостей. Без указания этой директивы во время установки библиотеки будет получена примерно такая ошибка:
Затем нужно указать git-репозиторий библиотеки:
и только затем можно устанавливать саму либу:
Если во время установки зависимостей появится ошибка на подобии такой:
То вам нужно обновить версию git.
Регистрация приложения для Telegram API
Теперь нужно зарегистрировать приложение в разделе API development tools и получить App api_id и App api_hash.
Как правильно использовать MadelineProto с Laravel
В-третьих, на сегодняшний день (2017-02-10) мне не удалось запустить MadelineProto из коробки, т.к. начинали сыпаться ошибки типа:
На самом деле здесь нет ничего фатального, просто фреймворк Laravel по-умолчанию перехватывает все ошибки и при отсуствии должных обработчиков завершает скрипт даже при наличии не критичных ошибок. Возможно такое поведение присутствует и в других фреймворках. Можно изменить уровень ошибок, добавив в метод \App\Providers\AppServiceProvider::boot() строку:
Но тогда есть вероятность пропустить некритичные ошибки своего приложения.
Вторым способом устранения ошибок будет правка исходника /vendor/danog/madelineproto/src/danog/MadelineProto/Connection.php, а именно нужно закомментировать 3 строки в конструкторе в условии
В коммите 56c0d431768c04009ae9aa3151715b5e6399ec4d эти строки находятся на 105-107 строках файла. Источник проблемы был найден с помощью отладчика xDebug. Проблема заключалась в том, что методы $this->sock->setOption() и $this->sock->setBlocking() пытались работать с ещё не созданным объектом $this->sock->sock. Если у вас возникнут другие ошибки, то с помощью отладчика вы их легко обнаружите и исправите.
Также в библиотеку могут быть зашиты устаревшие или не актуальные IP-адреса серверов Телеграма. Их всегда можно посмотреть на странице API development tools и передать в ModelineProto через конструктор \danog\MadelineProto\API().
Список всех параметров которые можно изменить в этой библиотеке можно посмотреть в массиве $default_settings метода \danog\MadelineProto\MTProto::parse_settings().
В идеале нужно зарегистрировать для приложения новую чистую учётную запись, но для тестирования и отладки вполне сгодится любая уже имеющаяся учётка Телеграма.
Пример работы MadelineProto на Laravel
Как делать запросы к Telegram API на PHP?
Приведу простой пример кода на базе консольной команды для Laravel:
Для тех, кто не умеет в Laravel, кратко поясню. Вызовы env() — это запросы значений из файла конфигурации, можно заменить их на константы или захардкодить. Собственно:
TELEGRAM_SESSION_FILE — любое значение, которое можно использовать в качестве имени файла.
TELEGRAM_API_ID и TELEGRAM_API_HASH — Данные из API development tools.
TELEGRAM_PHONE — мобильный номер существующий учётки, например, +7XXXXXXXXXX.
Теперь пояснения о происходящем в коде. Сессия — достаточно важный объект клиента, без него при каждом запуске скрипта авторизовываться и вводить код из сообщения, который Telegram высылает либо в смс либо через сам месседжер. Также на этапе авторизации происходит вся знаменитая шифровочная телеграм-магия. Процесс не быстрый, на моём тестовом стенде он мог затягиваться на минуты.
В результате работы скрипта в консоль будет выведено огромное количество отладочной информации, на которую можно не обращать внимания. При первом запуске сессии нужно будет авторизоваться в месседжере:
После чего можно полноценно использовать все возможности Telegram Core API, например, $messages = $madeline->messages->getHistory().
Данный метод возвращает сообщения из канала в обратном хронологическом порядке, т.е. начиная с самых свежих. Подробнее о параметрах этого метода можно узнать на страницах официальной документации MadelineProto. Заметьте, параметры MadelineProto могут отличаться от параметров официальной документации самого Telegram.
Читайте также
Иногда при обработке с помощью PHP больших и не очень данных, можно словить досадную ошибку посреди выполнения скрипта: PHP Fatal…
Бывают ситуации, например, когда предопределённых в конфиге Laravel подключений к базам данных не достаточно и возникает потребность создавать подключения динамически…
Существует красивое и элегантное решение в одну строку: list($a, $b) = [$b, $a]; А для PHP версий 5.3 и старше…