Реверс-инжиниринг API: Бесплатные доступ к нейросетям o3-mini, GPT-4o-mini и другим на запросах

Serj566

Client
Регистрация
09.05.2016
Сообщения
112
Благодарностей
293
Баллы
63
Rev_API_Header.png


Важно! Данная статья имеет исключительно образовательный характер и предназначена для ознакомления с техническими аспектами работы веб-сервисов.

Ни автор, ни компания Zenolab не несут ответственности за возможные последствия использования представленной информации. Каждый пользователь обязан:
  1. Внимательно изучить условия использования (Terms of Service) сервисов перед применением описанных методов
  2. Соблюдать законодательство своей страны в области информационных технологий
  3. Учитывать, что несанкционированный доступ к защищенным системам может являться противоправным действием
  4. Помнить, что чрезмерная нагрузка на серверы сторонних сервисов может быть расценена как DoS-атака
Использование методов реверс-инженеринга API допустимо только в отношении сервисов, которые явно не запрещают подобные действия, и только в личных некоммерческих целях.

Помните, что ответственность за все действия, совершенные с использованием данной информации, лежит исключительно на вас.

Давайте начнём с того, что такое API. Реверс-инжиниринг API тесно связан с API, поэтому для начала необходимо понять, что это такое.

Что такое API простыми словами
API (Application Programming Interface) — это набор правил и инструментов, который позволяет разным программам общаться между собой. Его можно представить как "официанта" в ресторане:
  1. Вы (пользователь) не идете сами на кухню готовить
  2. Официант (API) принимает ваш заказ, передает его на кухню и приносит готовое блюдо
  3. Кухня (сервер) готовит блюдо по вашему заказу
Примеры из жизни:
  • Когда вы используете приложение погоды на телефоне, оно обращается к API погодного сервиса, чтобы получить данные
  • Когда вы платите картой через интернет-магазин, сайт использует API платежной системы
  • Когда вы видите карту Google на каком-то сайте, этот сайт использует API Google Maps
API позволяет разработчикам использовать функции других программ или сервисов, не зная, как они устроены внутри. Это как пользоваться пультом от телевизора — вам не нужно знать, как телевизор работает внутри, чтобы переключать каналы.

Реверс-инженеринг API: простое руководство на примере duck.ai
Что такое реверс-инженеринг API простыми словами
Реверс-инженеринг API — это процесс изучения и анализа чужого API, чтобы понять, как оно работает, не имея доступа к официальной документации или исходному коду. Это как если бы вы хотели узнать, как официант в ресторане принимает заказы, но вместо того, чтобы спрашивать его напрямую:
  1. Вы наблюдаете за официантом
  2. Замечаете, какие слова он использует, принимая заказы
  3. Видите, какие записи он делает
  4. Отслеживаете, как он передает информацию на кухню
И затем, поняв этот процесс, вы можете сами "притвориться" официантом и сделать заказ напрямую на кухню, минуя настоящего официанта.

Зачем нам это нужно?
Рассмотрим сайт https://duck.ai/ — это сервис с чатом для доступа к нейросетям. Мы могли бы использовать браузер в ZennoPoster, вводить запросы и парсить ответы, но такой подход:
  • Ресурсоёмкий (нужно загружать весь сайт)
  • Медленный (много лишних запросов)
  • Нестабильный (интерфейс может меняться)
Если мы сможем напрямую обращаться к API, которое использует сам сайт, мы получим тот же результат быстрее и стабильнее.

Инструменты для реверс-инженеринга API
Для простого реверс-инженеринга API нам не нужно сложное ПО:
  • Встроенный браузер ZennoPoster с мониторингом трафика
  • Или обычный браузер с инструментами разработчика (DevTools, вкладка Network)
Пошаговое руководство по реверс-инженерингу API duck.ai
Шаг 1: Найти ключевой запрос
Начинаем с поиска запроса, который отправляет наш вопрос к нейросети и получает ответ. Открываем инструменты разработчика, отправляем тестовый вопрос и анализируем сетевой трафик.

Снимок экрана 2025-03-24 в 22.37.16.png


Находим ключевой запрос:

POST https://duckduckgo.com/duckchat/v1/chat

В теле запроса видим JSON:
Снимок экрана 2025-03-24 в 22.37.24.png

Тело POST запроса:
{
  "model": "gpt-4o-mini",
  "messages": [
    {
      "role": "user",
      "content": "Привет"
    }
  ]
}
Шаг 2: Анализируем заголовки запроса
Снимок экрана 2025-03-24 в 22.37.16.png


Снимок экрана 2025-03-24 в 22.47.18.png

