CCCPaste

Yota tariff share

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()