Разработка бота для автоматической обработки отзывов на маркетплейсах

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.
Разработка и обслуживание любых видов сайтов:
Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Разработка бота для автоматической обработки отзывов на маркетплейсах
Средняя
~3-5 рабочих дней
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1240
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1167
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    867
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1084
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    829
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    846

Разработка бота для автоматической обработки отзывов на маркетплейсах

Маркетплейсы — Ozon, Wildberries, Яндекс.Маркет — требуют оперативных ответов на отзывы. Платформы учитывают процент отвеченных отзывов при ранжировании карточек. Ручная обработка при сотнях отзывов в месяц — это потеря времени и постоянные просрочки. Бот автоматизирует три задачи: получение новых отзывов, генерацию ответов, публикацию через API.

Архитектура

Cron → API Polling → New Review Queue → Auto-Response Engine → Publish API
                                    ↓
                              Low-Score Alert → Human Queue

Логика: отзывы с рейтингом 4–5 обрабатываются автоматически. Отзывы с рейтингом 1–3 уходят в очередь для ручного ответа с уведомлением в Telegram.

Интеграция с Ozon API

class OzonReviewApiClient
{
    private string $clientId;
    private string $apiKey;
    private string $baseUrl = 'https://api-seller.ozon.ru';

    public function getUnprocessedReviews(): array
    {
        $response = Http::withHeaders([
            'Client-Id'   => $this->clientId,
            'Api-Key'     => $this->apiKey,
            'Content-Type' => 'application/json',
        ])->post("{$this->baseUrl}/v1/review/list", [
            'processed' => false,
            'with_text' => true,
            'page'      => 1,
            'page_size' => 100,
        ]);

        return $response->json('result.reviews', []);
    }

    public function replyToReview(string $reviewId, string $text): bool
    {
        $response = Http::withHeaders([
            'Client-Id'    => $this->clientId,
            'Api-Key'      => $this->apiKey,
            'Content-Type' => 'application/json',
        ])->post("{$this->baseUrl}/v1/review/comment/create", [
            'review_id' => $reviewId,
            'text'      => $text,
        ]);

        return $response->successful();
    }
}

Генератор ответов

Ответы генерируются из шаблонов с персонализацией или через GPT для уникальности.

Шаблонный подход:

class TemplateResponseGenerator
{
    private array $positiveTemplates = [
        "Спасибо за отзыв, {author}! Рады, что {product_short} вам понравился. Будем рады видеть вас снова!",
        "{author}, благодарим за оценку! Приятно слышать положительные слова о {product_short}.",
        "Спасибо, {author}! Ваш отзыв очень важен для нас. Желаем приятного использования {product_short}!",
    ];

    private array $neutralTemplates = [
        "Спасибо за отзыв, {author}. Если у вас возникнут вопросы по {product_short} — обращайтесь в нашу поддержку.",
    ];

    public function generate(ReviewDTO $review): string
    {
        $templates = $review->rating >= 4
            ? $this->positiveTemplates
            : $this->neutralTemplates;

        $template = $templates[array_rand($templates)];

        return str_replace(
            ['{author}', '{product_short}'],
            [$review->author, $this->shortProductName($review->productName)],
            $template,
        );
    }
}

GPT-подход для качественных уникальных ответов:

class GptResponseGenerator
{
    public function generate(ReviewDTO $review): string
    {
        $response = $this->openai->chat()->create([
            'model'    => 'gpt-4o-mini',
            'messages' => [
                [
                    'role'    => 'system',
                    'content' => implode("\n", [
                        'Ты — специалист поддержки интернет-магазина. Пишешь ответ на отзыв покупателя.',
                        'Требования: 1–3 предложения. Без канцелярита. Называй покупателя по имени если оно есть.',
                        'Если плюсы — поблагодари. Нейтральный — поблагодари и предложи помощь.',
                        'Никаких обещаний скидок и конкретных дат.',
                    ]),
                ],
                [
                    'role'    => 'user',
                    'content' => "Товар: {$review->productName}\nРейтинг: {$review->rating}/5\nАвтор: {$review->author}\nОтзыв: {$review->text}",
                ],
            ],
            'max_tokens'  => 150,
            'temperature' => 0.8,
        ]);

        return $response->choices[0]->message->content;
    }
}