Изучаем заголовки запроса и выделяем важные:
  • User-Agent (почти всегда нужен)
  • Accept: text/event-stream (указывает на стриминговый ответ)
  • Content-Type: application/json (формат данных)
  • Специфичные параметры: X-Vqd-4, x-vqd-hash-1 и x-xss-protection
Шаг 3: Пробуем воспроизвести запрос
Создаем в ZennoPoster действие с найденным запросом и пытаемся его отправить.
Снимок экрана 2025-03-24 в 22.47.26.png


Снимок экрана 2025-03-24 в 22.50.40.png

Получаем ошибку 418, что указывает на наличие проверки. Скорее всего, проблема в невалидных специфичных заголовков (X-Vqd-4, x-vqd-hash-1).

Шаг 4: Ищем источник специфичных заголовков
Теперь мы анализируем все запросы и ищем в каком запросе или запросах в ответ мы получаем нужные нам параметры.
Снимок экрана 2025-03-24 в 22.55.40.png


Снимок экрана 2025-03-24 в 22.59.25.png

Анализируем предыдущие запросы и находим:

GET https://duckduckgo.com/duckchat/v1/status

А в ответе получаем нужные нам:
  • X-Vqd-4
  • x-vqd-hash-1
  • x-xss-protection
Шаг 5: Метод проб и ошибок
Снимок экрана 2025-03-24 в 22.58.39.png


Экспериментальным путем определяем минимальный набор необходимых параметров:

Для запроса статуса (/duckchat/v1/status):
  • User-Agent
  • x-vqd-accept: 1
  • Куки не требуются
Снимок экрана 2025-03-24 в 23.58.51.png

Шаг 6: Извлечение данных из ответа статуса
Парсим необходимые заголовки из ответа статуса с помощью регулярных выражений:
  • Для x-vqd-4: (?<=x-vqd-4:\ ).*
  • Для x-vqd-hash-1: (?<=x-vqd-hash-1:\ ).*
UPD 26.03.2025 x-vqd-hash-1 был изменён и теперь не несёт готовый HASH, а несёт внутри base64, который указывает нам на то, как формируется HASH. Поэтому мы можем просто генерировать его и передавать уже сгенерированное значение.

Снимок экрана 2025-03-24 в 23.06.07.png

Сохраняем результаты в переменные ZennoPoster.

Шаг 7: Формируем финальный запрос к чату
Для запроса к чату (/duckchat/v1/chat) нам нужны:
  • User-Agent
  • Accept: text/event-stream
  • Content-Type: application/json
  • X-Vqd-4 (значение из шага 6)
  • x-vqd-hash-1 (значение из шага 6)
  • Тело запроса с моделью и текстом вопроса
Снимок экрана 2025-03-24 в 23.17.38.png


Снимок экрана 2025-03-24 в 23.20.45.png


Шаг 8: Обработка ответа
Ответ приходит в формате стрима событий (event-stream):

Код:
data: {"message":" культуры","created":1742840417,"id":"chatcmpl-BEghFsIETyILkbbs2JT0EWgBB8GCl","action":"success","model":"gpt-4o-mini-2024-07-18"}

data: {"message":" и","created":1742840417,"id":"chatcmpl-BEghFsIETyILkbbs2JT0EWgBB8GCl","action":"success","model":"gpt-4o-mini-2024-07-18"}

...

data: [DONE]
Для извлечения полного текста ответа:
  1. Используем регулярное выражение (?<="message":").*?(?=","created")
  2. Сохраняем все найденные фрагменты в список
  3. Объединяем список в единый текст
Итоговый алгоритм работы
  1. Отправляем GET-запрос на https://duckduckgo.com/duckchat/v1/statusс заголовками:
    • User-Agent
    • x-vqd-accept: 1
  2. Извлекаем из ответа заголовки:
    • X-Vqd-4
    • x-vqd-hash-1
  3. Отправляем POST-запрос на https://duckduckgo.com/duckchat/v1/chatс:
    • Заголовками: User-Agent, Accept: text/event-stream, Content-Type: application/json, X-Vqd-4, x-vqd-hash-1
    • Телом запроса: {"model":"gpt-4o-mini","messages":[{"role":"user","content":"Ваш вопрос"}]}
  4. Обрабатываем стриминговый ответ, извлекая и объединяя все фрагменты сообщения.
Практические советы при реверс-инженеринге API
Как справиться с частыми трудностями
Авторизация и токены
  • JWT токены: Ищите запрос, который получает токен после авторизации. Обычно он имеет короткий срок жизни, поэтому вам нужно будет периодически его обновлять.
  • Куки: Если сайт использует куки для авторизации, скопируйте их из браузера после входа в систему и добавьте в свои запросы.
