Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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()
Advertisement
Add Comment
Please, Sign In to add comment