Выгрузка полной статистики WB кабинета с обходом ошибки 429
Каждый, кто работал с API Wildberries, сталкивался с раздражающей ошибкой 429 — "Too Many Requests". Особенно остро эта проблема проявляется при попытке выгрузить полную статистику по рекламным кампаниям за длительный период. Так и случилось у моего клиента, который обратился ко мне с данным запросом.
Здесь я расскажу о комплексном решении, которое мы разработали для надежной выгрузки данных из рекламного кабинета WB с автоматическим обходом ограничений API. Система состоит из двух частей:
- Серверный компонент на Go, работающий на Dockhost
- Google Apps Script, интегрированный с Google Таблицами
Как работает серверная часть
Серверное приложение написано на Go и выполняет основную тяжелую работу по взаимодействию с API Wildberries. Вот ключевые особенности его архитектуры:
1. Умная система повторных запросов
Алгоритм использует экспоненциальную задержку между попытками, что значительно увеличивает шансы на успешное выполнение запроса после временных ограничений.
2. Пакетная обработка кампаний
Вместо последовательного обхода всех кампаний, система работает с ними пакетами по 50 штук, что оптимизирует нагрузку на API.
3. Сохранение промежуточного состояния
Чтобы не начинать выгрузку с начала при каждом сбое, система регулярно сохраняет прогресс в файл состояния:
Интеграция с Google Таблицами
Сервер сохраняет данные в CSV-файл, который затем загружается в Google Таблицы с помощью специального скрипта.
Как мы обходим ограничение 429
- Распределение запросов во времени — система автоматически делает паузы между запросами
- Ограничение скорости запросов — не более 40 запросов в минуту
- Парсинг заголовка Retry-After — если WB указывает, когда можно повторить запрос, система соблюдает это требование
- Кеширование данных — чтобы не запрашивать одни и те же данные повторно
func calculateRetryAfter(resp *http.Response) time.Duration {
if retryHeader := resp.Header.Get("Retry-After"); retryHeader != "" {
if seconds, err := strconv.Atoi(retryHeader); err == nil {
return time.Duration(seconds) * time.Second
}
}
return 30 * time.Second // Дефолтная пауза
}Практические советы по реализации
- Всегда обрабатывайте пустые ответы — иногда WB возвращает 200 OK с пустым телом
- Используйте контексты для таймаутов — это предотвратит зависание программы
- Логируйте все ошибки — это поможет в отладке
- Разделяйте код на модули — как в нашем случае: серверная часть + интеграция с таблицами
Заключение
Разработанная система успешно работает в продакшене, ежедневно выгружая статистику по сотням рекламных кампаний. Благодаря комплексному подходу к обработке ошибок 429, мы добились надежности выгрузки на уровне 99.9%.
Готов реализовать подобную автоматизацию под ваши задачи: от выгрузки данных с маркетплейсов до управления рекламой или складским учетом.
🤖 Автор: @offrmdm | Telegram-канал: БотоФабрика | GitHub: d1mk9 · GitHub
Разрабатываю чат-ботов на Golang и no-code платформах. Готов к сотрудничеству!