Защита от ботов
  • Делайте паузы между запросами (1-5 секунд)
  • Используйте реалистичный User-Agent от настоящего браузера
  • Если сайт блокирует ваш IP, попробуйте использовать прокси
Скрытые параметры
  • Ищите в запросах странные параметры или токены (часто с именами вроде "_csrf", "nonce", "hash")
  • Проверьте, откуда они берутся (часто из предыдущих запросов или из HTML страницы)
Простая проверка важности параметров
  1. Попробуйте удалить параметр из запроса - если всё работает, он не нужен
  2. Попробуйте изменить значение параметра - если запрос перестал работать, параметр важен
  3. Попробуйте отправить запрос без авторизации - чтобы понять, нужна ли она вообще
Когда ничего не работает
  1. Вернитесь к началу и проследите всю цепочку запросов с самого входа на сайт
  2. Обратите внимание на JavaScript, который может генерировать или шифровать данные
  3. Попробуйте другой браузер или режим инкогнито - иногда проблема в кэшированных данных
И самое главное
  • Делайте заметки о том, что работает, а что нет
  • Меняйте только один параметр за раз
  • Будьте готовы к тому, что API может измениться в любой момент

Заключение
Реверс-инженеринг API — это исследовательский процесс, требующий внимания к деталям и экспериментов. Основные шаги всегда одинаковы:
  1. Найти ключевой запрос
  2. Проанализировать его параметры и заголовки
  3. Понять, откуда берутся специфичные данные
  4. Определить минимальный набор необходимых параметров
  5. Автоматизировать весь процесс
Такой подход позволяет значительно ускорить взаимодействие с сервисами и сделать его более стабильным.

Шаблон DDG_API
Помимо статьи, я также создал шаблон, который умеет работать с прокси. Для демонстрации его функциональности, он генерирует ответы на вопросы и выводит их в лог. Вы можете использовать его как пример или интегрировать в свои проекты — это не составит труда.
Снимок экрана 2025-03-25 в 00.39.21.png

Шаблон поддерживает все 5 моделей DDG:
  • gpt-4o-mini
  • meta-llama/Llama-3.3-70B-Instruct-Turbo
  • claude-3-haiku-20240307
  • o3-mini
  • mistralai/Mistral-Small-24B-Instruct-2501
 

Вложения

Последнее редактирование:
Регистрация
23.03.2015
Сообщения
1 245
Благодарностей
800
Баллы
113
В копилочку:ay:
 
  • Спасибо
Реакции: vinaz и Serj566

spbalexpiter