Job обработки отзыва

class ProcessMarketplaceReviewJob implements ShouldQueue
{
    public int $tries = 3;

    public function handle(
        TemplateResponseGenerator $templateGen,
        GptResponseGenerator      $gptGen,
        ReviewPublisher           $publisher,
        ReviewAlertService        $alerts,
    ): void {
        $review = $this->review;

        if ($review->rating <= 3) {
            // Уведомить команду — ответ нужен вручную
            $alerts->urgentReviewAlert($review);
            return;
        }

        // Выбор генератора
        $text = config('reviews.use_gpt')
            ? $gptGen->generate($review)
            : $templateGen->generate($review);

        // Публикация через API маркетплейса
        $success = $publisher->publish($review->platform, $review->externalId, $text);

        if (!$success) {
            throw new \RuntimeException("Failed to publish reply to {$review->platform}");
        }

        // Запись ответа в БД
        Review::where('external_id', $review->externalId)
            ->update([
                'reply_text'       => $text,
                'reply_published_at' => now(),
                'is_processed'     => true,
            ]);
    }
}

Wildberries API

class WildberriesReviewApiClient
{
    private string $apiKey;
    private string $baseUrl = 'https://feedbacks-api.wildberries.ru';

    public function getFeedbacks(bool $onlyNew = true): array
    {
        $response = Http::withToken($this->apiKey)
            ->get("{$this->baseUrl}/api/v1/feedbacks", [
                'isAnswered' => $onlyNew ? 'false' : 'true',
                'take'       => 100,
                'skip'       => 0,
            ]);

        return $response->json('data.feedbacks', []);
    }

    public function replyToFeedback(string $id, string $text): bool
    {
        $response = Http::withToken($this->apiKey)
            ->patch("{$this->baseUrl}/api/v1/feedbacks", [
                'id'   => $id,
                'text' => $text,
            ]);

        return $response->successful();
    }
}

Контроль качества ответов

До публикации ответ проходит валидацию:

class ReplyValidator
{
    public function validate(string $reply): ValidationResult
    {
        $errors = [];

        if (mb_strlen($reply) < 20) {
            $errors[] = 'Слишком короткий ответ';
        }

        if (mb_strlen($reply) > 1000) {
            $errors[] = 'Превышен лимит символов';
        }

        // Маркетплейсы запрещают упоминание конкурентов и внешних ссылок
        if (preg_match('/https?:\/\//i', $reply)) {
            $errors[] = 'Ссылки в ответах запрещены';
        }

        $forbidden = ['wildberries', 'ozon', 'яндекс', 'aliexpress'];
        foreach ($forbidden as $word) {
            if (mb_stripos($reply, $word) !== false) {
                $errors[] = "Упоминание конкурента: {$word}";
            }
        }

        return new ValidationResult(errors: $errors);
    }
}

Метрики эффективности

Метрика Целевое значение
Процент обработанных отзывов > 95% в течение 24 часов
Доля автоответов (рейтинг 4–5) 70–80% от всех отзывов
Среднее время ответа < 2 часов
Ошибки публикации < 1%

Расписание

// Проверка новых отзывов каждые 30 минут
$schedule->command('reviews:marketplace:poll')->everyThirtyMinutes();

// Еженедельный отчёт по статистике ответов
$schedule->job(new MarketplaceReviewsWeeklyReportJob)->weekly()->mondays()->at('09:00');

Сроки реализации

  • Ozon API клиент + шаблонный генератор: 1 день
  • Wildberries + Яндекс.Маркет API: +1 день
  • GPT-генератор + валидатор: 1 день
  • Job-система + очередь ручных ответов: 0.5 дня
  • Telegram-уведомления + метрики: 0.5 дня

Итого: 3–4 рабочих дня.