Загрузка...

Telegram | Получение StringSession по Auth Key и DC ID с последующим входом в аккаунт Telethon

Тема в разделе Python создана пользователем жизнь 8 июн 2025 в 22:58. 77 просмотров

Загрузка...
  1. жизнь
    ⁡telegram_session_encoder.py
    ⁡ — Данный модуль позволяет создать строку StringSession для последующего использования, используя уже auth_key и DC ID.
    ⁡main.py
    ⁡ — Пример использования модуля: создаёт StringSession работает с аккаунтом Телеграма через Telethon. (В примере используется невалидный auth_key для демонстрации)

    Python
    import base64
    import ipaddress
    import struct
    from dataclasses import dataclass
    from typing import ClassVar, Mapping


    @dataclass(frozen=True)
    class TelegramSessionEncoder:
    """
    Encodes a Telegram session using a given auth_key and data center ID (dc_id).
    Produces a base64-encoded string suitable for use with Telegram clients.
    """
    auth_key: bytes
    dc_id: int

    _VERSION: ClassVar[str] = "1"
    _PORT: ClassVar[int] = 443
    _DC_IP_MAP: ClassVar[Mapping[int, str]] = {
    1: "149.154.175.53",
    2: "149.154.167.51",
    3: "149.154.175.100",
    4: "149.154.167.91",
    5: "91.108.56.130",
    203: "91.105.192.100",
    }

    def to_string(self) -> str:
    """
    Converts the session to a base64-encoded string.
    Format: <VERSION><base64(dc_id | ip | port | auth_key)>
    """
    ip_bytes = self._resolve_ip()
    payload = self._build_payload(ip_bytes)
    encoded = base64.urlsafe_b64encode(payload).decode("ascii")
    return f"{self._VERSION}{encoded}"

    def _resolve_ip(self) -> bytes:
    """
    Resolves the IP address for the given DC ID.
    Returns packed IP in bytes.
    """
    ip = self._DC_IP_MAP.get(self.dc_id)
    if not ip:
    raise ValueError(f"Unknown data center ID: {self.dc_id}")
    return ipaddress.ip_address(ip).packed

    def _build_payload(self, ip_bytes: bytes) -> bytes:
    """
    Builds the binary payload to be encoded.
    Structure: <dc_id:1B><ip:N><port:2B><auth_key:256B>
    """
    if len(self.auth_key) != 256:
    raise ValueError("auth_key must be exactly 256 bytes")
    fmt = f">B{len(ip_bytes)}sH256s"
    return struct.pack(fmt, self.dc_id, ip_bytes, self._PORT, self.auth_key)
    Python
    import asyncio
    from dataclasses import dataclass
    from telethon import TelegramClient
    from telethon.sessions import StringSession

    from telegram_session_encoder import TelegramSessionEncoder


    @dataclass(frozen=True)
    class APIConfig:
    api_id: int = 2040
    api_hash: str = "b18441a1ff607e10a989891a5462e627"
    device_model: str = "Desktop"
    system_version: str = "Windows 10"
    app_version: str = "3.4.3 x64"
    lang_code: str = "en"
    system_lang_code: str = "en-US"
    lang_pack: str = "tdesktop"


    async def main():
    auth_key_hex = "9b9067d02925853f458acc6405822ec63f7a227177d6a1b207d64dd8d52c3234ed8ad97d1de8c65ea570bc25ae527c14cb6d90107f2bbc5fa6d1d84db69c2b7e1776d59296276f7024e1d092cb24188125d93f3cc16a15fd2c61cd80c49dd62422b13467693f8a5201a329aa031f52af2d48781803bc8721f8ac907e8df13d17c6f8337441fe5337f91c2f721a5fcbde73aa3368c91ed130489640e94204262e9076ac547322ee57f91c44502ec90e2dbd7d793e76de7b27a36a29050b6562e9236525e9c8abcafb3d30a64ddec7971328d9a60dc4b759b30204134347888a12bd7d1e1ada5aebeda40a0d67b7e088c3898598368b28a327fcd204ef47cd2792"

    auth_key = bytes.fromhex(auth_key_hex)
    dc_id = 5

    session_encoder = TelegramSessionEncoder(auth_key, dc_id)
    string_session_str = session_encoder.to_string()

    string_session = StringSession(string_session_str)

    api_config = APIConfig()

    async with TelegramClient(
    session=string_session,
    api_id=api_config.api_id,
    api_hash=api_config.api_hash,
    device_model=api_config.device_model,
    system_version=api_config.system_version,
    app_version=api_config.app_version,
    lang_code=api_config.lang_code,
    system_lang_code=api_config.system_lang_code,
    ) as client:
    me = await client.get_me()
    print(f"Logged in as: {me.first_name}")


    if __name__ == "__main__":
    asyncio.run(main())
     
    8 июн 2025 в 22:58 Изменено
  2. danxshine
    Лучший :dance:
     
Top