⁡telegram_session_encoder.py - Данный модуль позволяет создать строку StringSession для последующего использования, используя уже auth_key и DC ID.

⁡main.py - Пример использования модуля: создаёт StringSession работает с аккаунтом Телеграма через Telethon. (В примере используется невалидный auth_key для демонстрации)


⁡telegram_session_encoder.py



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"
  }

  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)


⁡main.py


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())