- Регистрация
- 09.05.2016
- Сообщения
- 112
- Благодарностей
- 293
- Баллы
- 63
Важно! Данная статья имеет исключительно образовательный характер и предназначена для ознакомления с техническими аспектами работы веб-сервисов.
Ни автор, ни компания Zenolab не несут ответственности за возможные последствия использования представленной информации. Каждый пользователь обязан:
Помните, что ответственность за все действия, совершенные с использованием данной информации, лежит исключительно на вас.
Ни автор, ни компания Zenolab не несут ответственности за возможные последствия использования представленной информации. Каждый пользователь обязан:
- Внимательно изучить условия использования (Terms of Service) сервисов перед применением описанных методов
- Соблюдать законодательство своей страны в области информационных технологий
- Учитывать, что несанкционированный доступ к защищенным системам может являться противоправным действием
- Помнить, что чрезмерная нагрузка на серверы сторонних сервисов может быть расценена как DoS-атака
Помните, что ответственность за все действия, совершенные с использованием данной информации, лежит исключительно на вас.
Давайте начнём с того, что такое API. Реверс-инжиниринг API тесно связан с API, поэтому для начала необходимо понять, что это такое.
Что такое API простыми словами
API (Application Programming Interface) — это набор правил и инструментов, который позволяет разным программам общаться между собой. Его можно представить как "официанта" в ресторане:
- Вы (пользователь) не идете сами на кухню готовить
- Официант (API) принимает ваш заказ, передает его на кухню и приносит готовое блюдо
- Кухня (сервер) готовит блюдо по вашему заказу
- Когда вы используете приложение погоды на телефоне, оно обращается к API погодного сервиса, чтобы получить данные
- Когда вы платите картой через интернет-магазин, сайт использует API платежной системы
- Когда вы видите карту Google на каком-то сайте, этот сайт использует API Google Maps
Реверс-инженеринг API: простое руководство на примере duck.ai
Что такое реверс-инженеринг API простыми словами
Реверс-инженеринг API — это процесс изучения и анализа чужого API, чтобы понять, как оно работает, не имея доступа к официальной документации или исходному коду. Это как если бы вы хотели узнать, как официант в ресторане принимает заказы, но вместо того, чтобы спрашивать его напрямую:
- Вы наблюдаете за официантом
- Замечаете, какие слова он использует, принимая заказы
- Видите, какие записи он делает
- Отслеживаете, как он передает информацию на кухню
Зачем нам это нужно?
Рассмотрим сайт https://duck.ai/ — это сервис с чатом для доступа к нейросетям. Мы могли бы использовать браузер в ZennoPoster, вводить запросы и парсить ответы, но такой подход:
- Ресурсоёмкий (нужно загружать весь сайт)
- Медленный (много лишних запросов)
- Нестабильный (интерфейс может меняться)
Инструменты для реверс-инженеринга API
Для простого реверс-инженеринга API нам не нужно сложное ПО:
- Встроенный браузер ZennoPoster с мониторингом трафика
- Или обычный браузер с инструментами разработчика (DevTools, вкладка Network)
Шаг 1: Найти ключевой запрос
Начинаем с поиска запроса, который отправляет наш вопрос к нейросети и получает ответ. Открываем инструменты разработчика, отправляем тестовый вопрос и анализируем сетевой трафик.
Находим ключевой запрос:
POST https://duckduckgo.com/duckchat/v1/chat
В теле запроса видим JSON:
Тело POST запроса:
{
"model": "gpt-4o-mini",
"messages": [
{
"role": "user",
"content": "Привет"
}
]
}
Изучаем заголовки запроса и выделяем важные:
- User-Agent (почти всегда нужен)
- Accept: text/event-stream (указывает на стриминговый ответ)
- Content-Type: application/json (формат данных)
- Специфичные параметры: X-Vqd-4, x-vqd-hash-1 и x-xss-protection
Создаем в ZennoPoster действие с найденным запросом и пытаемся его отправить.
Получаем ошибку 418, что указывает на наличие проверки. Скорее всего, проблема в невалидных специфичных заголовков (X-Vqd-4, x-vqd-hash-1).
Шаг 4: Ищем источник специфичных заголовков
Теперь мы анализируем все запросы и ищем в каком запросе или запросах в ответ мы получаем нужные нам параметры.
Анализируем предыдущие запросы и находим:
GET https://duckduckgo.com/duckchat/v1/status
А в ответе получаем нужные нам:
- X-Vqd-4
- x-vqd-hash-1
- x-xss-protection
Экспериментальным путем определяем минимальный набор необходимых параметров:
Для запроса статуса (/duckchat/v1/status):
- User-Agent
- x-vqd-accept: 1
- Куки не требуются

