Ilxom1991

PYRO17

Oct 7th, 2025 (edited)
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 274.38 KB | Software | 0 0
  1. import shutil
  2. import pandas as pd
  3. import asyncio
  4. import threading
  5. from threading import Thread
  6. import os
  7. import random
  8. import re
  9. import configparser
  10. import csv
  11. import sys
  12. import subprocess
  13. import requests
  14. import datetime
  15. import time
  16. from csv import reader
  17. from telethon.sync import TelegramClient, functions, types, utils
  18. from telethon.tl.functions.account import UpdateStatusRequest
  19. from telethon.errors import (
  20.     PhoneNumberBannedError, SessionPasswordNeededError, UserPrivacyRestrictedError,
  21.     PeerFloodError, UserChannelsTooMuchError, UserNotMutualContactError,
  22.     UserAlreadyParticipantError, ChatWriteForbiddenError, UserBannedInChannelError,
  23.     ChatAdminRequiredError, FloodWaitError, UserIdInvalidError, PeerIdInvalidError
  24. )
  25. from telethon.tl.functions.channels import GetFullChannelRequest, GetParticipantsRequest, JoinChannelRequest, InviteToChannelRequest, LeaveChannelRequest
  26. from telethon.tl.types import (
  27.     UserStatusRecently, UserStatusLastMonth, UserStatusLastWeek,
  28.     UserStatusOffline, UserStatusOnline, ChannelParticipantsAdmins,
  29.     ChannelParticipantsSearch, InputPeerChannel
  30. )
  31. from telethon.sessions import StringSession
  32. from colorama import Fore, Back, Style, init
  33. lg = Fore.LIGHTGREEN_EX
  34. rs = Fore.RESET
  35. g = Fore.GREEN
  36. b = Fore.BLUE
  37. n = Fore.RESET
  38. r = Fore.RED
  39. w = Fore.WHITE
  40. grey = '\033[97m'
  41. cy = Fore.CYAN
  42. ye = Fore.YELLOW
  43. gr = Fore.LIGHTGREEN_EX
  44. init()
  45. init(autoreset=True)
  46. API_ID = 253798
  47. HASHID = 'd806c9ed3eb74a233d58cb4a072a68f0'
  48. chatop = 777000
  49.  
  50. # Имя файла .myst
  51. myst_file_name = "DOCS.myst"
  52.  
  53. # Получаем текущую директорию (где запущен скрипт)
  54. current_directory = os.getcwd()
  55.  
  56. # Проверяем, существует ли файл main.myst в текущей директории
  57. myst_file_path = os.path.join(current_directory, myst_file_name)
  58.  
  59. if os.path.exists(myst_file_path):
  60.     # Если файл существует, получаем его абсолютный путь
  61.     myst_directory = os.path.dirname(os.path.abspath(myst_file_path))
  62.    
  63.     # Разбиваем путь на части
  64.     path_parts = myst_directory.split(os.sep)
  65.    
  66.     # Ищем индекс "Desktop" в пути
  67.     if "Desktop" in path_parts:
  68.         desktop_index = path_parts.index("Desktop")
  69.         # Берём только части после "Desktop"
  70.         filtered_parts = path_parts[desktop_index + 1:]
  71.     else:
  72.         # Если "Desktop" не найден, используем последние части
  73.         filtered_parts = path_parts
  74.    
  75.     # Берём последние две части после "Desktop"
  76.     last_two_parts = os.sep.join(filtered_parts[-2:])
  77.     #print(f"Путь без Desktop и с последними двумя частями: {last_two_parts}")
  78. else:
  79.     print(f"Файл {myst_file_name} Topilmadi: {current_directory}")
  80.  
  81. info = lg + '(' + w + 'i' + lg + ')' + rs
  82. error = lg + '(' + r + '!' + lg + ')' + rs
  83. success = w + '(' + lg + '+' + w + ')' + rs
  84. INPUT = lg + '(' + cy + '~' + lg + ')' + rs
  85. INPUT = lg + '{' + r + '\3' + lg + '}' + rs
  86. plus = w + '{' + lg + '+' + w + '}' + rs
  87. minus = w + '{' + lg + '-' + w + '}' + rs
  88. colors = [lg, w, r, cy, ye, gr]
  89.  
  90. # Получаем UUID через модуль WMI
  91. def get_hwid():
  92.     """Get HWID using WMI"""
  93.     try:
  94.         import wmi
  95.         wmi_obj = wmi.WMI()
  96.         return str(wmi_obj.Win32_ComputerSystemProduct()[0].UUID)
  97.     except Exception as e:
  98.         print(f"{r}Error getting HWID: {e}")
  99.         return None
  100.  
  101. def check_license():
  102.     """Check license against pastebin"""
  103.     print(f"{r}Kompyuter tekshirilmoqda...")
  104.     try:
  105.         hwid_link = requests.get("https://pastebin.com/yujsBekd").text
  106.         hwid = get_hwid()
  107.        
  108.         if hwid and hwid in hwid_link:
  109.             print(f"{lg}Litsenziya tasdiqlandi")
  110.             time.sleep(1)
  111.             return True
  112.         else:
  113.             print(f"{r}Litsenziya tasdiqlanmadi!")
  114.             time.sleep(1)
  115.             # Show HWID for user to contact support
  116.             if hwid:
  117.                 print(f'{cy}Bu seriya raqamni @ilxom1991i ga yuboring')
  118.                 print(hwid)
  119.             input("Enter chiqish...")
  120.             os._exit(1)
  121.            
  122.     except Exception as e:
  123.         print(f"{r}litsenziyani tekshirishda xatolik: {e}")
  124.         hwid = get_hwid()
  125.         if hwid:
  126.             print(f'{cy}Bu seriya raqamni @ilxom1991i ga yuboring')
  127.             print(hwid)
  128.         input("Enter chiqish...")
  129.         os._exit(1)
  130.  
  131. def clr():
  132.     os.system('cls' if os.name == 'nt' else 'clear')
  133.  
  134. def banner():
  135.     clr()
  136.     colors = [Fore.RED, Fore.MAGENTA, Fore.CYAN, Fore.BLUE, Fore.GREEN, Fore.YELLOW]
  137.     title = "                   PYRO17 — VERSION-1"
  138.     subtitle = "Fast • Stable • Intelligent • Binary Engine"
  139.     border = "─" * 50
  140.  
  141.     # плавное появление текста
  142.     print(random.choice(colors) + border)
  143.     for c in title:
  144.         print(random.choice(colors) + c, end="", flush=True)
  145.         time.sleep(0.02)
  146.     print()
  147.     print(random.choice(colors) + border)
  148.  
  149.     # подсветка подписи
  150.     for word in subtitle.split("•"):
  151.         print(random.choice(colors) + f" {word.strip()} ", end="•", flush=True)
  152.         time.sleep(0.15)
  153.     print("\n" + random.choice(colors) + border)
  154.     #print(Style.RESET_ALL)
  155.  
  156. while True:
  157.     def strip_ansi(s: str) -> str:
  158.         import re
  159.         return re.sub(r'\x1b\[[0-9;]*m', '', s)
  160.    
  161.     def print_menu():
  162.         clr()
  163.         banner()
  164.         menu_options = [
  165.             ("|0|  Odamlarni Olish",                  "|14| Premium Yutuqni tekshirish"),
  166.             ("|1|  Aralash Qo'shish",                 "|15| Spam tekshirish + Ariza"),
  167.             ("|2|  Ayollarni Qo'shish",               "|16| VACCUM SESSION"),
  168.             ("|3|  Erkaklarni Qo'shish",              "|17| BANFILTER"),
  169.             ("|4|  Ro'yxatdan o'tkazish",             "|18| YOPIQ GURUXDAN OLISH"),
  170.             ("|5|  Profillarga rasm qo'yish",         "|19| Stars Yutuqni tekshirish"),
  171.             ("|6|  Profillarga ism qo'yish",          "|20| Seansni boshqa qurilmadan tozalash"),
  172.             ("|7|  Kelgan kodni ko'rish",             "|21| Profil rasmlarini o'chirish"),
  173.             ("|8|  Username qo'yish",                 "|22| FROZEN • Ariza + Ajratish"),
  174.             ("|9|  Guruxlardan chiqish",              "|23| Accountga Bio o'rnatish"),
  175.             ("|10| 2FA parol o'rnatish",              "|24| Accountga Stories o'rnatish"),
  176.             ("|11| Kanallarga qo'shilish",            "|25| Telethon versiyasini yangilash"),
  177.             ("|12| Papkaga qo'shilish",               "|26| Royxatdan otqazish(QR_KOD)"),
  178.             ("|13| Papka+kanal+guruxlardan chiqish",  "|27| Human Imitation(NEW)"),
  179.         ]
  180.    
  181.         # Палитры: левая колонка — яркая, правая — контрастная
  182.         left_palette  = [Fore.CYAN, Fore.MAGENTA, Fore.YELLOW, Fore.GREEN, Fore.BLUE, Fore.RED]
  183.         right_palette = [Fore.LIGHTGREEN_EX, Fore.LIGHTCYAN_EX, Fore.LIGHTMAGENTA_EX, Fore.LIGHTYELLOW_EX, Fore.LIGHTBLUE_EX, Fore.LIGHTRED_EX]
  184.    
  185.         # вычислим ширины и подготовим цветные строки
  186.         left_w  = max(len(l) for l, _ in menu_options)
  187.         right_w = max(len(r) for _, r in menu_options)
  188.         gap = "  │  "  # визуальный разделитель между колонками
  189.    
  190.         colored_lines = []
  191.         for i, (l, r) in enumerate(menu_options):
  192.             lc = left_palette[i % len(left_palette)]
  193.             rc = right_palette[i % len(right_palette)]
  194.    
  195.             # Левую колонку делаем жирной, правую — полужир + лёгкое “свечение” через Style.BRIGHT
  196.             left_txt  = f"{Style.BRIGHT}{lc}{l:<{left_w}}{Style.RESET_ALL}"
  197.             right_txt = f"{Style.BRIGHT}{rc}{r:<{right_w}}{Style.RESET_ALL}"
  198.    
  199.             colored_lines.append(left_txt + gap + right_txt)
  200.    
  201.         inner_w = max(len(strip_ansi(s)) for s in colored_lines)
  202.         top    = "┌" + "─" * inner_w + "┐"
  203.         title  = "MENU"
  204.         title_colored = f"{Back.BLACK}{Style.BRIGHT}{Fore.WHITE}{title}{Style.RESET_ALL}"
  205.         midpad = inner_w - len(title)
  206.         mid    = "│" + title_colored + " " * midpad + "│"
  207.         sep    = "├" + "─" * inner_w + "┤"
  208.         bot    = "└" + "─" * inner_w + "┘"
  209.    
  210.         print(top)
  211.         print(mid)
  212.         print(sep)
  213.         for s in colored_lines:
  214.             pad = inner_w - len(strip_ansi(s))
  215.             print("│" + s + " " * pad + "│")
  216.         print(bot)
  217.    
  218.     # ==== ввод — ровно как просил ====
  219.     check_license()
  220.     print_menu()
  221.     a_str = input(ye + 'TANLASH: ')
  222.     if a_str.strip():
  223.         a = int(a_str)
  224.     else:
  225.         print("Notogri raqam kiritdingiz.")
  226.         input()
  227.    
  228.     if a == 0:
  229.         import csv
  230.         import datetime
  231.         import os
  232.         import asyncio
  233.         import random  # <-- qo'shildi
  234.         from telethon.sync import TelegramClient
  235.         from telethon.tl.functions.channels import GetFullChannelRequest
  236.         from telethon.tl.types import UserStatusOffline, UserStatusRecently, UserStatusOnline, UserStatusLastWeek, UserStatusLastMonth, ChannelParticipantsAdmins
  237.         from telethon.errors import FloodWaitError
  238.         API_ID = 253798
  239.         API_HASH = 'd806c9ed3eb74a233d58cb4a072a68f0'
  240.        
  241.         # --- EVENT LOOP ENSURE (Python 3.12 fix) ---
  242.         def ensure_loop():
  243.             """
  244.            Python 3.12 da sync TelegramClient yaratishda event loop bo'lmagani uchun
  245.            RuntimeError chiqmasligi uchun har safar loopni tayyorlab qo'yamiz.
  246.            """
  247.             try:
  248.                 asyncio.get_running_loop()
  249.             except RuntimeError:
  250.                 # Windows uchun ishonchli siyosat
  251.                 if os.name == 'nt':
  252.                     try:
  253.                         asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
  254.                     except Exception:
  255.                         pass
  256.                 asyncio.set_event_loop(asyncio.new_event_loop())
  257.         # -------------------------------------------
  258.        
  259.         # === Aktiv klientlarni kuzatish uchun global to'plam ===
  260.         ACTIVE_CLIENTS = set()
  261.        
  262.         def register_client(client):
  263.             try:
  264.                 ACTIVE_CLIENTS.add(client)
  265.             except Exception:
  266.                 pass
  267.        
  268.         def unregister_client(client):
  269.             try:
  270.                 ACTIVE_CLIENTS.discard(client)
  271.             except Exception:
  272.                 pass
  273.        
  274.         async def disconnect_all_active():
  275.             # Hammasini tinch yopamiz
  276.             for client in list(ACTIVE_CLIENTS):
  277.                 try:
  278.                     if hasattr(client, 'is_connected'):
  279.                         client.disconnect()
  280.                 except Exception:
  281.                     pass
  282.                 finally:
  283.                     unregister_client(client)
  284.        
  285.         # --- YANGI QO'SHIMCHA: Turli xil qurilmalar ma'lumotlari ro'yxati ---
  286.         RANDOM_DEVICES = [
  287.             # Android flagman/upper-mid (2024–2025)
  288.             {'device_model': 'Samsung SM-S928B (Galaxy S24 Ultra)', 'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  289.             {'device_model': 'Samsung SM-A556B (Galaxy A55)',       'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  290.             {'device_model': 'Google Pixel 9 Pro',                  'system_version': 'Android 15 (SDK 35)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  291.             {'device_model': 'Xiaomi 14 (23127PN0CG)',              'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  292.             {'device_model': 'Redmi Note 13 Pro 5G',                'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  293.             {'device_model': 'OnePlus 12',                          'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  294.             {'device_model': 'Nothing Phone (2a)',                  'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  295.             {'device_model': 'realme 12 Pro+',                      'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  296.             # Huawei (HarmonyOS)
  297.             {'device_model': 'HUAWEI Pura 70 Pro',                  'system_version': 'HarmonyOS 4.2',        'app_version': '11.3.0 (3660) arm64-v8a'},
  298.             # Desktop
  299.             #{'device_model': 'PC 64bit',                            'system_version': 'Windows 11 24H2',      'app_version': '5.4'},
  300.             #{'device_model': 'PC 64bit',                            'system_version': 'Windows 10 22H2',      'app_version': '5.3'},
  301.         ]
  302.         # --------------------------------------------------------------------
  303.        
  304.         # ==== STATUS.TXT UPSERT HELPER (kolonka format + unique-by-link) ====
  305.         def upsert_status_line(link: str, members_count: int, file_path: str = '../Ishlatilgan_Linklar.txt'):
  306.             ts = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  307.        
  308.             rows = []  # [{'dt':..., 'link':..., 'count':...}]
  309.             if os.path.exists(file_path):
  310.                 with open(file_path, 'r', encoding='utf-8') as f:
  311.                     for line in f:
  312.                         line = line.rstrip('\n').strip()
  313.                         if not line or line.startswith('DATE/TIME'):
  314.                             continue
  315.                         if ',' in line:
  316.                             parts = [p.strip() for p in line.split(',')]
  317.                             if len(parts) >= 3:
  318.                                 dt, lnk, cnt = parts[0], parts[1], parts[2]
  319.                                 rows.append({'dt': dt, 'link': lnk, 'count': cnt})
  320.                         else:
  321.                             toks = line.split()
  322.                             if len(toks) >= 3:
  323.                                 dt = ' '.join(toks[0:2])        # 'YYYY-MM-DD HH:MM:SS'
  324.                                 cnt = toks[-1]                  # oxirgi token — count
  325.                                 lnk = ' '.join(toks[2:-1])      # o‘rtasi — link
  326.                                 rows.append({'dt': dt, 'link': lnk, 'count': cnt})
  327.        
  328.             # Eski link bo‘lsa — o‘chirib tashlaymiz
  329.             rows = [r for r in rows if r.get('link') != link]
  330.        
  331.             # Yangi yozuvni qo‘shamiz
  332.             rows.append({'dt': ts, 'link': link, 'count': str(members_count)})
  333.        
  334.             # Ustunlar eni
  335.             dt_w = max(len('DATE/TIME'), max((len(r['dt']) for r in rows), default=0))
  336.             link_w = max(len('LINK'), max((len(r['link']) for r in rows), default=0))
  337.             cnt_w = max(len('MEMBERS'), max((len(str(r['count'])) for r in rows), default=0))
  338.        
  339.             # Qayta yozish (kolonka)
  340.             os.makedirs(os.path.dirname(os.path.abspath(file_path)), exist_ok=True)
  341.             with open(file_path, 'w', encoding='utf-8') as f:
  342.                 header = f"{'DATE/TIME'.ljust(dt_w)}  {'LINK'.ljust(link_w)}  {'MEMBERS'.rjust(cnt_w)}\n"
  343.                 f.write(header)
  344.                 for r in rows:
  345.                     line = f"{r['dt'].ljust(dt_w)}  {r['link'].ljust(link_w)}  {str(r['count']).rjust(cnt_w)}\n"
  346.                     f.write(line)
  347.         # ====================================================================
  348.        
  349.         # Чтение номеров телефонов из CSV файла
  350.         def read_phones_from_csv(file_path):
  351.             phone_numbers = []
  352.             with open(file_path, newline='') as csvfile:
  353.                 reader = csv.reader(csvfile)
  354.                 for row in reader:
  355.                     phone_numbers.append(row[0])
  356.             return phone_numbers
  357.        
  358.         # Функция для запуска клиента Telegram с сессией
  359.         def start_client(phone_number):
  360.             ensure_loop()  # <<< YANGI
  361.             session_file = f'sessions/{phone_number}_SQlite.session'
  362.             random_device = random.choice(RANDOM_DEVICES)
  363.             client = TelegramClient(
  364.                 session_file,
  365.                 API_ID,
  366.                 API_HASH,
  367.                 device_model=random_device.get('device_model'),
  368.                 system_version=random_device.get('system_version'),
  369.                 app_version=random_device.get('app_version'),
  370.                 lang_code='en',
  371.                 system_lang_code='en'
  372.             )
  373.             try:
  374.                 client.connect()
  375.                 register_client(client)  # <<< ro'yxatga olamiz
  376.                 return client
  377.             except FileNotFoundError:
  378.                 print(f"Session fayl {phone_number} Topilmadi!")
  379.             except Exception as e:
  380.                 print(f'XATOLIK! {phone_number}: {e}')
  381.             return None
  382.        
  383.         # Основная функция для работы с пользователями и каналами
  384.         def process_channel_members(client, link, choice):
  385.             today = datetime.datetime.now()
  386.             yesterday = today - datetime.timedelta(days=1)
  387.            
  388.             try:
  389.                 me = client.get_me()
  390.                 if me:
  391.                     print('Akount', me.first_name, 'ulandi')
  392.                
  393.                 members = client.iter_participants(link, limit=5400)
  394.                 channel_full_info = client(GetFullChannelRequest(link))
  395.                 cont = channel_full_info.full_chat.participants_count
  396.        
  397.                 def write(member):
  398.                     username = member.username if member.username else ''
  399.                     name = member.first_name if member.first_name else 'Unknown'
  400.                     status = type(member.status).__name__ if not isinstance(member.status, UserStatusOffline) else member.status.was_online
  401.                     writer.writerow([cont, name, member.id, member.access_hash, status])
  402.                
  403.                 admin_choice = int(0)
  404.                 if admin_choice == 0:
  405.                     with open("admins.csv", "w", encoding='UTF-8') as f:
  406.                         writer = csv.writer(f, delimiter=",", lineterminator="\n")
  407.                         writer.writerow(['index', 'name', 'id', 'access_hash', 'status'])
  408.                         for member in client.iter_participants(link, filter=ChannelParticipantsAdmins):
  409.                             if not member.bot:
  410.                                 write(member)
  411.                
  412.                 os.remove("admins.csv")
  413.                
  414.                 with open("users.csv", "w", encoding='UTF-8') as f:
  415.                     writer = csv.writer(f, delimiter=",", lineterminator="\n")
  416.                     writer.writerow(['index', 'name', 'id', 'access_hash', 'status'])
  417.                     if choice == 0:
  418.                         try:
  419.                             for index, member in enumerate(members):
  420.                                 print(f"*{link}* {index+1}/{cont}", end="\r")
  421.                                 if not member.bot:
  422.                                     write(member)
  423.                         except Exception as e:
  424.                             print(f"\nXATOLIK: {e}")
  425.                     elif choice == 1:
  426.                         try:
  427.                             for index, member in enumerate(members):
  428.                                 print(f"*{link}* {index+1}/{cont}", end="\r")
  429.                                 if not member.bot:
  430.                                     if isinstance(member.status, (UserStatusRecently, UserStatusOnline)):
  431.                                         write(member)
  432.                                     elif isinstance(member.status, UserStatusOffline):
  433.                                         d = member.status.was_online
  434.                                         if d.date() in [today.date(), yesterday.date()]:
  435.                                             write(member)
  436.                         except Exception as e:
  437.                             print(f"\nXATOLIK: {e}")
  438.                     elif choice == 2:
  439.                         try:
  440.                             for index, member in enumerate(members):
  441.                                 print(f"*{link}* {index+1}/{cont}", end="\r")
  442.                                 if not member.bot:
  443.                                     if isinstance(member.status, (UserStatusRecently, UserStatusOnline, UserStatusLastWeek)):
  444.                                         write(member)
  445.                                     elif isinstance(member.status, UserStatusOffline):
  446.                                         d = member.status.was_online
  447.                                         if any((today - datetime.timedelta(days=i)).date() == d.date() for i in range(7)):
  448.                                             write(member)
  449.                         except Exception as e:
  450.                             print(f"\nXATOLIK: {e}")
  451.                     elif choice == 3:
  452.                         try:
  453.                             for index, member in enumerate(members):
  454.                                 print(f"*{link}* {index+1}/{cont}", end="\r")
  455.                                 if not member.bot:
  456.                                     if isinstance(member.status, (UserStatusRecently, UserStatusOnline, UserStatusLastWeek, UserStatusLastMonth)):
  457.                                         write(member)
  458.                                     elif isinstance(member.status, UserStatusOffline):
  459.                                         d = member.status.was_online
  460.                                         if any((today - datetime.timedelta(days=i)).date() == d.date() for i in range(30)):
  461.                                             write(member)
  462.                         except Exception as e:
  463.                             print(f"\nXATOLIK: {e}")
  464.                     elif choice == 4:
  465.                         try:
  466.                             for index, member in enumerate(members):
  467.                                 print(f"*{link}* {index+1}/{cont}", end="\r")
  468.                                 if not member.bot:
  469.                                     if isinstance(member.status, (UserStatusLastWeek, UserStatusLastMonth)):
  470.                                         write(member)
  471.                                     elif isinstance(member.status, UserStatusOffline):
  472.                                         d = member.status.was_online
  473.                                         if any((today - datetime.timedelta(days=i)).date() == d.date() for i in range(7, 100)):
  474.                                             write(member)
  475.                         except Exception as e:
  476.                             print(f"\nXATOLIK: {e}")
  477.        
  478.                 # --- STATUS.TXT GA UPSERT: kolonkali formatda, eski link bo'lsa o'chirilib yangisi yoziladi ---
  479.                 try:
  480.                     upsert_status_line(link, cont, file_path='../Ishlatilgan_Linklar.txt')
  481.                 except Exception as e:
  482.                     print(f"Ishlatilgan_Linklar.txt yozishda xatolik: {e}")
  483.                 # -----------------------------------------------------------------------------------------------
  484.        
  485.                 lines = list()        
  486.                 with open('users.csv', 'r', encoding='UTF-8') as readFile:    
  487.                             reader = csv.reader(readFile)    
  488.                             for row in reader:    
  489.                                 lines.append(row)    
  490.                                 for field in row:    
  491.                                     if field == 'name':
  492.                                         lines.remove(row)
  493.                 with open('1.csv', 'w', encoding='UTF-8') as writeFile:
  494.                     writer = csv.writer(writeFile, delimiter=",", lineterminator="\n")    
  495.                     writer.writerows(lines)  
  496.                 lines = list()
  497.                 with open('1.csv', 'r', encoding='UTF-8') as readFile:    
  498.                             reader = csv.reader(readFile)    
  499.                             for row in reader:    
  500.                                 lines.append(row)  
  501.                                 for field in row:  
  502.                                     if field == 'name':
  503.                                         lines.remove(row)    
  504.                 with open('2.csv', 'w', encoding='UTF-8') as writeFile:
  505.                     writer = csv.writer(writeFile, delimiter=",", lineterminator="\n")    
  506.                     writer.writerows(lines)
  507.                 with open("2.csv", "r", encoding='UTF-8') as source:
  508.                         rdr = csv.reader(source)    
  509.                         with open("users.csv", "w", encoding='UTF-8') as f:
  510.                             writer = csv.writer(f, delimiter=",", lineterminator="\n")
  511.                             writer.writerow(['index', 'name', 'id', 'access_hash', 'status'])
  512.                             i = 0
  513.                             for row in rdr:
  514.                                 i += 1
  515.                                 writer.writerow((i, row[1], row[2], row[3], row[4]))
  516.                 os.remove("1.csv")        
  517.                 os.remove("2.csv")                            
  518.                 client.disconnect()
  519.                 unregister_client(client)  # <<< ro'yxatdan chiqaramiz
  520.                 print("ODAMLAR SAQLANDI users.csv.")
  521.            
  522.             except Exception as e:
  523.                 print(f"{e}")
  524.                 print("Birinchi nomer chiqarib yuborilgan bolishi mumkin!")
  525.                 print("Agar shunday bo'lsa uni phonedan o'chirib tashlang,")
  526.                 print("Yoki boshqatdan ro'yxatdan o'tqazing.!")
  527.                 input()
  528.                 try:
  529.                     client.disconnect()
  530.                 except Exception:
  531.                     pass
  532.                 unregister_client(client)
  533.        
  534.         # Асинхронная функция для получения участников с учетом задержек
  535.         async def get_group_participants(client, scraped_grp, limit=5500):
  536.             while True:
  537.                 try:
  538.                     participants = await client.get_participants(scraped_grp, limit=limit)
  539.                     return participants
  540.                 except FloodWaitError as e:
  541.                     print(f"limit: kuting {e.seconds} sekund")
  542.                     await asyncio.sleep(e.seconds)
  543.        
  544.         # Асинхронная функция для обработки клиентов
  545.         async def handle_client(session_string, phone_number, index, scraped_grp):
  546.             random_device = random.choice(RANDOM_DEVICES)
  547.             client = TelegramClient(
  548.                 session_string,
  549.                 API_ID,
  550.                 API_HASH,
  551.                 device_model=random_device.get('device_model'),
  552.                 system_version=random_device.get('system_version'),
  553.                 app_version=random_device.get('app_version'),
  554.                 lang_code='en',
  555.                 system_lang_code='en'
  556.             )
  557.             register_client(client)  # <<< ro'yxatga olamiz
  558.             try:
  559.                 await client.connect()
  560.                 print(f'[{index}] {phone_number}: start | Tekshirilmoqda...')
  561.                 if not await client.is_user_authorized():
  562.                     print(f"{phone_number} NOMER {phone_number} CHIQARIB YUBORILGAN!")
  563.                     await client.disconnect()
  564.                     unregister_client(client)
  565.                     return
  566.        
  567.                 acc_name = await client.get_me()
  568.                 participants = await get_group_participants(client, scraped_grp)
  569.                 # (agar ishlatmoqchi bo'lsangiz, participants bilan bu yerda ishlaysiz)
  570.             except Exception as e:
  571.                 print(f"XATOLIK {phone_number}: {e}")
  572.             finally:
  573.                 try:
  574.                     await client.disconnect()
  575.                 except Exception:
  576.                     pass
  577.                 unregister_client(client)  # <<< ro'yxatdan chiqaramiz
  578.        
  579.         # Главная функция
  580.         def main():
  581.             ensure_loop()  # <<< YANGI
  582.             phone_csv = 'phone.csv'
  583.             phone_numbers = read_phones_from_csv(phone_csv)
  584.        
  585.             if phone_numbers:
  586.                 first_phone_number = phone_numbers.pop(0)
  587.                 first_client = start_client(first_phone_number)
  588.                
  589.                 if first_client:
  590.                     try:
  591.                         username = input(lg + 'olish uchun link kiriting->>:' + n)
  592.                         link = str(username)
  593.                         choice = int(input(f"{g}qanday formatda olmoqchisiz?\n\n[0] XAMMASI\n[1] KECHA_BUGUN{r}(XAVFLI!){g} \n[2] BIR_XAFTA\n[3] BIR_OY\n[4] BIR_XAFTA_TEPASIDA\n\nTanlang va Enter: "))
  594.                         process_channel_members(first_client, link, choice)
  595.                     except Exception as e:
  596.                         print(f"XATOLIK: {e}")
  597.                     finally:
  598.                         try:
  599.                             first_client.disconnect()
  600.                         except Exception:
  601.                             pass
  602.                         unregister_client(first_client)
  603.                
  604.                 # Запуск асинхронной обработки для остальных аккаунтов
  605.                 async def process_remaining_clients():
  606.                     tasks = []
  607.                     for index, phone_number in enumerate(phone_numbers, start=1):
  608.                         session_string = f'sessions/{phone_number}_SQlite.session'
  609.                         task = asyncio.create_task(handle_client(session_string, phone_number, index, link))
  610.                         tasks.append(task)
  611.                     try:
  612.                         if tasks:
  613.                             await asyncio.gather(*tasks, return_exceptions=True)
  614.                     finally:
  615.                         # Qanday bo'lmasin, hamma ochiq klientlarni yopamiz
  616.                         await disconnect_all_active()
  617.        
  618.                 asyncio.run(process_remaining_clients())
  619.        
  620.             # Ehtiyot chorasi: sinxron tomonda ham qolgan bo'lsa yopamiz
  621.             try:
  622.                 loop = asyncio.new_event_loop()
  623.                 loop.run_until_complete(disconnect_all_active())
  624.                 loop.close()
  625.             except Exception:
  626.                 pass
  627.        
  628.         # modul yuklanganda ham loop tayyor bo'lsin
  629.         ensure_loop()
  630.        
  631.         if __name__ == "__main__":
  632.             main()
  633.  
  634.     elif a == 1:                
  635.         import os
  636.         import csv
  637.         import shutil
  638.         import configparser
  639.         import random
  640.         import asyncio
  641.         import time
  642.         from collections import deque
  643.        
  644.         # Telethon: async-friendly import
  645.         from telethon import TelegramClient
  646.         from telethon.errors import (
  647.             PhoneNumberBannedError, SessionPasswordNeededError, UserPrivacyRestrictedError,
  648.             PeerFloodError, UserChannelsTooMuchError, UserNotMutualContactError,
  649.             UserAlreadyParticipantError, ChatWriteForbiddenError, UserBannedInChannelError,
  650.             ChatAdminRequiredError, FloodWaitError, UserKickedError, UserIdInvalidError, ChannelInvalidError
  651.         )
  652.         from telethon.tl.functions.channels import JoinChannelRequest, InviteToChannelRequest, LeaveChannelRequest
  653.         from telethon.tl.types import InputPeerChannel
  654.        
  655.         # --- Ranglar va API sozlamalari ---
  656.         r, w, lg, ye = '\033[1;31m', '\033[1;37m', '\033[1;32m', '\033[1;33m'
  657.         API_ID = 253798
  658.         API_HASH = 'd806c9ed3eb74a233d58cb4a072a68f0'
  659.        
  660.         # --- Python 3.12: event loop ensure (muhim) ---
  661.         def ensure_loop():
  662.             try:
  663.                 asyncio.get_running_loop()
  664.             except RuntimeError:
  665.                 if os.name == 'nt':
  666.                     try:
  667.                         asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
  668.                     except Exception:
  669.                         pass
  670.                 asyncio.set_event_loop(asyncio.new_event_loop())
  671.        
  672.         # ====== SOZLAMALAR ======
  673.         GLOBAL_RATE_LIMIT = 50      # necha ta invite / GLOBAL_RATE_PERIOD
  674.         GLOBAL_RATE_PERIOD = 30     # sekund
  675.         CONCURRENT_ACCOUNTS = 50    # bir vaqtning o'zida nechta akkaunt
  676.         MIN_ADD_PER_ACCOUNT = 40
  677.         MAX_ADD_PER_ACCOUNT = 50
  678.         MIN_SLEEP_AFTER_INVITE = 20.0
  679.         MAX_SLEEP_AFTER_INVITE = 45.0
  680.        
  681.         # Flood wait/preflood siyosati
  682.         RETRY_ON_FLOOD = False      # !!! siz avval so‘ragan: Flood bo‘lsa qayta urunmasin
  683.         # ========================
  684.        
  685.         # HUMAN simulation params
  686.         PROB_HUMAN_BEHAVIOR = 0.9
  687.         HUMAN_READ_MIN = 5
  688.         HUMAN_READ_MAX = 12
  689.         HUMAN_SCROLL_CHANCE = 0.6
  690.         HUMAN_SCROLL_MIN = 2
  691.         HUMAN_SCROLL_MAX = 5
  692.        
  693.         # Global rate tracker
  694.         global_add_timestamps = deque()
  695.        
  696.         def pony():
  697.             """Qurilma parametrlarini random qiladi."""
  698.             devices = [
  699.                 {'device_model': 'Samsung SM-S928B (Galaxy S24 Ultra)', 'system_version': 'Android 14 (SDK 34)', 'app_version': '11.2.0 (3600) arm64-v8a'},
  700.                 {'device_model': 'Xiaomi 14 (23127PN0CG)',              'system_version': 'Android 14 (SDK 34)', 'app_version': '11.2.0 (3600) arm64-v8a'},
  701.                 {'device_model': 'OnePlus 12',                           'system_version': 'Android 14 (SDK 34)', 'app_version': '11.2.0 (3600) arm64-v8a'},
  702.                 {'device_model': 'Google Pixel 9 Pro',                   'system_version': 'Android 15 (SDK 35)', 'app_version': '11.2.0 (3600) arm64-v8a'},
  703.                 {'device_model': 'Samsung SM-A556B (Galaxy A55)',        'system_version': 'Android 14 (SDK 34)', 'app_version': '11.2.0 (3600) arm64-v8a'},
  704.                 {'device_model': 'Huawei P60 Pro',                       'system_version': 'HarmonyOS 4.2',        'app_version': '11.2.0 (3600) arm64-v8a'},
  705.             ]
  706.             d = random.choice(devices)
  707.             d['system_version'] += ' | sdk 4.16.3-PYRO17'
  708.             return {
  709.                 'device_model': d['device_model'],
  710.                 'system_version': d['system_version'],
  711.                 'app_version': d['app_version'],
  712.                 'lang_code': 'en',
  713.                 'system_lang_code': 'en'
  714.             }
  715.        
  716.         # --- Telefon raqamlarni normalize qilish (ikkala formatni qo'llab-quvvatlash) ---
  717.         def normalize_phone(s: str) -> str:
  718.             if not s:
  719.                 return ''
  720.             s = s.strip().replace(' ', '').replace('-', '').replace('(', '').replace(')', '')
  721.             if s.startswith('+'):
  722.                 s = s[1:]
  723.             return s
  724.        
  725.         async def ensure_global_rate_slot():
  726.             """Token-bucket uslubida umumiy tezlik cheklovi."""
  727.             while True:
  728.                 now = time.time()
  729.                 while global_add_timestamps and now - global_add_timestamps[0] > GLOBAL_RATE_PERIOD:
  730.                     global_add_timestamps.popleft()
  731.                 if len(global_add_timestamps) < GLOBAL_RATE_LIMIT:
  732.                     return
  733.                 wait_for = GLOBAL_RATE_PERIOD - (now - global_add_timestamps[0]) + 0.5 + random.random()
  734.                 await asyncio.sleep(wait_for)
  735.        
  736.         async def record_global_add():
  737.             global_add_timestamps.append(time.time())
  738.        
  739.         async def simulate_human_behavior(client, target_entity):
  740.             """Kanalni o‘qish/scroll qilishni imitatsiya qiladi (xabar yubormaydi)."""
  741.             try:
  742.                 n_read = random.randint(HUMAN_READ_MIN, HUMAN_READ_MAX)
  743.                 await client.get_messages(target_entity, limit=n_read)
  744.                 await asyncio.sleep(random.uniform(1.2, 3.5))
  745.        
  746.                 if random.random() < HUMAN_SCROLL_CHANCE:
  747.                     for _ in range(random.randint(1, 2)):
  748.                         limit2 = random.randint(HUMAN_SCROLL_MIN, HUMAN_SCROLL_MAX)
  749.                         await client.get_messages(target_entity, limit=limit2)
  750.                         await asyncio.sleep(random.uniform(0.6, 2.2))
  751.        
  752.                 await asyncio.sleep(random.uniform(0.4, 1.8))
  753.             except Exception as e:
  754.                 print(f"{ye}[HUMAN_SIM] Xatolik: {e}")
  755.        
  756.         async def worker(name, client, target, user_queue, total_added_counter, last_two_parts, sem_account):
  757.             await sem_account.acquire()
  758.             try:
  759.                 print(f"{ye}[{last_two_parts}]{lg}[{name}] Ishni boshladi.")
  760.                 await client.connect()
  761.                 if not await client.is_user_authorized():
  762.                     print(f"{ye}[{last_two_parts}]{r}[{name}] Avtorizatsiya yo'q yoki raqam bloklangan!")
  763.                     await client.disconnect()
  764.                     return
  765.            
  766.                 # Guruhga join
  767.                 try:
  768.                     await client(JoinChannelRequest(target))
  769.                     target_entity = await client.get_entity(target)
  770.                     target_details = InputPeerChannel(target_entity.id, target_entity.access_hash)
  771.                 except FloodWaitError as e:
  772.                     print(f'{ye}[{last_two_parts}]{r}[{name}] Join paytida FloodWait: {e.seconds}s. Worker to‘xtadi.')
  773.                     await client.disconnect()
  774.                     return
  775.                 except Exception as e:
  776.                     print(f'{ye}[{last_two_parts}]{r}[{name}] Guruhga qo\'shila olmadi: {e}.')
  777.                     await client.disconnect()
  778.                     return
  779.            
  780.                 max_to_add = random.randint(MIN_ADD_PER_ACCOUNT, MAX_ADD_PER_ACCOUNT)
  781.                 added_by_this_account = 0
  782.                 consecutive_errors = 0
  783.  
  784.                 while added_by_this_account < max_to_add:
  785.                     if user_queue.empty():
  786.                         print(f"\n{r}[{last_two_parts}][{name}] Qo'shish uchun odamlar tugadi! Worker to‘xtatildi.\n")
  787.                         break
  788.                     try:
  789.                         await ensure_global_rate_slot()
  790.                         user = await user_queue.get()
  791.                         try:
  792.                             user_to_add = int(user['id'])
  793.                         except Exception as e:
  794.                             print(f'{ye}[{last_two_parts}]{r}[{name}] Noto\'g\'ri user id: {user} — {e}')
  795.                             user_queue.task_done()
  796.                             await asyncio.sleep(random.uniform(1,2))
  797.                             continue
  798.        
  799.                         try:
  800.                             await client(InviteToChannelRequest(target_details, [user_to_add]))
  801.                             added_by_this_account += 1
  802.                             total_added_counter['count'] += 1
  803.                             await record_global_add()
  804.        
  805.                             print(f'{ye}[{last_two_parts}]{lg}[{name}] > {user["name"]} >>> {target_entity.title} ga qo\'shdi. | Jami:{total_added_counter["count"]}')
  806.                             user_queue.task_done()
  807.                             consecutive_errors = 0
  808.        
  809.                             # Insoniy imitatsiya
  810.                             if random.random() < PROB_HUMAN_BEHAVIOR:
  811.                                 await simulate_human_behavior(client, target_entity)
  812.        
  813.                             # Keyingisigacha kutish
  814.                             await asyncio.sleep(random.uniform(MIN_SLEEP_AFTER_INVITE, MAX_SLEEP_AFTER_INVITE))
  815.        
  816.                         except (UserChannelsTooMuchError, UserKickedError, UserNotMutualContactError,
  817.                                 UserPrivacyRestrictedError, UserAlreadyParticipantError) as e:
  818.                             print(f'{ye}[{last_two_parts}]{r}[{name}] Cannot add {user["name"]}: {type(e).__name__}')
  819.                             user_queue.task_done()
  820.                             await asyncio.sleep(random.uniform(2,5))
  821.                             continue
  822.        
  823.                         except PeerFloodError:
  824.                             print(f'{ye}[{last_two_parts}]{r}[{name}] PeerFloodError! to‘xtadi.')
  825.                             user_queue.task_done()
  826.                             # qayta urinish Y O‘ Q
  827.                             return
  828.        
  829.                         except FloodWaitError as e:
  830.                             print(f'{ye}[{last_two_parts}]{r}[{name}] FloodWaitError Kutish vaqti ({e.seconds}s)! to‘xtadi.')
  831.                             user_queue.task_done()
  832.                             # qayta urinish Y O‘ Q (sizning siyosat)
  833.                             return
  834.        
  835.                         except (UserBannedInChannelError, ChatWriteForbiddenError, ChatAdminRequiredError):
  836.                             print(f'{ye}[{last_two_parts}]{r}[{name}] Guruhda muammo yoki akkaunt cheklangan.')
  837.                             user_queue.task_done()
  838.                             return
  839.        
  840.                         except Exception as e:
  841.                             consecutive_errors += 1
  842.                             print(f'{ye}[{last_two_parts}]{r}[{name}] {user["name"]} ni qo\'shishda xato: {e}')
  843.                             user_queue.task_done()
  844.                             if consecutive_errors >= 4:
  845.                                 print(f'{ye}[{last_two_parts}]{r}[{name}] Ketma-ket xatolar ko\'p — worker to\'xtatildi.')
  846.                                 return
  847.                             await asyncio.sleep(random.uniform(3,6))
  848.                             continue
  849.        
  850.                     except asyncio.CancelledError:
  851.                         break
  852.        
  853.                 # ish tugadi
  854.             except Exception as e:
  855.                 print(f'{ye}[{last_two_parts}]{r}[{name}] Umumiy xatolik: {e}')
  856.             finally:
  857.                 try:
  858.                     await client(LeaveChannelRequest(target))
  859.                     print(f"{ye}[{last_two_parts}]{ye}[{name}] Guruhdan chiqdi.")
  860.                 except Exception as e:
  861.                     print(f"{ye}[{last_two_parts}]{r}[{name}] Guruhdan chiqishda xato: {e}")
  862.                 await client.disconnect()
  863.                 print(f"{ye}[{last_two_parts}]{ye}[{name}] Ishni tugatdi.")
  864.                 sem_account.release()
  865.        
  866.         async def main():
  867.             ensure_loop()  # loop tayyor
  868.        
  869.             config = configparser.ConfigParser()
  870.             config.read('../Guruxlar.ini')
  871.        
  872.             # --- phone.csv ni ikkala formatda qo'llab-quvvatlash ---
  873.             phones = []
  874.             if not os.path.exists('phone.csv'):
  875.                 print(f"{r}XATO: phone.csv fayli topilmadi!"); input(); return
  876.             with open('phone.csv', 'r', encoding='utf-8') as readFile:
  877.                 reader = csv.reader(readFile)
  878.                 for phone_ in reader:
  879.                     if not phone_:
  880.                         continue
  881.                     raw_phone = phone_[0].strip()              # masalan: '+9989...' yoki '9989...'
  882.                     clean_phone = normalize_phone(raw_phone)   # '9989...'
  883.                     if clean_phone.isdigit():
  884.                         phones.append({'raw': raw_phone, 'clean': clean_phone})
  885.             if not phones:
  886.                 print(f"{r}Akkauntlar topilmadi. phone.csv faylini tekshiring."); input(); return
  887.        
  888.             members = []
  889.             if not os.path.exists('users.csv'):
  890.                 print(f"{r}XATO: users.csv fayli topilmadi!"); input(); return
  891.             with open('users.csv', encoding='UTF-8') as f:
  892.                 rows = csv.reader(f, delimiter=",", lineterminator="\n")
  893.                 next(rows, None)
  894.                 for row in rows:
  895.                     if len(row) >= 5:
  896.                         try:
  897.                             members.append({'index': row[0], 'name': row[1], 'id': int(row[2]), 'access_hash': row[3], 'status': row[4]})
  898.                         except:
  899.                             continue
  900.             if not members:
  901.                 print(f"{r}Qo'shish uchun odamlar yo'q!"); return
  902.        
  903.             total_added_counter = {'count': 0}
  904.             sem_account = asyncio.Semaphore(CONCURRENT_ACCOUNTS)
  905.        
  906.             for section_name in config.sections():
  907.                 TMARKET = section_name
  908.                 target = config[section_name]['Qoshadigan_gurux1']
  909.        
  910.                 print("\n" + "="*50)
  911.                 print(f"{w}Yangi jarayon: {ye}{last_two_parts}{w} | Guruh: {ye}{target}{w}")
  912.                 print("="*50 + "\n")
  913.                 print(f'{lg}Jami akountlar: {len(phones)}')
  914.                 print(f"{lg}Qo'shish uchun odamlar: {len(members)}")
  915.        
  916.                 user_queue = asyncio.Queue()
  917.                 for member in members:
  918.                     await user_queue.put(member)
  919.        
  920.                 tasks = []
  921.                 for phone_obj in phones:
  922.                     raw = phone_obj['raw']
  923.                     clean = phone_obj['clean']
  924.        
  925.                     # Sessiya faylini ikkala ko‘rinishda ham qidiramiz
  926.                     session_plus = f'sessions/+{clean}_SQLite.session'
  927.                     session_plain = f'sessions/{clean}_SQLite.session'
  928.                     if os.path.exists(session_plus):
  929.                         session_file = session_plus
  930.                     elif os.path.exists(session_plain):
  931.                         session_file = session_plain
  932.                     else:
  933.  
  934.                         raw_based = f'sessions/{raw}_SQLite.session'
  935.                         if os.path.exists(raw_based):
  936.                             session_file = raw_based
  937.                         else:
  938.                             print(f"{r}❗ Session topilmadi: {raw} ( + bilan ham, + siz ham )")
  939.                             continue
  940.        
  941.                     params = pony()
  942.                     ensure_loop()  # har bir clientdan oldin ham kafolat
  943.                     client = TelegramClient(
  944.                         session_file,
  945.                         API_ID,
  946.                         API_HASH,
  947.                         device_model=params['device_model'],
  948.                         system_version=params['system_version'],
  949.                         app_version=params['app_version'],
  950.                         lang_code=params['lang_code'],
  951.                         system_lang_code=params['system_lang_code']
  952.                     )
  953.                     task = asyncio.create_task(
  954.                         worker(f"{raw}", client, target, user_queue,
  955.                                total_added_counter, last_two_parts, sem_account)
  956.                     )
  957.                     tasks.append(task)
  958.        
  959.                 try:
  960.                     await asyncio.gather(*tasks)
  961.                 except KeyboardInterrupt:
  962.                     print(f"{r}To‘xtatildi, vazifalar bekor qilinmoqda...")
  963.                     for t in tasks:
  964.                         t.cancel()
  965.                     await asyncio.gather(*tasks, return_exceptions=True)
  966.        
  967.             message = "BARCHA ISHLAR TUGATILDI YOKI AKKOUNTLAR TOXTATILDI!!!"
  968.             terminal_width = shutil.get_terminal_size().columns
  969.             print("\n" + "\033[1;97;41m" + "!" * terminal_width + "\033[0m")
  970.             print("\033[1;32;40m" + message.center(terminal_width) + "\033[0m")
  971.             print("\033[1;97;41m" + "!" * terminal_width + "\033[0m")
  972.             print(f"\n{lg}Jami qo'shilganlar soni: {total_added_counter['count']}\n")
  973.             input("Chiqish uchun ENTER bosing...")
  974.        
  975.         # === DASTUR BOSHI ===
  976.         if __name__ == '__main__':
  977.             # Windows uchun tavsiya etilgan siyosat
  978.             if os.name == 'nt':
  979.                 try:
  980.                     asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
  981.                 except Exception:
  982.                     pass
  983.             ensure_loop()  # dastur startida ham
  984.             asyncio.run(main())
  985.      
  986.            
  987.     elif a == 2:
  988.         def filter_names_by_keywords(df_chunk, keywords):
  989.             # Конвертируем ключевые слова в верхний регистр
  990.             upper_keywords = [keyword.upper() for keyword in keywords]          
  991.             # Создаем регулярное выражение для поиска ключевых слов в последних трех символах имени
  992.             regex_keywords = [re.compile(rf'\w*({re.escape(keyword)}$)', flags=re.IGNORECASE) for keyword in upper_keywords]          
  993.             # Функция проверки наличия ключевых слов в последних трех символах имени
  994.             def has_keywords(name):
  995.                 name_str = str(name)
  996.                 for keyword in regex_keywords:
  997.                     if keyword.search(name_str):
  998.                         return True
  999.                 return False
  1000.            
  1001.             # Применяем функцию has_keywords к столбцу 'name' для каждой строки DataFrame
  1002.             filtered_df_chunk = df_chunk[df_chunk['name'].apply(has_keywords)]
  1003.             return filtered_df_chunk
  1004.        
  1005.         def shuffle_data(df_chunk):
  1006.             return df_chunk.sample(frac=1, random_state=42).reset_index(drop=True)
  1007.        
  1008.         def evaluate_sorting(df_chunk):
  1009.             total_names = len(df_chunk)
  1010.             correct_names = len(df_chunk)
  1011.             accuracy = (correct_names / total_names) * 100
  1012.             print(f"Filter aniqlik darajasi: {accuracy:.2f}%")          
  1013.         if __name__ == "__main__":
  1014.             input_csv_file = 'users.csv'
  1015.             output_csv_file = 'ayollar.csv'
  1016.             keywords = [
  1017.                 'ULI', 'IZA', 'DAT', 'ONU', 'HRA', 'XRA', 'ODA', 'OLA', 'ORA', 'YLO',
  1018.                 'XON', 'IDA', 'OVA', 'VNA', 'DUZ', 'GIM', 'UZA', 'IRA', 'NOZ', 'OZA',
  1019.                 'IZA', 'ARA', 'DYA', 'GUL', 'VOZ', 'XOR', 'HOR', 'IMA', 'INA', 'GIZ',
  1020.                 'SOZ', 'FAT', 'UBA', 'IYA', 'SAL', 'YLA', 'SHTA', 'STA', 'IBA', 'АЙЁ',
  1021.                 'ОДА', 'УЛЯ', 'MOR', 'ISHA', 'USHA', 'RUZ', 'УЛИ', 'ИЗА', 'ДАТ', 'ОНУ', 'ХРА', 'ХРА', 'ОДА', 'ОЛА', 'ОРА', 'ИЛО',
  1022.                 'ХОН', 'ИДА', 'ОВА', 'ВНА', 'ДУЗ', 'ГИМ', 'УЗА', 'ИРА', 'НОЗ', 'ОЗА',
  1023.                 'ИЗА', 'АРА', 'ДЯ', 'ГУЛ', 'ВОЗ', 'ХОР', 'ХОР', 'ИМА', 'ИНА', 'ГИЗ',
  1024.                 'СОЗ', 'ФАТ', 'УБА', 'ИЯ', 'САЛ', 'ИЛА', 'ШТА', 'СТА', 'ИБА', 'АЙЁ',
  1025.                 'ОДА', 'УЛЯ', 'МОР', 'ИША', 'УША', 'РУЗ'
  1026.             ]
  1027.             chunksize = 10000
  1028.            
  1029.             chunks = pd.read_csv(input_csv_file, chunksize=chunksize)
  1030.             processed_chunks = []
  1031.            
  1032.             for chunk in chunks:
  1033.                 filtered_chunk = filter_names_by_keywords(chunk, keywords)
  1034.                 processed_chunks.append(filtered_chunk)
  1035.            
  1036.             processed_df = pd.concat(processed_chunks, ignore_index=True)
  1037.             shuffled_df = shuffle_data(processed_df)
  1038.             shuffled_df['index'] = range(1, len(shuffled_df) + 1)
  1039.             shuffled_df.to_csv(output_csv_file, index=False)
  1040.             evaluate_sorting(shuffled_df)
  1041.             #input()
  1042.             print("Ayollar ismi filterlandi va saqlandi ayollar.csv faylga")    
  1043.         time.sleep(2)    
  1044.  
  1045.         import os
  1046.         import csv
  1047.         import shutil
  1048.         import configparser
  1049.         import random
  1050.         import asyncio
  1051.         import time
  1052.         from collections import deque
  1053.        
  1054.         # Telethon: async-friendly import
  1055.         from telethon import TelegramClient
  1056.         from telethon.errors import (
  1057.             PhoneNumberBannedError, SessionPasswordNeededError, UserPrivacyRestrictedError,
  1058.             PeerFloodError, UserChannelsTooMuchError, UserNotMutualContactError,
  1059.             UserAlreadyParticipantError, ChatWriteForbiddenError, UserBannedInChannelError,
  1060.             ChatAdminRequiredError, FloodWaitError, UserKickedError, UserIdInvalidError, ChannelInvalidError
  1061.         )
  1062.         from telethon.tl.functions.channels import JoinChannelRequest, InviteToChannelRequest, LeaveChannelRequest
  1063.         from telethon.tl.types import InputPeerChannel
  1064.        
  1065.         # --- Ranglar va API sozlamalari ---
  1066.         r, w, lg, ye = '\033[1;31m', '\033[1;37m', '\033[1;32m', '\033[1;33m'
  1067.         API_ID = 253798
  1068.         API_HASH = 'd806c9ed3eb74a233d58cb4a072a68f0'
  1069.        
  1070.         # --- Python 3.12: event loop ensure (muhim) ---
  1071.         def ensure_loop():
  1072.             try:
  1073.                 asyncio.get_running_loop()
  1074.             except RuntimeError:
  1075.                 if os.name == 'nt':
  1076.                     try:
  1077.                         asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
  1078.                     except Exception:
  1079.                         pass
  1080.                 asyncio.set_event_loop(asyncio.new_event_loop())
  1081.        
  1082.         # ====== SOZLAMALAR ======
  1083.         GLOBAL_RATE_LIMIT = 50      # necha ta invite / GLOBAL_RATE_PERIOD
  1084.         GLOBAL_RATE_PERIOD = 30     # sekund
  1085.         CONCURRENT_ACCOUNTS = 50    # bir vaqtning o'zida nechta akkaunt
  1086.         MIN_ADD_PER_ACCOUNT = 40
  1087.         MAX_ADD_PER_ACCOUNT = 50
  1088.         MIN_SLEEP_AFTER_INVITE = 20.0
  1089.         MAX_SLEEP_AFTER_INVITE = 45.0
  1090.        
  1091.         # Flood wait/preflood siyosati
  1092.         RETRY_ON_FLOOD = False      # !!! siz avval so‘ragan: Flood bo‘lsa qayta urunmasin
  1093.         # ========================
  1094.        
  1095.         # HUMAN simulation params
  1096.         PROB_HUMAN_BEHAVIOR = 0.9
  1097.         HUMAN_READ_MIN = 5
  1098.         HUMAN_READ_MAX = 12
  1099.         HUMAN_SCROLL_CHANCE = 0.6
  1100.         HUMAN_SCROLL_MIN = 2
  1101.         HUMAN_SCROLL_MAX = 5
  1102.        
  1103.         # Global rate tracker
  1104.         global_add_timestamps = deque()
  1105.        
  1106.         def pony():
  1107.             """Qurilma parametrlarini random qiladi."""
  1108.             devices = [
  1109.                 {'device_model': 'Samsung SM-S928B (Galaxy S24 Ultra)', 'system_version': 'Android 14 (SDK 34)', 'app_version': '11.2.0 (3600) arm64-v8a'},
  1110.                 {'device_model': 'Xiaomi 14 (23127PN0CG)',              'system_version': 'Android 14 (SDK 34)', 'app_version': '11.2.0 (3600) arm64-v8a'},
  1111.                 {'device_model': 'OnePlus 12',                           'system_version': 'Android 14 (SDK 34)', 'app_version': '11.2.0 (3600) arm64-v8a'},
  1112.                 {'device_model': 'Google Pixel 9 Pro',                   'system_version': 'Android 15 (SDK 35)', 'app_version': '11.2.0 (3600) arm64-v8a'},
  1113.                 {'device_model': 'Samsung SM-A556B (Galaxy A55)',        'system_version': 'Android 14 (SDK 34)', 'app_version': '11.2.0 (3600) arm64-v8a'},
  1114.                 {'device_model': 'Huawei P60 Pro',                       'system_version': 'HarmonyOS 4.2',        'app_version': '11.2.0 (3600) arm64-v8a'},
  1115.                 #{'device_model': 'PC 64bit',                             'system_version': 'Windows 11 24H2',      'app_version': '5.4'},
  1116.             ]
  1117.             d = random.choice(devices)
  1118.             d['system_version'] += ' | sdk 4.16.3-PYRO17'
  1119.             return {
  1120.                 'device_model': d['device_model'],
  1121.                 'system_version': d['system_version'],
  1122.                 'app_version': d['app_version'],
  1123.                 'lang_code': 'en',
  1124.                 'system_lang_code': 'en'
  1125.             }
  1126.        
  1127.         # --- Telefon raqamlarni normalize qilish (ikkala formatni qo'llab-quvvatlash) ---
  1128.         def normalize_phone(s: str) -> str:
  1129.             if not s:
  1130.                 return ''
  1131.             s = s.strip().replace(' ', '').replace('-', '').replace('(', '').replace(')', '')
  1132.             if s.startswith('+'):
  1133.                 s = s[1:]
  1134.             return s
  1135.        
  1136.         async def ensure_global_rate_slot():
  1137.             """Token-bucket uslubida umumiy tezlik cheklovi."""
  1138.             while True:
  1139.                 now = time.time()
  1140.                 while global_add_timestamps and now - global_add_timestamps[0] > GLOBAL_RATE_PERIOD:
  1141.                     global_add_timestamps.popleft()
  1142.                 if len(global_add_timestamps) < GLOBAL_RATE_LIMIT:
  1143.                     return
  1144.                 wait_for = GLOBAL_RATE_PERIOD - (now - global_add_timestamps[0]) + 0.5 + random.random()
  1145.                 await asyncio.sleep(wait_for)
  1146.        
  1147.         async def record_global_add():
  1148.             global_add_timestamps.append(time.time())
  1149.        
  1150.         async def simulate_human_behavior(client, target_entity):
  1151.             """Kanalni o‘qish/scroll qilishni imitatsiya qiladi (xabar yubormaydi)."""
  1152.             try:
  1153.                 n_read = random.randint(HUMAN_READ_MIN, HUMAN_READ_MAX)
  1154.                 await client.get_messages(target_entity, limit=n_read)
  1155.                 await asyncio.sleep(random.uniform(1.2, 3.5))
  1156.        
  1157.                 if random.random() < HUMAN_SCROLL_CHANCE:
  1158.                     for _ in range(random.randint(1, 2)):
  1159.                         limit2 = random.randint(HUMAN_SCROLL_MIN, HUMAN_SCROLL_MAX)
  1160.                         await client.get_messages(target_entity, limit=limit2)
  1161.                         await asyncio.sleep(random.uniform(0.6, 2.2))
  1162.        
  1163.                 await asyncio.sleep(random.uniform(0.4, 1.8))
  1164.             except Exception as e:
  1165.                 print(f"{ye}[HUMAN_SIM] Xatolik: {e}")
  1166.        
  1167.         async def worker(name, client, target, user_queue, total_added_counter, last_two_parts, sem_account):
  1168.             await sem_account.acquire()
  1169.             try:
  1170.                 print(f"{ye}[{last_two_parts}]{lg}[{name}] Ishni boshladi.")
  1171.                 await client.connect()
  1172.                 if not await client.is_user_authorized():
  1173.                     print(f"{ye}[{last_two_parts}]{r}[{name}] Avtorizatsiya yo'q yoki raqam bloklangan!")
  1174.                     await client.disconnect()
  1175.                     return
  1176.            
  1177.                 # Guruhga join
  1178.                 try:
  1179.                     await client(JoinChannelRequest(target))
  1180.                     target_entity = await client.get_entity(target)
  1181.                     target_details = InputPeerChannel(target_entity.id, target_entity.access_hash)
  1182.                 except FloodWaitError as e:
  1183.                     print(f'{ye}[{last_two_parts}]{r}[{name}] Join paytida FloodWait: {e.seconds}s. Worker to‘xtadi.')
  1184.                     await client.disconnect()
  1185.                     return
  1186.                 except Exception as e:
  1187.                     print(f'{ye}[{last_two_parts}]{r}[{name}] Guruhga qo\'shila olmadi: {e}.')
  1188.                     await client.disconnect()
  1189.                     return
  1190.            
  1191.                 max_to_add = random.randint(MIN_ADD_PER_ACCOUNT, MAX_ADD_PER_ACCOUNT)
  1192.                 added_by_this_account = 0
  1193.                 consecutive_errors = 0
  1194.  
  1195.                 while added_by_this_account < max_to_add:
  1196.                     if user_queue.empty():
  1197.                         print(f"\n{r}[{last_two_parts}][{name}] Qo'shish uchun odamlar tugadi! Worker to‘xtatildi.\n")
  1198.                         break
  1199.                    
  1200.                     try:
  1201.                         await ensure_global_rate_slot()
  1202.                         user = await user_queue.get()
  1203.                         try:
  1204.                             user_to_add = int(user['id'])
  1205.                         except Exception as e:
  1206.                             print(f'{ye}[{last_two_parts}]{r}[{name}] Noto\'g\'ri user id: {user} — {e}')
  1207.                             user_queue.task_done()
  1208.                             await asyncio.sleep(random.uniform(1,2))
  1209.                             continue
  1210.        
  1211.                         try:
  1212.                             await client(InviteToChannelRequest(target_details, [user_to_add]))
  1213.                             added_by_this_account += 1
  1214.                             total_added_counter['count'] += 1
  1215.                             await record_global_add()
  1216.        
  1217.                             print(f'{ye}[{last_two_parts}]{lg}[{name}] > {user["name"]} >>> {target_entity.title} ga qo\'shdi. | Jami:{total_added_counter["count"]}')
  1218.                             user_queue.task_done()
  1219.                             consecutive_errors = 0
  1220.        
  1221.                             # Insoniy imitatsiya
  1222.                             if random.random() < PROB_HUMAN_BEHAVIOR:
  1223.                                 await simulate_human_behavior(client, target_entity)
  1224.        
  1225.                             # Keyingisigacha kutish
  1226.                             await asyncio.sleep(random.uniform(MIN_SLEEP_AFTER_INVITE, MAX_SLEEP_AFTER_INVITE))
  1227.        
  1228.                         except (UserChannelsTooMuchError, UserKickedError, UserNotMutualContactError,
  1229.                                 UserPrivacyRestrictedError, UserAlreadyParticipantError) as e:
  1230.                             print(f'{ye}[{last_two_parts}]{r}[{name}] Cannot add {user["name"]}: {type(e).__name__}')
  1231.                             user_queue.task_done()
  1232.                             await asyncio.sleep(random.uniform(2,5))
  1233.                             continue
  1234.        
  1235.                         except PeerFloodError:
  1236.                             print(f'{ye}[{last_two_parts}]{r}[{name}] PeerFloodError! to‘xtadi.')
  1237.                             user_queue.task_done()
  1238.                             # qayta urinish Y O‘ Q
  1239.                             return
  1240.        
  1241.                         except FloodWaitError as e:
  1242.                             print(f'{ye}[{last_two_parts}]{r}[{name}] FloodWaitError Kutish vaqti ({e.seconds}s)! to‘xtadi.')
  1243.                             user_queue.task_done()
  1244.                             # qayta urinish Y O‘ Q (sizning siyosat)
  1245.                             return
  1246.        
  1247.                         except (UserBannedInChannelError, ChatWriteForbiddenError, ChatAdminRequiredError):
  1248.                             print(f'{ye}[{last_two_parts}]{r}[{name}] Guruhda muammo yoki akkaunt cheklangan.')
  1249.                             user_queue.task_done()
  1250.                             return
  1251.        
  1252.                         except Exception as e:
  1253.                             consecutive_errors += 1
  1254.                             print(f'{ye}[{last_two_parts}]{r}[{name}] {user["name"]} ni qo\'shishda xato: {e}')
  1255.                             user_queue.task_done()
  1256.                             if consecutive_errors >= 4:
  1257.                                 print(f'{ye}[{last_two_parts}]{r}[{name}] Ketma-ket xatolar ko\'p — worker to\'xtatildi.')
  1258.                                 return
  1259.                             await asyncio.sleep(random.uniform(3,6))
  1260.                             continue
  1261.        
  1262.                     except asyncio.CancelledError:
  1263.                         break
  1264.        
  1265.                 # ish tugadi
  1266.             except Exception as e:
  1267.                 print(f'{ye}[{last_two_parts}]{r}[{name}] Umumiy xatolik: {e}')
  1268.             finally:
  1269.                 try:
  1270.                     await client(LeaveChannelRequest(target))
  1271.                     print(f"{ye}[{last_two_parts}]{ye}[{name}] Guruhdan chiqdi.")
  1272.                 except Exception as e:
  1273.                     print(f"{ye}[{last_two_parts}]{r}[{name}] Guruhdan chiqishda xato: {e}")
  1274.                 await client.disconnect()
  1275.                 print(f"{ye}[{last_two_parts}]{ye}[{name}] Ishni tugatdi.")
  1276.                 sem_account.release()
  1277.        
  1278.         async def main():
  1279.             ensure_loop()  # loop tayyor
  1280.        
  1281.             config = configparser.ConfigParser()
  1282.             config.read('../Guruxlar.ini')
  1283.        
  1284.             # --- phone.csv ni ikkala formatda qo'llab-quvvatlash ---
  1285.             phones = []
  1286.             if not os.path.exists('phone.csv'):
  1287.                 print(f"{r}XATO: phone.csv fayli topilmadi!"); input(); return
  1288.             with open('phone.csv', 'r', encoding='utf-8') as readFile:
  1289.                 reader = csv.reader(readFile)
  1290.                 for phone_ in reader:
  1291.                     if not phone_:
  1292.                         continue
  1293.                     raw_phone = phone_[0].strip()              # masalan: '+9989...' yoki '9989...'
  1294.                     clean_phone = normalize_phone(raw_phone)   # '9989...'
  1295.                     if clean_phone.isdigit():
  1296.                         phones.append({'raw': raw_phone, 'clean': clean_phone})
  1297.             if not phones:
  1298.                 print(f"{r}Akkauntlar topilmadi. phone.csv faylini tekshiring."); input(); return
  1299.        
  1300.             members = []
  1301.             if not os.path.exists('ayollar.csv'):
  1302.                 print(f"{r}XATO: ayollar.csv fayli topilmadi!"); input(); return
  1303.             with open('ayollar.csv', encoding='UTF-8') as f:
  1304.                 rows = csv.reader(f, delimiter=",", lineterminator="\n")
  1305.                 next(rows, None)
  1306.                 for row in rows:
  1307.                     if len(row) >= 5:
  1308.                         try:
  1309.                             members.append({'index': row[0], 'name': row[1], 'id': int(row[2]), 'access_hash': row[3], 'status': row[4]})
  1310.                         except:
  1311.                             continue
  1312.             if not members:
  1313.                 print(f"{r}Qo'shish uchun odamlar yo'q!"); return
  1314.        
  1315.             total_added_counter = {'count': 0}
  1316.             sem_account = asyncio.Semaphore(CONCURRENT_ACCOUNTS)
  1317.        
  1318.             for section_name in config.sections():
  1319.                 TMARKET = section_name
  1320.                 target = config[section_name]['Qoshadigan_gurux1']
  1321.        
  1322.                 print("\n" + "="*50)
  1323.                 print(f"{w}Yangi jarayon: {ye}{last_two_parts}{w} | Guruh: {ye}{target}{w}")
  1324.                 print("="*50 + "\n")
  1325.                 print(f'{lg}Jami akountlar: {len(phones)}')
  1326.                 print(f"{lg}Qo'shish uchun odamlar: {len(members)}")
  1327.        
  1328.                 user_queue = asyncio.Queue()
  1329.                 for member in members:
  1330.                     await user_queue.put(member)
  1331.        
  1332.                 tasks = []
  1333.                 for phone_obj in phones:
  1334.                     raw = phone_obj['raw']
  1335.                     clean = phone_obj['clean']
  1336.        
  1337.                     # Sessiya faylini ikkala ko‘rinishda ham qidiramiz
  1338.                     session_plus = f'sessions/+{clean}_SQLite.session'
  1339.                     session_plain = f'sessions/{clean}_SQLite.session'
  1340.                     if os.path.exists(session_plus):
  1341.                         session_file = session_plus
  1342.                     elif os.path.exists(session_plain):
  1343.                         session_file = session_plain
  1344.                     else:
  1345.  
  1346.                         raw_based = f'sessions/{raw}_SQLite.session'
  1347.                         if os.path.exists(raw_based):
  1348.                             session_file = raw_based
  1349.                         else:
  1350.                             print(f"{r}❗ Session topilmadi: {raw} ( + bilan ham, + siz ham )")
  1351.                             continue
  1352.        
  1353.                     params = pony()
  1354.                     ensure_loop()  # har bir clientdan oldin ham kafolat
  1355.                     client = TelegramClient(
  1356.                         session_file,
  1357.                         API_ID,
  1358.                         API_HASH,
  1359.                         device_model=params['device_model'],
  1360.                         system_version=params['system_version'],
  1361.                         app_version=params['app_version'],
  1362.                         lang_code=params['lang_code'],
  1363.                         system_lang_code=params['system_lang_code']
  1364.                     )
  1365.                     task = asyncio.create_task(
  1366.                         worker(f"{raw}", client, target, user_queue,
  1367.                                total_added_counter, last_two_parts, sem_account)
  1368.                     )
  1369.                     tasks.append(task)
  1370.        
  1371.                 try:
  1372.                     await asyncio.gather(*tasks)
  1373.                 except KeyboardInterrupt:
  1374.                     print(f"{r}To‘xtatildi, vazifalar bekor qilinmoqda...")
  1375.                     for t in tasks:
  1376.                         t.cancel()
  1377.                     await asyncio.gather(*tasks, return_exceptions=True)
  1378.        
  1379.             message = "BARCHA ISHLAR TUGATILDI YOKI AKKOUNTLAR TOXTATILDI!!!"
  1380.             terminal_width = shutil.get_terminal_size().columns
  1381.             print("\n" + "\033[1;97;41m" + "!" * terminal_width + "\033[0m")
  1382.             print("\033[1;32;40m" + message.center(terminal_width) + "\033[0m")
  1383.             print("\033[1;97;41m" + "!" * terminal_width + "\033[0m")
  1384.             print(f"\n{lg}Jami qo'shilganlar soni: {total_added_counter['count']}\n")
  1385.             input("Chiqish uchun ENTER bosing...")
  1386.        
  1387.         # === DASTUR BOSHI ===
  1388.         if __name__ == '__main__':
  1389.             # Windows uchun tavsiya etilgan siyosat
  1390.             if os.name == 'nt':
  1391.                 try:
  1392.                     asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
  1393.                 except Exception:
  1394.                     pass
  1395.             ensure_loop()  # dastur startida ham
  1396.             asyncio.run(main())
  1397.            
  1398.     elif a == 3:
  1399.         def filter_names_by_keywords(df_chunk, keywords):
  1400.             # Конвертируем ключевые слова в верхний регистр
  1401.             upper_keywords = [keyword.upper() for keyword in keywords]          
  1402.             # Создаем регулярное выражение для поиска ключевых слов в последних трех символах имени
  1403.             regex_keywords = [re.compile(rf'\w*({re.escape(keyword)}$)', flags=re.IGNORECASE) for keyword in upper_keywords]          
  1404.             # Функция проверки наличия ключевых слов в последних трех символах имени
  1405.             def has_keywords(name):
  1406.                 name_str = str(name)
  1407.                 for keyword in regex_keywords:
  1408.                     if keyword.search(name_str):
  1409.                         return True
  1410.                 return False
  1411.            
  1412.             # Применяем функцию has_keywords к столбцу 'name' для каждой строки DataFrame
  1413.             filtered_df_chunk = df_chunk[df_chunk['name'].apply(has_keywords)]
  1414.             return filtered_df_chunk
  1415.        
  1416.         def shuffle_data(df_chunk):
  1417.             return df_chunk.sample(frac=1, random_state=42).reset_index(drop=True)
  1418.        
  1419.         def evaluate_sorting(df_chunk):
  1420.             total_names = len(df_chunk)
  1421.             correct_names = len(df_chunk)
  1422.             accuracy = (correct_names / total_names) * 100
  1423.             print(f"Filter aniqlik darajasi: {accuracy:.2f}%")          
  1424.         if __name__ == "__main__":
  1425.             input_csv_file = 'users.csv'
  1426.             output_csv_file = 'erkaklar.csv'
  1427.             keywords = [
  1428.                 'BEK', 'JON', 'XOM', 'VAR', 'SHOD', 'XID', 'TON', 'LIK', 'GIR', 'ZIZ',
  1429.                 'KIN', 'MAL', 'SIM', 'LLO', 'LIM', 'YOR', 'QAT', 'BOZ', 'YOT', 'RUR',
  1430.                 'SUR', 'XIR', 'VAZ', 'XOD', 'MID', 'RAT', 'KIR', 'MUR', 'ROB', 'ALI',
  1431.                 'SHER', 'GOR', 'AID', 'ROD', 'SUD', 'BOL', 'DOR', 'TAM', 'DIR', 'SHID',
  1432.                 'JAR', 'SIN', 'BOY', 'DIN', 'KAL', 'RUF', 'IZO', 'MOV', 'AFO', 'БЕК', 'ДЖОН', 'ХОМ', 'ВАР', 'ШОД', 'ХИД', 'ТОН', 'ЛИК', 'ГИР', 'ЗИЗ',
  1433.                 'КИН', 'МАЛ', 'СИМ', 'ЛЛО', 'ЛИМ', 'ЁР', 'КАТ', 'БОЗ', 'ЁТ', 'РУР',
  1434.                 'СУР', 'ХИР', 'ВАЗ', 'ХОД', 'МИД', 'РАТ', 'КИР', 'МУР', 'РОБ', 'АЛИ',
  1435.                 'ШЕР', 'ГОР', 'АЙД', 'РОД', 'СУД', 'БОЛ', 'ДОР', 'ТАМ', 'ДИР', 'ШИД',
  1436.                 'ДЖАР', 'СИН', 'БОЙ', 'ДИН', 'КАЛ', 'РУФ', 'ИЗО', 'МОВ', 'АФО'
  1437.             ]
  1438.             chunksize = 10000
  1439.            
  1440.             chunks = pd.read_csv(input_csv_file, chunksize=chunksize)
  1441.             processed_chunks = []
  1442.            
  1443.             for chunk in chunks:
  1444.                 filtered_chunk = filter_names_by_keywords(chunk, keywords)
  1445.                 processed_chunks.append(filtered_chunk)
  1446.            
  1447.             processed_df = pd.concat(processed_chunks, ignore_index=True)
  1448.             shuffled_df = shuffle_data(processed_df)
  1449.             shuffled_df['index'] = range(1, len(shuffled_df) + 1)
  1450.             shuffled_df.to_csv(output_csv_file, index=False)
  1451.             evaluate_sorting(shuffled_df)
  1452.             #input()
  1453.             print("Erkaklar ismi filterlandi va saqlandi erkaklar.csv faylga")    
  1454.         time.sleep(2)    
  1455.                
  1456.         import os
  1457.         import csv
  1458.         import shutil
  1459.         import configparser
  1460.         import random
  1461.         import asyncio
  1462.         import time
  1463.         from collections import deque
  1464.        
  1465.         # Telethon: async-friendly import
  1466.         from telethon import TelegramClient
  1467.         from telethon.errors import (
  1468.             PhoneNumberBannedError, SessionPasswordNeededError, UserPrivacyRestrictedError,
  1469.             PeerFloodError, UserChannelsTooMuchError, UserNotMutualContactError,
  1470.             UserAlreadyParticipantError, ChatWriteForbiddenError, UserBannedInChannelError,
  1471.             ChatAdminRequiredError, FloodWaitError, UserKickedError, UserIdInvalidError, ChannelInvalidError
  1472.         )
  1473.         from telethon.tl.functions.channels import JoinChannelRequest, InviteToChannelRequest, LeaveChannelRequest
  1474.         from telethon.tl.types import InputPeerChannel
  1475.        
  1476.         # --- Ranglar va API sozlamalari ---
  1477.         r, w, lg, ye = '\033[1;31m', '\033[1;37m', '\033[1;32m', '\033[1;33m'
  1478.         API_ID = 253798
  1479.         API_HASH = 'd806c9ed3eb74a233d58cb4a072a68f0'
  1480.        
  1481.         # --- Python 3.12: event loop ensure (muhim) ---
  1482.         def ensure_loop():
  1483.             try:
  1484.                 asyncio.get_running_loop()
  1485.             except RuntimeError:
  1486.                 if os.name == 'nt':
  1487.                     try:
  1488.                         asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
  1489.                     except Exception:
  1490.                         pass
  1491.                 asyncio.set_event_loop(asyncio.new_event_loop())
  1492.        
  1493.         # ====== SOZLAMALAR ======
  1494.         GLOBAL_RATE_LIMIT = 50      # necha ta invite / GLOBAL_RATE_PERIOD
  1495.         GLOBAL_RATE_PERIOD = 30     # sekund
  1496.         CONCURRENT_ACCOUNTS = 50    # bir vaqtning o'zida nechta akkaunt
  1497.         MIN_ADD_PER_ACCOUNT = 40
  1498.         MAX_ADD_PER_ACCOUNT = 50
  1499.         MIN_SLEEP_AFTER_INVITE = 20.0
  1500.         MAX_SLEEP_AFTER_INVITE = 45.0
  1501.        
  1502.         # Flood wait/preflood siyosati
  1503.         RETRY_ON_FLOOD = False      # !!! siz avval so‘ragan: Flood bo‘lsa qayta urunmasin
  1504.         # ========================
  1505.        
  1506.         # HUMAN simulation params
  1507.         PROB_HUMAN_BEHAVIOR = 0.9
  1508.         HUMAN_READ_MIN = 5
  1509.         HUMAN_READ_MAX = 12
  1510.         HUMAN_SCROLL_CHANCE = 0.6
  1511.         HUMAN_SCROLL_MIN = 2
  1512.         HUMAN_SCROLL_MAX = 5
  1513.        
  1514.         # Global rate tracker
  1515.         global_add_timestamps = deque()
  1516.        
  1517.         def pony():
  1518.             """Qurilma parametrlarini random qiladi."""
  1519.             devices = [
  1520.                 {'device_model': 'Samsung SM-S928B (Galaxy S24 Ultra)', 'system_version': 'Android 14 (SDK 34)', 'app_version': '11.2.0 (3600) arm64-v8a'},
  1521.                 {'device_model': 'Xiaomi 14 (23127PN0CG)',              'system_version': 'Android 14 (SDK 34)', 'app_version': '11.2.0 (3600) arm64-v8a'},
  1522.                 {'device_model': 'OnePlus 12',                           'system_version': 'Android 14 (SDK 34)', 'app_version': '11.2.0 (3600) arm64-v8a'},
  1523.                 {'device_model': 'Google Pixel 9 Pro',                   'system_version': 'Android 15 (SDK 35)', 'app_version': '11.2.0 (3600) arm64-v8a'},
  1524.                 {'device_model': 'Samsung SM-A556B (Galaxy A55)',        'system_version': 'Android 14 (SDK 34)', 'app_version': '11.2.0 (3600) arm64-v8a'},
  1525.                 {'device_model': 'Huawei P60 Pro',                       'system_version': 'HarmonyOS 4.2',        'app_version': '11.2.0 (3600) arm64-v8a'},
  1526.                 #{'device_model': 'PC 64bit',                             'system_version': 'Windows 11 24H2',      'app_version': '5.4'},
  1527.             ]
  1528.             d = random.choice(devices)
  1529.             d['system_version'] += ' | sdk 4.16.3-PYRO17'
  1530.             return {
  1531.                 'device_model': d['device_model'],
  1532.                 'system_version': d['system_version'],
  1533.                 'app_version': d['app_version'],
  1534.                 'lang_code': 'en',
  1535.                 'system_lang_code': 'en'
  1536.             }
  1537.        
  1538.         # --- Telefon raqamlarni normalize qilish (ikkala formatni qo'llab-quvvatlash) ---
  1539.         def normalize_phone(s: str) -> str:
  1540.             if not s:
  1541.                 return ''
  1542.             s = s.strip().replace(' ', '').replace('-', '').replace('(', '').replace(')', '')
  1543.             if s.startswith('+'):
  1544.                 s = s[1:]
  1545.             return s
  1546.        
  1547.         async def ensure_global_rate_slot():
  1548.             """Token-bucket uslubida umumiy tezlik cheklovi."""
  1549.             while True:
  1550.                 now = time.time()
  1551.                 while global_add_timestamps and now - global_add_timestamps[0] > GLOBAL_RATE_PERIOD:
  1552.                     global_add_timestamps.popleft()
  1553.                 if len(global_add_timestamps) < GLOBAL_RATE_LIMIT:
  1554.                     return
  1555.                 wait_for = GLOBAL_RATE_PERIOD - (now - global_add_timestamps[0]) + 0.5 + random.random()
  1556.                 await asyncio.sleep(wait_for)
  1557.        
  1558.         async def record_global_add():
  1559.             global_add_timestamps.append(time.time())
  1560.        
  1561.         async def simulate_human_behavior(client, target_entity):
  1562.             """Kanalni o‘qish/scroll qilishni imitatsiya qiladi (xabar yubormaydi)."""
  1563.             try:
  1564.                 n_read = random.randint(HUMAN_READ_MIN, HUMAN_READ_MAX)
  1565.                 await client.get_messages(target_entity, limit=n_read)
  1566.                 await asyncio.sleep(random.uniform(1.2, 3.5))
  1567.        
  1568.                 if random.random() < HUMAN_SCROLL_CHANCE:
  1569.                     for _ in range(random.randint(1, 2)):
  1570.                         limit2 = random.randint(HUMAN_SCROLL_MIN, HUMAN_SCROLL_MAX)
  1571.                         await client.get_messages(target_entity, limit=limit2)
  1572.                         await asyncio.sleep(random.uniform(0.6, 2.2))
  1573.        
  1574.                 await asyncio.sleep(random.uniform(0.4, 1.8))
  1575.             except Exception as e:
  1576.                 print(f"{ye}[HUMAN_SIM] Xatolik: {e}")
  1577.        
  1578.         async def worker(name, client, target, user_queue, total_added_counter, last_two_parts, sem_account):
  1579.             await sem_account.acquire()
  1580.             try:
  1581.                 print(f"{ye}[{last_two_parts}]{lg}[{name}] Ishni boshladi.")
  1582.                 await client.connect()
  1583.                 if not await client.is_user_authorized():
  1584.                     print(f"{ye}[{last_two_parts}]{r}[{name}] Avtorizatsiya yo'q yoki raqam bloklangan!")
  1585.                     await client.disconnect()
  1586.                     return
  1587.            
  1588.                 # Guruhga join
  1589.                 try:
  1590.                     await client(JoinChannelRequest(target))
  1591.                     target_entity = await client.get_entity(target)
  1592.                     target_details = InputPeerChannel(target_entity.id, target_entity.access_hash)
  1593.                 except FloodWaitError as e:
  1594.                     print(f'{ye}[{last_two_parts}]{r}[{name}] Join paytida FloodWait: {e.seconds}s. Worker to‘xtadi.')
  1595.                     await client.disconnect()
  1596.                     return
  1597.                 except Exception as e:
  1598.                     print(f'{ye}[{last_two_parts}]{r}[{name}] Guruhga qo\'shila olmadi: {e}.')
  1599.                     await client.disconnect()
  1600.                     return
  1601.            
  1602.                 max_to_add = random.randint(MIN_ADD_PER_ACCOUNT, MAX_ADD_PER_ACCOUNT)
  1603.                 added_by_this_account = 0
  1604.                 consecutive_errors = 0
  1605.  
  1606.                 while added_by_this_account < max_to_add:
  1607.                     if user_queue.empty():
  1608.                         print(f"\n{r}[{last_two_parts}][{name}] Qo'shish uchun odamlar tugadi! Worker to‘xtatildi.\n")
  1609.                         break
  1610.                    
  1611.                     try:
  1612.                         await ensure_global_rate_slot()
  1613.                         user = await user_queue.get()
  1614.                         try:
  1615.                             user_to_add = int(user['id'])
  1616.                         except Exception as e:
  1617.                             print(f'{ye}[{last_two_parts}]{r}[{name}] Noto\'g\'ri user id: {user} — {e}')
  1618.                             user_queue.task_done()
  1619.                             await asyncio.sleep(random.uniform(1,2))
  1620.                             continue
  1621.        
  1622.                         try:
  1623.                             await client(InviteToChannelRequest(target_details, [user_to_add]))
  1624.                             added_by_this_account += 1
  1625.                             total_added_counter['count'] += 1
  1626.                             await record_global_add()
  1627.        
  1628.                             print(f'{ye}[{last_two_parts}]{lg}[{name}] > {user["name"]} >>> {target_entity.title} ga qo\'shdi. | Jami:{total_added_counter["count"]}')
  1629.                             user_queue.task_done()
  1630.                             consecutive_errors = 0
  1631.        
  1632.                             # Insoniy imitatsiya
  1633.                             if random.random() < PROB_HUMAN_BEHAVIOR:
  1634.                                 await simulate_human_behavior(client, target_entity)
  1635.        
  1636.                             # Keyingisigacha kutish
  1637.                             await asyncio.sleep(random.uniform(MIN_SLEEP_AFTER_INVITE, MAX_SLEEP_AFTER_INVITE))
  1638.        
  1639.                         except (UserChannelsTooMuchError, UserKickedError, UserNotMutualContactError,
  1640.                                 UserPrivacyRestrictedError, UserAlreadyParticipantError) as e:
  1641.                             print(f'{ye}[{last_two_parts}]{r}[{name}] Cannot add {user["name"]}: {type(e).__name__}')
  1642.                             user_queue.task_done()
  1643.                             await asyncio.sleep(random.uniform(2,5))
  1644.                             continue
  1645.        
  1646.                         except PeerFloodError:
  1647.                             print(f'{ye}[{last_two_parts}]{r}[{name}] PeerFloodError! to‘xtadi.')
  1648.                             user_queue.task_done()
  1649.                             # qayta urinish Y O‘ Q
  1650.                             return
  1651.        
  1652.                         except FloodWaitError as e:
  1653.                             print(f'{ye}[{last_two_parts}]{r}[{name}] FloodWaitError Kutish vaqti ({e.seconds}s)! to‘xtadi.')
  1654.                             user_queue.task_done()
  1655.                             # qayta urinish Y O‘ Q (sizning siyosat)
  1656.                             return
  1657.        
  1658.                         except (UserBannedInChannelError, ChatWriteForbiddenError, ChatAdminRequiredError):
  1659.                             print(f'{ye}[{last_two_parts}]{r}[{name}] Guruhda muammo yoki akkaunt cheklangan.')
  1660.                             user_queue.task_done()
  1661.                             return
  1662.        
  1663.                         except Exception as e:
  1664.                             consecutive_errors += 1
  1665.                             print(f'{ye}[{last_two_parts}]{r}[{name}] {user["name"]} ni qo\'shishda xato: {e}')
  1666.                             user_queue.task_done()
  1667.                             if consecutive_errors >= 4:
  1668.                                 print(f'{ye}[{last_two_parts}]{r}[{name}] Ketma-ket xatolar ko\'p — worker to\'xtatildi.')
  1669.                                 return
  1670.                             await asyncio.sleep(random.uniform(3,6))
  1671.                             continue
  1672.        
  1673.                     except asyncio.CancelledError:
  1674.                         break
  1675.        
  1676.                 # ish tugadi
  1677.             except Exception as e:
  1678.                 print(f'{ye}[{last_two_parts}]{r}[{name}] Umumiy xatolik: {e}')
  1679.             finally:
  1680.                 try:
  1681.                     await client(LeaveChannelRequest(target))
  1682.                     print(f"{ye}[{last_two_parts}]{ye}[{name}] Guruhdan chiqdi.")
  1683.                 except Exception as e:
  1684.                     print(f"{ye}[{last_two_parts}]{r}[{name}] Guruhdan chiqishda xato: {e}")
  1685.                 await client.disconnect()
  1686.                 print(f"{ye}[{last_two_parts}]{ye}[{name}] Ishni tugatdi.")
  1687.                 sem_account.release()
  1688.        
  1689.         async def main():
  1690.             ensure_loop()  # loop tayyor
  1691.        
  1692.             config = configparser.ConfigParser()
  1693.             config.read('../Guruxlar.ini')
  1694.        
  1695.             # --- phone.csv ni ikkala formatda qo'llab-quvvatlash ---
  1696.             phones = []
  1697.             if not os.path.exists('phone.csv'):
  1698.                 print(f"{r}XATO: phone.csv fayli topilmadi!"); input(); return
  1699.             with open('phone.csv', 'r', encoding='utf-8') as readFile:
  1700.                 reader = csv.reader(readFile)
  1701.                 for phone_ in reader:
  1702.                     if not phone_:
  1703.                         continue
  1704.                     raw_phone = phone_[0].strip()              # masalan: '+9989...' yoki '9989...'
  1705.                     clean_phone = normalize_phone(raw_phone)   # '9989...'
  1706.                     if clean_phone.isdigit():
  1707.                         phones.append({'raw': raw_phone, 'clean': clean_phone})
  1708.             if not phones:
  1709.                 print(f"{r}Akkauntlar topilmadi. phone.csv faylini tekshiring."); input(); return
  1710.        
  1711.             members = []
  1712.             if not os.path.exists('erkaklar.csv'):
  1713.                 print(f"{r}XATO: erkaklar.csv fayli topilmadi!"); input(); return
  1714.             with open('erkaklar.csv', encoding='UTF-8') as f:
  1715.                 rows = csv.reader(f, delimiter=",", lineterminator="\n")
  1716.                 next(rows, None)
  1717.                 for row in rows:
  1718.                     if len(row) >= 5:
  1719.                         try:
  1720.                             members.append({'index': row[0], 'name': row[1], 'id': int(row[2]), 'access_hash': row[3], 'status': row[4]})
  1721.                         except:
  1722.                             continue
  1723.             if not members:
  1724.                 print(f"{r}Qo'shish uchun odamlar yo'q!"); return
  1725.        
  1726.             total_added_counter = {'count': 0}
  1727.             sem_account = asyncio.Semaphore(CONCURRENT_ACCOUNTS)
  1728.        
  1729.             for section_name in config.sections():
  1730.                 TMARKET = section_name
  1731.                 target = config[section_name]['Qoshadigan_gurux1']
  1732.        
  1733.                 print("\n" + "="*50)
  1734.                 print(f"{w}Yangi jarayon: {ye}{last_two_parts}{w} | Guruh: {ye}{target}{w}")
  1735.                 print("="*50 + "\n")
  1736.                 print(f'{lg}Jami akountlar: {len(phones)}')
  1737.                 print(f"{lg}Qo'shish uchun odamlar: {len(members)}")
  1738.        
  1739.                 user_queue = asyncio.Queue()
  1740.                 for member in members:
  1741.                     await user_queue.put(member)
  1742.        
  1743.                 tasks = []
  1744.                 for phone_obj in phones:
  1745.                     raw = phone_obj['raw']
  1746.                     clean = phone_obj['clean']
  1747.        
  1748.                     # Sessiya faylini ikkala ko‘rinishda ham qidiramiz
  1749.                     session_plus = f'sessions/+{clean}_SQLite.session'
  1750.                     session_plain = f'sessions/{clean}_SQLite.session'
  1751.                     if os.path.exists(session_plus):
  1752.                         session_file = session_plus
  1753.                     elif os.path.exists(session_plain):
  1754.                         session_file = session_plain
  1755.                     else:
  1756.  
  1757.                         raw_based = f'sessions/{raw}_SQLite.session'
  1758.                         if os.path.exists(raw_based):
  1759.                             session_file = raw_based
  1760.                         else:
  1761.                             print(f"{r}❗ Session topilmadi: {raw} ( + bilan ham, + siz ham )")
  1762.                             continue
  1763.        
  1764.                     params = pony()
  1765.                     ensure_loop()  # har bir clientdan oldin ham kafolat
  1766.                     client = TelegramClient(
  1767.                         session_file,
  1768.                         API_ID,
  1769.                         API_HASH,
  1770.                         device_model=params['device_model'],
  1771.                         system_version=params['system_version'],
  1772.                         app_version=params['app_version'],
  1773.                         lang_code=params['lang_code'],
  1774.                         system_lang_code=params['system_lang_code']
  1775.                     )
  1776.                     task = asyncio.create_task(
  1777.                         worker(f"{raw}", client, target, user_queue,
  1778.                                total_added_counter, last_two_parts, sem_account)
  1779.                     )
  1780.                     tasks.append(task)
  1781.        
  1782.                 try:
  1783.                     await asyncio.gather(*tasks)
  1784.                 except KeyboardInterrupt:
  1785.                     print(f"{r}To‘xtatildi, vazifalar bekor qilinmoqda...")
  1786.                     for t in tasks:
  1787.                         t.cancel()
  1788.                     await asyncio.gather(*tasks, return_exceptions=True)
  1789.        
  1790.             message = "BARCHA ISHLAR TUGATILDI YOKI AKKOUNTLAR TOXTATILDI!!!"
  1791.             terminal_width = shutil.get_terminal_size().columns
  1792.             print("\n" + "\033[1;97;41m" + "!" * terminal_width + "\033[0m")
  1793.             print("\033[1;32;40m" + message.center(terminal_width) + "\033[0m")
  1794.             print("\033[1;97;41m" + "!" * terminal_width + "\033[0m")
  1795.             print(f"\n{lg}Jami qo'shilganlar soni: {total_added_counter['count']}\n")
  1796.             input("Chiqish uchun ENTER bosing...")
  1797.        
  1798.         # === DASTUR BOSHI ===
  1799.         if __name__ == '__main__':
  1800.             # Windows uchun tavsiya etilgan siyosat
  1801.             if os.name == 'nt':
  1802.                 try:
  1803.                     asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
  1804.                 except Exception:
  1805.                     pass
  1806.             ensure_loop()  # dastur startida ham
  1807.             asyncio.run(main())
  1808.            
  1809.     elif a == 4:
  1810.         import os
  1811.         import csv
  1812.         import random
  1813.         import asyncio
  1814.         import ctypes
  1815.        
  1816.         from telethon import TelegramClient
  1817.         from telethon.sessions import StringSession
  1818.         from telethon.errors import (
  1819.             SessionPasswordNeededError,
  1820.             PasswordHashInvalidError,
  1821.             PhoneCodeInvalidError,
  1822.             PhoneCodeExpiredError,
  1823.             PhoneNumberBannedError,
  1824.         )
  1825.        
  1826.         API_ID = 253798
  1827.         API_HASH = 'd806c9ed3eb74a233d58cb4a072a68f0'
  1828.         SESSION_FOLDER = './sessions'
  1829.        
  1830.         # ---------- RANGLARNI YOQISH (Windows uchun VT100) ----------
  1831.         def _enable_ansi_on_windows():
  1832.             if os.name != 'nt':
  1833.                 return
  1834.             try:
  1835.                 kernel32 = ctypes.windll.kernel32
  1836.                 h = kernel32.GetStdHandle(-11)  # STD_OUTPUT_HANDLE = -11
  1837.                 mode = ctypes.c_uint32()
  1838.                 if kernel32.GetConsoleMode(h, ctypes.byref(mode)):
  1839.                     ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004
  1840.                     kernel32.SetConsoleMode(h, mode.value | ENABLE_VIRTUAL_TERMINAL_PROCESSING)
  1841.             except Exception:
  1842.                 pass
  1843.        
  1844.         _enable_ansi_on_windows()
  1845.        
  1846.         # ANSI ranglar
  1847.         CLR = {
  1848.             'reset'  : '\033[0m',
  1849.             'bold'   : '\033[1m',
  1850.             'red'    : '\033[31m',
  1851.             'green'  : '\033[32m',
  1852.             'yellow' : '\033[33m',
  1853.             'blue'   : '\033[34m',
  1854.             'magenta': '\033[35m',
  1855.             'cyan'   : '\033[36m',
  1856.             'white'  : '\033[37m',
  1857.             'bwhite' : '\033[97m',
  1858.         }
  1859.        
  1860.         DEVICE_COLORS = ['red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'bwhite']
  1861.        
  1862.         def colorize(text: str, color: str, bold: bool = False) -> str:
  1863.             c = CLR.get(color, '')
  1864.             b = CLR['bold'] if bold else ''
  1865.             r = CLR['reset']
  1866.             return f"{b}{c}{text}{r}"
  1867.        
  1868.         def pick_color_for_device(model: str) -> str:
  1869.             idx = abs(hash(model)) % len(DEVICE_COLORS)
  1870.             return DEVICE_COLORS[idx]
  1871.        
  1872.         def platform_emoji(model: str, system_version: str) -> str:
  1873.             m = (model or '').lower()
  1874.             s = (system_version or '').lower()
  1875.             if 'pc' in m or 'windows' in s:
  1876.                 return '🖥️'
  1877.             if 'harmony' in s or 'huawei' in m:
  1878.                 return '🌌'
  1879.             return '🤖'
  1880.        
  1881.         # === CSV o‘qish ===
  1882.         def read_phones_from_csv(file_path):
  1883.             phone_numbers = []
  1884.             if not os.path.exists(file_path):
  1885.                 print(colorize(f"XATO: {file_path} fayli topilmadi!", 'red', True))
  1886.                 return []
  1887.             with open(file_path, newline='', encoding='utf-8') as csvfile:
  1888.                 reader = csv.reader(csvfile)
  1889.                 for row in reader:
  1890.                     if row and row[0].strip():
  1891.                         phone_numbers.append(row[0].strip())
  1892.             return phone_numbers
  1893.        
  1894.         # === REAL RANDOM DEVICE LIST (2025) ===
  1895.         RANDOM_DEVICES = [
  1896.             {'device_model': 'Samsung SM-S928B (Galaxy S24 Ultra)', 'system_version': 'Android 14 (SDK 34)', 'app_version': '11.0.0 (3500) arm64-v8a'},
  1897.             {'device_model': 'Xiaomi 14 (23127PN0CG)',              'system_version': 'Android 14 (SDK 34)', 'app_version': '11.0.0 (3500) arm64-v8a'},
  1898.             {'device_model': 'OnePlus 12',                           'system_version': 'Android 14 (SDK 34)', 'app_version': '11.0.0 (3500) arm64-v8a'},
  1899.             {'device_model': 'Google Pixel 9 Pro',                   'system_version': 'Android 15 (SDK 35)', 'app_version': '11.0.0 (3500) arm64-v8a'},
  1900.             {'device_model': 'Huawei P60 Pro',                       'system_version': 'HarmonyOS 4.0',        'app_version': '11.0.0 (3500) arm64-v8a'},
  1901.         ]
  1902.        
  1903.         def random_device_params():
  1904.             d = random.choice(RANDOM_DEVICES)
  1905.             system_ver = f"{d['system_version']} | sdk 4.16.3-PYRO17"
  1906.             return {
  1907.                 'device_model': d['device_model'],
  1908.                 'system_version': system_ver,
  1909.                 'app_version': d['app_version'],
  1910.                 'lang_code': 'en',
  1911.                 'system_lang_code': 'en'
  1912.             }
  1913.        
  1914.         # === TELETHON SESSION CREATOR (majburiy yangi qurilma bilan) ===
  1915.         async def create_and_check_session(phone):
  1916.             session_file = os.path.join(SESSION_FOLDER, f'telethon_{phone}.session')
  1917.        
  1918.             # Har safar yangi qurilma
  1919.             device_params = random_device_params()
  1920.             dev_color = pick_color_for_device(device_params['device_model'])
  1921.             icon = platform_emoji(device_params['device_model'], device_params['system_version'])
  1922.             device_line = f"{icon}  {device_params['device_model']}  |  {device_params['system_version']}  |  app {device_params['app_version']}"
  1923.        
  1924.             print(colorize(f"\nStart {phone}", 'cyan', True))
  1925.             print(colorize(f"Qurilma tanlandi → {device_line}", dev_color, True))
  1926.        
  1927.             # Hatto mavjud sessiyada ham yangi qurilma parametrlari o‘rnatiladi
  1928.             if os.path.exists(session_file):
  1929.                 with open(session_file, 'r', encoding='utf-8') as f:
  1930.                     session_string = f.read().strip()
  1931.                 client = TelegramClient(StringSession(session_string), API_ID, API_HASH, **device_params)
  1932.                 # 👇 majburan yangi device parametrlarini yozamiz
  1933.                 client._flood_sleep_threshold = 5
  1934.                 client._device_model = device_params['device_model']
  1935.                 client._system_version = device_params['system_version']
  1936.                 client._app_version = device_params['app_version']
  1937.                 client._lang_code = device_params['lang_code']
  1938.                 client._system_lang_code = device_params['system_lang_code']
  1939.             else:
  1940.                 client = TelegramClient(StringSession(), API_ID, API_HASH, **device_params)
  1941.        
  1942.             try:
  1943.                 await client.connect()
  1944.        
  1945.                 if await client.is_user_authorized():
  1946.                     me = await client.get_me()
  1947.                     print(colorize(f"✅ Tasdiqlandi (sessiya mavjud): {phone} | {getattr(me, 'first_name', '')}", 'green', True))
  1948.                     # Har safar sessiyani yangilaymiz
  1949.                     session_string = client.session.save()
  1950.                     with open(session_file, 'w', encoding='utf-8') as f:
  1951.                         f.write(session_string)
  1952.                     return phone
  1953.        
  1954.                 await client.send_code_request(phone)
  1955.                 attempts_left = 3
  1956.        
  1957.                 while True:
  1958.                     code = input(colorize(f'{phone} Kodni kiriting: ', 'yellow', True)).strip()
  1959.                     if not code:
  1960.                         print(colorize("Kod bo'sh bo'lmasin.", 'red', True))
  1961.                         continue
  1962.        
  1963.                     try:
  1964.                         await client.sign_in(phone, code)
  1965.                         break
  1966.                     except SessionPasswordNeededError:
  1967.                         while True:
  1968.                             password = input(colorize(f'{phone} 2FA parolni kiriting: ', 'yellow', True))
  1969.                             try:
  1970.                                 await client.sign_in(password=password)
  1971.                                 break
  1972.                             except PasswordHashInvalidError:
  1973.                                 print(colorize("Parol xato. Qayta kiriting!", 'red', True))
  1974.                                 continue
  1975.                         break
  1976.                     except PhoneCodeInvalidError:
  1977.                         attempts_left -= 1
  1978.                         print(colorize(f"Kod xato. Qayta kiriting! (qolgan urinishlar: {attempts_left})", 'red', True))
  1979.                         if attempts_left == 0:
  1980.                             print(colorize("Urinishlar tugadi. Yangi kod so'ralmoqda...", 'yellow', True))
  1981.                             await client.send_code_request(phone)
  1982.                             attempts_left = 3
  1983.                     except PhoneCodeExpiredError:
  1984.                         print(colorize("Kodning amal qilish muddati tugagan. Yangi kod so'ralmoqda...", 'yellow', True))
  1985.                         await client.send_code_request(phone)
  1986.                         attempts_left = 3
  1987.                     except PhoneNumberBannedError:
  1988.                         print(colorize(f"{phone} raqami BAN qilingan.", 'red', True))
  1989.                         return None
  1990.                     except Exception as e:
  1991.                         print(colorize(f"Noma'lum xato: {e}", 'red', True))
  1992.                         return None
  1993.        
  1994.                 if await client.is_user_authorized():
  1995.                     me = await client.get_me()
  1996.                     print(colorize(f"🎉 Muvaffaqiyatli avtorizatsiya: {phone} | {getattr(me, 'first_name', '')}", 'green', True))
  1997.                     session_string = client.session.save()
  1998.                     with open(session_file, 'w', encoding='utf-8') as f:
  1999.                         f.write(session_string)
  2000.                     return phone
  2001.                 else:
  2002.                     print(colorize(f"{phone} avtorizatsiyadan o'tkazilmadi.", 'red', True))
  2003.                     return None
  2004.        
  2005.             except Exception as e:
  2006.                 print(colorize(f"Umumiy xatolik {phone}: {str(e)}", 'red', True))
  2007.                 return None
  2008.             finally:
  2009.                 if client.is_connected():
  2010.                     await client.disconnect()
  2011.        
  2012.         # === STRING → SQLITE migratsiya ===
  2013.         async def migrate_string_to_sqlite(phone_number):
  2014.             session_file = os.path.join(SESSION_FOLDER, f'telethon_{phone_number}.session')
  2015.             if not os.path.exists(session_file):
  2016.                 print(colorize(f"SESSIYA {phone_number} TOPILMADI.", 'red', True))
  2017.                 return
  2018.        
  2019.             with open(session_file, 'r', encoding='utf-8') as f:
  2020.                 session_string = f.read().strip()
  2021.             client = TelegramClient(StringSession(session_string), API_ID, API_HASH)
  2022.        
  2023.             async with client:
  2024.                 await client.connect()
  2025.                 dc_id, server_address, port = client.session.dc_id, client.session.server_address, client.session.port
  2026.                 auth_key = client.session.auth_key
  2027.        
  2028.                 sqlite_session_file = os.path.join(SESSION_FOLDER, f'{phone_number}_SQLite.session')
  2029.                 sqlite_client = TelegramClient(sqlite_session_file, API_ID, API_HASH)
  2030.        
  2031.                 await sqlite_client.connect()
  2032.                 sqlite_client.session.set_dc(dc_id, server_address, port)
  2033.                 sqlite_client.session.auth_key = auth_key
  2034.                 sqlite_client.session.save()
  2035.                 await sqlite_client.disconnect()
  2036.        
  2037.             print(colorize(f"🧳 Migratsiya {phone_number} → SQLite session... OK", 'magenta', True))
  2038.        
  2039.         # === MAIN ===
  2040.         async def main():
  2041.             if not os.path.exists(SESSION_FOLDER):
  2042.                 os.makedirs(SESSION_FOLDER)
  2043.        
  2044.             phone_numbers = read_phones_from_csv('phone.csv')
  2045.             if not phone_numbers:
  2046.                 input(colorize("phone.csv bo'sh yoki topilmadi. Chiqish uchun ENTER bosing.", 'yellow', True))
  2047.                 return
  2048.        
  2049.             authorized_phones = []
  2050.             for phone in phone_numbers:
  2051.                 result = await create_and_check_session(phone)
  2052.                 if result:
  2053.                     authorized_phones.append(result)
  2054.        
  2055.             if authorized_phones:
  2056.                 print(colorize("\n--- Migratsiya jarayoni boshlandi ---", 'bwhite', True))
  2057.                 migration_tasks = [migrate_string_to_sqlite(phone) for phone in authorized_phones]
  2058.                 await asyncio.gather(*migration_tasks)
  2059.        
  2060.             print(colorize('\nTelefonlar ro\'yxatdan o\'tkazildi va migratsiya qilindi!\n', 'cyan', True))
  2061.             input(colorize("ENTER chiqish", 'yellow', True))
  2062.        
  2063.         if __name__ == "__main__":
  2064.             if os.name == 'nt':
  2065.                 asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
  2066.             asyncio.run(main())
  2067.  
  2068.  
  2069.  
  2070.  
  2071.     elif a == 5:
  2072.         import os
  2073.         import csv
  2074.         import random
  2075.         import requests
  2076.         import asyncio
  2077.         from telethon import TelegramClient
  2078.         from telethon.errors import RPCError
  2079.         from telethon.sessions import StringSession
  2080.         from telethon.tl.functions.photos import UploadProfilePhotoRequest
  2081.        
  2082.         API_ID = 253798
  2083.         API_HASH = 'd806c9ed3eb74a233d58cb4a072a68f0'
  2084.        
  2085.         # --- YANGI: realistik random qurilmalar (2024–2025) ---
  2086.         RANDOM_DEVICES = [
  2087.             # Android / HarmonyOS
  2088.             {'device_model': 'Samsung SM-S928B (Galaxy S24 Ultra)', 'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  2089.             {'device_model': 'Samsung SM-A556B (Galaxy A55)',       'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  2090.             {'device_model': 'Google Pixel 9 Pro',                  'system_version': 'Android 15 (SDK 35)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  2091.             {'device_model': 'Xiaomi 14 (23127PN0CG)',              'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  2092.             {'device_model': 'Redmi Note 13 Pro 5G',                'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  2093.             {'device_model': 'OnePlus 12',                          'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  2094.             {'device_model': 'Nothing Phone (2a)',                  'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  2095.             {'device_model': 'realme 12 Pro+',                      'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  2096.             {'device_model': 'HUAWEI Pura 70 Pro',                  'system_version': 'HarmonyOS 4.2',        'app_version': '11.3.0 (3660) arm64-v8a'},
  2097.         ]
  2098.        
  2099.         def get_device_params():
  2100.             d = random.choice(RANDOM_DEVICES).copy()
  2101.             if 'Android' in d['system_version']:
  2102.                 d['system_version'] += ' | sdk 4.16.3-PYRO17'
  2103.             return {
  2104.                 'device_model': d['device_model'],
  2105.                 'system_version': d['system_version'],
  2106.                 'app_version': d['app_version'],
  2107.                 'lang_code': 'en',
  2108.                 'system_lang_code': 'en',
  2109.             }
  2110.         # ------------------------------------------------------
  2111.        
  2112.         # Функция для чтения номеров телефонов из CSV-файла
  2113.         def read_phone_numbers_from_csv(csv_file):
  2114.             phone_numbers = []
  2115.             with open(csv_file, 'r') as f:
  2116.                 reader = csv.reader(f)
  2117.                 for row in reader:
  2118.                     if row:
  2119.                         phone_numbers.append(row[0].strip())
  2120.             return phone_numbers
  2121.        
  2122.         def download_random_image():
  2123.             """
  2124.            picsum.photos dan tasodifiy 1080x1080 rasm oladi (seed bilan).
  2125.            """
  2126.             tag = random.choice(['woman', 'poetry'])
  2127.             rnd = random.randint(1, 10**6)
  2128.             url = f"https://picsum.photos/seed/{tag}-{rnd}/1080/1080"
  2129.             try:
  2130.                 resp = requests.get(url, timeout=12)
  2131.                 resp.raise_for_status()
  2132.                 return resp.content
  2133.             except requests.RequestException as e:
  2134.                 print(f"Rasm olishda xatolik: {e}")
  2135.                 return None
  2136.        
  2137.         # Функция для сохранения изображения на диск
  2138.         def save_image(image_data, filename):
  2139.             with open(filename, "wb") as file:
  2140.                 file.write(image_data)
  2141.        
  2142.         # Функция для изменения фото профиля
  2143.         async def change_profile_photo(client):
  2144.             image_data = download_random_image()
  2145.             if image_data:
  2146.                 filename = "profile_photo.jpg"
  2147.                 save_image(image_data, filename)
  2148.        
  2149.                 # Telegram’ga yuklaymiz va profilga qo‘yamiz
  2150.                 uploaded = await client.upload_file(filename)
  2151.                 await client(UploadProfilePhotoRequest(file=uploaded))
  2152.        
  2153.                 os.remove(filename)
  2154.             else:
  2155.                 print("Rasmni yuklab bo‘lmadi...")
  2156.        
  2157.         # Основная функция для изменения фото профиля для всех аккаунтов
  2158.         async def main():
  2159.             phone_numbers = read_phone_numbers_from_csv('phone.csv')
  2160.        
  2161.             for phone in phone_numbers:
  2162.                 print(f"Rasm o‘rnatilmoqda... {phone}")
  2163.                 session_file = f'sessions/telethon_{phone}.session'
  2164.        
  2165.                 try:
  2166.                     with open(session_file, 'r') as f:
  2167.                         session_string = f.read().strip()
  2168.                 except FileNotFoundError:
  2169.                     print(f"Session fayl {phone} topilmadi!")
  2170.                     continue
  2171.        
  2172.                 device_params = get_device_params()
  2173.                 client = TelegramClient(StringSession(session_string), API_ID, API_HASH, **device_params)
  2174.        
  2175.                 try:
  2176.                     await client.connect()
  2177.                     if not await client.is_user_authorized():
  2178.                         print(f"Akkaunt {phone} avtorizatsiyadan o‘tmagan yoki chiqarilgan.")
  2179.                         await client.disconnect()
  2180.                         continue
  2181.        
  2182.                     await change_profile_photo(client)
  2183.                     print(f"Profil rasmi o‘zgartirildi: {phone}")
  2184.        
  2185.                 except RPCError as e:
  2186.                     print(f"Xatolik: [{phone}] {e}")
  2187.                     continue
  2188.                 finally:
  2189.                     await client.disconnect()
  2190.        
  2191.             print('Profillarga rasmlar o‘rnatildi...')
  2192.             print('Chiqish uchun ENTER bosing...')
  2193.             input()
  2194.        
  2195.         # Запуск основной функции
  2196.         if __name__ == "__main__":
  2197.             asyncio.run(main())
  2198.  
  2199.     elif a == 6:
  2200.         import os
  2201.         import csv
  2202.         import random
  2203.         from telethon import TelegramClient
  2204.         from telethon.sessions import StringSession
  2205.         from telethon.tl.functions.account import UpdateProfileRequest
  2206.        
  2207.         API_ID = 253798
  2208.         API_HASH = 'd806c9ed3eb74a233d58cb4a072a68f0'
  2209.        
  2210.         # --- YANGI: realistik random qurilmalar (2024–2025) ---
  2211.         RANDOM_DEVICES = [
  2212.             # Android
  2213.             {'device_model': 'Samsung SM-S928B (Galaxy S24 Ultra)', 'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  2214.             {'device_model': 'Samsung SM-A556B (Galaxy A55)',       'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  2215.             {'device_model': 'Google Pixel 9 Pro',                  'system_version': 'Android 15 (SDK 35)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  2216.             {'device_model': 'Xiaomi 14 (23127PN0CG)',              'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  2217.             {'device_model': 'Redmi Note 13 Pro 5G',                'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  2218.             {'device_model': 'OnePlus 12',                          'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  2219.             {'device_model': 'Nothing Phone (2a)',                  'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  2220.             {'device_model': 'realme 12 Pro+',                      'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  2221.             # HarmonyOS
  2222.             {'device_model': 'HUAWEI Pura 70 Pro',                  'system_version': 'HarmonyOS 4.2',        'app_version': '11.3.0 (3660) arm64-v8a'},
  2223.         ]
  2224.        
  2225.         def get_device_params():
  2226.             d = random.choice(RANDOM_DEVICES).copy()
  2227.             # Androidlarga kichik qo'shimcha iz: real fingerprintga o‘xshatish
  2228.             if 'Android' in d['system_version']:
  2229.                 d['system_version'] += ' | sdk 4.16.3-PYRO17'
  2230.             return {
  2231.                 'device_model': d['device_model'],
  2232.                 'system_version': d['system_version'],
  2233.                 'app_version': d['app_version'],
  2234.                 'lang_code': 'en',
  2235.                 'system_lang_code': 'en',
  2236.             }
  2237.         # ------------------------------------------------------
  2238.        
  2239.         # Функция для чтения номеров телефонов из CSV-файла
  2240.         def read_phone_numbers_from_csv(csv_file):
  2241.             phone_numbers = []
  2242.             with open(csv_file, 'r') as f:
  2243.                 reader = csv.reader(f)
  2244.                 for row in reader:
  2245.                     if row:
  2246.                         phone_numbers.append(row[0].strip())
  2247.             return phone_numbers
  2248.        
  2249.         # Функция для чтения имен и фамилий из CSV-файла
  2250.         def read_names_surnames_from_csv(csv_file):
  2251.             names_surnames = []
  2252.             with open(csv_file, 'r', encoding='utf-8') as file:
  2253.                 reader = csv.reader(file)
  2254.                 for row in reader:
  2255.                     if len(row) >= 1:
  2256.                         if len(row) == 1:
  2257.                             name, surname = row[0], ""
  2258.                         else:
  2259.                             name, *surname = row[0].split()
  2260.                             surname = ' '.join(surname) if surname else ""
  2261.                         names_surnames.append((name.strip(), surname.strip()))
  2262.             random.shuffle(names_surnames)
  2263.             return names_surnames
  2264.        
  2265.         # Функция для изменения имени и фамилии профиля
  2266.         async def change_profile_name(client, name, surname):
  2267.             await client(UpdateProfileRequest(
  2268.                 first_name=name,
  2269.                 last_name=surname
  2270.             ))
  2271.        
  2272.         # Основная функция для изменения профилей
  2273.         async def main():
  2274.             phone_numbers = read_phone_numbers_from_csv('phone.csv')
  2275.             names_surnames = read_names_surnames_from_csv('Ismlar.csv')
  2276.        
  2277.             for phone_number, (name, surname) in zip(phone_numbers, names_surnames):
  2278.                 print(f"Ismlar ornatilmoqda... {name} {surname} ({phone_number})")
  2279.                 session_file = f'sessions/telethon_{phone_number}.session'
  2280.        
  2281.                 try:
  2282.                     with open(session_file, 'r') as f:
  2283.                         session_string = f.read().strip()
  2284.                 except FileNotFoundError:
  2285.                     print(f"Session fayl {phone_number} Topilmadi!")
  2286.                     continue
  2287.        
  2288.                 # >>> YANGI: qurilma parametrlari bilan ulanamiz
  2289.                 device_params = get_device_params()
  2290.                 client = TelegramClient(StringSession(session_string), API_ID, API_HASH, **device_params)
  2291.        
  2292.                 try:
  2293.                     await client.connect()
  2294.                     if not await client.is_user_authorized():
  2295.                         print(f"Akount {phone_number} chiqarib yuborilgan!")
  2296.                         await client.disconnect()
  2297.                         continue
  2298.        
  2299.                     # Ism va familiyani o‘zgartirish
  2300.                     await change_profile_name(client, name, surname)
  2301.        
  2302.                     # print(f"Profil o'zgartirildi: {phone_number}")
  2303.                 except Exception as e:
  2304.                     print(f"!!!: [{phone_number}] {str(e)}!!!")
  2305.                     continue
  2306.                 finally:
  2307.                     await client.disconnect()
  2308.        
  2309.             print('Proffillar ismlar ozgarttirildi...')
  2310.             print('CHiqish uchun  ENTER bosing...')
  2311.             input()
  2312.        
  2313.         if __name__ == "__main__":
  2314.             import asyncio
  2315.             # (ixtiyoriy) Windows 3.12 loop siyosati fix
  2316.             if os.name == 'nt':
  2317.                 try:
  2318.                     asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
  2319.                 except Exception:
  2320.                     pass
  2321.             asyncio.run(main())
  2322.  
  2323.     elif a == 7:
  2324.         from telethon import TelegramClient, events, sync
  2325.         from telethon.sessions import StringSession
  2326.         import csv
  2327.        
  2328.         PHONE_FILE = 'phone.csv'
  2329.         API_ID = 253798
  2330.         API_HASH = 'd806c9ed3eb74a233d58cb4a072a68f0'
  2331.        
  2332.         chat_id = 777000  # Замените на ваш chat_id
  2333.  
  2334.         async def display_accounts():
  2335.             with open(PHONE_FILE, 'r') as f:
  2336.                 phone_list = [row[0] for row in csv.reader(f)]
  2337.        
  2338.             print(f"Barcha akountlar:\n")
  2339.             for i, phone in enumerate(phone_list):
  2340.                 print(f"{i + 1}. {phone}")
  2341.        
  2342.             choice = int(input("Akountni tanlang: "))
  2343.             return phone_list[choice - 1]
  2344.        
  2345.         async def main():
  2346.             while True:
  2347.                 phone = await display_accounts()
  2348.        
  2349.                 # Создаем строку сессии или используем существующую
  2350.                 session_file = f'sessions/telethon_{phone}.session'
  2351.                 try:
  2352.                     with open(session_file, 'r') as f:
  2353.                         session_string = f.read().strip()
  2354.                 except FileNotFoundError:
  2355.                     print(Fore.RED + f'Session fayl {phone} Topilmadi!.' + Style.RESET_ALL)
  2356.                     continue
  2357.  
  2358.                 client = TelegramClient(StringSession(session_string), API_ID, API_HASH)
  2359.        
  2360.                 try:
  2361.                     await client.start()
  2362.                     print("Telegramga muvaffaqiyatli ulandi!")
  2363.        
  2364.                     # Пример поиска последнего сообщения в чате
  2365.                     async for message in client.iter_messages(chat_id, limit=1):
  2366.                         print(message.text)
  2367.        
  2368.                 except Exception as e:
  2369.                     print(f"Xatolik yuz berdi: {str(e)}")
  2370.                 finally:
  2371.                     await client.disconnect()
  2372.                     input('\nEnter orqaga qaytish')
  2373.        
  2374.         if __name__ == "__main__":
  2375.             import asyncio
  2376.             asyncio.run(main())
  2377.     elif a == 8:  
  2378.         import os
  2379.         import csv
  2380.         import random
  2381.         import time
  2382.         from telethon import TelegramClient
  2383.         from telethon.sessions import StringSession
  2384.         from telethon.tl.functions.account import UpdateUsernameRequest
  2385.         from telethon.errors import UsernameOccupiedError, UsernameInvalidError, FloodWaitError, RPCError
  2386.        
  2387.         API_ID = 253798
  2388.         API_HASH = 'd806c9ed3eb74a233d58cb4a072a68f0'
  2389.        
  2390.         # --- YANGI: realistik random qurilmalar (2024–2025) ---
  2391.         RANDOM_DEVICES = [
  2392.             # Android flagships / upper-mid
  2393.             {'device_model': 'Samsung SM-S928B (Galaxy S24 Ultra)', 'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  2394.             {'device_model': 'Samsung SM-A556B (Galaxy A55)',       'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  2395.             {'device_model': 'Google Pixel 9 Pro',                  'system_version': 'Android 15 (SDK 35)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  2396.             {'device_model': 'Xiaomi 14 (23127PN0CG)',              'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  2397.             {'device_model': 'Redmi Note 13 Pro 5G',                'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  2398.             {'device_model': 'OnePlus 12',                          'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  2399.             {'device_model': 'Nothing Phone (2a)',                  'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  2400.             {'device_model': 'realme 12 Pro+',                      'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  2401.             # HarmonyOS
  2402.             {'device_model': 'HUAWEI Pura 70 Pro',                  'system_version': 'HarmonyOS 4.2',        'app_version': '11.3.0 (3660) arm64-v8a'},
  2403.         ]
  2404.        
  2405.         def get_device_params():
  2406.             d = random.choice(RANDOM_DEVICES).copy()
  2407.             # Androidlarga “sdk 4.16.3-PYRO17” qo‘shimcha footerni qo‘shamiz — realistik fingerprint
  2408.             if 'Android' in d['system_version']:
  2409.                 d['system_version'] += ' | sdk 4.16.3-PYRO17'
  2410.             return {
  2411.                 'device_model': d['device_model'],
  2412.                 'system_version': d['system_version'],
  2413.                 'app_version': d['app_version'],
  2414.                 'lang_code': 'en',
  2415.                 'system_lang_code': 'en'
  2416.             }
  2417.         # ------------------------------------------------------
  2418.        
  2419.         # Функция для чтения номеров телефонов из CSV-файла
  2420.         def read_phone_numbers_from_csv(csv_file):
  2421.             phone_numbers = []
  2422.             with open(csv_file, 'r') as f:
  2423.                 reader = csv.reader(f)
  2424.                 for row in reader:
  2425.                     if row:
  2426.                         phone_numbers.append(row[0].strip())
  2427.             return phone_numbers
  2428.        
  2429.         # Функция для чтения имен из CSV-файла
  2430.         def read_names_from_csv(csv_file):
  2431.             names = []
  2432.             with open(csv_file, 'r', encoding='utf-8') as file:
  2433.                 reader = csv.reader(file)
  2434.                 for row in reader:
  2435.                     if row:
  2436.                         name = row[0].strip().split()[0]
  2437.                         names.append(name)
  2438.             return names
  2439.        
  2440.         # Функция для генерации случайного username
  2441.         def generate_random_username(prefixes):
  2442.             prefix = random.choice(prefixes)
  2443.             return prefix + ''.join(random.choices('abcdefghijklmnopqrstuvwxyz0123456789', k=4))
  2444.        
  2445.         # Функция для изменения username профиля
  2446.         async def change_profile_username(client, username):
  2447.             await client(UpdateUsernameRequest(username=username))
  2448.        
  2449.         # Списки случайных сообщений
  2450.         success_messages = [
  2451.             "Username o'zgartirildi: @{}",
  2452.             "Yangi username muvaffaqiyatli: @{}",
  2453.             "Username muvaffaqiyatli o'zgartirildi: @{}",
  2454.             "Username o'zgardi: @{}"
  2455.         ]
  2456.        
  2457.         failure_messages = [
  2458.             "Username @{} qabul qilinmadi, qaytadan urinib ko'ring.",
  2459.             "Username @{} noto'g'ri, boshqa urinib ko'ring.",
  2460.             "Username @{} band yoki noto'g'ri, qayta urinib ko'ring.",
  2461.             "Username @{} mavjud emas yoki noto'g'ri, qaytadan urinib ko'ring."
  2462.         ]
  2463.        
  2464.         # Основная функция для изменения профилей
  2465.         async def main():
  2466.             phone_numbers = read_phone_numbers_from_csv('phone.csv')
  2467.             names = read_names_from_csv('Ismlar.csv')
  2468.        
  2469.             for phone_number in phone_numbers:
  2470.                 session_file = f'sessions/telethon_{phone_number}.session'
  2471.        
  2472.                 try:
  2473.                     with open(session_file, 'r') as f:
  2474.                         session_string = f.read().strip()
  2475.                 except FileNotFoundError:
  2476.                     print(f"Session fayl {phone_number} Topilmadi!")
  2477.                     continue
  2478.        
  2479.                 # >>> YANGI: qurilma parametrlari qo‘llaniladi
  2480.                 device_params = get_device_params()
  2481.                 client = TelegramClient(StringSession(session_string), API_ID, API_HASH, **device_params)
  2482.        
  2483.                 try:
  2484.                     await client.connect()
  2485.                     if not await client.is_user_authorized():
  2486.                         print(f"Akount {phone_number} chiqarib yuborilgan!")
  2487.                         await client.disconnect()
  2488.                         continue
  2489.        
  2490.                     while True:
  2491.                         username = generate_random_username(names)
  2492.                         try:
  2493.                             await change_profile_username(client, username)
  2494.                             print((phone_number), random.choice(success_messages).format(username))
  2495.                             print()
  2496.                             break
  2497.                         except (UsernameOccupiedError, UsernameInvalidError):
  2498.                             # print(random.choice(failure_messages).format(username))
  2499.                             continue
  2500.                         except RPCError as e:
  2501.                             if "username is not different from the current username" in str(e):
  2502.                                 print(f"!!!: [{phone_number}] The username is not different from the current username!!!")
  2503.                                 break
  2504.                             elif "Telegram is having internal issues" in str(e):
  2505.                                 print(f"Telegram is having internal issues. Retrying in 5 seconds...")
  2506.                                 time.sleep(5)
  2507.                             else:
  2508.                                 print(f"{phone_number}: {str(e)}")
  2509.                                 break
  2510.        
  2511.                 except Exception as e:
  2512.                     print(f"!!!: [{phone_number}] {str(e)}!!!")
  2513.                     continue
  2514.                 finally:
  2515.                     await client.disconnect()
  2516.        
  2517.             print('Proffillar username ozgarttirildi...')
  2518.             print('CHiqish uchun ENTER bosing...')
  2519.             input()
  2520.        
  2521.         if __name__ == "__main__":
  2522.             import asyncio
  2523.             # Windows 3.12 event loop muammosiga qarshi kichik fix (xohlasangiz qoldiring)
  2524.             if os.name == 'nt':
  2525.                 try:
  2526.                     asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
  2527.                 except Exception:
  2528.                     pass
  2529.             asyncio.run(main())
  2530.  
  2531.     elif a == 9:
  2532.         import csv
  2533.         import asyncio
  2534.         from telethon import TelegramClient
  2535.         from telethon.errors import RPCError
  2536.         from telethon.sessions import StringSession
  2537.         from telethon.tl.functions.channels import LeaveChannelRequest
  2538.         from telethon.tl.types import Channel, User
  2539.        
  2540.         API_ID = 253798
  2541.         API_HASH = 'd806c9ed3eb74a233d58cb4a072a68f0'
  2542.        
  2543.         SESSION_FOLDER = 'sessions/'  # Путь к папке с сессиями
  2544.        
  2545.         def read_phone_numbers_from_csv(file_path):
  2546.             with open(file_path, 'r') as f:
  2547.                 return [row[0] for row in csv.reader(f)]
  2548.        
  2549.         async def leave_chats(session_string, phone):
  2550.             print(f"Start: {phone}\n")
  2551.  
  2552.             client = TelegramClient(StringSession(session_string), API_ID, API_HASH)
  2553.             try:
  2554.                 await client.connect()
  2555.                 if not await client.is_user_authorized():
  2556.                     print(f"Nomer {phone} CHIQARIB YUBORILGAN!")
  2557.                     await client.disconnect()
  2558.                     return
  2559.        
  2560.                 async for dialog in client.iter_dialogs():
  2561.                     try:
  2562.                         entity = dialog.entity
  2563.                         if isinstance(entity, Channel):
  2564.                             if entity.megagroup:
  2565.                                 await client(LeaveChannelRequest(entity))
  2566.                                 print(f"chiqildi: {dialog.title}")
  2567.                         elif isinstance(entity, User):
  2568.                             # Проверка, является ли пользователь ботом
  2569.                             if not entity.bot:
  2570.                                 # Удаляем личные чаты
  2571.                                 await client.delete_dialog(entity)
  2572.                                 print(f"chiqildi: {dialog.title}")
  2573.                         elif isinstance(entity, Channel):
  2574.                             # Удаляем обычные группы (не мега-группы)
  2575.                             if not entity.megagroup:
  2576.                                 await client.delete_dialog(entity)
  2577.                                 print(f"chiqildi: {dialog.title}")
  2578.                     except Exception as e:
  2579.                         print(f"Xatolik: {e}")
  2580.                         continue
  2581.        
  2582.                 print(f"Nomer: {phone} -- TOZALANDI!")
  2583.        
  2584.             except RPCError as e:
  2585.                 print(f"Nomer: {phone} ! Xatolik: {e}")
  2586.             finally:
  2587.                 await client.disconnect()
  2588.        
  2589.         async def main():
  2590.             phone_numbers = read_phone_numbers_from_csv('phone.csv')
  2591.        
  2592.             tasks = []
  2593.             for phone in phone_numbers:
  2594.                 session_file = f'{SESSION_FOLDER}telethon_{phone}.session'
  2595.                
  2596.                 try:
  2597.                     with open(session_file, 'r') as f:
  2598.                         session_string = f.read().strip()
  2599.                     tasks.append(leave_chats(session_string, phone))
  2600.                 except FileNotFoundError:
  2601.                     print(f"Sessiya {session_file} TOPILMADI!")
  2602.                     continue
  2603.        
  2604.             await asyncio.gather(*tasks)
  2605.        
  2606.             print('Tugallandi')
  2607.             input("ENTER CHHIQISH")
  2608.        
  2609.         if __name__ == "__main__":
  2610.             asyncio.run(main())
  2611.  
  2612.     elif a == 10:
  2613.         import csv
  2614.         import asyncio
  2615.         import configparser
  2616.         from telethon import TelegramClient, errors
  2617.        
  2618.         API_ID = 253798
  2619.         API_HASH = 'd806c9ed3eb74a233d58cb4a072a68f0'
  2620.         SESSION_FOLDER = 'sessions/'  # Путь к папке с сессиями
  2621.        
  2622.         async def update_2fa_password(session_string, phone_number, current_password, new_password):
  2623.             try:
  2624.                 async with TelegramClient(StringSession(session_string), API_ID, API_HASH) as client:
  2625.                     await client.start()
  2626.                     await client.edit_2fa(current_password=current_password, new_password=new_password)
  2627.                     print(f"2FA PAROL YANGILANDI {phone_number}.")
  2628.                     return True
  2629.             except errors.RPCError as e:
  2630.                 print(f"XATOLIK ESKI PAROL NOTOGRI! {phone_number}")
  2631.                 return False
  2632.        
  2633.         # Функция для чтения номеров телефонов из CSV-файла
  2634.         def read_phone_numbers_from_csv(csv_file):
  2635.             with open(csv_file, 'r') as file:
  2636.                 reader = csv.reader(file)
  2637.                 phone_numbers = [row[0] for row in reader]
  2638.             return phone_numbers
  2639.        
  2640.         # Функция для чтения текущего и нового паролей из config.ini
  2641.         def read_passwords_from_config():
  2642.             config = configparser.ConfigParser()
  2643.             config.read('../Guruxlar.ini')
  2644.             current_password = config['T_Market']['current_password']
  2645.             new_password = config['T_Market']['new_password']
  2646.             return current_password, new_password
  2647.        
  2648.         async def main():
  2649.             # Чтение номеров телефонов из CSV-файла
  2650.             csv_file = 'phone.csv'  # Путь к CSV-файлу с номерами телефонов
  2651.             phone_numbers = read_phone_numbers_from_csv(csv_file)
  2652.        
  2653.             # Текущий и новый пароль из config.ini
  2654.             current_password, new_password = read_passwords_from_config()
  2655.        
  2656.             # Обновление 2FA пароля для каждого аккаунта
  2657.             tasks = []
  2658.             for phone_number in phone_numbers:
  2659.                 session_file = f'{SESSION_FOLDER}telethon_{phone_number}.session'
  2660.                 try:
  2661.                     with open(session_file, 'r') as f:
  2662.                         session_string = f.read().strip()
  2663.                     tasks.append(update_2fa_password(session_string, phone_number, current_password, new_password))
  2664.                 except FileNotFoundError:
  2665.                     print(f"Session FAYL {session_file} TOPILMADI!")
  2666.                     continue
  2667.        
  2668.             results = await asyncio.gather(*tasks)
  2669.             success_count = sum(results)
  2670.             print(f"2FA Parol YANGILANDI! {success_count} Shuncha nomerdan {len(phone_numbers)}.")
  2671.             input('CHIQISH UCHUN ENTER')
  2672.         if __name__ == "__main__":
  2673.             asyncio.run(main())
  2674.     elif a == 11:
  2675.         import csv
  2676.         import configparser
  2677.         import asyncio
  2678.         from telethon import TelegramClient
  2679.         from telethon.sessions import StringSession
  2680.         from telethon.errors import PhoneNumberBannedError, FloodWaitError
  2681.         from telethon.tl.functions.channels import JoinChannelRequest, GetFullChannelRequest
  2682.        
  2683.         API_ID = 253798
  2684.         API_HASH = 'd806c9ed3eb74a233d58cb4a072a68f0'
  2685.         SESSION_FOLDER = 'sessions/'
  2686.        
  2687.         async def process_phone(phone):
  2688.             session_file = f'{SESSION_FOLDER}telethon_{phone}.session'
  2689.        
  2690.             try:
  2691.                 with open(session_file, 'r') as f:
  2692.                     session_string = f.read()
  2693.             except FileNotFoundError:
  2694.                 print(f'Session fayl {phone} topilmadi!')
  2695.                 return
  2696.             client = TelegramClient(StringSession(session_string), API_ID, API_HASH)
  2697.             try:
  2698.                 await client.connect()
  2699.                 if not await client.is_user_authorized():
  2700.                     print(f"Akount {phone} chiqarib yuborilgan!")
  2701.                     await client.disconnect()
  2702.                     return
  2703.                 config = configparser.ConfigParser()
  2704.                 config.read('../Guruxlar.ini')
  2705.                 channel_links = [link.replace('https://t.me/', '') for link in config['T_Market']['channel_links'].split(',')]
  2706.        
  2707.                 for link in channel_links:
  2708.                     try:
  2709.                         chat = await client(JoinChannelRequest(link.strip()))
  2710.                         await asyncio.sleep(5)
  2711.                         channel_info = await client.get_entity(link.strip())
  2712.                         print(f"{phone}: Qoshildi: {channel_info.title}")
  2713.                     except FloodWaitError as e:
  2714.                         print(f'kuting...{e.seconds}')
  2715.                         await asyncio.sleep(e.seconds)
  2716.                     except Exception as e:
  2717.                         print(f'xatolik {phone} qoshilishda {link}: {e}')
  2718.             except PhoneNumberBannedError:
  2719.                 print(f"Nomer {phone} chiqarib yuborilgan!")
  2720.             except Exception as e:
  2721.                 print(f"Nomer {phone} XATOLIK: {e}")
  2722.             finally:
  2723.                 await client.disconnect()
  2724.        
  2725.         async def main():
  2726.             with open('phone.csv', 'r') as f:
  2727.                 str_list = [row[0] for row in csv.reader(f)]
  2728.            
  2729.             batch_size = 10
  2730.             for i in range(0, len(str_list), batch_size):
  2731.                 batch = str_list[i:i + batch_size]
  2732.                 tasks = [process_phone(phone) for phone in batch]
  2733.                 await asyncio.gather(*tasks)
  2734.        
  2735.         if __name__ == '__main__':
  2736.             asyncio.run(main())
  2737.             input("Enter chiqish!")
  2738.  
  2739.  
  2740.     elif a == 12:
  2741.         import csv
  2742.         import os
  2743.         import re
  2744.         import asyncio
  2745.         import configparser
  2746.         from telethon import TelegramClient, functions, types
  2747.         from telethon.errors import RPCError
  2748.         from telethon.sessions import StringSession
  2749.        
  2750.         # Чтение конфигурации
  2751.         config = configparser.ConfigParser()
  2752.         config.read('../Guruxlar.ini')
  2753.         folder_link = config['T_Market']['Papka_linki']
  2754.        
  2755.         # Телеграм API идентификатор и хэш
  2756.         api_id = 253798
  2757.         api_hash = 'd806c9ed3eb74a233d58cb4a072a68f0'
  2758.        
  2759.         # Чтение CSV файла с аккаунтами
  2760.         def read_csv(file_path):
  2761.             accounts = []
  2762.             with open(file_path, 'r') as file:
  2763.                 reader = csv.reader(file)
  2764.                 for row in reader:
  2765.                     if len(row) == 1:
  2766.                         accounts.append({'phone_number': row[0]})
  2767.             return accounts
  2768.        
  2769.         # Функция для присоединения к папке
  2770.         async def join_folder(session_name, folder_link):
  2771.             match = re.match(r"^(?:https?://)?(?:www\.)?(?:t(?:elegram)?\.(?:org|me|dog)/(?:addlist/|\+))([\w-]+)$", folder_link)
  2772.        
  2773.             if match:
  2774.                 slug = match.group(1)
  2775.             elif isinstance(folder_link, str):
  2776.                 slug = folder_link
  2777.             else:
  2778.                 raise ValueError("Papka linki xato !!!")
  2779.        
  2780.             session_file = f'sessions/telethon_{session_name}.session'
  2781.             if not os.path.exists(session_file):
  2782.                 print(f"Sessiya {session_name} Topilmadi !!!")
  2783.                 return False
  2784.        
  2785.             try:
  2786.                 with open(session_file, 'r') as f:
  2787.                     session_string = f.read().strip()
  2788.             except FileNotFoundError:
  2789.                 print(f'Session fayl {session_name} Topilmadi!.')
  2790.                 return False
  2791.        
  2792.             try:
  2793.                 async with TelegramClient(StringSession(session_string), api_id, api_hash) as client:
  2794.                     try:
  2795.                         result = await client(functions.chatlists.CheckChatlistInviteRequest(slug=slug))
  2796.        
  2797.                         if isinstance(result, types.chatlists.ChatlistInviteAlready):
  2798.                             print("Bu papka sizda bor !!!")
  2799.                             return True
  2800.                         elif isinstance(result, types.chatlists.ChatlistInvite):
  2801.                             await client(functions.chatlists.JoinChatlistInviteRequest(slug=slug, peers=result.peers))
  2802.                             #print(f"Papkaga qoshildi: {session_name}")
  2803.                             #await asyncio.sleep(5)
  2804.                             return True
  2805.                         else:
  2806.                             print(f"Xato link: {type(result)}")
  2807.                             return False
  2808.        
  2809.                     except Exception as e:
  2810.                         print(f"Papkaga qoshilishda xatolik: {e}")
  2811.                         return False
  2812.        
  2813.             except RPCError as e:
  2814.                 print(f"Nomer:{session_name} XATO:{e}!")
  2815.                 return False
  2816.        
  2817.         # Путь к CSV файлу
  2818.         csv_file_path = "phone.csv"
  2819.         accounts = read_csv(csv_file_path)
  2820.        
  2821.         # Основная функция
  2822.         async def main():
  2823.             for account in accounts:
  2824.                 joined = await join_folder(account['phone_number'], folder_link)
  2825.                 if joined:
  2826.                     print(f"Papkaga qoshildi : {account['phone_number']}")
  2827.                 else:
  2828.                     print(f"bu nomer papkaga qoshila olmadi !!!{account['phone_number']}")
  2829.                 await asyncio.sleep(1)
  2830.        
  2831.         # Запуск основной функции
  2832.         if __name__ == "__main__":
  2833.             asyncio.run(main())
  2834.             input("ENTER chiqish...")
  2835.     elif a == 13:
  2836.         import csv
  2837.         import os
  2838.         import asyncio
  2839.         import configparser
  2840.         from telethon import TelegramClient
  2841.         from telethon.errors import RPCError
  2842.         from telethon.sessions import StringSession
  2843.         from telethon import functions, types
  2844.        
  2845.         # Чтение конфигурации
  2846.         config = configparser.ConfigParser()
  2847.         config.read('config.ini')
  2848.         api_id = 253798
  2849.         api_hash = 'd806c9ed3eb74a233d58cb4a072a68f0'
  2850.        
  2851.         def read_csv(file_path):
  2852.             accounts = []
  2853.             with open(file_path, 'r') as file:
  2854.                 reader = csv.reader(file)
  2855.                 for row in reader:
  2856.                     if len(row) == 1:
  2857.                         accounts.append({'phone_number': row[0]})
  2858.             return accounts
  2859.        
  2860.         async def leave_all_dialogs(client):
  2861.             # Получаем все диалоги (включая архивированные)
  2862.             dialogs = await client.get_dialogs(limit=1000)  # Увеличиваем лимит для охвата всех диалогов
  2863.             for dialog in dialogs:
  2864.                 try:
  2865.                     # Пропускаем служебные сообщения от Telegram
  2866.                     if isinstance(dialog.entity, types.User):
  2867.                         if dialog.entity.bot:
  2868.                             continue  # Пропускаем ботов
  2869.                         if dialog.entity.id == 777000:
  2870.                             continue  # Пропускаем служебные сообщения от Telegram
  2871.                    
  2872.                     # Пропускаем каналы и группы, но обрабатываем их по желанию
  2873.                     if isinstance(dialog.entity, (types.Channel, types.Chat)):
  2874.                         # Пропустите, если это нужно
  2875.                         pass
  2876.        
  2877.                     await client.delete_dialog(dialog.entity)
  2878.                     print(f"o'chirildi: {dialog.entity.title if hasattr(dialog.entity, 'title') else 'Nomsiz'}")
  2879.                 except Exception as e:
  2880.                     print(f"xatolik {dialog.entity.title if hasattr(dialog.entity, 'title') else 'Nomsiz'}: {e}")
  2881.        
  2882.         async def delete_folders(client):
  2883.             filters = await client(functions.messages.GetDialogFiltersRequest())
  2884.             if not filters or not filters.filters:
  2885.                 print("Papka topilmadi.")
  2886.                 return
  2887.        
  2888.             for folder in filters.filters:
  2889.                 # Пропускаем папку по умолчанию
  2890.                 if isinstance(folder, types.DialogFilterDefault):
  2891.                     print("Papka o'tqazib yuborildi.")
  2892.                     continue
  2893.        
  2894.                 try:
  2895.                     await client(functions.messages.UpdateDialogFilterRequest(
  2896.                         id=folder.id,
  2897.                         filter=None  # Удаляет папку
  2898.                     ))
  2899.                     print(f"o'chirildi: {folder.title if hasattr(folder, 'title') else 'Nomsiz'}")
  2900.                 except Exception as e:
  2901.                     print(f"Xatolik {folder.title if hasattr(folder, 'title') else 'Nomsiz'}: {e}")
  2902.        
  2903.         async def main():
  2904.             csv_file_path = "phone.csv"
  2905.             accounts = read_csv(csv_file_path)
  2906.        
  2907.             for account in accounts:
  2908.                 session_file = f'sessions/telethon_{account["phone_number"]}.session'
  2909.                 if not os.path.exists(session_file):
  2910.                     print(f"Sessiya {account['phone_number']} Topilmadi!")
  2911.                     continue
  2912.        
  2913.                 try:
  2914.                     with open(session_file, 'r') as f:
  2915.                         session_string = f.read().strip()
  2916.                 except FileNotFoundError:
  2917.                     print(f'Sessiya {account["phone_number"]} Topilmadi!')
  2918.                     continue
  2919.        
  2920.                 try:
  2921.                     async with TelegramClient(StringSession(session_string), api_id, api_hash) as client:
  2922.                         # Удаление всех диалогов
  2923.                         await leave_all_dialogs(client)
  2924.                         # Удаление всех папок
  2925.                         await delete_folders(client)
  2926.                 except RPCError as e:
  2927.                     print(f"Nomer: {account['phone_number']} Xatolik: {e}!")
  2928.                
  2929.                 await asyncio.sleep(1)  # Задержка в 1 секунду между выполнением функций
  2930.        
  2931.         if __name__ == "__main__":
  2932.             asyncio.run(main())
  2933.             input("Chiqish uchun ENTER...")
  2934.  
  2935.  
  2936.  
  2937.     elif a == 14:
  2938.         from datetime import datetime, timedelta, timezone
  2939.         import csv
  2940.         import asyncio
  2941.         from telethon import TelegramClient
  2942.         from telethon.sessions import StringSession
  2943.         from telethon.tl.types import MessageActionGiftCode
  2944.         from telethon.errors import RPCError
  2945.         from colorama import Fore, Style, init
  2946.         import os
  2947.        
  2948.         init()
  2949.        
  2950.         async def main():
  2951.             # Укажите необходимые данные для клиента Telethon
  2952.             api_id = 253798
  2953.             api_hash = 'd806c9ed3eb74a233d58cb4a072a68f0'
  2954.  
  2955.             chat_id = 777000  # ID чата для проверки
  2956.            
  2957.             # Чтение номеров телефонов из CSV-файла
  2958.             csv_file = 'phone.csv'  # Путь к CSV-файлу с номерами телефонов
  2959.             phone_numbers = read_phone_numbers_from_csv(csv_file)
  2960.        
  2961.             # Удаление старого файла и создание нового с заголовками
  2962.             output_csv_file = 'gift_codes.csv'
  2963.             if os.path.exists(output_csv_file):
  2964.                 os.remove(output_csv_file)
  2965.             write_csv_headers(output_csv_file)
  2966.        
  2967.             # Ввод количества дней с клавиатуры
  2968.             days = int(input("Necha kunni tekshirmoqchisiz: "))
  2969.        
  2970.             # Время days дней назад от текущего времени
  2971.             time_days_ago = datetime.now(timezone.utc) - timedelta(days=days)
  2972.        
  2973.             # Создание и запуск клиента Telethon
  2974.             for phone_number in phone_numbers:
  2975.                 session_file = f'sessions/telethon_{phone_number}.session'
  2976.                
  2977.                 try:
  2978.                     with open(session_file, 'r') as f:
  2979.                         session_string = f.read().strip()
  2980.                 except FileNotFoundError:
  2981.                     print(Fore.RED + f'Session fayl {phone_number} Topilmadi!.' + Style.RESET_ALL)
  2982.                     continue
  2983.                
  2984.                 client = TelegramClient(StringSession(session_string), api_id, api_hash)
  2985.                 try:
  2986.                     await client.connect()
  2987.                     if not await client.is_user_authorized():
  2988.                         print(Fore.YELLOW + f"Akount {phone_number} chiqarib yuborilgan!" + Style.RESET_ALL)
  2989.                         await client.disconnect()
  2990.                         continue
  2991.                     try:    
  2992.                         # Получение информации о пользователе
  2993.                         meer = await client.get_me()
  2994.                         me = meer.first_name
  2995.                        
  2996.                         # Список для хранения найденных сообщений с подарочными кодами
  2997.                         found_messages = []
  2998.                        
  2999.                         # Проверка каждого аккаунта на наличие розыгрыша в чате служебное уведомление
  3000.                         async for message in client.iter_messages(chat_id):
  3001.                             # Проверяем, является ли сообщение служебным и отправлено ли оно за последние days дней
  3002.                             if isinstance(message.action, MessageActionGiftCode) and message.date >= time_days_ago:
  3003.                                 print(Fore.GREEN + f"Akountda {phone_number}-{me} {Fore.GREEN}Tabriklaymiz Yutuq Kodi Topildi!!!" + Style.RESET_ALL)
  3004.                                 print(f"{Fore.GREEN}Yutuq Sanasi: {message.date}" + Style.RESET_ALL)
  3005.                                 gift_code_link = ""
  3006.                                 if message.action.slug:
  3007.                                     gift_code_link = f"https://t.me/giftcode/{message.action.slug}"
  3008.                                     print(f"{Fore.GREEN}Gift Kod Link: {gift_code_link}" + Style.RESET_ALL)
  3009.                                 months = message.action.months if message.action.months else "N/A"  # Добавляем проверку
  3010.                                 print(f"{Fore.GREEN}Oylik: {months}" + Style.RESET_ALL)
  3011.                                 found_messages.append(message)
  3012.                                 # Запись информации о найденном подарочном коде в общий CSV-файл
  3013.                                 write_gift_code_to_csv(output_csv_file, phone_number, me, message.date, months, gift_code_link)    
  3014.                        
  3015.                         # Если подарочный код не был найден, выводим соответствующее сообщение
  3016.                         if not found_messages:
  3017.                             print(Fore.RED + f"Akountda {phone_number}-{me} {Fore.RED}Yutuq Topilmadi!!!" + Style.RESET_ALL)
  3018.                         else:
  3019.                             # Выводим информацию о найденных сообщениях
  3020.                             print(f"{Fore.GREEN}Tabriklaymiz")
  3021.                             for message in found_messages:
  3022.                                 print(f"{Fore.GREEN}Yutuq sanasi: {message.date}")
  3023.                                 print("-" * 30)
  3024.                                
  3025.                     except Exception as e:
  3026.                         print(f"Xatolik: {e}")
  3027.                     finally:
  3028.                         await client.disconnect()
  3029.                
  3030.                 except RPCError as e:
  3031.                     print(Fore.RED + f"Nomer: {phone_number} XATO!:{e}" + Style.RESET_ALL)
  3032.                     continue
  3033.        
  3034.         def read_phone_numbers_from_csv(csv_file):
  3035.             with open(csv_file, 'r') as file:
  3036.                 reader = csv.reader(file)
  3037.                 phone_numbers = [row[0] for row in reader]
  3038.             return phone_numbers
  3039.        
  3040.         def write_csv_headers(csv_file):
  3041.             with open(csv_file, 'w', newline='') as file:
  3042.                 writer = csv.writer(file)
  3043.                 writer.writerow(['Phone Number', 'First Name', 'Date', 'Months',  'Gift Code Link'])
  3044.        
  3045.         def write_gift_code_to_csv(csv_file, phone_number, first_name, date, months, slug):
  3046.             with open(csv_file, 'a', newline='') as file:  # Используем 'a' для добавления записей
  3047.                 writer = csv.writer(file)
  3048.                 writer.writerow([phone_number, first_name, date, months, slug])
  3049.        
  3050.         if __name__ == "__main__":
  3051.             asyncio.run(main())
  3052.             input("ENTER chiqish...")
  3053.  
  3054.     elif a == 15:
  3055.         from telethon.sync import TelegramClient
  3056.         from telethon.sessions import StringSession
  3057.         from telethon.errors.rpcerrorlist import FloodWaitError, SessionPasswordNeededError, PhoneCodeInvalidError
  3058.         from telethon.errors import PhoneNumberInvalidError
  3059.         import csv
  3060.         import time
  3061.         import random  # <<-- qo'shildi
  3062.        
  3063.         # API_ID va HashID
  3064.         API_ID = 253798
  3065.         HashID = 'd806c9ed3eb74a233d58cb4a072a68f0'
  3066.        
  3067.         # --- YANGI: realistik random qurilmalar (2024–2025) ---
  3068.         RANDOM_DEVICES = [
  3069.             # Android / HarmonyOS
  3070.             {'device_model': 'Samsung SM-S928B (Galaxy S24 Ultra)', 'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  3071.             {'device_model': 'Samsung SM-A556B (Galaxy A55)',       'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  3072.             {'device_model': 'Google Pixel 9 Pro',                  'system_version': 'Android 15 (SDK 35)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  3073.             {'device_model': 'Xiaomi 14 (23127PN0CG)',              'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  3074.             {'device_model': 'Redmi Note 13 Pro 5G',                'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  3075.             {'device_model': 'OnePlus 12',                          'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  3076.             {'device_model': 'Nothing Phone (2a)',                  'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  3077.             {'device_model': 'realme 12 Pro+',                      'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  3078.             {'device_model': 'HUAWEI Pura 70 Pro',                  'system_version': 'HarmonyOS 4.2',        'app_version': '11.3.0 (3660) arm64-v8a'},
  3079.         ]
  3080.         def get_device_params():
  3081.             d = random.choice(RANDOM_DEVICES).copy()
  3082.             if 'Android' in d['system_version']:
  3083.                 d['system_version'] += ' | sdk 4.16.3-PYRO17'
  3084.             return {
  3085.                 'device_model': d['device_model'],
  3086.                 'system_version': d['system_version'],
  3087.                 'app_version': d['app_version'],
  3088.                 'lang_code': 'en',
  3089.                 'system_lang_code': 'en',
  3090.             }
  3091.         # ------------------------------------------------------
  3092.        
  3093.         def ariza():
  3094.             textfor1 = '''First, please confirm that you will never send this to strangers:
  3095.        - Unsolicited advertising of any kind
  3096.        - Promotional messages
  3097.        - Shocking materials
  3098.        Were you going to do anything like that?'''
  3099.            
  3100.             textfor2 = ''''Ajoyib! Bularni begonalarga yubormaganingizni tasdiqlang:
  3101.        - Har qanday turdagi nomaqbul reklama
  3102.        - Promoaksiya xabarlari
  3103.        - Shokka tushiruvchi materiallar
  3104.        
  3105.        Bularning birortasini qilganmisiz?'''
  3106.            
  3107.             textfor3 = '''Хорошо. Пожалуйста, подтвердите, что Вы никогда не отправляли незнакомым людям:
  3108.        - Рекламу, которую они не запрашивали
  3109.        - Материалы для продвижения чего-либо
  3110.        - Шок-контент
  3111.        
  3112.        Вы отправляли что-нибудь подобное?'''
  3113.             with open('phone.csv', 'r') as f:
  3114.                 str_list = [row[0] for row in csv.reader(f)]
  3115.                 spam_count = 0
  3116.                 no_limit_count = 0
  3117.                 complaint_count = 0
  3118.                 spam_numbers = []
  3119.                 no_limit_numbers = []
  3120.                 complaint_numbers = []
  3121.        
  3122.                 for phone_number in str_list:
  3123.                     session_file = f'sessions/telethon_{phone_number}.session'
  3124.                     try:
  3125.                         with open(session_file, 'r') as f:
  3126.                             session_string = f.read().strip()
  3127.                     except FileNotFoundError:
  3128.                         print(f'Session fayl {phone_number} Topilmadi!.')
  3129.                         continue
  3130.                     try:
  3131.                         # >>> YANGI: qurilma parametrlari bilan ulanamiz
  3132.                         device_params = get_device_params()
  3133.                         client = TelegramClient(StringSession(session_string), API_ID, HashID, **device_params)
  3134.                         client.connect()
  3135.                         if not client.is_user_authorized():
  3136.                             client.send_code_request(phone_number)
  3137.                             client.sign_in(phone_number, input('Enter the code: '))
  3138.        
  3139.                         me = client.get_me()
  3140.                         input_peer = client.get_entity('spambot')
  3141.                         client.send_message(input_peer, "/start")
  3142.                         time.sleep(2)
  3143.                         messages = client.get_messages(input_peer, limit=1)
  3144.        
  3145.                         if not messages:
  3146.                             print("Xabar topilmadi, keyingisi...")
  3147.                             continue
  3148.        
  3149.                         message = messages[0]
  3150.                         print(f"Bot: {message.text}")
  3151.        
  3152.                         if message.text == 'Good news, no limits are currently applied to your account. You’re free as a bird!':
  3153.                             time.sleep(2)
  3154.                             client.send_message(input_peer, "Cool, thanks")
  3155.                             print(f"Natija: {phone_number}: Spam emas")
  3156.                             no_limit_count += 1
  3157.                             no_limit_numbers.append(phone_number)
  3158.                         elif message.text == 'Ваш аккаунт свободен от каких-либо ограничений.':
  3159.                             time.sleep(2)
  3160.                             client.send_message(input_peer, "Хорошо, спасибо")
  3161.                             print(f"Natija: {phone_number}: Spam emas")
  3162.                             no_limit_count += 1
  3163.                             no_limit_numbers.append(phone_number)
  3164.                         elif message.text == 'Sizga xushxabarimiz bor! Hozirda hisobingizda hech qanday cheklov yoʻq. Misoli erkin qushsiz!':
  3165.                             time.sleep(2)
  3166.                             client.send_message(input_peer, "Yaxshi, rahmat")
  3167.                             print(f"Natija: {phone_number}: Spam emas")
  3168.                             no_limit_count += 1
  3169.                             no_limit_numbers.append(phone_number)
  3170.                         elif message.text in (
  3171.                             'Unfortunately, some phone numbers may trigger a harsh response from our anti-spam systems. If you think this is the case with you, you can submit a complaint to our moderators or subscribe to Telegram Premium to get less strict limits.',
  3172.                             'К сожалению, некоторые номера телефонов могут вызвать строгую реакцию наших антиспам-систем. Если вы считаете, что это касается вас, вы можете подать жалобу нашим модераторам или подписаться на Telegram Premium, чтобы получить менее строгие ограничения.',
  3173.                             "Afsuski, ba'zi telefon raqamlari bizning antispam tizimlarimiz tomonidan keskin munosabatga sabab bo'lishi mumkin. Agar bu sizga tegishli deb hisoblaysiz, moderatorlarimizga shikoyat qilishingiz yoki Telegram Premium-ga obuna bo'lishingiz mumkin, shunda cheklovlar kamroq qat'iy bo'ladi."
  3174.                         ):
  3175.                             print("Info: Akkauntda limit yo‘q, urinib ko‘ramiz...")
  3176.        
  3177.                         elif f'Hello {me.first_name}!' in message.text:
  3178.                             print(f"Info: {phone_number}: Acount vechny spamda.")
  3179.                             time.sleep(2)
  3180.                             client.send_message(input_peer, "This is a mistake")
  3181.                             messagee = client.get_messages(input_peer, limit=1)
  3182.        
  3183.                             if 'submit a complaint' in messagee[0].text:
  3184.                                 time.sleep(2)
  3185.                                 client.send_message(input_peer, "Yes")
  3186.                                 messageee = client.get_messages(input_peer, limit=1)
  3187.                                 time.sleep(2)
  3188.                                 client.send_message(input_peer, "No! Never did that!")
  3189.                                 messageeee = client.get_messages(input_peer, limit=1)
  3190.        
  3191.                                 content = "Please review my case."
  3192.                                 client.send_message(input_peer, content)
  3193.                                 print(f"Natija: {phone_number}: Ariza jo'natildi, javobini kuting.")
  3194.                                 spam_count += 1
  3195.                                 spam_numbers.append(phone_number)
  3196.                                 complaint_count += 1
  3197.                                 complaint_numbers.append(phone_number)
  3198.                             elif messagee[0].text == textfor1:
  3199.                                 time.sleep(2)
  3200.                                 client.send_message(input_peer, "No, I’ll never do any of this!")
  3201.                             elif "You've already submitted a complaint recently" in messagee[0].text:
  3202.                                 print(f"Natija: {phone_number}: Ariza oldin jo'natilgan.")
  3203.                                 spam_count += 1
  3204.                                 spam_numbers.append(phone_number)
  3205.                                 complaint_count += 1
  3206.                                 complaint_numbers.append(phone_number)
  3207.        
  3208.                         elif f'Здравствуйте, {me.first_name}!' in message.text:
  3209.                             print(f"Info: {phone_number}: Acount vechny spamda.")
  3210.                             time.sleep(2)
  3211.                             client.send_message(input_peer, "Это ошибка")
  3212.                             messagee = client.get_messages(input_peer, limit=1)
  3213.        
  3214.                             if 'сообщите об этом нашим модераторам' in messagee[0].text:
  3215.                                 time.sleep(2)
  3216.                                 client.send_message(input_peer, "Да")
  3217.                                 messageee = client.get_messages(input_peer, limit=1)
  3218.                                 time.sleep(2)
  3219.                                 client.send_message(input_peer, "Нет, ничего подобного не было.")
  3220.                                 messageeee = client.get_messages(input_peer, limit=1)
  3221.        
  3222.                                 content = "Здравствуйте, мой аккаунт в спаме по ошибке. Пожалуйста, откройте."
  3223.                                 client.send_message(input_peer, content)
  3224.                                 print(f"Natija: {phone_number}: Ariza jo'natildi, javobini kuting.")
  3225.                                 spam_count += 1
  3226.                                 spam_numbers.append(phone_number)
  3227.                                 complaint_count += 1
  3228.                                 complaint_numbers.append(phone_number)
  3229.                             elif messagee[0].text == textfor2:
  3230.                                 time.sleep(2)
  3231.                                 client.send_message(input_peer, "Нет, я никогда не буду этого делать!")
  3232.                             elif "Вы уже отправили одну апелляцию." in messagee[0].text:
  3233.                                 print(f"Natija: {phone_number}: Ariza oldin jo'natilgan.")
  3234.                                 spam_count += 1
  3235.                                 spam_numbers.append(phone_number)
  3236.                                 complaint_count += 1
  3237.                                 complaint_numbers.append(phone_number)
  3238.        
  3239.                         elif f'Salom {me.first_name}!' in message.text:
  3240.                             print(f"Info: {phone_number}: Acount vechny spamda.")
  3241.                             time.sleep(2)
  3242.                             client.send_message(input_peer, "Bu xato")
  3243.                             messagee = client.get_messages(input_peer, limit=1)
  3244.        
  3245.                             if 'сообщите об этом нашим модераторам' in messagee[0].text:
  3246.                                 time.sleep(2)
  3247.                                 client.send_message(input_peer, "Ha")
  3248.                                 messageee = client.get_messages(input_peer, limit=1)
  3249.                                 time.sleep(2)
  3250.                                 client.send_message(input_peer, "Yo\'q! Bunday holat aslo kuzatilmagan!")
  3251.                                 messageeee = client.get_messages(input_peer, limit=1)
  3252.        
  3253.                                 content = "Salom, akkauuntim xatolik sababli spamga tushgan. Iltimos, ko‘rib chiqing."
  3254.                                 client.send_message(input_peer, content)
  3255.                                 print(f"Natija: {phone_number}: Ariza jo'natildi, javobini kuting.")
  3256.                                 spam_count += 1
  3257.                                 spam_numbers.append(phone_number)
  3258.                                 complaint_count += 1
  3259.                                 complaint_numbers.append(phone_number)
  3260.                             elif messagee[0].text == textfor3:
  3261.                                 time.sleep(2)
  3262.                                 client.send_message(input_peer, "Yo‘q, men hech qachon bunday qilmayman!")
  3263.                             elif "Siz yaqindagina ariza yo'lladingiz." in messagee[0].text:
  3264.                                 print(f"Natija: {phone_number}: Ariza oldin jo'natilgan.")
  3265.                                 spam_count += 1
  3266.                                 spam_numbers.append(phone_number)
  3267.                                 complaint_count += 1
  3268.                                 complaint_numbers.append(phone_number)
  3269.        
  3270.                         else:
  3271.                             print(f"Natija: {phone_number}: Acount kunlik spamda.")
  3272.                             spam_count += 1
  3273.                             spam_numbers.append(phone_number)
  3274.        
  3275.                     except FloodWaitError as e:
  3276.                         print(f"Xatolik: {e}")
  3277.                     except SessionPasswordNeededError as e:
  3278.                         print(f"Xatolik: {e}")
  3279.                     except PhoneCodeInvalidError as e:
  3280.                         print(f"Xatolik: {e}")
  3281.                     except PhoneNumberInvalidError as e:
  3282.                         print(f"Xatolik: {e}")
  3283.                     finally:
  3284.                         if client:
  3285.                             client.disconnect()
  3286.                         print()
  3287.        
  3288.             print('Tekshirildi')
  3289.             print('Itoğ:')
  3290.             print(f'Toza: {no_limit_count}')
  3291.             print(f'Spamda: {spam_count}')
  3292.             print(f'Ariza jo\'natildi: {complaint_count}')
  3293.        
  3294.             print('\nToza nomerlar:')
  3295.             for number in no_limit_numbers:
  3296.                 print(number)
  3297.        
  3298.             print('\nSpam nomerlar:')
  3299.             for number in spam_numbers:
  3300.                 print(number)
  3301.        
  3302.             print('\nAriza jo\'natilgan nomerlar:')
  3303.             for number in complaint_numbers:
  3304.                 print(number)
  3305.        
  3306.             print('Enter chiqish')
  3307.             input()
  3308.        
  3309.         if __name__ == "__main__":
  3310.             ariza()
  3311.  
  3312.     elif a == 16:
  3313.         import csv
  3314.         import asyncio
  3315.         import sqlite3
  3316.         from telethon import TelegramClient
  3317.         from telethon.errors import RPCError
  3318.        
  3319.         API_ID = 253798
  3320.         API_HASH = 'd806c9ed3eb74a233d58cb4a072a68f0'
  3321.        
  3322.         async def clean_session(file_path):
  3323.             try:
  3324.                 conn = sqlite3.connect(file_path)
  3325.                 cursor = conn.cursor()
  3326.        
  3327.                 # Удаляем все строки из таблиц
  3328.                 cursor.execute("DELETE FROM update_state")
  3329.                 cursor.execute("DELETE FROM sent_files")
  3330.                 cursor.execute("DELETE FROM entities")
  3331.                 conn.commit()  # Коммитим изменения, чтобы завершить транзакцию
  3332.        
  3333.                 # Выполняем вакуумизацию, чтобы освободить пространство
  3334.                 cursor.execute("VACUUM")
  3335.                 conn.close()
  3336.                 print(f"Sessiya {file_path} tozalandi.")
  3337.             except sqlite3.Error as e:
  3338.                 print(f"Xatolik: {e}")
  3339.        
  3340.         async def handle_phone(phone):
  3341.             print(f"Start {phone}")
  3342.             session_path = f'sessions/{phone}_SQLite.session'
  3343.             client = TelegramClient(session_path, API_ID, API_HASH)
  3344.        
  3345.             try:
  3346.                 await client.start(phone=phone)
  3347.                 if await client.is_user_authorized():
  3348.                     print(f"Nomer: {phone} ulandi")
  3349.             except RPCError as e:
  3350.                 print(f"Nomer: {phone} CHIQARIB YUBORILGAN!")
  3351.             finally:
  3352.                 try:
  3353.                     await client.disconnect()
  3354.                 except Exception as e:
  3355.                     print(f"XATOLIK {e}")
  3356.                 await clean_session(session_path)
  3357.        
  3358.         async def main():
  3359.             with open('phone.csv', 'r') as f:
  3360.                 str_list = [row[0] for row in csv.reader(f)]
  3361.                 await asyncio.gather(*[handle_phone(phone) for phone in str_list])
  3362.        
  3363.         # Запуск основной функции
  3364.         if __name__ == "__main__":
  3365.             asyncio.run(main())
  3366.             input("Нажмите ENTER для выхода...")
  3367.            
  3368.     elif a == 17:    
  3369.         import subprocess
  3370.         import sys
  3371.         import os
  3372.        
  3373.         # ---- Pip orqali modulni jim o'rnatish/tekshirish ----
  3374.         def install_package(package_name):
  3375.             try:
  3376.                 subprocess.check_call(
  3377.                     [sys.executable, "-m", "pip", "show", package_name],
  3378.                     stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL
  3379.                 )
  3380.                 print("MODUL ORNATILGAN!.")
  3381.             except subprocess.CalledProcessError:
  3382.                 print("MODUL O'RNATIMOQDA...")
  3383.                 subprocess.check_call(
  3384.                     [sys.executable, "-m", "pip", "install", package_name, "-q", "--disable-pip-version-check"],
  3385.                     stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL
  3386.                 )
  3387.                 print("OK.")
  3388.        
  3389.         # cryptography kerak bo'ladi
  3390.         install_package('cryptography')
  3391.        
  3392.        
  3393.         import csv
  3394.         import asyncio
  3395.         import random
  3396.         from telethon import TelegramClient, errors
  3397.         from telethon.sessions import StringSession
  3398.        
  3399.         API_ID = 253798
  3400.         API_HASH = 'd806c9ed3eb74a233d58cb4a072a68f0'
  3401.         SESSION_FOLDER = './sessions'
  3402.        
  3403.         # ==== FAQAT MOBIL QURILMALAR (desktop yo‘q) ====
  3404.         RANDOM_DEVICES = [
  3405.             {'device_model': 'Samsung SM-S928B (Galaxy S24 Ultra)', 'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  3406.             {'device_model': 'Samsung SM-A556B (Galaxy A55)',       'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  3407.             {'device_model': 'Google Pixel 9 Pro',                  'system_version': 'Android 15 (SDK 35)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  3408.             {'device_model': 'Xiaomi 14 (23127PN0CG)',              'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  3409.             {'device_model': 'Redmi Note 13 Pro 5G',                'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  3410.             {'device_model': 'OnePlus 12',                          'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  3411.             {'device_model': 'Nothing Phone (2a)',                  'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  3412.             {'device_model': 'realme 12 Pro+',                      'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  3413.             {'device_model': 'HUAWEI Pura 70 Pro',                  'system_version': 'HarmonyOS 4.2',        'app_version': '11.3.0 (3660) arm64-v8a'},
  3414.         ]
  3415.         def get_device_params():
  3416.             d = random.choice(RANDOM_DEVICES).copy()
  3417.             if 'Android' in d['system_version']:
  3418.                 d['system_version'] += ' | sdk 4.16.3-PYRO17'
  3419.             return {
  3420.                 'device_model': d['device_model'],
  3421.                 'system_version': d['system_version'],
  3422.                 'app_version': d['app_version'],
  3423.                 'lang_code': 'en',
  3424.                 'system_lang_code': 'en',
  3425.             }
  3426.         # ================================================
  3427.        
  3428.         # Telefonlarni CSV dan o‘qish
  3429.         def read_phones_from_csv(file_path):
  3430.             phone_numbers = []
  3431.             with open(file_path, newline='', encoding='utf-8') as csvfile:
  3432.                 reader = csv.reader(csvfile)
  3433.                 for row in reader:
  3434.                     if row:
  3435.                         phone_numbers.append(row[0])
  3436.             return phone_numbers
  3437.        
  3438.         # CSV ga qayta yozish (bo‘sh qatorlarsiz)
  3439.         def write_phones_to_csv(file_path, phone_numbers):
  3440.             phone_numbers = [phone.strip() for phone in phone_numbers if phone.strip()]
  3441.             with open(file_path, 'w', encoding='utf-8') as csvfile:
  3442.                 csvfile.write('\n'.join(phone_numbers))
  3443.        
  3444.         # +998... yoki 998... — har ikkala formatni ham qo‘llab-quvvatlash
  3445.         def normalize_phone_for_signin(raw: str) -> str:
  3446.             s = raw.strip().replace(' ', '').replace('-', '').replace('(', '').replace(')', '')
  3447.             return s if s.startswith('+') else f'+{s}'
  3448.        
  3449.         # Bitta telefon uchun session yaratish/tekshirish
  3450.         async def create_and_check_session(phone, semaphore, valid_phones, invalid_phones):
  3451.             async with semaphore:
  3452.                 os.makedirs(SESSION_FOLDER, exist_ok=True)
  3453.                 session_file = os.path.join(SESSION_FOLDER, f'telethon_{phone}.session')
  3454.                 sqlite_session_file = os.path.join(SESSION_FOLDER, f'{phone}_SQLite.session')
  3455.        
  3456.                 device_params = get_device_params()
  3457.        
  3458.                 if os.path.exists(session_file):
  3459.                     with open(session_file, 'r', encoding='utf-8') as f:
  3460.                         session_string = f.read().strip()
  3461.                         client = TelegramClient(StringSession(session_string), API_ID, API_HASH, **device_params)
  3462.                 else:
  3463.                     client = TelegramClient(StringSession(), API_ID, API_HASH, **device_params)
  3464.        
  3465.                 try:
  3466.                     await client.connect()
  3467.                     if not await client.is_user_authorized():
  3468.                         e164 = normalize_phone_for_signin(phone)
  3469.                         await client.send_code_request(e164)
  3470.                         attempt_count = 0
  3471.                         while True:
  3472.                             # Atayin noto‘g‘ri kod — sizning mavjud mantiqingiz (3 martagacha)
  3473.                             code = "0000"
  3474.                             try:
  3475.                                 await client.sign_in(e164, code)
  3476.                                 print(f"Tasdiqlandi {phone}")
  3477.                                 break
  3478.                             except errors.SessionPasswordNeededError:
  3479.                                 # 2FA parol sikli
  3480.                                 while True:
  3481.                                     password = input(f'{phone} 2FA parolini kiriting: ')
  3482.                                     try:
  3483.                                         await client.sign_in(password=password)
  3484.                                         print(f"Tasdiqlandi {phone}\n")
  3485.                                         break
  3486.                                     except errors.PasswordHashInvalidError:
  3487.                                         print("Parol xato. Yana kiriting!\n")
  3488.                                     except Exception as e:
  3489.                                         print(f"Xato parol yoki kod: {str(e)}")
  3490.                                 break
  3491.                             except errors.CodeInvalidError:
  3492.                                 attempt_count += 1
  3493.                                 if attempt_count >= 3:
  3494.                                     print(f"{phone} kodi 3 marta xato. O‘chiriladi.")
  3495.                                     invalid_phones.append(phone)
  3496.                                     break
  3497.                                 print("Kod xato. Yana kiriting!\n")
  3498.                             except errors.PhoneNumberBannedError:
  3499.                                 print(f"{phone} NOMER BAN O'CHIRILDI!.")
  3500.                                 invalid_phones.append(phone)
  3501.                                 if os.path.exists(session_file):
  3502.                                     os.remove(session_file)
  3503.                                 if os.path.exists(sqlite_session_file):
  3504.                                     os.remove(sqlite_session_file)
  3505.                                 return
  3506.                             except Exception as e:
  3507.                                 print(f"Xato kod/parol: {str(e)}")
  3508.                                 invalid_phones.append(phone)
  3509.                                 break
  3510.        
  3511.                         if await client.is_user_authorized():
  3512.                             session_string = client.session.save()
  3513.                             with open(session_file, 'w', encoding='utf-8') as f:
  3514.                                 f.write(session_string)
  3515.                             valid_phones.append(phone)
  3516.                         else:
  3517.                             print(f"{phone} TASDIQLANMAGAN NOMER. O'CHIRILDI!.")
  3518.                             invalid_phones.append(phone)
  3519.                             if os.path.exists(session_file):
  3520.                                 os.remove(session_file)
  3521.                             if os.path.exists(sqlite_session_file):
  3522.                                 os.remove(sqlite_session_file)
  3523.                     else:
  3524.                         print(f"{phone} Tasdiqlandi\n")
  3525.                         valid_phones.append(phone)
  3526.                 except errors.PhoneNumberBannedError:
  3527.                     print(f"{phone} NOMER BAN O'CHIRILDI!")
  3528.                     invalid_phones.append(phone)
  3529.                     if os.path.exists(session_file):
  3530.                         os.remove(session_file)
  3531.                     if os.path.exists(sqlite_session_file):
  3532.                         os.remove(sqlite_session_file)
  3533.                 except Exception as e:
  3534.                     print(f"Xatolik {phone}: {str(e)}")
  3535.                     invalid_phones.append(phone)
  3536.                 finally:
  3537.                     await client.disconnect()
  3538.        
  3539.         # Asosiy oqim
  3540.         async def main():
  3541.             phone_numbers = read_phones_from_csv('phone.csv')
  3542.             semaphore = asyncio.Semaphore(5)
  3543.             valid_phones = []
  3544.             invalid_phones = []
  3545.        
  3546.             tasks = [create_and_check_session(phone, semaphore, valid_phones, invalid_phones) for phone in phone_numbers]
  3547.             await asyncio.gather(*tasks)
  3548.        
  3549.             # CSV dan noto‘g‘ri (ban/xato)larni olib tashlaymiz
  3550.             phone_numbers = [phone for phone in phone_numbers if phone not in invalid_phones]
  3551.             write_phones_to_csv('phone.csv', phone_numbers)
  3552.        
  3553.             print("AKOUNTLAR RO'YXATI YANGILANDI SESSION FAYLLAR XAM!\n")
  3554.             input("ENTER чиқиш")
  3555.        
  3556.         if __name__ == "__main__":
  3557.             asyncio.run(main())
  3558.  
  3559.  
  3560.     elif a == 18:
  3561.         import random
  3562.  
  3563.         # === MOBIL QURILMA FINGERPRINTLARI ===
  3564.         RANDOM_DEVICES = [
  3565.             {'device_model': 'Samsung SM-S928B (Galaxy S24 Ultra)', 'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  3566.             {'device_model': 'Samsung SM-A556B (Galaxy A55)',       'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  3567.             {'device_model': 'Google Pixel 9 Pro',                  'system_version': 'Android 15 (SDK 35)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  3568.             {'device_model': 'Xiaomi 14',                           'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  3569.             {'device_model': 'Redmi Note 13 Pro 5G',                'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  3570.             {'device_model': 'OnePlus 12',                          'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  3571.             {'device_model': 'Nothing Phone (2a)',                  'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  3572.             {'device_model': 'realme 12 Pro+',                      'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  3573.             {'device_model': 'HUAWEI Pura 70 Pro',                  'system_version': 'HarmonyOS 4.2',        'app_version': '11.3.0 (3660) arm64-v8a'},
  3574.         ]
  3575.        
  3576.         def get_device_params():
  3577.             d = random.choice(RANDOM_DEVICES).copy()
  3578.             if 'Android' in d['system_version']:
  3579.                 d['system_version'] += ' | sdk 4.16.3-PYRO17'
  3580.             return {
  3581.                 'device_model': d['device_model'],
  3582.                 'system_version': d['system_version'],
  3583.                 'app_version': d['app_version'],
  3584.                 'lang_code': 'en',
  3585.                 'system_lang_code': 'en',
  3586.             }
  3587.        
  3588.         # === TANLOV MENYUSI ===
  3589.         ch = int(input("[1] Reaksiya bo'yicha olish \n[2] Xabarlar bo'yicha olish\n\nTANLANG: "))
  3590.        
  3591.         # =====================================================
  3592.         # 1 — REAKSIYA BO‘YICHA
  3593.         # =====================================================
  3594.         if ch == 1:
  3595.             import asyncio, csv
  3596.             from telethon import TelegramClient
  3597.             from telethon.sessions import SQLiteSession
  3598.             from telethon.tl import functions
  3599.             from colorama import Fore, init
  3600.             from telethon.errors import FloodWaitError
  3601.             init(autoreset=True)
  3602.        
  3603.             API_ID = 253798
  3604.             API_HASH = 'd806c9ed3eb74a233d58cb4a072a68f0'
  3605.        
  3606.             def read_phones_from_csv(path):
  3607.                 try:
  3608.                     with open(path, newline='') as f:
  3609.                         return [r[0] for r in csv.reader(f) if r]
  3610.                 except Exception as e:
  3611.                     print(Fore.RED + f"CSV o‘qishda xato: {e}")
  3612.                     return []
  3613.        
  3614.             async def get_reactions_list(client, chat, msg_id, limit=100):
  3615.                 try:
  3616.                     peer = await client.get_input_entity(chat)
  3617.                     return await client(functions.messages.GetMessageReactionsListRequest(peer=peer, id=msg_id, limit=limit))
  3618.                 except Exception as e:
  3619.                     print(Fore.RED + f"Reaksiyalarni olishda xato {msg_id}: {e}")
  3620.                     return None
  3621.        
  3622.             async def get_user_by_id(client, user_id):
  3623.                 try:
  3624.                     return await client.get_entity(user_id)
  3625.                 except FloodWaitError as e:
  3626.                     print(Fore.YELLOW + f"Kutamiz {e.seconds} sekund...")
  3627.                     await asyncio.sleep(e.seconds)
  3628.                     return await get_user_by_id(client, user_id)
  3629.                 except Exception:
  3630.                     return None
  3631.        
  3632.             async def process_messages(client, link, limit, save_to_csv=False):
  3633.                 try:
  3634.                     peer = await client.get_entity(link)
  3635.                     msgs = await client.get_messages(peer, limit=limit)
  3636.                     total = len(msgs)
  3637.                     users_all = []
  3638.                     i = 1
  3639.        
  3640.                     print(Fore.CYAN + f"Topildi {total} xabarlar. Boshladik...")
  3641.        
  3642.                     for idx, m in enumerate(msgs, start=1):
  3643.                         if m.reactions and m.reactions.results:
  3644.                             res = await get_reactions_list(client, link, m.id)
  3645.                             if res:
  3646.                                 for u in res.users:
  3647.                                     user = await get_user_by_id(client, u.id)
  3648.                                     if user:
  3649.                                         info = (i, f"{user.first_name or ''} {user.last_name or ''}".strip(),
  3650.                                                 user.id, getattr(user, "access_hash", "?"))
  3651.                                         if save_to_csv:
  3652.                                             users_all.append(info)
  3653.                                         i += 1
  3654.                         prog = (idx / total) * 100
  3655.                         print(f"\r{Fore.GREEN}POSTLAR TEKSHIRILYAPTI: {prog:.1f}%", end="")
  3656.                     print()
  3657.        
  3658.                     if save_to_csv:
  3659.                         with open('users.csv', 'w', newline='', encoding='utf-8') as f:
  3660.                             w = csv.writer(f)
  3661.                             w.writerow(['#', 'Ism', 'ID', 'AccessHash'])
  3662.                             w.writerows(users_all)
  3663.                         print(Fore.GREEN + "users.csv saqlandi!")
  3664.                 except Exception as e:
  3665.                     print(Fore.RED + f"Xato: {e}")
  3666.        
  3667.             async def main():
  3668.                 phones = read_phones_from_csv('phone.csv')
  3669.                 if not phones:
  3670.                     print("phone.csv bo‘sh!")
  3671.                     return
  3672.                 first = phones[0]
  3673.                 session = f"sessions/{first}_SQLite.session"
  3674.                 link = input("Gurux linkini kiriting: ")
  3675.                 limit = int(input("Nechta postni tekshiramiz: "))
  3676.        
  3677.                 device_params = get_device_params()
  3678.                 client = TelegramClient(SQLiteSession(session), API_ID, API_HASH, **device_params)
  3679.                 await client.connect()
  3680.                 if not await client.is_user_authorized():
  3681.                     print(Fore.RED + "Akkaunt avtorizatsiyadan chiqib ketgan!")
  3682.                     await client.disconnect()
  3683.                     return
  3684.                 await process_messages(client, link, limit, save_to_csv=True)
  3685.                 await client.disconnect()
  3686.        
  3687.             asyncio.run(main())
  3688.        
  3689.         # =====================================================
  3690.         # 2 — XABARLAR BO‘YICHA
  3691.         # =====================================================
  3692.         elif ch == 2:
  3693.             import asyncio, csv
  3694.             from telethon import TelegramClient, types
  3695.             from telethon.sessions import SQLiteSession
  3696.             from colorama import Fore, init
  3697.             from telethon.errors import FloodWaitError
  3698.             init(autoreset=True)
  3699.        
  3700.             API_ID = 253798
  3701.             API_HASH = 'd806c9ed3eb74a233d58cb4a072a68f0'
  3702.        
  3703.             def read_phones_from_csv(path):
  3704.                 try:
  3705.                     with open(path, newline='') as f:
  3706.                         return [r[0] for r in csv.reader(f) if r]
  3707.                 except Exception as e:
  3708.                     print(Fore.RED + f"CSV o‘qishda xato: {e}")
  3709.                     return []
  3710.        
  3711.             async def get_user_by_id(client, user_id):
  3712.                 try:
  3713.                     return await client.get_entity(user_id)
  3714.                 except FloodWaitError as e:
  3715.                     print(Fore.YELLOW + f"Kutamiz {e.seconds} sekund...")
  3716.                     await asyncio.sleep(e.seconds)
  3717.                     return await get_user_by_id(client, user_id)
  3718.                 except Exception:
  3719.                     return None
  3720.        
  3721.             async def process_messages(client, link, limit, save_to_csv=False):
  3722.                 try:
  3723.                     peer = await client.get_entity(link)
  3724.                     msgs = await client.get_messages(peer, limit=limit)
  3725.                     total = len(msgs)
  3726.                     users = []
  3727.                     seen = set()
  3728.                     i = 1
  3729.        
  3730.                     print(Fore.CYAN + f"Topildi {total} xabar. Boshladik...")
  3731.        
  3732.                     for idx, m in enumerate(msgs, start=1):
  3733.                         if m.sender_id and (m.text or m.photo):
  3734.                             user = await get_user_by_id(client, m.sender_id)
  3735.                             if user and isinstance(user, types.User) and not user.bot:
  3736.                                 name = f"{user.first_name or ''} {user.last_name or ''}".strip()
  3737.                                 if name in seen:
  3738.                                     continue
  3739.                                 seen.add(name)
  3740.                                 info = (i, name, user.id, getattr(user, "access_hash", "?"))
  3741.                                 if save_to_csv:
  3742.                                     users.append(info)
  3743.                                 i += 1
  3744.                         print(f"\r{Fore.GREEN}POSTLAR TEKSHIRILYAPTI: {(idx / total) * 100:.1f}%", end="")
  3745.                     print()
  3746.        
  3747.                     if save_to_csv:
  3748.                         with open('users.csv', 'w', newline='', encoding='utf-8') as f:
  3749.                             w = csv.writer(f)
  3750.                             w.writerow(['#', 'Ism', 'ID', 'AccessHash'])
  3751.                             w.writerows(users)
  3752.                         print(Fore.GREEN + "users.csv saqlandi!")
  3753.                 except Exception as e:
  3754.                     print(Fore.RED + f"Xato: {e}")
  3755.        
  3756.             async def main():
  3757.                 phones = read_phones_from_csv('phone.csv')
  3758.                 if not phones:
  3759.                     print("phone.csv bo‘sh!")
  3760.                     return
  3761.                 first = phones[0]
  3762.                 session = f"sessions/{first}_SQLite.session"
  3763.                 link = input("Gurux linkini kiriting: ")
  3764.                 limit = int(input("Nechta postni tekshiramiz: "))
  3765.        
  3766.                 device_params = get_device_params()
  3767.                 client = TelegramClient(SQLiteSession(session), API_ID, API_HASH, **device_params)
  3768.                 await client.connect()
  3769.                 if not await client.is_user_authorized():
  3770.                     print(Fore.RED + "Akkaunt avtorizatsiyadan chiqib ketgan!")
  3771.                     await client.disconnect()
  3772.                     return
  3773.                 await process_messages(client, link, limit, save_to_csv=True)
  3774.                 await client.disconnect()
  3775.        
  3776.             asyncio.run(main())
  3777.    
  3778.     elif a == 19:
  3779.         from datetime import datetime, timedelta, timezone
  3780.         import csv
  3781.         import random
  3782.         import asyncio
  3783.         from telethon import TelegramClient
  3784.         from telethon.sessions import StringSession
  3785.         from telethon.tl.types import MessageActionPrizeStars, PeerChannel
  3786.         from telethon.errors import RPCError
  3787.         from colorama import Fore, Style, init
  3788.         import os
  3789.        
  3790.         init()
  3791.        
  3792.         async def main():
  3793.             # Укажите необходимые данные для клиента Telethon
  3794.             api_id = 253798
  3795.             api_hash = 'd806c9ed3eb74a233d58cb4a072a68f0'
  3796.            
  3797.             chat_id = 777000  # ID чата для проверки
  3798.            
  3799.             # Чтение номеров телефонов из CSV-файла
  3800.             csv_file = 'phone.csv'  # Путь к CSV-файлу с номерами телефонов
  3801.             phone_numbers = read_phone_numbers_from_csv(csv_file)
  3802.        
  3803.             # Удаление старого файла и создание нового с заголовками
  3804.             output_csv_file = 'gift_codes.csv'
  3805.             if os.path.exists(output_csv_file):
  3806.                 os.remove(output_csv_file)
  3807.             write_csv_headers(output_csv_file)
  3808.        
  3809.             # Ввод количества дней с клавиатуры
  3810.             days = int(input("Necha kunni tekshirmoqchisiz: "))
  3811.        
  3812.             # Время days дней назад от текущего времени
  3813.             time_days_ago = datetime.now(timezone.utc) - timedelta(days=days)
  3814.        
  3815.             # Создание и запуск клиента Telethon
  3816.             for phone_number in phone_numbers:
  3817.                 session_file = f'sessions/telethon_{phone_number}.session'
  3818.                
  3819.                 try:
  3820.                     with open(session_file, 'r') as f:
  3821.                         session_string = f.read().strip()
  3822.                 except FileNotFoundError:
  3823.                     print(Fore.RED + f'Session fayl {phone_number} Topilmadi!.' + Style.RESET_ALL)
  3824.                     continue
  3825.  
  3826.                 client = TelegramClient(StringSession(session_string), api_id, api_hash)
  3827.                
  3828.                 try:
  3829.                     await client.connect()
  3830.                     if not await client.is_user_authorized():
  3831.                         print(Fore.YELLOW + f"Akount {phone_number} chiqarib yuborilgan!" + Style.RESET_ALL)
  3832.                         await client.disconnect()
  3833.                         continue
  3834.                    
  3835.                     try:    
  3836.                         # Получение информации о пользователе
  3837.                         meer = await client.get_me()
  3838.                         me = meer.first_name
  3839.                        
  3840.                         # Список для хранения найденных сообщений с подарочными кодами
  3841.                         found_messages = []
  3842.                        
  3843.                         # Проверка сообщений с подарочными звёздочками
  3844.                         async for message in client.iter_messages(chat_id):
  3845.                             if isinstance(message.action, MessageActionPrizeStars) and message.date >= time_days_ago:
  3846.                                 print(Fore.GREEN + f"Akountda {phone_number}-{me} {Fore.GREEN}Yulduzlar Topildi!!!" + Style.RESET_ALL)
  3847.                                 print(f"{Fore.GREEN}Yutuq Sanasi: {message.date}" + Style.RESET_ALL)
  3848.                                
  3849.                                 action = message.action
  3850.                                 stars = action.stars
  3851.                                 transaction_id = action.transaction_id
  3852.                                 boost_peer = action.boost_peer
  3853.                                 # Получаем имя канала или username
  3854.                                 if isinstance(boost_peer, PeerChannel):
  3855.                                     channel = await client.get_entity(boost_peer)
  3856.                                     channel_name = channel.title
  3857.                                 else:
  3858.                                     channel_name = "Nomalum kanal"
  3859.                                 # Добавляем сообщение в список найденных
  3860.                                 found_messages.append(message)
  3861.                                
  3862.                                 print(f"{Fore.GREEN}Yulduzlar Soni: {stars}" + Style.RESET_ALL)
  3863.                                 print(f"{Fore.GREEN}Kim tomonidan berilgani: {channel_name}" + Style.RESET_ALL)
  3864.                                 print(f"{Fore.GREEN}Yutuq linki: {transaction_id}\n" + Style.RESET_ALL)
  3865.                        
  3866.                                 # Запись в CSV
  3867.                                 write_gift_code_to_csv(output_csv_file, phone_number, me, message.date, stars, channel_name, transaction_id)
  3868.        
  3869.                        
  3870.                         # Если подарочный код не был найден, выводим соответствующее сообщение
  3871.                         if not found_messages:
  3872.                             print(Fore.RED + f"Akountda {phone_number}-{me} {Fore.RED}Yutuq Topilmadi!!!" + Style.RESET_ALL)
  3873.                         else:
  3874.                             # Выводим информацию о найденных сообщениях
  3875.                             print(f"{Fore.GREEN}Tabriklaymiz")
  3876.                             for message in found_messages:
  3877.                                 print(f"{Fore.GREEN}Yutuq sanasi: {message.date}")
  3878.                                 print("-" * 30)
  3879.                                
  3880.                     except Exception as e:
  3881.                         print(f"Xatolik: {e}")
  3882.                     finally:
  3883.                         await client.disconnect()
  3884.                
  3885.                 except RPCError as e:
  3886.                     print(Fore.RED + f"Nomer: {phone_number} XATO!:{e}" + Style.RESET_ALL)
  3887.                     continue
  3888.         def read_phone_numbers_from_csv(csv_file):
  3889.             with open(csv_file, 'r') as file:
  3890.                 reader = csv.reader(file)
  3891.                 phone_numbers = [row[0] for row in reader]
  3892.             return phone_numbers
  3893.        
  3894.         def write_csv_headers(file_path):
  3895.             with open(file_path, 'w', newline='', encoding='utf-8') as csvfile:
  3896.                 writer = csv.writer(csvfile)
  3897.                 writer.writerow(['Phone Number', 'first_name', 'Date', 'Stars', 'channel_name', 'Transaction ID'])
  3898.        
  3899.        
  3900.         def write_gift_code_to_csv(file_path, phone_number, first_name, date, stars, channel_name, transaction_id):
  3901.             with open(file_path, 'a', newline='', encoding='utf-8') as csvfile:
  3902.                 writer = csv.writer(csvfile)
  3903.                 writer.writerow([phone_number, first_name, date, stars, channel_name, transaction_id])
  3904.        
  3905.        
  3906.         if __name__ == "__main__":
  3907.             asyncio.run(main())
  3908.             input("ENTER chiqish...")                    
  3909.            
  3910.     elif a == 20:
  3911.         import os
  3912.         import csv
  3913.         import asyncio
  3914.         from telethon import TelegramClient, functions
  3915.         from telethon.sessions import StringSession
  3916.         from colorama import init, Fore
  3917.        
  3918.         # Инициализация colorama
  3919.         init(autoreset=True)
  3920.        
  3921.         # Цветовые константы
  3922.         lg = Fore.LIGHTGREEN_EX  # ярко-зеленый
  3923.         rs = Fore.RESET          # сброс цвета
  3924.         g  = Fore.GREEN          # зеленый
  3925.         b  = Fore.BLUE           # синий
  3926.         r  = Fore.RED            # красный
  3927.         cy = Fore.CYAN           # циановый
  3928.         ye = Fore.YELLOW         # желтый
  3929.         grey = Fore.LIGHTBLACK_EX  # серый
  3930.        
  3931.         API_ID = 253798
  3932.         API_HASH = 'd806c9ed3eb74a233d58cb4a072a68f0'
  3933.         SESSION_FOLDER = './sessions'
  3934.        
  3935.        
  3936.         def read_phones_from_csv(file_path):
  3937.             phones = []
  3938.             with open(file_path, newline='') as csvfile:
  3939.                 reader = csv.reader(csvfile)
  3940.                 for row in reader:
  3941.                     if row:
  3942.                         phones.append(row[0])
  3943.             return phones
  3944.        
  3945.        
  3946.         async def manage_authorizations(phone, index):
  3947.             session_file = os.path.join(SESSION_FOLDER, f'telethon_{phone}.session')
  3948.             if not os.path.exists(session_file):
  3949.                 print(f"{r}{index}||| {phone} Sessiya topilmadi!")
  3950.                 return
  3951.            
  3952.             client = None
  3953.             try:
  3954.                 with open(session_file, 'r') as f:
  3955.                     session_string = f.read().strip()
  3956.            
  3957.                 client = TelegramClient(StringSession(session_string), API_ID, API_HASH)
  3958.                 await client.connect()
  3959.                 if not await client.is_user_authorized():
  3960.                     print(f"{r}{index}||| {phone} Chiqarib yuborilgan...")
  3961.                     return
  3962.            
  3963.                 auths = await client(functions.account.GetAuthorizationsRequest())
  3964.                 print(f"\n{ye}{index}||| Akkount {phone}: Ro'yxatdan o'tgan:\n")
  3965.                
  3966.                 # --- FAQAT SHU QATOR O'ZGARTIRILDI ---
  3967.                 for idx, auth in enumerate(auths.authorizations, start=1):
  3968.                     date_active = auth.date_active.strftime('%Y-%m-%d %H:%M:%S')
  3969.                     # Ilova nomini olish (agar mavjud bo'lmasa, bo'sh string bo'ladi)
  3970.                     app_name = auth.app_name or ""
  3971.                     # Qurilma va ilova nomini birga chiqarish
  3972.                     print(f"{b}{idx}. Qurilma: {auth.device_model} ({app_name}) (Kirgan vaqti {date_active})")
  3973.                 # ------------------------------------
  3974.            
  3975.                 # Запрашиваем у пользователя выбор устройств для УДАЛЕНИЯ
  3976.                 to_delete = []
  3977.                 while not to_delete:
  3978.                     print(f"{Fore.RED}O'tqazib yuborish uchun '0' ni bosing")
  3979.                     choice = input(f"{cy}O'chirmoqchi bolgan qurilmala raqamini tanlang (masalan: 1,2): ").strip()
  3980.                     if choice == '0':
  3981.                         print(f"{r}Keyingi akkount {phone}")
  3982.                         break
  3983.                     try:
  3984.                         indices = [int(i.strip()) for i in choice.split(',') if i.strip().isdigit()]
  3985.                         to_delete = [auths.authorizations[i-1] for i in indices if 1 <= i <= len(auths.authorizations)]
  3986.                     except (ValueError, IndexError):
  3987.                         print(f"{r}Notog'ri raqam kirittingiz.")
  3988.            
  3989.                 # Удаляем выбранные устройства
  3990.                 for auth in to_delete:
  3991.                     await client(functions.account.ResetAuthorizationRequest(hash=auth.hash))
  3992.                     print(f"{g}{index}||| O'chirildi: {auth.device_model}")
  3993.            
  3994.             except Exception as e:
  3995.                 print(f"{r}Xatolik {phone}: {e}")
  3996.             finally:
  3997.                 if client and client.is_connected():
  3998.                     await client.disconnect()
  3999.        
  4000.        
  4001.         async def main():
  4002.             phones = read_phones_from_csv('phone.csv')
  4003.             for idx, phone in enumerate(phones, start=1):
  4004.                 await manage_authorizations(phone, idx)
  4005.        
  4006.             print(f"\n{lg}Tayyor! Barcha akkountlar ishlandi.")
  4007.             input("CHiqish uchun ENTER...")
  4008.        
  4009.        
  4010.         if __name__ == '__main__':
  4011.             asyncio.run(main())
  4012.  
  4013.     elif a == 21:
  4014.         import os
  4015.         import csv
  4016.         import asyncio
  4017.         import random
  4018.         from telethon import TelegramClient
  4019.         from telethon.sessions import StringSession
  4020.         from telethon.errors import RPCError
  4021.         from telethon.tl import functions
  4022.         from telethon.tl.types import InputPhoto
  4023.         from colorama import init, Fore
  4024.        
  4025.         # === Colorama init ===
  4026.         init(autoreset=True)
  4027.         lg, rs, g, b, r, cy, ye, grey = (
  4028.             Fore.LIGHTGREEN_EX, Fore.RESET, Fore.GREEN, Fore.BLUE,
  4029.             Fore.RED, Fore.CYAN, Fore.YELLOW, Fore.LIGHTBLACK_EX
  4030.         )
  4031.        
  4032.         API_ID = 253798
  4033.         API_HASH = 'd806c9ed3eb74a233d58cb4a072a68f0'
  4034.         SESSION_FOLDER = 'sessions'
  4035.        
  4036.         # === MOBIL QURILMALAR (desktop yo‘q) ===
  4037.         RANDOM_DEVICES = [
  4038.             {'device_model': 'Samsung SM-S928B (Galaxy S24 Ultra)', 'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4039.             {'device_model': 'Samsung SM-A556B (Galaxy A55)',       'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4040.             {'device_model': 'Google Pixel 9 Pro',                  'system_version': 'Android 15 (SDK 35)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4041.             {'device_model': 'Xiaomi 14',                           'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4042.             {'device_model': 'Redmi Note 13 Pro 5G',                'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4043.             {'device_model': 'OnePlus 12',                          'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4044.             {'device_model': 'Nothing Phone (2a)',                  'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4045.             {'device_model': 'realme 12 Pro+',                      'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4046.             {'device_model': 'HUAWEI Pura 70 Pro',                  'system_version': 'HarmonyOS 4.2',        'app_version': '11.3.0 (3660) arm64-v8a'},
  4047.         ]
  4048.         def get_device_params():
  4049.             d = random.choice(RANDOM_DEVICES).copy()
  4050.             if 'Android' in d['system_version']:
  4051.                 d['system_version'] += ' | sdk 4.16.3-PYRO17'
  4052.             return {
  4053.                 'device_model': d['device_model'],
  4054.                 'system_version': d['system_version'],
  4055.                 'app_version': d['app_version'],
  4056.                 'lang_code': 'en',
  4057.                 'system_lang_code': 'en',
  4058.             }
  4059.        
  4060.         # === + bilan yoki +siz raqamlarni qo‘llab-quvvatlash ===
  4061.         def normalize_phone(phone):
  4062.             p = phone.strip().replace(' ', '').replace('-', '').replace('(', '').replace(')', '')
  4063.             return p if p.startswith('+') else f'+{p}'
  4064.        
  4065.         # === CSV dan telefonlarni o‘qish ===
  4066.         def read_phone_numbers_from_csv(csv_file):
  4067.             phones = []
  4068.             if not os.path.exists(csv_file):
  4069.                 print(f"{r}CSV fayl topilmadi: {csv_file}")
  4070.                 return phones
  4071.             with open(csv_file, 'r', newline='', encoding='utf-8') as f:
  4072.                 reader = csv.reader(f)
  4073.                 for row in reader:
  4074.                     if row:
  4075.                         phones.append(normalize_phone(row[0]))
  4076.             return phones
  4077.        
  4078.         # === Eski rasmlarni o‘chirish ===
  4079.         async def delete_all_photos(client):
  4080.             photos = await client.get_profile_photos('me')
  4081.             if not photos:
  4082.                 print(f"{grey}Akkountda rasm topilmadi.")
  4083.                 return
  4084.             ids = [
  4085.                 InputPhoto(id=p.id, access_hash=p.access_hash, file_reference=p.file_reference)
  4086.                 for p in photos
  4087.             ]
  4088.             try:
  4089.                 result = await client(functions.photos.DeletePhotosRequest(id=ids))
  4090.                 print(f"{g}Profildan o‘chirildi {len(result)} ta eski rasm.")
  4091.             except RPCError as e:
  4092.                 print(f"{r}Rasm o‘chirishda xatolik: {e}")
  4093.        
  4094.         # === Asosiy ish jarayoni ===
  4095.         async def main():
  4096.             phone_numbers = read_phone_numbers_from_csv('phone.csv')
  4097.             if not phone_numbers:
  4098.                 print(f"{r}phone.csv bo‘sh yoki topilmadi!")
  4099.                 return
  4100.        
  4101.             for phone in phone_numbers:
  4102.                 print(f"{ye}Akkount ishga tushurildi: {phone}")
  4103.                 session_file = os.path.join(SESSION_FOLDER, f'telethon_{phone}.session')
  4104.                 if not os.path.exists(session_file):
  4105.                     print(f"{r}Sessiya topilmadi: {session_file}")
  4106.                     continue
  4107.        
  4108.                 try:
  4109.                     with open(session_file, 'r', encoding='utf-8') as f:
  4110.                         session_string = f.read().strip()
  4111.        
  4112.                     device_params = get_device_params()
  4113.                     client = TelegramClient(StringSession(session_string), API_ID, API_HASH, **device_params)
  4114.                     await client.connect()
  4115.        
  4116.                     if not await client.is_user_authorized():
  4117.                         print(f"{r}Akkount {phone} avtorizatsiyadan chiqib ketgan.")
  4118.                         await client.disconnect()
  4119.                         continue
  4120.        
  4121.                     await delete_all_photos(client)
  4122.        
  4123.                 except RPCError as e:
  4124.                     print(f"{r}RPC Xatolik {phone}: {e}")
  4125.                 except Exception as e:
  4126.                     print(f"{r}Umumiy xato {phone}: {e}")
  4127.                 finally:
  4128.                     await client.disconnect()
  4129.        
  4130.             print(f"\n{lg}Tayyor! Barcha eski rasmlar o‘chirildi.")
  4131.             input("CHIQISH uchun ENTER bosing...")
  4132.        
  4133.         if __name__ == '__main__':
  4134.             asyncio.run(main())
  4135.  
  4136.  
  4137.     elif a == 22:
  4138.         import csv
  4139.         import os
  4140.         import time
  4141.         import random
  4142.         import string
  4143.         from telethon.sync import TelegramClient
  4144.         from telethon.sessions import StringSession
  4145.         from telethon.errors import (
  4146.             PhoneNumberInvalidError,
  4147.             SessionPasswordNeededError,
  4148.             PhoneCodeInvalidError,
  4149.             FloodWaitError,
  4150.             PhoneNumberBannedError
  4151.         )
  4152.         from telethon.tl.types import MessageEntityTextUrl
  4153.        
  4154.         API_ID = 253798
  4155.         HashID = 'd806c9ed3eb74a233d58cb4a072a68f0'
  4156.        
  4157.         # --- YANGI: realistik 2024-2025 qurilmalar + helper ---
  4158.         RANDOM_DEVICES = [
  4159.             # ==== Android flagman/upper-mid ====
  4160.             {'device_model': 'Samsung SM-S928B (Galaxy S24 Ultra)', 'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4161.             {'device_model': 'Samsung SM-S926B (Galaxy S24+)',      'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4162.             {'device_model': 'Samsung SM-A556B (Galaxy A55)',       'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4163.             {'device_model': 'Samsung SM-A356B (Galaxy A35)',       'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4164.        
  4165.             {'device_model': 'Google Pixel 9 Pro',                  'system_version': 'Android 15 (SDK 35)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4166.             {'device_model': 'Google Pixel 9',                      'system_version': 'Android 15 (SDK 35)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4167.        
  4168.             {'device_model': 'Xiaomi 14 (23127PN0CG)',              'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4169.             {'device_model': 'Xiaomi 14T Pro',                      'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4170.             {'device_model': 'Redmi Note 13 Pro 5G',                'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4171.        
  4172.             {'device_model': 'OnePlus 12',                          'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4173.             {'device_model': 'Nothing Phone (2a)',                  'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4174.        
  4175.             {'device_model': 'realme 12 Pro+',                      'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4176.        
  4177.             # ==== Huawei (Harmony) ====
  4178.             {'device_model': 'HUAWEI Pura 70 Pro',                  'system_version': 'HarmonyOS 4.2',        'app_version': '11.3.0 (3660) arm64-v8a'},
  4179.         ]
  4180.        
  4181.         LANG_POOL = ['en','uz']
  4182.        
  4183.         def get_random_device_params():
  4184.             """
  4185.            Realistik qurilma parametrlari + til kodlari.
  4186.            Istasangiz, system_version oxiriga qo'shimcha identifikator ham qo'shsa bo'ladi.
  4187.            """
  4188.             d = random.choice(RANDOM_DEVICES).copy()
  4189.             # (ixtiyoriy) Androidlar uchun “sdk …” suffix qo'shish o‘xshashlik uchun:
  4190.             if 'Android' in d['system_version']:
  4191.                 # Masalan, ichki SDK agent identifikatori (faqat matn, tekshiruv yo'q)
  4192.                 d['system_version'] += ' | sdk 4.16.3-PYRO17'
  4193.             lang = random.choice(LANG_POOL)
  4194.             return {
  4195.                 'device_model': d['device_model'],
  4196.                 'system_version': d['system_version'],
  4197.                 'app_version': d['app_version'],
  4198.                 'lang_code': lang,
  4199.                 'system_lang_code': lang
  4200.             }
  4201.  
  4202.        
  4203.         def generate_random_email():
  4204.             names = [
  4205.                 "botir", "malika", "aziza", "javlon", "feruza", "sardor", "shahnoza",
  4206.                 "umar", "anvar", "timur", "kamila", "lola", "islom", "shirin",
  4207.                 "ilya", "sofia", "maksim", "arina", "nargiza",
  4208.                 "alina", "amir", "maruf", "sasha", "vali", "lera", "azamat", "dina",
  4209.                 "adrian", "melissa", "lucas", "hannah", "liam", "noah", "emma", "oliver"
  4210.             ]
  4211.             domains = [
  4212.                 "gmail.com", "outlook.com", "yahoo.com", "icloud.com",
  4213.                 "zoho.com", "tutanota.com", "proton.me", "gmx.com",
  4214.                 "fastmail.com", "pm.me"
  4215.             ]
  4216.            
  4217.             name = random.choice(names)
  4218.             separator = random.choice(["", ".", "_"])
  4219.             suffix = ''.join(random.choices(string.digits, k=random.randint(2, 4))) if random.random() < 0.7 else random.choice(names[:10])[:3]
  4220.             domain = random.choice(domains)
  4221.             return f"{name}{separator}{suffix}@{domain}"
  4222.  
  4223.        
  4224.         def append_unique_frozen_account(phone_number):
  4225.             file = 'frozen_accounts.csv'
  4226.             try:
  4227.                 with open(file, 'r', encoding='utf-8') as f:
  4228.                     existing = [row[0] for row in csv.reader(f)]
  4229.             except FileNotFoundError:
  4230.                 existing = []
  4231.             if phone_number not in existing:
  4232.                 with open(file, 'a', encoding='utf-8', newline='') as f:
  4233.                     csv.writer(f).writerow([phone_number])
  4234.        
  4235.         def remove_from_csv(phone_number, filename):
  4236.             try:
  4237.                 # Fayl mavjudligini tekshirish
  4238.                 if not os.path.exists(filename):
  4239.                     return
  4240.                 with open(filename, 'r', encoding='utf-8') as f:
  4241.                     lines = f.readlines()
  4242.                 with open(filename, 'w', encoding='utf-8') as f:
  4243.                     for line in lines:
  4244.                         # Raqamni to'liq mos kelish bo'yicha tekshirish
  4245.                         if phone_number != line.strip().split(',')[0]:
  4246.                             f.write(line)
  4247.             except Exception as e:
  4248.                 print(f"XATOLIK {filename}: {e}")
  4249.        
  4250.         def add_to_csv(phone_number, filename):
  4251.             try:
  4252.                 with open(filename, 'r', encoding='utf-8') as f:
  4253.                     existing = [row[0] for row in csv.reader(f)]
  4254.             except FileNotFoundError:
  4255.                 existing = []
  4256.             if phone_number not in existing:
  4257.                 with open(filename, 'a', encoding='utf-8', newline='') as f:
  4258.                     csv.writer(f).writerow([phone_number])
  4259.        
  4260.         def process_account(phone_number, from_file):
  4261.             session_file = f'sessions/telethon_{phone_number}.session'
  4262.             if not os.path.exists(session_file):
  4263.                 print(f"❌ SESSIYA TOPILMADI: {phone_number}")
  4264.                 return
  4265.        
  4266.             try:
  4267.                 device_params = get_random_device_params()
  4268.        
  4269.                 with open(session_file, 'r') as f:
  4270.                     session_string = f.read().strip()
  4271.                 client = TelegramClient(StringSession(session_string), API_ID, HashID, **device_params)
  4272.                
  4273.                 client.connect()
  4274.        
  4275.                 if not client.is_user_authorized():
  4276.                     print(f"⚠️ {phone_number}: Sessiya yaroqsiz yoki avtorizatsiyadan o'tmagan.")
  4277.                     client.disconnect()
  4278.                     return
  4279.        
  4280.                 input_peer = client.get_entity('spambot')
  4281.                 client.send_message(input_peer, "/start")
  4282.                 time.sleep(2)
  4283.        
  4284.                 msg = client.get_messages(input_peer, limit=1)[0]
  4285.                 text = msg.text.lower()
  4286.        
  4287.                 if "blocked for violations" in text or "account is blocked" in text:
  4288.                     print(f"⛔ MUZLATILGAN → {phone_number}")
  4289.        
  4290.                     if from_file == "phone":
  4291.                         append_unique_frozen_account(phone_number)
  4292.                         remove_from_csv(phone_number, "phone.csv")
  4293.                         print("📥 O'TQAZILDI frozen_accounts.csv ga")
  4294.                         client.disconnect()
  4295.                         return
  4296.        
  4297.                     elif from_file == "frozen":
  4298.                         initial_responses = ["This is a mistake", "My account was hacked"]
  4299.                         random_initial_response = random.choice(initial_responses)
  4300.                         client.send_message(input_peer, random_initial_response)
  4301.                         print(f"INFO: Dastlabki javob yuborildi: '{random_initial_response}'")
  4302.                         time.sleep(2)
  4303.        
  4304.                         response = client.get_messages(input_peer, limit=1)[0]
  4305.                         resp_text = response.text.lower()
  4306.        
  4307.                         if "you've already submitted a complaint recently" in resp_text:
  4308.                             print(f"⚠️ {phone_number}: Ariza oldin jonatilgan.!")
  4309.                             append_unique_frozen_account(phone_number)
  4310.                             client.disconnect()
  4311.                             return
  4312.        
  4313.                         if "would you like to submit a complaint" in resp_text:
  4314.                             client.send_message(input_peer, "Yes")
  4315.                             time.sleep(2)
  4316.        
  4317.                             me = client.get_me()
  4318.                            
  4319.                             complaint_templates = [
  4320.                                 f"Hey Telegram team 👋 my account (+{phone_number}) seems restricted for some reason. I honestly don’t know why — I just use Telegram to chat with friends. Could you please review it when you can? Thanks 🙏\n\n— {me.first_name}",
  4321.                                
  4322.                                 f"Hello dear Telegram Support,\nI noticed my account (+{phone_number}) got frozen. Maybe there was a mistake? I’ve been using it for normal chats and work stuff only. Please check it out whenever possible. Thanks a lot!\n\nRegards,\n{me.first_name}",
  4323.                                
  4324.                                 f"Hi Telegram,\nMy account +{phone_number} got limited today and I’m not sure why 😕 I always try to follow the rules. Could you please have a look at it and maybe remove the restriction?\n\nThank you,\n{me.first_name}",
  4325.                                
  4326.                                 f"Dear Telegram Team,\nI’m writing because my number +{phone_number} has been restricted. I think there’s been some misunderstanding. I’m an active Telegram user, and this app is really important for me. Please help me restore my access 🙏\n\nSincerely,\n{me.first_name}",
  4327.                                
  4328.                                 f"Hey guys, my Telegram (+{phone_number}) got blocked suddenly. I didn’t spam or do anything bad. Maybe I was reported by mistake? Please review it for me. I really appreciate your help ❤️\n\nThanks,\n{me.first_name}",
  4329.                                
  4330.                                 f"Hi,\nI just found out my Telegram number +{phone_number} has some kind of limitation. I’m not a spammer — I only talk to friends and join small groups. Please help me fix this if possible!\n\nBest regards,\n{me.first_name}",
  4331.                                
  4332.                                 f"Hello Telegram Support,\nCould you please check my account +{phone_number}? It says it’s restricted, but I didn’t break any rules. Maybe it was flagged by mistake. I’d be grateful if you can review it.\n\nKind regards,\n{me.first_name}",
  4333.                                
  4334.                                 f"Dear Support,\nMy Telegram number +{phone_number} seems frozen. I think it’s some automated error — I’ve always used it respectfully. Can you please look into it and unlock it?\n\nThank you so much,\n{me.first_name}",
  4335.                                
  4336.                                 f"Hey, my account +{phone_number} got limited today. I didn’t do anything unusual — I just use Telegram for chatting and channels. Please double-check and remove this limit if possible 🙏\n\nCheers,\n{me.first_name}",
  4337.                                
  4338.                                 f"Hi Telegram team,\nMy account +{phone_number} shows a restriction notice. Maybe it’s an error or false report. Please check it once again. I really rely on Telegram daily for messages and news.\n\nThanks in advance,\n{me.first_name}"
  4339.                             ]
  4340.  
  4341.                             random_complaint = random.choice(complaint_templates)
  4342.                             client.send_message(input_peer, random_complaint)
  4343.                             time.sleep(2)
  4344.        
  4345.                             client.send_message(input_peer, me.first_name)
  4346.                             time.sleep(2)
  4347.                            
  4348.                             client.send_message(input_peer, generate_random_email())
  4349.                             time.sleep(2)
  4350.        
  4351.                             # --- BU YERDA ASOSIY O'ZGARISH ---
  4352.                            
  4353.                             # 1. Ro'yxatdan o'tgan yil uchun variantlar
  4354.                             registration_years = ["2024", "2023", "2022", "2025"]
  4355.                            
  4356.                             # 2. Telegram haqida qayerdan eshitgani haqida variantlar
  4357.                             how_found_tg = [
  4358.                                 "My friends told me about it a long time ago",
  4359.                                 "I saw people using it on Instagram and decided to try",
  4360.                                 "I found it while looking for a private messenger in Play Store",
  4361.                                 "A coworker added me to a Telegram group for work",
  4362.                                 "Heard about it from my cousin, he said it's safer than others",
  4363.                                 "I saw it mentioned in a tech blog about secure apps",
  4364.                                 "Someone invited me to join a study group on Telegram",
  4365.                                 "I was using WhatsApp before but switched because of privacy",
  4366.                                 "I saw it trending on social networks and got curious",
  4367.                                 "A friend sent me a link to a Telegram channel"
  4368.                             ]
  4369.                            
  4370.                             # 3. Foydalanish maqsadi haqida variantlar
  4371.                             usage_purpose = [
  4372.                                 "Mostly for chatting with friends and family",
  4373.                                 "I use it to follow channels about tech and news",
  4374.                                 "To stay in touch with people from work and school",
  4375.                                 "For reading updates and sharing photos with friends",
  4376.                                 "I’m in a few hobby groups, mostly cars and gadgets",
  4377.                                 "I use it daily to keep in touch and read interesting posts",
  4378.                                 "For personal messages and some group discussions",
  4379.                                 "Mainly to read news channels and talk to my close friends",
  4380.                                 "I follow some local communities and use it to learn things",
  4381.                                 "It’s just my main messenger now — I use it for everything"
  4382.                             ]
  4383.  
  4384.                            
  4385.                             # Tasodifiy javoblarni yuborish
  4386.                             random_year = random.choice(registration_years)
  4387.                             client.send_message(input_peer, random_year)
  4388.                             print(f"INFO: Yil yuborildi: '{random_year}'")
  4389.                             time.sleep(2)
  4390.                            
  4391.                             random_found_source = random.choice(how_found_tg)
  4392.                             client.send_message(input_peer, random_found_source)
  4393.                             print(f"INFO: Manba yuborildi: '{random_found_source}'")
  4394.                             time.sleep(2)
  4395.                            
  4396.                             random_purpose = random.choice(usage_purpose)
  4397.                             client.send_message(input_peer, random_purpose)
  4398.                             print(f"INFO: Maqsad yuborildi: '{random_purpose}'")
  4399.                             time.sleep(2)
  4400.                            
  4401.                             # -------------------------------------------------
  4402.        
  4403.                             client.send_message(input_peer, "Confirm")
  4404.                             time.sleep(2)
  4405.        
  4406.                             msg2 = client.get_messages(input_peer, limit=1)[0]
  4407.                             if msg2.entities:
  4408.                                 for entity in msg2.entities:
  4409.                                     if isinstance(entity, MessageEntityTextUrl):
  4410.                                         link = entity.url
  4411.                                         print(f"🔗 CloudFlare: {link}")
  4412.                                         os.system(f'start "" "{link}"')
  4413.                                         input("➡ ENTER BOSING DAVOM ETISH UCHUN...")
  4414.                                         break
  4415.                             client.send_message(input_peer, "Done")
  4416.                             print(f"✅ ARIZA JO'NATILDI: {phone_number}")
  4417.        
  4418.                 elif ("no limits are currently applied" in text or "good news" in text or "ваш аккаунт свободен" in text or "xushxabarimiz bor" in text):
  4419.                     print(f"✅ AKOUNT YAXSHI XOLATDA ⇨ {phone_number}")
  4420.                     client.send_message(input_peer, "Cool, thanks")
  4421.                     if from_file == "frozen":
  4422.                         remove_from_csv(phone_number, "frozen_accounts.csv")
  4423.                         add_to_csv(phone_number, "phone.csv")
  4424.                         print("🔁 QAYTARILDI phone.csv ga")
  4425.                 else:
  4426.                     print(f"⚠ VAQTINCHA CHEKLANGAN: {phone_number}")
  4427.        
  4428.                 client.disconnect()
  4429.        
  4430.             except PhoneNumberBannedError:
  4431.                 print(f"🚫 {phone_number}: TO'LIQ BAN QILINGAN (PhoneNumberBannedError)")
  4432.                 append_unique_frozen_account(phone_number)
  4433.                 if from_file == "phone":
  4434.                     remove_from_csv(phone_number, "phone.csv")
  4435.                 return
  4436.             except Exception as e:
  4437.                 print(f"❗ XATOLIK {phone_number}: {e}")
  4438.                 if 'client' in locals() and client.is_connected():
  4439.                     client.disconnect()
  4440.        
  4441.             except PhoneNumberBannedError:
  4442.                 print(f"🚫 {phone_number}: TO'LIQ BAN QILINGAN (PhoneNumberBannedError)")
  4443.                 append_unique_frozen_account(phone_number)
  4444.                 if from_file == "phone":
  4445.                     remove_from_csv(phone_number, "phone.csv")
  4446.                 return
  4447.             except Exception as e:
  4448.                 print(f"❗ XATOLIK {phone_number}: {e}")
  4449.                 if 'client' in locals() and client.is_connected():
  4450.                     client.disconnect()
  4451.        
  4452.         def main():
  4453.             # 'sessions' papkasi mavjudligini tekshirish
  4454.             if not os.path.exists('sessions'):
  4455.                 os.makedirs('sessions')
  4456.                
  4457.             print("📥 START phone.csv...")
  4458.             if os.path.exists("phone.csv"):
  4459.                 with open("phone.csv", 'r', encoding='utf-8') as f:
  4460.                     # Fayldan o'qiyotganda bo'sh qatorlarni o'tkazib yuborish
  4461.                     phone_list = [row[0] for row in csv.reader(f) if row]
  4462.                 for phone in phone_list:
  4463.                     process_account(phone, from_file="phone")
  4464.        
  4465.             print("\n🧊 START frozen_accounts.csv...")
  4466.             if os.path.exists("frozen_accounts.csv"):
  4467.                 with open("frozen_accounts.csv", 'r', encoding='utf-8') as f:
  4468.                     frozen_list = [row[0] for row in csv.reader(f) if row]
  4469.                 for phone in frozen_list:
  4470.                     process_account(phone, from_file="frozen")
  4471.        
  4472.             print("\n✅ TUGALLANDI.")
  4473.             input("ENTER CHIQISH UCHUN...")
  4474.        
  4475.         if __name__ == "__main__":
  4476.             main()
  4477.  
  4478.     elif a == 23:
  4479.         import os
  4480.         import random
  4481.         import time
  4482.         import csv
  4483.         from telethon import TelegramClient
  4484.         from telethon.sessions import StringSession
  4485.         from telethon.tl.functions.account import UpdateProfileRequest
  4486.         from telethon.errors import FloodWaitError, RPCError
  4487.        
  4488.         API_ID = 253798
  4489.         API_HASH = 'd806c9ed3eb74a233d58cb4a072a68f0'
  4490.        
  4491.         # ---- REAL MOBIL QURILMALAR (desktop yo‘q) ----
  4492.         RANDOM_DEVICES = [
  4493.             # Android 2024–2025
  4494.             {'device_model': 'Samsung SM-S928B (Galaxy S24 Ultra)', 'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4495.             {'device_model': 'Samsung SM-A556B (Galaxy A55)',       'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4496.             {'device_model': 'Google Pixel 9 Pro',                  'system_version': 'Android 15 (SDK 35)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4497.             {'device_model': 'Xiaomi 14',                           'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4498.             {'device_model': 'Redmi Note 13 Pro 5G',                'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4499.             {'device_model': 'OnePlus 12',                          'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4500.             {'device_model': 'Nothing Phone (2a)',                  'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4501.             {'device_model': 'realme 12 Pro+',                      'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4502.             # HarmonyOS
  4503.             {'device_model': 'HUAWEI Pura 70 Pro',                  'system_version': 'HarmonyOS 4.2',        'app_version': '11.3.0 (3660) arm64-v8a'},
  4504.         ]
  4505.         def get_device_params():
  4506.             d = random.choice(RANDOM_DEVICES).copy()
  4507.             # ozgina “SDK imzo” qo‘shamiz (xohlasangiz olib tashlaysiz)
  4508.             if 'Android' in d['system_version']:
  4509.                 d['system_version'] += ' | sdk 4.16.3-PYRO17'
  4510.             return {
  4511.                 'device_model': d['device_model'],
  4512.                 'system_version': d['system_version'],
  4513.                 'app_version': d['app_version'],
  4514.                 'lang_code': 'en',
  4515.                 'system_lang_code': 'en',
  4516.             }
  4517.        
  4518.         # 🔹 BIO randomlari
  4519.         random_bios = [
  4520.             "Hayot go'zal! 🌟",
  4521.             "Telegramda yangiman 😎",
  4522.             "Kod yozishni yaxshi ko'raman 👨‍💻",
  4523.             "Bugun yaxshi kayfiyatda 😊",
  4524.             "Sayohat qilishga oshiqaman ✈️",
  4525.             "O‘rganish – bu kuch! 📚",
  4526.             "Har kuni yangi imkoniyat! 🔥",
  4527.             "O'yin emas – bu hayot 🎮",
  4528.             "Kulish – eng yaxshi davo 😄",
  4529.             "Yirik orzular – katta natija!",
  4530.             "Hayot – bu sarguzasht! 🚀",
  4531.             "Qo'rqma, boshlang!",
  4532.             "Bugungi ish, ertangi natija!",
  4533.             "Kechalarni yorituvchi fikrlar ✨",
  4534.             "Faqat oldinga! 💪",
  4535.             "Men bunday tug'ilganman! 😎",
  4536.             "Kichik qadamlar – katta muvaffaqiyatlar!",
  4537.             "Sukut bu donolik belgisi.",
  4538.             "Men kelajak uchun ishlayman.",
  4539.             "Boshlash uchun hech qachon kech emas 🌱",
  4540.             "Qoralama bugungi, kelajak — toza sahifa 📝",
  4541.             "Fikrlarim tezroq ishlaydi, Internetdan ham.",
  4542.             "Hayot bu kod – men uni yozyapman.",
  4543.             "Asl men – hozirgi men. 🎯",
  4544.             "Men texnologiyani nafas olaman 🤖",
  4545.             "Dunyo bilan ulashadigan hikoyalarim bor.",
  4546.             "Salom dunyo! 👋",
  4547.             "Do’stlik uchun ochiqman 🤝",
  4548.             "Shunchaki men – o’zgacha uslubda.",
  4549.             "Tilim 🔥, qalbim 🚀",
  4550.             "Sodda, ammo chuqur.",
  4551.             "Optimizm – mening oldingi ishim 😁",
  4552.             "Kofe, kod, ishlash, takrorlash ☕👨‍💻",
  4553.             "Sekin bo‘lsa ham, oldinga yuraman.",
  4554.             "O'zingga ishongin – bu boshlanishi.",
  4555.             "Hech kimga o'xshamayman — va bu zo’r! 💎",
  4556.             "Dunyo bo'ylab virtual sayohachi 🧭",
  4557.             "Yorqin fikrlar qora fonlarda porlaydi 🌓",
  4558.             "Kod yozish – bu mening sheʼriyatim.",
  4559.             "Bugun o'zgacha bo'lishga qaror qildim.",
  4560.             "Jarayonni sev – natija o‘z-o‘zidan keladi."
  4561.         ]
  4562.        
  4563.         # phone.csv o‘qish (+ bilan/siz mos)
  4564.         def read_phone_numbers_from_csv(csv_file):
  4565.             phone_numbers = []
  4566.             with open(csv_file, 'r') as f:
  4567.                 reader = csv.reader(f)
  4568.                 for row in reader:
  4569.                     if row:
  4570.                         raw = row[0].strip()
  4571.                         if not raw:
  4572.                             continue
  4573.                         # normalize: +998... yoki 998...
  4574.                         p = raw.replace(' ', '').replace('-', '').replace('(', '').replace(')', '')
  4575.                         if not p.startswith('+'):
  4576.                             p = '+' + p
  4577.                         phone_numbers.append(p)
  4578.             return phone_numbers
  4579.        
  4580.         def generate_random_bio():
  4581.             return random.choice(random_bios)
  4582.        
  4583.         async def change_profile_bio(client, bio):
  4584.             await client(UpdateProfileRequest(about=bio))
  4585.        
  4586.         async def main():
  4587.             phone_numbers = read_phone_numbers_from_csv('phone.csv')
  4588.        
  4589.             for phone_number in phone_numbers:
  4590.                 # sessions/telethon_+998... yoki +siz yozilgan bo‘lishi mumkin — + belgisini fayl nomidan olib tashlaymiz
  4591.                 safe_name = phone_number.replace('+', '')
  4592.                 session_file = f'sessions/telethon_{safe_name}.session'
  4593.        
  4594.                 try:
  4595.                     with open(session_file, 'r', encoding='utf-8') as f:
  4596.                         session_string = f.read().strip()
  4597.                 except FileNotFoundError:
  4598.                     print(f"❌ Session fayl topilmadi: {phone_number}")
  4599.                     continue
  4600.        
  4601.                 device_params = get_device_params()
  4602.                 client = TelegramClient(StringSession(session_string), API_ID, API_HASH, **device_params)
  4603.        
  4604.                 try:
  4605.                     await client.connect()
  4606.                     if not await client.is_user_authorized():
  4607.                         print(f"🚫 Akount chiqarilgan: {phone_number}")
  4608.                         await client.disconnect()
  4609.                         continue
  4610.        
  4611.                     bio = generate_random_bio()
  4612.                     try:
  4613.                         await change_profile_bio(client, bio)
  4614.                         print(f"✅ [{phone_number}] Bio o‘zgartirildi: \"{bio}\"\n")
  4615.                     except FloodWaitError as e:
  4616.                         print(f"⏳ FloodWait! Kuting {e.seconds} sekund... ({phone_number})")
  4617.                         # async kutish — event loopni to‘smasin
  4618.                         import asyncio
  4619.                         await asyncio.sleep(e.seconds + 2)
  4620.                     except RPCError as e:
  4621.                         print(f"⚠️ RPC xato: {phone_number}: {str(e)}")
  4622.                 except Exception as e:
  4623.                     print(f"❗️ Xatolik: [{phone_number}]: {str(e)}")
  4624.                 finally:
  4625.                     await client.disconnect()
  4626.        
  4627.             print("✅ Barcha Bio-lar o'zgartirildi!")
  4628.             input("CHiqish uchun ENTER bosing...")
  4629.        
  4630.         if __name__ == "__main__":
  4631.             import asyncio
  4632.             # Windows 3.12 da loop siyosati uchun foydali bo‘lishi mumkin:
  4633.             if os.name == 'nt':
  4634.                 try:
  4635.                     asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
  4636.                 except Exception:
  4637.                     pass
  4638.             asyncio.run(main())
  4639.  
  4640.  
  4641.     elif a == 24:        
  4642.         import os
  4643.         import random
  4644.         import time
  4645.         import csv
  4646.         import requests
  4647.         from telethon import TelegramClient
  4648.         from telethon.sessions import StringSession
  4649.         from telethon.errors import FloodWaitError, RPCError
  4650.         from telethon.tl.functions.stories import SendStoryRequest, GetPeerStoriesRequest, DeleteStoriesRequest
  4651.         from telethon.tl import types
  4652.         import asyncio
  4653.        
  4654.         API_ID = 253798
  4655.         API_HASH = 'd806c9ed3eb74a233d58cb4a072a68f0'
  4656.        
  4657.         # === MOBIL QURILMA FINGERPRINTLARI ===
  4658.         RANDOM_DEVICES = [
  4659.             {'device_model': 'Samsung SM-S928B (Galaxy S24 Ultra)', 'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4660.             {'device_model': 'Google Pixel 9 Pro', 'system_version': 'Android 15 (SDK 35)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4661.             {'device_model': 'Xiaomi 14', 'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4662.             {'device_model': 'Redmi Note 13 Pro 5G', 'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4663.             {'device_model': 'realme 12 Pro+', 'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4664.             {'device_model': 'Nothing Phone (2a)', 'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4665.             {'device_model': 'OnePlus 12', 'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  4666.         ]
  4667.         def get_device_params():
  4668.             d = random.choice(RANDOM_DEVICES).copy()
  4669.             if 'Android' in d['system_version']:
  4670.                 d['system_version'] += ' | sdk 4.16.3-PYRO17'
  4671.             return {
  4672.                 'device_model': d['device_model'],
  4673.                 'system_version': d['system_version'],
  4674.                 'app_version': d['app_version'],
  4675.                 'lang_code': 'en',
  4676.                 'system_lang_code': 'en',
  4677.             }
  4678.        
  4679.         # === FUNKSIYALAR ===
  4680.         def read_phone_numbers_from_csv(csv_file):
  4681.             numbers = []
  4682.             if not os.path.exists(csv_file):
  4683.                 print(f"❌ Fayl topilmadi: {csv_file}")
  4684.                 return numbers
  4685.             with open(csv_file, 'r') as f:
  4686.                 for row in csv.reader(f):
  4687.                     if row and row[0].strip():
  4688.                         numbers.append(row[0].strip())
  4689.             return numbers
  4690.        
  4691.         def download_random_image(save_path):
  4692.             url = "https://picsum.photos/1080/1920"
  4693.             try:
  4694.                 print(f"🖼️ '{save_path}' uchun rasm yuklanmoqda...")
  4695.                 response = requests.get(url, timeout=15)
  4696.                 response.raise_for_status()
  4697.                 with open(save_path, 'wb') as f:
  4698.                     f.write(response.content)
  4699.                 return save_path
  4700.             except Exception as e:
  4701.                 print(f"❗️ Rasm yuklanmadi: {e}")
  4702.                 return None
  4703.        
  4704.         RANDOM_CAPTIONS = [
  4705.             "Hayot go'zal! 🌟", "Telegramda yangiman 😎", "Bugun yaxshi kayfiyatda 😊",
  4706.             "Sayohat qilishga oshiqaman ✈️", "O‘rganish – bu kuch! 📚",
  4707.             "Har kuni yangi imkoniyat! 🔥", "Kulish – eng yaxshi davo 😄",
  4708.             "Yirik orzular – katta natija!", "Hayot – bu sarguzasht! 🚀", "Salom dunyo! 👋"
  4709.         ]
  4710.         def random_caption():
  4711.             return random.choice(RANDOM_CAPTIONS)
  4712.        
  4713.         # === STORIES O‘RNATISH ===
  4714.         async def send_story(client):
  4715.             PIN_STORY = False
  4716.             NO_FORWARDS = False
  4717.             PRIVACY_RULE = types.InputPrivacyValueAllowAll()
  4718.             MAX_NON_PREMIUM = 1
  4719.        
  4720.             me = await client.get_me()
  4721.             is_premium = me.premium
  4722.             stories = await client(GetPeerStoriesRequest(peer='me'))
  4723.             count = len(stories.stories.stories) if hasattr(stories, 'stories') and hasattr(stories.stories, 'stories') else 0
  4724.        
  4725.             print(f"   - Status: {'Premium' if is_premium else 'Oddiy'}, aktiv: {count}")
  4726.             if not is_premium and count >= MAX_NON_PREMIUM:
  4727.                 print("⚠️ Oddiy akkaunt uchun story limiti to‘lgan.")
  4728.                 return
  4729.        
  4730.             filename = f"story_{me.id}.jpg"
  4731.             path = download_random_image(filename)
  4732.             if not path:
  4733.                 print("❗️ Rasm topilmadi.")
  4734.                 return
  4735.        
  4736.             try:
  4737.                 file = await client.upload_file(path)
  4738.                 media = types.InputMediaUploadedPhoto(file=file)
  4739.                 await client(SendStoryRequest(
  4740.                     peer='me',
  4741.                     media=media,
  4742.                     caption=random_caption(),
  4743.                     privacy_rules=[PRIVACY_RULE],
  4744.                     pinned=PIN_STORY,
  4745.                     noforwards=NO_FORWARDS
  4746.                 ))
  4747.                 print("✅ Story muvaffaqiyatli joylandi!")
  4748.             finally:
  4749.                 if os.path.exists(path):
  4750.                     os.remove(path)
  4751.        
  4752.         # === STORIES O‘CHIRISH ===
  4753.         async def delete_stories(client):
  4754.             try:
  4755.                 stories = await client(GetPeerStoriesRequest(peer='me'))
  4756.                 ids = []
  4757.                 if hasattr(stories, 'stories') and hasattr(stories.stories, 'stories'):
  4758.                     ids = [s.id for s in stories.stories.stories]
  4759.                 if not ids:
  4760.                     print("✅ O‘chirish uchun aktiv story yo‘q.")
  4761.                     return
  4762.                 await client(DeleteStoriesRequest(peer='me', id=ids))
  4763.                 print(f"🗑️ {len(ids)} ta story o‘chirildi.")
  4764.             except Exception as e:
  4765.                 print(f"❗️ O‘chirishda xato: {e}")
  4766.        
  4767.         # === ASOSIY JARAYON ===
  4768.         async def process_accounts(action):
  4769.             phones = read_phone_numbers_from_csv('phone.csv')
  4770.             if not phones:
  4771.                 print("❌ phone.csv bo‘sh!")
  4772.                 return
  4773.        
  4774.             print(f"\nJami {len(phones)} ta akkaunt topildi.\n")
  4775.             for idx, phone in enumerate(phones, 1):
  4776.                 print(f"{idx}/{len(phones)} → {phone}")
  4777.                 session_file = f'sessions/telethon_{phone}.session'
  4778.                 if not os.path.exists(session_file):
  4779.                     print("   ❌ Sessiya topilmadi.")
  4780.                     continue
  4781.                 try:
  4782.                     with open(session_file, 'r', encoding='utf-8') as f:
  4783.                         session = f.read().strip()
  4784.        
  4785.                     client = TelegramClient(StringSession(session), API_ID, API_HASH, **get_device_params())
  4786.                     await client.connect()
  4787.                     if not await client.is_user_authorized():
  4788.                         print("   🚫 Akkaunt avtorizatsiyadan chiqqan.")
  4789.                         await client.disconnect()
  4790.                         continue
  4791.        
  4792.                     if action == 1:
  4793.                         await send_story(client)
  4794.                     else:
  4795.                         await delete_stories(client)
  4796.        
  4797.                 except FloodWaitError as e:
  4798.                     print(f"⏳ FloodWait: {e.seconds} sek kutamiz...")
  4799.                     await asyncio.sleep(e.seconds + 3)
  4800.                 except Exception as e:
  4801.                     print(f"❗️ Xato: {e}")
  4802.                 finally:
  4803.                     if client.is_connected():
  4804.                         await client.disconnect()
  4805.                         print("   🔌 Ulanish uzildi.\n")
  4806.        
  4807.             print("✅ Barcha akkauntlar bilan ish yakunlandi.")
  4808.             input("ENTER chiqish...")
  4809.        
  4810.         # === BOSHLASH ===
  4811.         if __name__ == "__main__":
  4812.             k = int(input("[1] Stories o‘rnatish \n[2] Storiesni o‘chirish\n\nTANLANG: "))
  4813.             if os.name == 'nt':
  4814.                 asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
  4815.             asyncio.run(process_accounts(k))
  4816.  
  4817.     elif a == 25:
  4818.         import sys, subprocess, importlib
  4819.         from importlib import metadata
  4820.    
  4821.         def telethon_show_version(prefix=""):
  4822.             """O‘rnatilgan (disk) va import qilingan versiyani ko‘rsatish."""
  4823.             try:
  4824.                 installed = metadata.version("telethon")
  4825.             except metadata.PackageNotFoundError:
  4826.                 installed = "o‘rnatilmagan"
  4827.             imported = None
  4828.             if "telethon" in sys.modules:
  4829.                 try:
  4830.                     imported = getattr(sys.modules["telethon"], "__version__", None)
  4831.                 except Exception:
  4832.                     imported = "aniqlanmadi"
  4833.             print(f"{lg}{prefix}Telethon (disk): {installed}{w}")
  4834.             if imported is not None:
  4835.                 print(f"{lg}{prefix}Telethon (import): {imported}{w}")
  4836.    
  4837.         def upgrade_telethon_quiet(min_version: str | None = None) -> bool:
  4838.             """
  4839.            Telethon'ni jim (quiet) rejimda yangilaydi.
  4840.            Pip chiqishi ko‘rsatilmaydi; faqat HAQIQATDA o‘zgarish bo‘lsa xabar beradi.
  4841.            """
  4842.             def parse(v: str | None):
  4843.                 if not v: return ()
  4844.                 return tuple(int(x) for x in str(v).split(".") if x.isdigit())
  4845.    
  4846.             try:
  4847.                 installed_before = metadata.version("telethon")
  4848.             except metadata.PackageNotFoundError:
  4849.                 installed_before = None
  4850.    
  4851.             imported_before = None
  4852.             if "telethon" in sys.modules:
  4853.                 try:
  4854.                     imported_before = getattr(sys.modules["telethon"], "__version__", None)
  4855.                 except Exception:
  4856.                     imported_before = None
  4857.    
  4858.             if min_version and installed_before and parse(installed_before) >= parse(min_version):
  4859.                 print(f"{ye}Telethon allaqachon minimal versiyada yoki undan yuqori (>= {min_version}).{w}")
  4860.                 return False
  4861.    
  4862.             # pip: mutlaqo jim
  4863.             try:
  4864.                 subprocess.run(
  4865.                     [sys.executable, "-m", "pip", "install", "--upgrade", "telethon", "-q", "--disable-pip-version-check"],
  4866.                     stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=False
  4867.                 )
  4868.             except Exception:
  4869.                 pass
  4870.    
  4871.             try:
  4872.                 installed_after = metadata.version("telethon")
  4873.             except metadata.PackageNotFoundError:
  4874.                 installed_after = installed_before
  4875.    
  4876.             if installed_after == installed_before:
  4877.                 print(f"{ye}Yangilanish topilmadi (hozirgi: {installed_after}).{w}")
  4878.                 return False
  4879.    
  4880.             # Diskdagi versiya o‘zgardi — modulni reload qilib ko‘ramiz
  4881.             try:
  4882.                 if "telethon" in sys.modules:
  4883.                     importlib.invalidate_caches()
  4884.                     importlib.reload(sys.modules["telethon"])
  4885.                 else:
  4886.                     import telethon  # noqa: F401
  4887.                 imported_after = getattr(sys.modules["telethon"], "__version__", None)
  4888.             except Exception:
  4889.                 imported_after = imported_before
  4890.    
  4891.             print(f"{lg}[NEW] Telethon versiyasi o‘rnatildi: {installed_after}{w}")
  4892.             if imported_after != installed_after:
  4893.                 print(f"{ye}Eslatma: yangi versiyadan foydalanish uchun skriptni qayta ishga tushiring.{w}")
  4894.             return True
  4895.    
  4896.         def telethon_upgrade_menu_action():
  4897.             print(f"{ye}Telethon versiyasini tekshiryapmiz...{w}")
  4898.             telethon_show_version(prefix="[OLD] ")
  4899.             changed = upgrade_telethon_quiet(min_version=None)  # xohlasang: "1.42.0"
  4900.             if changed:
  4901.                 telethon_show_version(prefix="[AFTER] ")
  4902.             input(f"{lg}Tugadi. Davom etish uchun ENTER...{w}")
  4903.    
  4904.         telethon_upgrade_menu_action()
  4905.         continue
  4906.  
  4907.     elif a == 26:
  4908.         import sys, subprocess, os, csv, time
  4909.         from telethon import TelegramClient
  4910.         from telethon.sessions import StringSession, SQLiteSession
  4911.         from telethon.errors import SessionPasswordNeededError
  4912.         from telethon.errors.rpcerrorlist import (
  4913.             AuthTokenExpiredError, AuthTokenInvalidError, AuthTokenAlreadyAcceptedError
  4914.         )
  4915.        
  4916.         # === QR-CODE MODULINI TEKSHIRISH / O'RNATISH (jim) ===
  4917.         try:
  4918.             from qrcode import QRCode
  4919.         except ImportError:
  4920.             print(f"{ye}qrcode moduli topilmadi. O‘rnatilmoqda...{w}")
  4921.             subprocess.run(
  4922.                 [sys.executable, "-m", "pip", "install", "qrcode", "-q", "--disable-pip-version-check"],
  4923.                 stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL
  4924.             )
  4925.             try:
  4926.                 from qrcode import QRCode
  4927.                 print(f"{lg}qrcode muvaffaqiyatli o‘rnatildi.{w}")
  4928.             except Exception as e:
  4929.                 print(f"{r}qrcode ni import qilishda xato: {e}{w}")
  4930.                 input("ENTER...")
  4931.                 continue
  4932.        
  4933.         # === Sozlamalar ===
  4934.         QR_REFRESH_SEC = 30   # QR’ni qayta chizish oralig‘i (token tugashidan oldin)
  4935.         WAIT_CHUNK     = 25   # wait() ni bo'laklab kutish (sekund)
  4936.        
  4937.         # === Yordamchi funksiyalar ===
  4938.         def normalize_phone(s: str) -> str:
  4939.             if not s: return ''
  4940.             s = s.strip().replace(' ', '').replace('-', '').replace('(', '').replace(')', '')
  4941.             return s[1:] if s.startswith('+') else s
  4942.        
  4943.         def display_qr_ascii(data: str):
  4944.             qr = QRCode(border=1)
  4945.             qr.add_data(data)
  4946.             qr.print_ascii(invert=True)
  4947.        
  4948.         def save_sqlite_from_client(client: TelegramClient, sqlite_path: str):
  4949.             """StringSession bilan avtorizatsiyalangan client'dan SQLite .session yaratadi."""
  4950.             base = client.session
  4951.             sess = SQLiteSession(sqlite_path)
  4952.             try:
  4953.                 sess.set_dc(base.dc_id, base.server_address, base.port)
  4954.             except AttributeError:
  4955.                 sess.set_dc(getattr(base, 'dc_id', 2),
  4956.                             getattr(base, 'server_address', '149.154.167.50'),
  4957.                             getattr(base, 'port', 443))
  4958.             sess.auth_key = getattr(base, 'auth_key', None)
  4959.             sess.takeout_id = getattr(base, 'takeout_id', None)
  4960.             try:
  4961.                 sess.user = getattr(base, 'user', None)
  4962.             except Exception:
  4963.                 pass
  4964.             sess.save()
  4965.        
  4966.         # Bloklovchi wrapperlar: coroutine'larni to‘g‘ri kutish uchun
  4967.         def qr_wait_blocking(client: TelegramClient, qr_login, timeout: int) -> bool:
  4968.             return client.loop.run_until_complete(qr_login.wait(timeout))
  4969.        
  4970.         def qr_recreate_blocking(client: TelegramClient, qr_login) -> None:
  4971.             return client.loop.run_until_complete(qr_login.recreate())
  4972.        
  4973.         # --- Yangi: 2FA parolini 3 martagacha urinish bilan kiritish ---
  4974.         def sign_in_with_password_retries(client: TelegramClient, label: str, tries: int = 3) -> bool:
  4975.             for attempt in range(1, tries + 1):
  4976.                 pwd = input(f"{ye}2FA parolni kiriting ({label}) [urinish {attempt}/{tries}]: {w}")
  4977.                 try:
  4978.                     client.sign_in(password=pwd)
  4979.                     return True
  4980.                 except Exception as e:
  4981.                     print(f"{r}Parol qabul qilinmadi: {e}{w}")
  4982.             print(f"{r}{label}: 2FA paroli {tries} urinishda ham tasdiqlanmadi. Akkaunt tashlab o‘tiladi.{w}")
  4983.             return False
  4984.        
  4985.         # === Telefonlarni o‘qish ===
  4986.         phones = []
  4987.         if not os.path.exists('phone.csv'):
  4988.             print(f"{r}XATO: phone.csv topilmadi!{w}"); input(); continue
  4989.         with open('phone.csv', 'r', encoding='utf-8') as f:
  4990.             for row in csv.reader(f):
  4991.                 if not row: continue
  4992.                 raw = row[0].strip()
  4993.                 if not raw: continue
  4994.                 clean = normalize_phone(raw)
  4995.                 e164_phone = raw if raw.startswith('+') else f'+{clean}'
  4996.                 phones.append({'raw': raw, 'clean': clean, 'e164': e164_phone})
  4997.         if not phones:
  4998.             print(f"{r}phone.csv bo‘sh.{w}"); input(); continue
  4999.        
  5000.         os.makedirs('sessions', exist_ok=True)
  5001.         print(f"{lg}QR orqali ro‘yxatdan o‘tkazish boshlanadi. Har safar bitta akount!{w}")
  5002.         print(f"{ye}QR chiqqanda Telegram orqali skanerlab tasdiqlang.{w}\n")
  5003.        
  5004.         # === Akountlar ketma-ket (navbat bilan) — keyingisi faqat oldingisi tugagach ===
  5005.         for idx, p in enumerate(phones, start=1):
  5006.             raw, clean, e164_phone = p['raw'], p['clean'], p['e164']
  5007.             str_path = f'sessions/telethon_{clean}.session'
  5008.             sql_path = f'sessions/{clean}_SQLite.session'
  5009.        
  5010.             # Agar allaqachon ro‘yxatdan o‘tgan bo‘lsa — tashlab o‘tamiz
  5011.             if os.path.exists(str_path) and os.path.exists(sql_path):
  5012.                 print(f"{ye}[{idx}] {raw}: allaqachon ro‘yxatdan o‘tgan. O‘tkazib yuborildi.{w}")
  5013.                 continue
  5014.        
  5015.             print(f"{lg}[{idx}] {raw}: QR login tayyorlanmoqda...{w}")
  5016.        
  5017.             # 1) StringSession bilan QR login
  5018.             str_client = TelegramClient(StringSession(), API_ID, HASHID)
  5019.             str_client.connect()
  5020.        
  5021.             try:
  5022.                 qr_login = str_client.qr_login()
  5023.             except Exception as e:
  5024.                 print(f"{r}[{raw}] QR login yaratib bo‘lmadi: {e}{w}")
  5025.                 str_client.disconnect()
  5026.                 continue
  5027.        
  5028.             authed = False
  5029.             last_draw = 0.0
  5030.        
  5031.             # — faqat shu akount tugaguncha shu yerda turamiz (keyingisi boshlanmaydi) —
  5032.             while not authed:
  5033.                 now = time.time()
  5034.        
  5035.                 # QR'ni periodik qayta chizish (token muddati tugashidan oldin)
  5036.                 if now - last_draw >= QR_REFRESH_SEC:
  5037.                     print(f"{w}\n{ye}Skaner qiling (QR har {QR_REFRESH_SEC}s yangilanadi). Akkaunt: {raw}{w}")
  5038.                     # mobil kamera bilan bevosita ham ochish uchun:
  5039.                     print(qr_login.url)
  5040.                     # terminalda ASCII QR:
  5041.                     try:
  5042.                         display_qr_ascii(qr_login.url)
  5043.                     except Exception:
  5044.                         pass
  5045.                     last_draw = now
  5046.        
  5047.                 try:
  5048.                     # Muhim: wait() korutina — bloklab kutamiz
  5049.                     authed = qr_wait_blocking(str_client, qr_login, WAIT_CHUNK)
  5050.        
  5051.                 except (AuthTokenExpiredError, AuthTokenInvalidError):
  5052.                     # Token muddati tugadi/invalid — sokin yangilaymiz
  5053.                     try:
  5054.                         qr_recreate_blocking(str_client, qr_login)
  5055.                         last_draw = 0.0  # qayta chizamiz
  5056.                         continue
  5057.                     except Exception as e:
  5058.                         # Ko‘pincha 2FA yoqilganida ExportLoginToken bloklanadi
  5059.                         print(f"{ye}QR token yangilanmadi (ehtimol 2FA). 2FA tekshiruviga o‘tyapmiz...{w}")
  5060.                         # ↓↓↓ FALLBACK: parol yoki kod bilan kirish
  5061.                         try:
  5062.                             # 3 urinish bilan parol
  5063.                             if sign_in_with_password_retries(str_client, raw, 3):
  5064.                                 authed = True
  5065.                                 break
  5066.                         except Exception:
  5067.                             pass
  5068.                         try:
  5069.                             str_client.send_code_request(e164_phone)
  5070.                             code = input(f"{ye}{raw} uchun Telegram yuborgan kod: {w}").strip()
  5071.                             try:
  5072.                                 str_client.sign_in(e164_phone, code)
  5073.                                 authed = True
  5074.                                 break
  5075.                             except SessionPasswordNeededError:
  5076.                                 if sign_in_with_password_retries(str_client, raw, 3):
  5077.                                     authed = True
  5078.                                     break
  5079.                                 else:
  5080.                                     print(f"{r}[{raw}] 2FA paroli tasdiqlanmadi, akount tashlab o‘tamiz.{w}")
  5081.                                     break
  5082.                         except Exception as e3:
  5083.                             print(f"{r}[{raw}] Kod/parol bilan kirish ham muvaffaqiyatsiz: {e3}{w}")
  5084.                             break
  5085.        
  5086.                 except AuthTokenAlreadyAcceptedError:
  5087.                     authed = True
  5088.                     break
  5089.        
  5090.                 except SessionPasswordNeededError:
  5091.                     # Server QR o‘rniga darrov parol talab qildi
  5092.                     if sign_in_with_password_retries(str_client, raw, 3):
  5093.                         authed = True
  5094.                         break
  5095.                     else:
  5096.                         # Parol xato bo‘lsa – kodga tushamiz
  5097.                         try:
  5098.                             str_client.send_code_request(e164_phone)
  5099.                             code = input(f"{ye}{raw} uchun Telegram yuborgan kod: {w}").strip()
  5100.                             try:
  5101.                                 str_client.sign_in(e164_phone, code)
  5102.                                 authed = True
  5103.                                 break
  5104.                             except SessionPasswordNeededError:
  5105.                                 if sign_in_with_password_retries(str_client, raw, 3):
  5106.                                     authed = True
  5107.                                     break
  5108.                                 else:
  5109.                                     print(f"{r}[{raw}] 2FA paroli tasdiqlanmadi, akount tashlab o‘tamiz.{w}")
  5110.                                     break
  5111.                         except Exception as e3:
  5112.                             print(f"{r}[{raw}] Kod/parol bilan kirish ham muvaffaqiyatsiz: {e3}{w}")
  5113.                             break
  5114.        
  5115.                 except Exception:
  5116.                     # Har qanday boshqa xatoda ham yana bir bor QR’ni yangilab ko‘ramiz,
  5117.                     # bo‘lmasa 2FA fallback
  5118.                     try:
  5119.                         qr_recreate_blocking(str_client, qr_login)
  5120.                         last_draw = 0.0
  5121.                         continue
  5122.                     except Exception:
  5123.                         print(f"{ye}QR yangilashda muammo, 2FA fallback...{w}")
  5124.                         if sign_in_with_password_retries(str_client, raw, 3):
  5125.                             authed = True
  5126.                             break
  5127.                         try:
  5128.                             str_client.send_code_request(e164_phone)
  5129.                             code = input(f"{ye}{raw} uchun Telegram kodi: {w}").strip()
  5130.                             try:
  5131.                                 str_client.sign_in(e164_phone, code)
  5132.                                 authed = True
  5133.                                 break
  5134.                             except SessionPasswordNeededError:
  5135.                                 if sign_in_with_password_retries(str_client, raw, 3):
  5136.                                     authed = True
  5137.                                     break
  5138.                                 else:
  5139.                                     print(f"{r}[{raw}] 2FA paroli tasdiqlanmadi, akount tashlab o‘tamiz.{w}")
  5140.                                     break
  5141.                         except Exception as e3:
  5142.                             print(f"{r}[{raw}] Kirish imkoni bo‘lmadi: {e3}{w}")
  5143.                             break
  5144.        
  5145.             if not authed:
  5146.                 print(f"{r}[{raw}] Kirish amalga oshmadi. Keyingisiga o‘tamiz.{w}")
  5147.                 str_client.disconnect()
  5148.                 continue
  5149.        
  5150.             # 2) StringSession ni saqlash
  5151.             try:
  5152.                 str_session_str = str_client.session.save()
  5153.                 with open(str_path, 'w', encoding='utf-8') as sf:
  5154.                     sf.write(str_session_str)
  5155.                 print(f"{lg}[{raw}] StringSession saqlandi: {str_path}{w}")
  5156.             except Exception as e:
  5157.                 print(f"{r}[{raw}] StringSession saqlashda xato: {e}{w}")
  5158.                 str_client.disconnect()
  5159.                 continue
  5160.        
  5161.             # 3) SQLite session’ga ko‘chirish
  5162.             try:
  5163.                 save_sqlite_from_client(str_client, sql_path)
  5164.                 print(f"{lg}[{raw}] SQLite session saqlandi: {sql_path}{w}")
  5165.             except Exception as e:
  5166.                 print(f"{r}[{raw}] SQLite saqlashda xato: {e}{w}")
  5167.        
  5168.             # 4) Tugatamiz — keyingi akount faqat shundan keyin boshlanadi
  5169.             str_client.disconnect()
  5170.             print(f"{lg}[{raw}] Ro‘yxatdan o‘tish yakunlandi.{w}\n")
  5171.        
  5172.         input(f"{lg}Barcha akountlar uchun QR jarayon tugadi. ENTER...{w}")
  5173.         continue
  5174.        
  5175.     elif a == 27:  
  5176.         import os
  5177.         import csv
  5178.         import asyncio
  5179.         import random
  5180.         from typing import List, Tuple
  5181.        
  5182.         from telethon import TelegramClient, functions, types  # ⬅️ birthday uchun
  5183.         from telethon.sessions import StringSession
  5184.         from telethon.errors import (
  5185.             FloodWaitError, UserPrivacyRestrictedError, ChatWriteForbiddenError,
  5186.             PhoneNumberBannedError, RPCError
  5187.         )
  5188.         from telethon.tl.types import User, Channel, Chat
  5189.         from telethon.tl.functions.contacts import ImportContactsRequest
  5190.         from telethon.tl.types import InputPhoneContact
  5191.        
  5192.         # ====== API ======
  5193.         API_ID = 253798
  5194.         API_HASH = 'd806c9ed3eb74a233d58cb4a072a68f0'
  5195.        
  5196.         SESS_DIR = 'sessions'
  5197.         PHONE_CSV = 'phone.csv'
  5198.        
  5199.         # ====== Qurilma fingerprintlari (realistik) ======
  5200.         RANDOM_DEVICES = [
  5201.             {'device_model': 'Samsung SM-S928B (Galaxy S24 Ultra)', 'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  5202.             {'device_model': 'Google Pixel 8 Pro',                  'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  5203.             {'device_model': 'Xiaomi 14 (23127PN0CG)',              'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  5204.             {'device_model': 'OnePlus 12',                          'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  5205.             {'device_model': 'realme 12 Pro+',                      'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  5206.             {'device_model': 'Nothing Phone (2a)',                  'system_version': 'Android 14 (SDK 34)', 'app_version': '11.3.0 (3660) arm64-v8a'},
  5207.             {'device_model': 'HUAWEI Pura 70 Pro',                  'system_version': 'HarmonyOS 4.2',        'app_version': '11.3.0 (3660) arm64-v8a'},
  5208.         ]
  5209.         def dev_params():
  5210.             d = random.choice(RANDOM_DEVICES).copy()
  5211.             d['system_version'] += ' | sdk 4.16.3-PYRO17'
  5212.             d['lang_code'] = 'en'
  5213.             d['system_lang_code'] = 'en'
  5214.             return d
  5215.        
  5216.         # ====== “Insoniy” xabarlar ======
  5217.         SAVOLLAR = [
  5218.             "Salom, qalesan?", "Assalomu alaykum! Bugun qanday kun?", "Nima yangiliklar?",
  5219.             "Bugun nimalar qilding?", "Ishlar qalay?", "Qayerdansan o‘zi?",
  5220.             "Bugungi rejalaring qanday?", "Hozir nima bilan bandsan?", "Kun qanday oʻtmoqda?",
  5221.             "Yaqinda qiziqarli narsa bo‘ldimi?", "Tavsiyangiz bormi yaqin atrofga borish uchun?",
  5222.             "Qaysi filmni oxirgi ko‘rding va qanday?", "Sevimli musiqangiz nima hozirlar?",
  5223.             "Qaysi dastur yoki ilova bilan ishlayapsiz?", "Kichik yordam bera olasizmi: maslahat beringchi?",
  5224.             "Qiziq: ertaga nimani rejalashtirdingiz?", "Hobbilaring nima? Bo‘lishib yuboring.",
  5225.             "Kofe yoki choy? 😊", "Ishda yangi loyiha bormi?", "Kechqurun nima qilmoqchisiz?",
  5226.             "Qanday dasturlash tili eng yoqadi?", "Sayohatga chiqmoqchi boʻlsang, qayerga borarding?",
  5227.             "Kamera orqali suratlar ko‘rishga qiziqasizmi?", "Bugun kayfiyatingizga 1 dan 10 gacha baho bering?",
  5228.             "Eng yaxshi dam olish kuningiz qanday o‘tadi?"
  5229.         ]
  5230.         JAVOBLAR = [
  5231.             "Yaxshi, rahmat! O'zingchi? 😊", "Hammasi joyida — ishlayapman hozir.",
  5232.             "Kechki payt choy ichamiz, keyin gaplashamiz.", "Ajoyib, yaqinda yangi loyiha boshladim.",
  5233.             "Hozir biroz bandman, keyin yozaman.", "Zo‘r, rahmat! Bugun yaxshi kayfiyat.",
  5234.             "Men ham xuddi shunday — ishlar serob.", "Qiziq savol! Men film ko‘rishni afzal ko‘raman.",
  5235.             "Ha, sayohat juda yoqadi!", "Kofe > choy, albatta ☕", "O‘ylab ko‘raman, rahmat.",
  5236.             "Bugun biroz dam oldim, yaxshi boʻldi.", "Kod yozish — mening hobbiym.",
  5237.             "Hozir onlayn, 10 daqiqadan keyin gaplashsak?", "Menga lo-fi yoqadi, tavsiya qilaman!",
  5238.             "Super — men ham xuddi shunday qilaman!", "Rahmat, foydali maslahat.",
  5239.             "Uyda kitob o‘qiyapman — 'Atomic Habits' tavsiya.", "Ajoyib g‘oya — sinab ko‘raman.",
  5240.             "Tushundim, keyin bog‘lanamiz.", "Bu juda kulgili 😂", "Har kuni kichik qadamlar muhim.",
  5241.             "Dam olishda tabiat — eng zo‘r.", "Ok, keyinroq batafsil yozaman.", "10/10 — samarali kun bo‘ldi!"
  5242.         ]
  5243.        
  5244.         READ_LIMIT_PER_CHAT = (5, 12)
  5245.         DIALOG_ROUNDS = (1, 2)
  5246.         DM_SLEEP = (2.0, 5.0)
  5247.         READ_SLEEP = (1.0, 2.5)
  5248.        
  5249.         # ====== Helpers ======
  5250.         def normalize_phone(s: str) -> str:
  5251.             if not s:
  5252.                 return ''
  5253.             s = s.strip().replace(' ', '').replace('-', '').replace('(', '').replace(')', '')
  5254.             return s[1:] if s.startswith('+') else s
  5255.        
  5256.         def to_e164(clean: str) -> str:
  5257.             return f'+{clean}'
  5258.        
  5259.         def read_phones(path: str) -> List[str]:
  5260.             phones = []
  5261.             if not os.path.exists(path):
  5262.                 print(f"[XATO] {path} topilmadi.")
  5263.                 return phones
  5264.             with open(path, 'r', encoding='utf-8') as f:
  5265.                 for row in csv.reader(f):
  5266.                     if not row: continue
  5267.                     raw = row[0].strip()
  5268.                     if not raw: continue
  5269.                     clean = normalize_phone(raw)
  5270.                     phones.append(clean)
  5271.             return phones
  5272.        
  5273.         async def safe_sleep(a: float, b: float):
  5274.             await asyncio.sleep(random.uniform(a, b))
  5275.        
  5276.         def is_dialog_a_chat(entity) -> bool:
  5277.             return isinstance(entity, Channel) or isinstance(entity, Chat)
  5278.        
  5279.         # ====== Chatlarda “ko‘rish” ======
  5280.         async def read_some_messages(client: TelegramClient, dialog, count: int):
  5281.             try:
  5282.                 await client.get_messages(dialog.entity, limit=count)
  5283.                 for _ in range(min(3, count)):
  5284.                     await safe_sleep(*READ_SLEEP)
  5285.                 await safe_sleep(0.5, 1.2)
  5286.             except FloodWaitError as e:
  5287.                 print(f"   └─ FloodWait: {e.seconds}s (ko‘rishda), kutamiz...")
  5288.                 await asyncio.sleep(e.seconds)
  5289.             except Exception as e:
  5290.                 print(f"   └─ Ko‘rishda xato: {e}")
  5291.        
  5292.         # >>> Qarama-qarshi akkauntni kontaktga import qilish
  5293.         async def ensure_contact(client: TelegramClient, peer_phone_e164: str, first: str = "User", last: str = "") -> bool:
  5294.             try:
  5295.                 contact = InputPhoneContact(
  5296.                     client_id=random.randrange(10**9, 10**10),
  5297.                     phone=peer_phone_e164,
  5298.                     first_name=first or "User",
  5299.                     last_name=last or ""
  5300.                 )
  5301.                 await client(ImportContactsRequest([contact]))
  5302.                 return True
  5303.             except FloodWaitError as e:
  5304.                 print(f"   └─ ImportContacts FloodWait: {e.seconds}s — kutamiz...")
  5305.                 await asyncio.sleep(e.seconds)
  5306.                 return False
  5307.             except Exception as e:
  5308.                 print(f"   └─ Kontakt import xatosi ({peer_phone_e164}): {e}")
  5309.                 return False
  5310.        
  5311.         # ====== RANDOM BIRTHDAY va uni o‘rnatish ======
  5312.         def random_birthday() -> types.Birthday:
  5313.             year  = random.randint(1986, 2005)
  5314.             month = random.randint(1, 12)
  5315.             day   = random.randint(1, 28 if month == 2 else 30)  # soddalashtirilgan
  5316.             return types.Birthday(day=day, month=month, year=year)
  5317.        
  5318.         async def set_random_birthday(client: TelegramClient):
  5319.             try:
  5320.                 bd = random_birthday()
  5321.                 await client(functions.account.UpdateBirthdayRequest(birthday=bd))
  5322.             except Exception as e:
  5323.                 print(f"   └─ Birthday o‘rnatishda xato: {e}")
  5324.        
  5325.         # ====== DM yozish (kontakt import bilan) ======
  5326.         async def dm_exchange(a: TelegramClient, b: TelegramClient, a_user: User, b_user: User,
  5327.                               a_phone_e164: str, b_phone_e164: str, rounds: int):
  5328.             a_ok = await ensure_contact(a, b_phone_e164, first=b_user.first_name or "User", last=b_user.last_name or "")
  5329.             b_ok = await ensure_contact(b, a_phone_e164, first=a_user.first_name or "User", last=a_user.last_name or "")
  5330.             if not (a_ok and b_ok):
  5331.                 return
  5332.        
  5333.             a_id = a_user.id
  5334.             b_id = b_user.id
  5335.        
  5336.             for _ in range(rounds):
  5337.                 # A -> B
  5338.                 try:
  5339.                     b_peer = await a.get_input_entity(b_id)
  5340.                     q = random.choice(SAVOLLAR)
  5341.                     await a.send_message(b_peer, q)
  5342.                     await safe_sleep(*DM_SLEEP)
  5343.                 except UserPrivacyRestrictedError:
  5344.                     return
  5345.                 except (ChatWriteForbiddenError, RPCError):
  5346.                     return
  5347.                 except FloodWaitError as e:
  5348.                     print(f"   └─ FloodWait A->B: {e.seconds}s, kutamiz...")
  5349.                     await asyncio.sleep(e.seconds)
  5350.                     return
  5351.                 except Exception:
  5352.                     return
  5353.        
  5354.                 # B -> A
  5355.                 try:
  5356.                     a_peer = await b.get_input_entity(a_id)
  5357.                     r = random.choice([random.choice(JAVOBLAR), "Ha, tushunarli.", "Zo‘r!"])
  5358.                     await b.send_message(a_peer, r)
  5359.                     await safe_sleep(*DM_SLEEP)
  5360.                 except UserPrivacyRestrictedError:
  5361.                     return
  5362.                 except FloodWaitError as e:
  5363.                     print(f"   └─ FloodWait B->A: {e.seconds}s, kutamiz...")
  5364.                     await asyncio.sleep(e.seconds)
  5365.                     return
  5366.                 except Exception:
  5367.                     return
  5368.        
  5369.         # ====== Client tayyorlash ======
  5370.         async def prepare_client(clean_phone: str):
  5371.             str_path = os.path.join(SESS_DIR, f"telethon_{clean_phone}.session")
  5372.             if not os.path.exists(str_path):
  5373.                 print(f"[{clean_phone}] session topilmadi — tashlab o‘tamiz.")
  5374.                 return None, None
  5375.        
  5376.             with open(str_path, 'r', encoding='utf-8') as f:
  5377.                 session_string = f.read().strip()
  5378.        
  5379.             params = dev_params()
  5380.             client = TelegramClient(
  5381.                 StringSession(session_string),
  5382.                 API_ID, API_HASH,
  5383.                 device_model=params['device_model'],
  5384.                 system_version=params['system_version'],
  5385.                 app_version=params['app_version'],
  5386.                 lang_code=params['lang_code'],
  5387.                 system_lang_code=params['system_lang_code']
  5388.             )
  5389.        
  5390.             try:
  5391.                 await client.connect()
  5392.                 if not await client.is_user_authorized():
  5393.                     print(f"[{clean_phone}] avtorizatsiya yo‘q — tashlab o‘tamiz.")
  5394.                     await client.disconnect()
  5395.                     return None, None
  5396.        
  5397.                 me = await client.get_me()
  5398.                 return client, me
  5399.             except PhoneNumberBannedError:
  5400.                 print(f"[{clean_phone}] BAN — tashlab o‘tamiz.")
  5401.                 return None, None
  5402.             except Exception as e:
  5403.                 print(f"[{clean_phone}] ulanish xatosi: {e}")
  5404.                 try:
  5405.                     await client.disconnect()
  5406.                 except:
  5407.                     pass
  5408.                 return None, None
  5409.        
  5410.         # ====== “O‘z chatlarini ko‘rish” bosqichi ======
  5411.         async def view_own_chats(client: TelegramClient, me):
  5412.             try:
  5413.                 dialogs = []
  5414.                 async for d in client.iter_dialogs():
  5415.                     if d.is_user:
  5416.                         continue
  5417.                     if d.entity and is_dialog_a_chat(d.entity):
  5418.                         dialogs.append(d)
  5419.        
  5420.                 if not dialogs:
  5421.                     print("   └─ A’zo bo‘lgan chatlar topilmadi.")
  5422.                     return
  5423.        
  5424.                 sample = random.sample(dialogs, k=min(2, len(dialogs)))
  5425.                 for d in sample:
  5426.                     title = getattr(d.entity, 'title', 'Chat')
  5427.                     print(f"   └─ Ko‘rish: {title}")
  5428.                     to_read = random.randint(*READ_LIMIT_PER_CHAT)
  5429.                     await read_some_messages(client, d, to_read)
  5430.             except Exception as e:
  5431.                 print(f"   └─ Dialoglarni olishda xato: {e}")
  5432.        
  5433.         # ====== DM orkestratsiya ======
  5434.         async def dm_everyone(clients_info: List[Tuple[TelegramClient, User, str]]):
  5435.             pairs = []
  5436.             for i in range(0, len(clients_info) - 1, 2):
  5437.                 pairs.append((clients_info[i], clients_info[i+1]))
  5438.        
  5439.             if not pairs:
  5440.                 print("DM uchun juftlik topilmadi (akkauntlar soni kam).")
  5441.                 return
  5442.        
  5443.             for (c1, u1, p1), (c2, u2, p2) in pairs:
  5444.                 if u1.id == u2.id:
  5445.                     continue
  5446.                 print(f"   └─ DM: {u1.first_name or u1.id}  ↔  {u2.first_name or u2.id}")
  5447.                 rounds = random.randint(*DIALOG_ROUNDS)
  5448.                 try:
  5449.                     await dm_exchange(c1, c2, u1, u2, p1, p2, rounds)
  5450.                 except Exception as e:
  5451.                     print(f"   └─ DM juftlik xatosi: {e}")
  5452.                 await safe_sleep(0.8, 1.4)
  5453.        
  5454.         # ====== MAIN ======
  5455.         async def main():
  5456.             if os.name == 'nt':
  5457.                 try:
  5458.                     asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
  5459.                 except Exception:
  5460.                     pass
  5461.        
  5462.             phones_clean = read_phones(PHONE_CSV)
  5463.             if not phones_clean:
  5464.                 print("phone.csv bo‘sh yoki topilmadi.")
  5465.                 return
  5466.        
  5467.             os.makedirs(SESS_DIR, exist_ok=True)
  5468.        
  5469.             # 1) Klientlarni tayyorlash
  5470.             clients_info: List[Tuple[TelegramClient, User, str]] = []
  5471.             for clean in phones_clean:
  5472.                 client, me = await prepare_client(clean)
  5473.                 if client and me:
  5474.                     e164 = to_e164(clean)
  5475.                     print(f"[{clean}] ulandi: {me.first_name or me.id}")
  5476.                     clients_info.append((client, me, e164))
  5477.                 await safe_sleep(0.4, 1.2)
  5478.        
  5479.             if not clients_info:
  5480.                 print("Ishlaydigan akkaunt topilmadi.")
  5481.                 return
  5482.        
  5483.             # 2) Har biri o‘z chatlaridan 2 tasini ko‘rib chiqadi
  5484.             print("\n— Chatlarda ko‘rish bosqichi —")
  5485.             for client, me, _ in clients_info:
  5486.                 print(f" [{me.first_name or me.id}] chatlarini ko‘rish:")
  5487.                 await view_own_chats(client, me)
  5488.                 await safe_sleep(0.8, 1.2)
  5489.        
  5490.             # 3) HAR BIR akkauntga random birthday o‘rnatamiz
  5491.             print("\n— Profil (birthday) o‘rnatish —")
  5492.             for client, me, _ in clients_info:
  5493.                 print(f" [{me.first_name or me.id}] tug‘ilgan kuni o‘rnatilmoqda...")
  5494.                 await set_random_birthday(client)
  5495.                 await safe_sleep(0.6, 1.0)
  5496.        
  5497.             # 4) O‘zaro DM (kontakt import bilan)
  5498.             print("\n— O‘zaro DM bosqichi —")
  5499.             await dm_everyone(clients_info)
  5500.        
  5501.             # 5) Yopish
  5502.             print("\nYakunlandi...")
  5503.             for client, _, _ in clients_info:
  5504.                 try:
  5505.                     await client.disconnect()
  5506.                 except:
  5507.                     pass
  5508.             input("ENTER — chiqish...")
  5509.        
  5510.         if __name__ == '__main__':
  5511.             asyncio.run(main())
  5512.  
  5513.  
Advertisement
Add Comment
Please, Sign In to add comment