Add interactive IPv4/IPv6 choice for session generation.
Create a dedicated session generator script that prompts for IP mode first and update README with the new generation flow and behavior in non-interactive shells. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
93
generate_session.py
Normal file
93
generate_session.py
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
import asyncio
|
||||||
|
import getpass
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from telethon import TelegramClient
|
||||||
|
from telethon.sessions import StringSession
|
||||||
|
|
||||||
|
|
||||||
|
API_ID = int(os.getenv("TG_API_ID", "0"))
|
||||||
|
API_HASH = os.getenv("TG_API_HASH", "")
|
||||||
|
SESSION_FILE_PATH = os.getenv("SESSION_FILE_PATH", "./session_data/session.session")
|
||||||
|
TG_USE_IPV6 = os.getenv("TG_USE_IPV6", "true").lower() in {"1", "true", "yes"}
|
||||||
|
TG_CONNECT_TIMEOUT = int(os.getenv("TG_CONNECT_TIMEOUT", "30"))
|
||||||
|
TG_REQUEST_RETRIES = int(os.getenv("TG_REQUEST_RETRIES", "10"))
|
||||||
|
TG_CONNECTION_RETRIES = int(os.getenv("TG_CONNECTION_RETRIES", "20"))
|
||||||
|
TG_RETRY_DELAY = int(os.getenv("TG_RETRY_DELAY", "5"))
|
||||||
|
|
||||||
|
|
||||||
|
def validate() -> None:
|
||||||
|
if API_ID <= 0:
|
||||||
|
raise ValueError("Set TG_API_ID in environment")
|
||||||
|
if not API_HASH:
|
||||||
|
raise ValueError("Set TG_API_HASH in environment")
|
||||||
|
|
||||||
|
|
||||||
|
def choose_ip_mode(default_ipv6: bool) -> bool:
|
||||||
|
default_label = "2" if default_ipv6 else "1"
|
||||||
|
print("Choose connection mode for Telegram session generation:")
|
||||||
|
print("1) IPv4")
|
||||||
|
print("2) IPv6")
|
||||||
|
|
||||||
|
if not sys.stdin.isatty():
|
||||||
|
print(f"Non-interactive shell detected, using default from env: {'IPv6' if default_ipv6 else 'IPv4'}")
|
||||||
|
return default_ipv6
|
||||||
|
|
||||||
|
choice = input(f"Select [1/2] (default {default_label}): ").strip().lower()
|
||||||
|
if choice in {"2", "ipv6", "v6"}:
|
||||||
|
return True
|
||||||
|
if choice in {"1", "ipv4", "v4"}:
|
||||||
|
return False
|
||||||
|
return default_ipv6
|
||||||
|
|
||||||
|
|
||||||
|
async def main() -> None:
|
||||||
|
validate()
|
||||||
|
selected_use_ipv6 = choose_ip_mode(TG_USE_IPV6)
|
||||||
|
|
||||||
|
print("Starting Telegram login for StringSession generation")
|
||||||
|
print(
|
||||||
|
"Connection settings:",
|
||||||
|
{
|
||||||
|
"use_ipv6": selected_use_ipv6,
|
||||||
|
"connect_timeout": TG_CONNECT_TIMEOUT,
|
||||||
|
"request_retries": TG_REQUEST_RETRIES,
|
||||||
|
"connection_retries": TG_CONNECTION_RETRIES,
|
||||||
|
"retry_delay": TG_RETRY_DELAY,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
client = TelegramClient(
|
||||||
|
StringSession(),
|
||||||
|
API_ID,
|
||||||
|
API_HASH,
|
||||||
|
use_ipv6=selected_use_ipv6,
|
||||||
|
timeout=TG_CONNECT_TIMEOUT,
|
||||||
|
request_retries=TG_REQUEST_RETRIES,
|
||||||
|
connection_retries=TG_CONNECTION_RETRIES,
|
||||||
|
retry_delay=TG_RETRY_DELAY,
|
||||||
|
auto_reconnect=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
async with client:
|
||||||
|
phone = input("Phone number (international format, e.g. +1234567890): ").strip()
|
||||||
|
await client.send_code_request(phone)
|
||||||
|
code = input("Telegram code: ").strip()
|
||||||
|
|
||||||
|
try:
|
||||||
|
await client.sign_in(phone=phone, code=code)
|
||||||
|
except Exception:
|
||||||
|
password = getpass.getpass("2FA password: ")
|
||||||
|
await client.sign_in(password=password)
|
||||||
|
|
||||||
|
session_string = client.session.save()
|
||||||
|
session_path = Path(SESSION_FILE_PATH)
|
||||||
|
session_path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
session_path.write_text(session_string + "\n", encoding="utf-8")
|
||||||
|
print(f"Session saved to: {session_path.resolve()}")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
asyncio.run(main())
|
||||||
16
redme.md
16
redme.md
@@ -23,6 +23,7 @@
|
|||||||
dbbot/
|
dbbot/
|
||||||
├── redme.md # этот файл
|
├── redme.md # этот файл
|
||||||
├── script.py # Telethon userbot sender -> n8n webhook
|
├── script.py # Telethon userbot sender -> n8n webhook
|
||||||
|
├── generate_session.py # генерация новой StringSession
|
||||||
├── requirements.txt # зависимости python
|
├── requirements.txt # зависимости python
|
||||||
├── Dockerfile # контейнер для script.py
|
├── Dockerfile # контейнер для script.py
|
||||||
├── .gitignore # исключения (секреты, кеш, сессия)
|
├── .gitignore # исключения (секреты, кеш, сессия)
|
||||||
@@ -52,6 +53,21 @@ dbbot/
|
|||||||
|
|
||||||
Внутри должна быть одна строка `StringSession` без переносов и пробелов по краям.
|
Внутри должна быть одна строка `StringSession` без переносов и пробелов по краям.
|
||||||
|
|
||||||
|
Если нужно сгенерировать новую сессию (например, для IPv6), используй:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export TG_API_ID=<your_api_id>
|
||||||
|
export TG_API_HASH=<your_api_hash>
|
||||||
|
export SESSION_FILE_PATH=./session_data/session.session
|
||||||
|
python3 generate_session.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Скрипт первым шагом спросит режим подключения:
|
||||||
|
- `1) IPv4`
|
||||||
|
- `2) IPv6`
|
||||||
|
|
||||||
|
Если запуск неинтерактивный, используется значение `TG_USE_IPV6` из окружения.
|
||||||
|
|
||||||
### 3) Переменные окружения для контейнера
|
### 3) Переменные окружения для контейнера
|
||||||
|
|
||||||
Сделай локальный `.env`:
|
Сделай локальный `.env`:
|
||||||
|
|||||||
Reference in New Issue
Block a user