| import os |
| import asyncio |
| import random |
| from argparse import ArgumentParser |
| from pathlib import Path |
| from itertools import cycle |
| from pyrogram import Client |
| from better_proxy import Proxy |
| from bot.utils.logger import log |
| from bot.utils.settings import config, logo |
| from bot.core.bot import run_bot |
|
|
| start_text = logo + """ |
| Select an action: |
| 1. Create session |
| 2. Run bot |
| """ |
|
|
| def get_session_names() -> list[str]: |
| session_path = Path('sessions') |
| session_files = session_path.glob('*.session') |
| session_names = sorted([file.stem for file in session_files]) |
| return session_names |
|
|
| async def register_sessions() -> None: |
| session_name = input('\nEnter the session name (press Enter to exit): ') |
| if not session_name: return None |
| |
| if not os.path.exists(path='sessions'): os.mkdir(path='sessions') |
|
|
| session = Client( |
| name=session_name, |
| api_id=config.API_ID, |
| api_hash=config.API_HASH, |
| workdir="sessions/" |
| ) |
|
|
| async with session: user_data = await session.get_me() |
| log.success(f"Session added successfully: {user_data.username or user_data.id} | " |
| f"{user_data.first_name or ''} {user_data.last_name or ''}") |
|
|
| def get_proxies() -> list[Proxy]: |
| if config.USE_PROXY_FROM_FILE: |
| with open(file='proxies.txt', encoding='utf-8-sig') as file: |
| proxies = sorted([Proxy.from_str(proxy=row.strip()).as_url for row in file if row.strip()]) |
| else: |
| proxies = [] |
|
|
| return proxies |
|
|
| async def get_tg_clients() -> list[Client]: |
| session_names = get_session_names() |
|
|
| if not session_names: |
| raise FileNotFoundError("Not found session files") |
|
|
| tg_clients = [Client( |
| name=session_name, |
| api_id=config.API_ID, |
| api_hash=config.API_HASH, |
| workdir='sessions/', |
| plugins=dict(root='bot/plugins') |
| ) for session_name in session_names] |
|
|
| return tg_clients |
|
|
| async def run_bot_with_delay(tg_client, proxy, delay): |
| if delay > 0: |
| log.info(f"{tg_client.name} | Wait {delay} seconds before start") |
| await asyncio.sleep(delay) |
| await run_bot(tg_client=tg_client, proxy=proxy) |
|
|
| async def run_clients(tg_clients: list[Client]): |
| proxies = get_proxies() |
| proxies_cycle = cycle(proxies) if proxies else cycle([None]) |
| tasks = [] |
| delay = 0 |
| for index, tg_client in enumerate(tg_clients): |
| if index > 0: |
| delay = random.randint(*config.SLEEP_BETWEEN_START) |
| proxy = next(proxies_cycle) |
| task = asyncio.create_task(run_bot_with_delay(tg_client=tg_client, proxy=proxy, delay=delay)) |
| tasks.append(task) |
| await asyncio.gather(*tasks) |
|
|
| async def start() -> None: |
| if not config: |
| log.warning(f"Please fix the above errors in the .env file") |
| return |
| parser = ArgumentParser() |
| parser.add_argument('-a', '--action', type=int, choices=[1, 2], help='Action to perform (1 or 2)') |
| log.info(f"Detected {len(get_session_names())} sessions | {len(get_proxies())} proxies") |
| action = parser.parse_args().action |
|
|
| if not action: |
| print(start_text) |
| while True: |
| action = input('> ').strip() |
| if action.isdigit() and action in ['1', '2']: |
| action = int(action) |
| break |
| log.warning("Action must be a number (1 or 2)") |
|
|
| if action == 1: |
| await register_sessions() |
| elif action == 2: |
| tg_clients = await get_tg_clients() |
| await run_clients(tg_clients=tg_clients) |