После создания вашего Auth_key мне проще всего убедиться, что я подключен к ближайшему центру обработки данных, прежде чем продолжить. Также вы должны отправить команду InitConnection вместе с текущим уровнем (версией API), с которым будет работать ваш код.
Вот пример того, что я отправляю:
msg = TL.invokewithlayer(@layer, TL.initconnection(@app_id, @device_model, @system_version, @app_version, @lang_code, TL.help_getnearestdc))
Теперь, прежде чем вы отправите это, вот еще немного предыстории:
1) Серверы Telegram общаются в TL, что в основном представляет собой специально разработанную схему кодирования, которую Telegram использует для выражения всего: от команд до всех их типов. Вам нужно будет создать себе декодер и кодировщик для преобразования необработанных байтов в TL и наоборот.
2) Telegram время от времени обновляет свои версии API, но версия на их сайте устарела. Вы можете легко получить последнюю спецификацию API их официальных проектов с открытым исходным кодом. В частности, это и это из Webogram весьма полезны для генерации свой собственный парсер TL. Текущая версия слоя 45
3) Таким образом, когда вы отправляете свой запрос init + NearestDc, это, скорее всего, ваше первое зашифрованное сообщение MTproto, поэтому вам нужно будет создать новый случайный 64-битный номер в качестве ключа сеанса, но также вам нужен действительный server_salt...
4) Возможно, вы пропустили это при создании своего Auth_Key, но вы можете создать действительный начальный server_salt из этого:
server_salt = substr(new_nonce, 0, 8) XOR substr(server_nonce, 0, 8)
вы можете посмотреть это здесь: ШАГ 9) Обмен ключами DH завершен
5) Теперь у вас есть server_salt, новый случайный 64-битный идентификатор session_id, и вы хотите отправить следующее:
msg = TL.invokewithlayer(@layer, TL.initconnection(@app_id, @device_model, @system_version, @app_version, @lang_code, TL.help_getnearestdc))
Формат MTProto: auth_id + msg_key + enc_payload
enc_payload = AES_IGE_enc (полезная нагрузка)
полезная нагрузка = соль + session_id + msg_id + seq_no + len(msg) + msg + padding
Вы можете получить это из здесь
6) теперь вы ожидаете результат, который сообщает вам ваш ближайший dc_id, если он отличается от dc_id = 2 (обычно dc_id = 2 используется по умолчанию, с которого вы начинаете), тогда вам нужно отключиться и запустить новое подключение к вашему новому dc_id и повторно сгенерируйте свой ключ auth_key, подключенный к этому новому контроллеру домена. Ваши dc_ids указывают на список IP-адресов центров обработки данных Telegram ['149.154.175.50', '149.154.167.51', '149.154.175.100', '149.154.167.91', '149.154.171.5']
7) после подключения к правильному «ближайшему контроллеру домена» теперь можно выполнить авторизацию пользователя, чтобы авторизуйте (ваш) номер мобильного телефона для доступа к телеграмме с помощью вашего нового клиента Telegram
8) все последующие сообщения, которые вы отправляете в Telegram, будут отправляться с использованием того же идентификатора session_id и соли и с соблюдением шагов шифрования MTProto, как и раньше.
9) обратите внимание, что соль обычно хороша всего 24 часа. Сервер отправит вам новую соль, которую вы можете использовать для замены просроченных солей. session_id обычно долгоживущий.
10) как только вы освоите эти несколько шагов, вы можете попробовать отправлять сообщения или получать список контактов и историю сообщений.
Ваше здоровье.
person
Charles Okwuagwu
schedule
18.02.2016