Задать вопрос
@klounboy32

В чём может быть причина, что при работе через Telethon с явно заданным SOCKS5-прокси Telegram определяет локацию устройства не по IP прокси?

Есть скрипт создатель сессий тг.
Нужно чтобы скрипт работал с проксями создавал сессию на прокси.
Суть проблемы: В тг авторизованных устройствах отображает без прокси. (прокси московские)
Прокси берет из Proxies.txt
Формат прокси socks5://aaaaa:bbbbbb@11.12.80.155:8888
6841f7dacc6be458548816.png
import os
import asyncio
import json
import re
import socks
from telethon import TelegramClient
from config import DEVICE_CONFIGS

SESSIONS_FOLDER = "sessions"
os.makedirs(SESSIONS_FOLDER, exist_ok=True)

def parse_proxy(line):
    match = re.match(r'socks5://([^:]+):([^@]+)@([^\:]+):(\d+)', line)
    if not match:
        return None
    login, password, host, port = match.groups()
    return (
        socks.SOCKS5,
        host,
        int(port),
        True,
        login,
        password
    )

def load_proxies(filename="Proxies.txt"):
    proxies = []
    with open(filename, "r", encoding="utf-8") as f:
        for line in f:
            line = line.strip()
            if not line or line.startswith("#"):
                continue
            proxy = parse_proxy(line)
            if proxy:
                proxies.append(proxy)
    return proxies

PROXIES = load_proxies()

async def create_sessions():
    with open("accounts.json", "r", encoding="utf-8") as f:
        api_entries = json.load(f)["accounts"]

    if len(api_entries) < 1:
        print("accounts.json пуст")
        return

    if len(PROXIES) < 1:
        print("Proxies.txt пуст или нет валидных строк")
        return

    idx = 0
    while idx < len(api_entries):
        phone = input(f"\n Введите номер телефона (+7xxxxxxxxxx) или пустую строку для выхода: ").strip()
        if not phone:
            print("Завершение работы.")
            break

        api_id = api_entries[idx]["api_id"]
        api_hash = api_entries[idx]["api_hash"]
        device = DEVICE_CONFIGS[idx % len(DEVICE_CONFIGS)]
        proxy = PROXIES[idx % len(PROXIES)]  # Берём следующий прокси из списка

        print(f" Используется API #{idx+1}: {api_id}, устройство: {device['device_model']} / {device['system_version']}")
        print(f" Используется прокси: {proxy[1]}:{proxy[2]} ({proxy[4]})")

        session_path = os.path.join(SESSIONS_FOLDER, f"tg_{phone.replace('+', '').replace(' ', '')}")
        client = TelegramClient(
            session=session_path,
            api_id=api_id,
            api_hash=api_hash,
            device_model=device["device_model"],
            system_version=device["system_version"],
            proxy=proxy
        )

        await client.connect()
        if not await client.is_user_authorized():
            try:
                await client.send_code_request(phone)
                code = input(f"[{phone}] Введите код подтверждения: ")
                await client.sign_in(phone, code)
                print(f"[{phone}] ✅ Сессия сохранена.")
            except Exception as e:
                print(f"[{phone}] ❌ Ошибка: {e}")
        else:
            print(f"[{phone}] Уже авторизован.")

        await client.disconnect()
        idx += 1

async def main():
    await create_sessions()

if __name__ == "__main__":
    asyncio.run(main())
  • Вопрос задан
  • 99 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
А твой прокси отдаёт серверу X-Forwarded-For? Если не ты их конфигурировал, проверь экспериментально.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы