import requests import json import time from datetime import datetime # Как пользоваться? # Устанавливаем Python последней версии с официального сайта # Переходим на https://web.yota.ru/, входим в свой аккаунт # Открываем инструменты разработчика Chrome (Ctrl+Shift+I) # Сортируем запросы по фильтру Fetch/Xhr и обновляем страницу (F5) # Выбираем слева любой запрос, кликаем ПКМ --> Copy --> Copy as Curl (bash) и вставляем на сайт https://curlconverter.com/ # Копируем только cookies и headers ниже с заменой, остальное не трогаем. Не потеряйте {}. # PROFIT!!11!1 # === ВАШИ ДАННЫЕ (замените на реальные) === cookies = { # Ваши cookies здесь } headers = { # Ваши headers здесь } def check_availability(): url = 'https://mapi.yota.ru/customer/products/clone/availability' try: response = requests.get(url, cookies=cookies, headers=headers) response.raise_for_status() data = response.json() available = data.get('available', False) details = data.get('details', {}) limits = details.get('promocodeLimits', {}) limit = limits.get('limit') issued = limits.get('issued') is_unlimited = limits.get('isUnlimited', False) # Рассчитываем остаток if is_unlimited: remaining = float('inf') # неограниченно else: if isinstance(limit, int) and isinstance(issued, int): remaining = max(0, limit - issued) else: remaining = 0 return { 'available': available, 'is_unlimited': is_unlimited, 'limit': limit, 'issued': issued, 'remaining': remaining } except Exception as e: print(f"Ошибка при проверке доступности: {e}") return None def get_promocodes(count): promocodes = [] url = 'https://mapi.yota.ru/customer/products/clone/initiate' json_data = {'type': 'CLONE_TO_OTHER'} print(f"\nЗапрашиваю {count} промокодов...\n") for i in range(count): try: response = requests.post(url, cookies=cookies, headers=headers, json=json_data) response.raise_for_status() data = response.json() if not data.get('result'): print(f"Ошибка на шаге {i+1}: result != true. Ответ сервера: {data}") break details = data.get('details', {}) promocode = details.get('promocode') link = details.get('link', '').strip() if not promocode: print(f"Ошибка на шаге {i+1}: отсутствует promocode.") break promocodes.append((promocode, link)) print(f"[{i+1}] Промокод: {promocode}") time.sleep(0.3) # небольшая задержка except requests.RequestException as e: print(f"Ошибка запроса на шаге {i+1}: {e}") break except json.JSONDecodeError: print(f"Ошибка на шаге {i+1}: не удалось распарсить JSON.") break return promocodes def save_promocodes_to_file(promocodes): timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") filename = f"promocodes_{timestamp}.txt" with open(filename, 'w', encoding='utf-8') as f: f.write("Промокоды и ссылки:\n\n") for code, link in promocodes: f.write(f"{code}\t{link}\n") print(f"\nПромокоды сохранены в файл: {filename}") return filename def save_availability_to_file(info, prefix=""): filename = f"{prefix}availability_info.txt" with open(filename, 'w', encoding='utf-8') as f: f.write("Информация о доступности промокодов:\n\n") f.write(f"Доступно для выпуска: {'Да' if info['available'] else 'Нет'}\n") if info['is_unlimited']: f.write("Лимит: неограничен\n") f.write("Осталось: неограниченно\n") else: f.write(f"Лимит: {info['limit']}\n") f.write(f"Выдано: {info['issued']}\n") f.write(f"Осталось: {info['remaining']}\n") print(f"Информация о лимитах сохранена в файл: {filename}") return filename def main(): print("Проверяю текущую доступность промокодов...\n") initial_info = check_availability() if not initial_info: print("Не удалось получить информацию о лимитах.") return # Выводим статус до ввода print("=== Текущий статус лимитов ===") if initial_info['is_unlimited']: print("У вас неограниченный выпуск промокодов.") max_allowed = float('inf') else: print(f"Лимит: {initial_info['limit']}") print(f"Выдано: {initial_info['issued']}") print(f"Осталось: {initial_info['remaining']}") max_allowed = initial_info['remaining'] print(f"Доступно для выпуска: {'Да' if initial_info['available'] else 'Нет'}\n") if not initial_info['available']: print("Сервер не позволяет выпускать промокоды сейчас.") return # Ввод количества с проверкой try: count = int(input("Сколько промокодов вы хотите получить? ")) if count <= 0: print("Количество должно быть положительным числом.") return if not initial_info['is_unlimited'] and count > max_allowed: print(f"Вы запросили {count} промокодов, но осталось только {max_allowed}.") confirm = input(f"Продолжить с {max_allowed} промокодами? (y/n): ").strip().lower() if confirm in ('y', 'yes', 'да'): count = max_allowed else: print("Операция отменена.") return except ValueError: print("Введите корректное число.") return # Получаем промокоды promocodes = get_promocodes(count) if not promocodes: print("Ни один промокод не был получен.") return # Сохраняем save_promocodes_to_file(promocodes) save_availability_to_file(initial_info, prefix="initial_") # Повторная проверка после выпуска print("\nПроверяю остатки после выпуска промокодов...") final_info = check_availability() if final_info: print("\n=== Новый статус лимитов ===") if final_info['is_unlimited']: print("Лимит: неограничен") print("Осталось: неограниченно") else: print(f"Лимит: {final_info['limit']}") print(f"Выдано: {final_info['issued']}") print(f"Осталось: {final_info['remaining']}") save_availability_to_file(final_info, prefix="final_") else: print("Не удалось получить обновлённую информацию о лимитах.") if __name__ == "__main__": main()