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