Client
Регистрация
24.11.2013
Сообщения
430
Благодарностей
115
Баллы
43
отличная статья. использовал этот сайт в вебе.
запустил Ваш шаблон. вот такой ответ :(
{"action":"error","status":418,"type":"ERR_CHALLENGE","overrideCode":"6b56","cd":{"cc":"duckchat","e":0,"er":null,"gk":"d4cd0dabcf4caa22ad92fab40844c786","i":"3","iadb":1,"o":"nt%2Bl2D%2B12AC5NY4xVdqns0%2FcwXkDnlayR2c9DMcPfWznjXEyEBJB88nq8hQhJPt8%0A","p":"491d386b2c854701a07d8cecf58f0ca2-7214b7e37ba3470a80a60db40c289c0e-00af48fbf81246368098632cb6a904e6-5f41225f75ce4a429c90cd9bfb587f7a-32fc38c036284b168b6ca8014150ff21-400de96bf6344506909c47d5093eabfb-078f1b87107343b28c36b8cfc729b1f9-3af2b7c055c148e9abeb619bdbb8a91f-6a81689333ee47aa98d18023a3928edf","q":"","r":"euw","s":"aichat","sc":1}}
 

Serj566

Client
Регистрация
09.05.2016
Сообщения
112
Благодарностей
293
Баллы
63
отличная статья. использовал этот сайт в вебе.
запустил Ваш шаблон. вот такой ответ :(
{"action":"error","status":418,"type":"ERR_CHALLENGE","overrideCode":"6b56","cd":{"cc":"duckchat","e":0,"er":null,"gk":"d4cd0dabcf4caa22ad92fab40844c786","i":"3","iadb":1,"o":"nt%2Bl2D%2B12AC5NY4xVdqns0%2FcwXkDnlayR2c9DMcPfWznjXEyEBJB88nq8hQhJPt8%0A","p":"491d386b2c854701a07d8cecf58f0ca2-7214b7e37ba3470a80a60db40c289c0e-00af48fbf81246368098632cb6a904e6-5f41225f75ce4a429c90cd9bfb587f7a-32fc38c036284b168b6ca8014150ff21-400de96bf6344506909c47d5093eabfb-078f1b87107343b28c36b8cfc729b1f9-3af2b7c055c148e9abeb619bdbb8a91f-6a81689333ee47aa98d18023a3928edf","q":"","r":"euw","s":"aichat","sc":1}}
Странно, ночью проверял всё работало без проблем. За компом буду, посмотрю.
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 860
Благодарностей
2 573
Баллы
113
Сколько запросов разрешает с одного IP?
 

ZennoCat

Client
Регистрация
06.01.2020
Сообщения
61
Благодарностей
32
Баллы
18
спасибо, статья актуальна для меня в данный момент, сейчас буду тестировать
 

Serj566

Client
Регистрация
09.05.2016
Сообщения
112
Благодарностей
293
Баллы
63
отличная статья. использовал этот сайт в вебе.
запустил Ваш шаблон. вот такой ответ :(
{"action":"error","status":418,"type":"ERR_CHALLENGE","overrideCode":"6b56","cd":{"cc":"duckchat","e":0,"er":null,"gk":"d4cd0dabcf4caa22ad92fab40844c786","i":"3","iadb":1,"o":"nt%2Bl2D%2B12AC5NY4xVdqns0%2FcwXkDnlayR2c9DMcPfWznjXEyEBJB88nq8hQhJPt8%0A","p":"491d386b2c854701a07d8cecf58f0ca2-7214b7e37ba3470a80a60db40c289c0e-00af48fbf81246368098632cb6a904e6-5f41225f75ce4a429c90cd9bfb587f7a-32fc38c036284b168b6ca8014150ff21-400de96bf6344506909c47d5093eabfb-078f1b87107343b28c36b8cfc729b1f9-3af2b7c055c148e9abeb619bdbb8a91f-6a81689333ee47aa98d18023a3928edf","q":"","r":"euw","s":"aichat","sc":1}}
Внёс правки, обновил в теме и прикладываю измененные вариант.
Снимок экрана 2025-03-26 в 03.24.52.png


Сколько запросов разрешает с одного IP?
На сколько я помню, там около 10 запросов в минут и 200 в час с 1 IP. Но я им давно не пользуюсь сам, так что точно не могу сказать. Вы можете проверить, проведя тесты на лимиты.

спасибо, статья актуальна для меня в данный момент, сейчас буду тестировать
Я обновил шаблон, внёс правки. Скачайте новую версию.


Если вам понравилась моя работа, не забудьте проголосовать за неё и други понравившиеся вам работы на странице голосования.
"Спасибо", которые вы нажимаете, очень приятны. Но они не учитываются в голосовании.

Zennolab Master 4.0 - Голосование за лучшие работы!
 

Вложения

  • Спасибо
Реакции: udder и smartmail

udder

Client
Регистрация
28.03.2017
Сообщения
633
Благодарностей
138
Баллы
43
@Serj566 Прекрасное решение, голос за вас.
 
  • Спасибо
Реакции: Serj566

spbalexpiter

Client
Регистрация
24.11.2013
Сообщения
430
Благодарностей
115
Баллы
43
Шаблон опять сломался :( X-Vqd-Hash-1 теперь указан в таком виде и я так и не смог разобраться, как его получить
токен:
X-Vqd-Hash-1: eyJzZXJ2ZXJfaGFzaGVzIjpbIlljZHFDNlBKT0MrejBudHpJbUQ5V0hNRWpheDJhQU1idUgyc2VDd0lQb2s9IiwiU2MvRjViWlJpb1Y5ckpwdEM4ZXNOVEFJVktpMVhacHFTVUliUjQvL2sxVT0iXSwiY2xpZW50X2hhc2hlcyI6WyJlSklKem1JcnB2OUNUQ0JYWHN5S1dNekJSa1IweXA1bE1mcFF0cFdrQW80PSIsIk5HMlhZbFVPMTFhN1IxN2NmMnFXUHZMMnlDY3k1Zk4wQnZta1hZUm9tSkE9Il0sInNpZ25hbHMiOnt9fQ==
 

volody00

Client
Регистрация
06.09.2016
Сообщения
970
Благодарностей
1 065
Баллы
93
@Serj566, спасибо за статью. Может немного разовьете тему и покажете, как вы анализируете js код? Небольшое видео хотелось бы. Например, как вы пришли к выводу, что "x-vqd-hash-1 был изменён и теперь не несёт готовый HASH, а несёт внутри base64, который указывает нам на то, как формируется HASH". Теперь вот опять что-то поменялось и очень сложно разбираться. Мне бы хотелось подсмотреть на ход ваших мыслей, как вы действуете в подобных ситуациях
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)