hjugo

Yota tariff share

Nov 12th, 2025
363
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import requests
  2. import json
  3. import time
  4. from datetime import datetime
  5.  
  6. # Как пользоваться?
  7. # Устанавливаем Python последней версии с официального сайта
  8. # Переходим на https://web.yota.ru/, входим в свой аккаунт
  9. # Открываем инструменты разработчика Chrome (Ctrl+Shift+I)
  10. # Сортируем запросы по фильтру Fetch/Xhr и обновляем страницу (F5)
  11. # Выбираем слева любой запрос, кликаем ПКМ --> Copy --> Copy as Curl (bash) и вставляем на сайт https://curlconverter.com/
  12. # Копируем только cookies и headers ниже с заменой, остальное не трогаем. Не потеряйте {}.
  13. # PROFIT!!11!1
  14.  
  15.  
  16. # === ВАШИ ДАННЫЕ (замените на реальные) ===
  17. cookies = {
  18.     # Ваши cookies здесь
  19. }
  20. headers = {
  21.     # Ваши headers здесь
  22. }
  23.  
  24. def check_availability():
  25.     url = 'https://mapi.yota.ru/customer/products/clone/availability'
  26.     try:
  27.         response = requests.get(url, cookies=cookies, headers=headers)
  28.         response.raise_for_status()
  29.         data = response.json()
  30.  
  31.         available = data.get('available', False)
  32.         details = data.get('details', {})
  33.         limits = details.get('promocodeLimits', {})
  34.  
  35.         limit = limits.get('limit')
  36.         issued = limits.get('issued')
  37.         is_unlimited = limits.get('isUnlimited', False)
  38.  
  39.         # Рассчитываем остаток
  40.         if is_unlimited:
  41.             remaining = float('inf')  # неограниченно
  42.         else:
  43.             if isinstance(limit, int) and isinstance(issued, int):
  44.                 remaining = max(0, limit - issued)
  45.             else:
  46.                 remaining = 0
  47.  
  48.         return {
  49.             'available': available,
  50.             'is_unlimited': is_unlimited,
  51.             'limit': limit,
  52.             'issued': issued,
  53.             'remaining': remaining
  54.         }
  55.  
  56.     except Exception as e:
  57.         print(f"Ошибка при проверке доступности: {e}")
  58.         return None
  59.  
  60. def get_promocodes(count):
  61.     promocodes = []
  62.     url = 'https://mapi.yota.ru/customer/products/clone/initiate'
  63.     json_data = {'type': 'CLONE_TO_OTHER'}
  64.  
  65.     print(f"\nЗапрашиваю {count} промокодов...\n")
  66.  
  67.     for i in range(count):
  68.         try:
  69.             response = requests.post(url, cookies=cookies, headers=headers, json=json_data)
  70.             response.raise_for_status()
  71.             data = response.json()
  72.  
  73.             if not data.get('result'):
  74.                 print(f"Ошибка на шаге {i+1}: result != true. Ответ сервера: {data}")
  75.                 break
  76.  
  77.             details = data.get('details', {})
  78.             promocode = details.get('promocode')
  79.             link = details.get('link', '').strip()
  80.  
  81.             if not promocode:
  82.                 print(f"Ошибка на шаге {i+1}: отсутствует promocode.")
  83.                 break
  84.  
  85.             promocodes.append((promocode, link))
  86.             print(f"[{i+1}] Промокод: {promocode}")
  87.  
  88.             time.sleep(0.3)  # небольшая задержка
  89.  
  90.         except requests.RequestException as e:
  91.             print(f"Ошибка запроса на шаге {i+1}: {e}")
  92.             break
  93.         except json.JSONDecodeError:
  94.             print(f"Ошибка на шаге {i+1}: не удалось распарсить JSON.")
  95.             break
  96.  
  97.     return promocodes
  98.  
  99. def save_promocodes_to_file(promocodes):
  100.     timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
  101.     filename = f"promocodes_{timestamp}.txt"
  102.     with open(filename, 'w', encoding='utf-8') as f:
  103.         f.write("Промокоды и ссылки:\n\n")
  104.         for code, link in promocodes:
  105.             f.write(f"{code}\t{link}\n")
  106.     print(f"\nПромокоды сохранены в файл: {filename}")
  107.     return filename
  108.  
  109. def save_availability_to_file(info, prefix=""):
  110.     filename = f"{prefix}availability_info.txt"
  111.     with open(filename, 'w', encoding='utf-8') as f:
  112.         f.write("Информация о доступности промокодов:\n\n")
  113.         f.write(f"Доступно для выпуска: {'Да' if info['available'] else 'Нет'}\n")
  114.         if info['is_unlimited']:
  115.             f.write("Лимит: неограничен\n")
  116.             f.write("Осталось: неограниченно\n")
  117.         else:
  118.             f.write(f"Лимит: {info['limit']}\n")
  119.             f.write(f"Выдано: {info['issued']}\n")
  120.             f.write(f"Осталось: {info['remaining']}\n")
  121.     print(f"Информация о лимитах сохранена в файл: {filename}")
  122.     return filename
  123.  
  124. def main():
  125.     print("Проверяю текущую доступность промокодов...\n")
  126.     initial_info = check_availability()
  127.  
  128.     if not initial_info:
  129.         print("Не удалось получить информацию о лимитах.")
  130.         return
  131.  
  132.     # Выводим статус до ввода
  133.     print("=== Текущий статус лимитов ===")
  134.     if initial_info['is_unlimited']:
  135.         print("У вас неограниченный выпуск промокодов.")
  136.         max_allowed = float('inf')
  137.     else:
  138.         print(f"Лимит: {initial_info['limit']}")
  139.         print(f"Выдано: {initial_info['issued']}")
  140.         print(f"Осталось: {initial_info['remaining']}")
  141.         max_allowed = initial_info['remaining']
  142.  
  143.     print(f"Доступно для выпуска: {'Да' if initial_info['available'] else 'Нет'}\n")
  144.  
  145.     if not initial_info['available']:
  146.         print("Сервер не позволяет выпускать промокоды сейчас.")
  147.         return
  148.  
  149.     # Ввод количества с проверкой
  150.     try:
  151.         count = int(input("Сколько промокодов вы хотите получить? "))
  152.         if count <= 0:
  153.             print("Количество должно быть положительным числом.")
  154.             return
  155.  
  156.         if not initial_info['is_unlimited'] and count > max_allowed:
  157.             print(f"Вы запросили {count} промокодов, но осталось только {max_allowed}.")
  158.             confirm = input(f"Продолжить с {max_allowed} промокодами? (y/n): ").strip().lower()
  159.             if confirm in ('y', 'yes', 'да'):
  160.                 count = max_allowed
  161.             else:
  162.                 print("Операция отменена.")
  163.                 return
  164.  
  165.     except ValueError:
  166.         print("Введите корректное число.")
  167.         return
  168.  
  169.     # Получаем промокоды
  170.     promocodes = get_promocodes(count)
  171.  
  172.     if not promocodes:
  173.         print("Ни один промокод не был получен.")
  174.         return
  175.  
  176.     # Сохраняем
  177.     save_promocodes_to_file(promocodes)
  178.     save_availability_to_file(initial_info, prefix="initial_")
  179.  
  180.     # Повторная проверка после выпуска
  181.     print("\nПроверяю остатки после выпуска промокодов...")
  182.     final_info = check_availability()
  183.  
  184.     if final_info:
  185.         print("\n=== Новый статус лимитов ===")
  186.         if final_info['is_unlimited']:
  187.             print("Лимит: неограничен")
  188.             print("Осталось: неограниченно")
  189.         else:
  190.             print(f"Лимит: {final_info['limit']}")
  191.             print(f"Выдано: {final_info['issued']}")
  192.             print(f"Осталось: {final_info['remaining']}")
  193.         save_availability_to_file(final_info, prefix="final_")
  194.     else:
  195.         print("Не удалось получить обновлённую информацию о лимитах.")
  196.  
  197. if __name__ == "__main__":
  198.     main()
Advertisement
Add Comment
Please, Sign In to add comment