Шаг 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. Поэтому мы можем просто генерировать его и передавать уже сгенерированное значение.Сохраняем результаты в переменные ZennoPoster.
Шаг 7: Формируем финальный запрос к чату
Для запроса к чату (/duckchat/v1/chat) нам нужны:
- User-Agent
- Accept: text/event-stream
- Content-Type: application/json
- X-Vqd-4 (значение из шага 6)
- x-vqd-hash-1 (значение из шага 6)
- Тело запроса с моделью и текстом вопроса
Шаг 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]
- Используем регулярное выражение
(?<="message":").*?(?=","created")
- Сохраняем все найденные фрагменты в список
- Объединяем список в единый текст
- Отправляем GET-запрос на https://duckduckgo.com/duckchat/v1/statusс заголовками:
- User-Agent
- x-vqd-accept: 1
- Извлекаем из ответа заголовки:
- X-Vqd-4
- x-vqd-hash-1
- Отправляем 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":"Ваш вопрос"}]}
- Обрабатываем стриминговый ответ, извлекая и объединяя все фрагменты сообщения.
Как справиться с частыми трудностями
Авторизация и токены
- JWT токены: Ищите запрос, который получает токен после авторизации. Обычно он имеет короткий срок жизни, поэтому вам нужно будет периодически его обновлять.
- Куки: Если сайт использует куки для авторизации, скопируйте их из браузера после входа в систему и добавьте в свои запросы.
- Делайте паузы между запросами (1-5 секунд)
- Используйте реалистичный User-Agent от настоящего браузера
- Если сайт блокирует ваш IP, попробуйте использовать прокси
- Ищите в запросах странные параметры или токены (часто с именами вроде "_csrf", "nonce", "hash")
- Проверьте, откуда они берутся (часто из предыдущих запросов или из HTML страницы)
- Попробуйте удалить параметр из запроса - если всё работает, он не нужен
- Попробуйте изменить значение параметра - если запрос перестал работать, параметр важен
- Попробуйте отправить запрос без авторизации - чтобы понять, нужна ли она вообще
- Вернитесь к началу и проследите всю цепочку запросов с самого входа на сайт
- Обратите внимание на JavaScript, который может генерировать или шифровать данные
- Попробуйте другой браузер или режим инкогнито - иногда проблема в кэшированных данных
- Делайте заметки о том, что работает, а что нет
- Меняйте только один параметр за раз
- Будьте готовы к тому, что API может измениться в любой момент
Заключение
Реверс-инженеринг API — это исследовательский процесс, требующий внимания к деталям и экспериментов. Основные шаги всегда одинаковы:
- Найти ключевой запрос
- Проанализировать его параметры и заголовки
- Понять, откуда берутся специфичные данные
- Определить минимальный набор необходимых параметров
- Автоматизировать весь процесс
Шаблон DDG_API
Помимо статьи, я также создал шаблон, который умеет работать с прокси. Для демонстрации его функциональности, он генерирует ответы на вопросы и выводит их в лог. Вы можете использовать его как пример или интегрировать в свои проекты — это не составит труда.
Шаблон поддерживает все 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
Вложения
-
25 КБ Просмотры: 21
Последнее редактирование: