""" 首次登录脚本 —— 完成 Telegram 手机号 + 验证码认证,生成 session 文件。 只需运行一次,之后重启容器无需重新登录。 用法: docker exec -it <容器名> python3 /app/do_login.py """ import asyncio import os import sys import yaml from pyrogram import Client def load_config(path: str = "config.yaml") -> dict: with open(path, "r", encoding="utf-8") as f: return yaml.safe_load(f) or {} async def main(): config_path = os.path.join(os.path.abspath("."), "config.yaml") if not os.path.exists(config_path): print(f"错误:找不到配置文件 {config_path}") sys.exit(1) cfg = load_config(config_path) api_id = cfg.get("api_id") api_hash = cfg.get("api_hash") if not api_id or not api_hash: print("错误:config.yaml 中缺少 api_id 或 api_hash") sys.exit(1) session_dir = os.path.join(os.path.abspath("."), "sessions") os.makedirs(session_dir, exist_ok=True) session_file = os.path.join(session_dir, "media_downloader") proxy_cfg = cfg.get("proxy") proxy = None if proxy_cfg: proxy = { "scheme": proxy_cfg.get("scheme", "socks5"), "hostname": proxy_cfg.get("hostname", "127.0.0.1"), "port": proxy_cfg.get("port", 1080), } print("=== Telegram 首次登录 ===") print(f"Session 文件将保存到:{session_file}.session") print() client = Client( session_file, api_id=api_id, api_hash=api_hash, proxy=proxy, ) async with client: me = await client.get_me() print(f"\n登录成功!账号:{me.first_name} (@{me.username})") print("Session 文件已保存,后续启动无需重新登录。") if __name__ == "__main__": asyncio.run(main())