Получить api hash Telegram

Эта заметка не про 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. Однако, нельзя просто так взять и воспользоваться библиотекой. Есть как минимум три нюанса, которые нужно решить.

How to Get API Id API Hash Of a Telegram Account #Tg #for_beginners #Easy

Подготовка к установке M adelineProto

Во-первых, нужен установленный 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 из коробки, т.к. начинали сыпаться ошибки типа:

How to get API ID & API HASH of a Telegram Account | No Errors | By Bemro


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:

Для тех, кто не умеет в 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.

Post Views: 15 384

Как по-быстрому увеличить объём выделяемой памяти для консольного PHP скрипта? Иногда при обработке с помощью PHP больших и не очень данных, можно словить досадную ошибку посреди выполнения скрипта: PHP Fatal…

Как в Laravel создать подключение к БД в runtime Бывают ситуации, например, когда предопределённых в конфиге Laravel подключений к базам данных не достаточно и возникает потребность создавать подключения динамически…

Поменять местами значения переменных в PHP Существует красивое и элегантное решение в одну строку: list($a, $b) = [$b, $a]; А для PHP версий 5.3 и старше…

1 Comment

Alexander Tihonov · 2020-10-17 at 01:08

Спасибо, это очень полезно! Действительно, как ботов создать — так на каждом шагу примеры, а чтоб в core залезть да еще и на пхп…

Источник: evilinside.ru

Создание и развертывание ретранслятора Telegram каналов, используя Python и Heroku

Для случая зеркалирования «один к одному» у нас все готово и можно переходить к развертыванию.

Зеркалирование «много к одному»

Когда каналов-источников и каналов, в которые необходимо пересылать сообщения, больше чем один, необходимо задать их взаимное соответствие.

Задавать карту соответствий прямо в коде — не вариант, поэтому для значения новой переменной окружения (CHANNELS_MAPPING) введем специальный формат записи:

Развертывание

Для развертывания приложения Heroku необходимо сделать следующее:

1. Зарегистрироваться на Heroku, если это не было сделано ранее;

3. Создать Heroku Procfile:

Источник: vc.ru

Выгрузка сообщений с использованием Telegram API. С чего начать

Выгрузка сообщений с использованием Telegram API. С чего начать

2018-03-16 в 15:19, admin , рубрики: .net, C#, github, telegram api

На просторах интернета можно найти множество описаний и примеров по созданию telegram bot-ов.Но Telegram Bot Api имеет ограниченный функционал. Для решения задачи по выгрузке сообщений из Telegram по ключевому слову необходимо использовать Telegram API. За основу была взята библиотека TLSharp. Стоит сразу прояснить, что дальнейшая работа возможна только для зарегистрированных пользователей в Telegram.

Стартом работы с API служит регистрация приложения:

  1. Заходим на сайт Телеграмма и вводим свой номер телефона. Вводим код подтверждения. image
  2. Попадаем на страницу разработчика. Для завершения регистрации необходимо заполнить поля, характеризующие ваше будущее приложение. image
  3. Получаем api_id и api_hash.
Еще по теме:  В Телеграме архив постоянно подписывается на разные группы

Работа с библиотекой

Добавляем в проект Visual Studio через консоль диспетчера пакетов:

Install-Package TLSharp

Для начала работы создаём клиента с параметрами api_id и api_hash, полученными выше — совершаем подключение.

TelegramClient client = new TelegramClient(apiId, apiHash); await client.ConnectAsync();

Для аутентификации своего аккаунта, выполняем следующее:

var hash = await client.SendCodeRequestAsync(«номер телефона»); var code = «код телеграмма»; var user = await client.MakeAuthAsync(«номер телефона», hash, code);

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

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

var dialogs = (TLDialogs)await client.GetUserDialogsAsync();

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

dialogs.Chats

Проходим по всем чатам и каналам, отдельно проверяя является ли следующий элемент чатом или каналом:

foreach (var element in dialogs.Chats)< if (element is TLChat)< TLChat chat = element as TLChat;

В библиотеке TLSharp реализованы все функции официального API. Функции реализованы через запросы, например, дополнительную информацию по каналу можно получить через запрос вида:

TeleSharp.TL.Messages.TLChatFull channelInfo = await client.SendRequestAsync (new TLRequestGetFullChat());

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

if (element is TLChannel)< var offset = 0; TLChannel channel = element as TLChannel; var chan = await client.SendRequestAsync(new TLRequestGetFullChannel() < Channel = new TLInputChannel() < ChannelId = channel.Id, AccessHash = (long)channel.AccessHash>>); TLInputPeerChannel inputPeer = new TLInputPeerChannel() < ChannelId = channel.Id, AccessHash = (long)channel.AccessHash >;

Выгрузка сообщений

Выгрузка сообщений происходит порциями по 100 сообщений и параметром AddOffset настраивается выгрузка следующей порции сообщений.

while (true) < TLChannelMessages res = await client.SendRequestAsync(new TLRequestGetHistory()< Peer = inputPeer, Limit = 400, AddOffset = offset, OffsetId = 0 >); var msgs = res.Messages;

Сообщения бывают двух типов TLMessage и TLMessageService. Первый — обычное текстовое сообщение, возможно содержащий в себе некоторый медиа файл. Второй тип сообщений в большинстве случаев представляет собой звонок или сообщения от Telegram Service.

if (res.Count > offset) < offset += msgs.Count; foreach (var msg in msgs) < if (msg is TLMessage) < TLMessage sms = msg as TLMessage; st.Add(sms.Message); >if (msg is TLMessageService) continue; > > else break; > >

Поиск по сообщениям

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

TLInputPeerChannel inputPeer = new TLInputPeerChannel() < ChannelId = channel.Id, AccessHash = (long)channel.AccessHash>; TLChannelMessages search = await client.SendRequestAsync (new TeleSharp.TL.Messages.TLRequestSearch()< Peer = inputPeer, MaxDate = maxdate, MinDate = mindate, Q = searchWord, Filter = new TLInputMessagesFilterEmpty(), Limit = 100, Offset = offset >);

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

На этом всё, надеюсь кому-то это статья была полезной.

Источник: www.pvsm.ru

Рейтинг
( Пока оценок нет )
Загрузка ...