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