Дашборд
Обзор статистики отзывов
Всего отзывов
💬
Без ответа
С ответом
Средний рейтинг
Распределение оценок
Загружаем статистику…
Загружаем отзывы…

Код для вставки на сайт

Скопируйте этот код и вставьте в HTML-блок Яндекс Кит. Виджет автоматически загрузит отзывы с этого сервера.

Инструкция

  1. Убедитесь, что сервер доступен из интернета (настройте домен или IP)
  2. В Яндекс Кит добавьте блок «HTML-код»
  3. Вставьте скопированный код в блок
  4. Сохраните и опубликуйте сайт

API Wildberries

Где взять: Личный кабинет WB → Настройки → Доступ к API → создайте токен с правом «Отзывы»

Авто-ответы

Включить авто-ответы
Автоматически отвечать на новые отзывы
`; document.getElementById('embed-code').textContent = code; } function copyEmbed() { const text = document.getElementById('embed-code').textContent; navigator.clipboard.writeText(text).then(() => toast('Скопировано!', 'ok')); } // ── SETTINGS ── async function loadSettings() { try { const data = await api('/api/settings'); document.getElementById('inp-token').placeholder = data.token || 'eyJhbGciOiJIUzI1NiIs...'; document.getElementById('inp-template').value = data.autoReplyTemplate || ''; autoReplyOn = data.autoReply; template = data.autoReplyTemplate || ''; const tog = document.getElementById('toggle-auto'); if (autoReplyOn) tog.classList.add('on'); else tog.classList.remove('on'); } catch(e) {} } function toggleAuto() { autoReplyOn = !autoReplyOn; const tog = document.getElementById('toggle-auto'); if (autoReplyOn) tog.classList.add('on'); else tog.classList.remove('on'); } async function checkToken() { const token = document.getElementById('inp-token').value.trim(); if (!token) return toast('Введите токен', 'err'); const st = document.getElementById('token-status'); st.innerHTML = 'Проверяем…'; try { const data = await api('/api/check-token', {method:'POST', body:JSON.stringify({token})}); if (data.ok) { st.innerHTML = '✓ Токен действителен'; await api('/api/settings', {method:'POST', body:JSON.stringify({token})}); } else { st.innerHTML = '✗ '+data.error+''; } } catch(e) { st.innerHTML = '✗ '+e.message+''; } } async function saveSettings() { const payload = { autoReply: autoReplyOn, autoReplyTemplate: document.getElementById('inp-template').value.trim(), }; const token = document.getElementById('inp-token').value.trim(); if (token) payload.token = token; try { await api('/api/settings', {method:'POST', body:JSON.stringify(payload)}); template = payload.autoReplyTemplate; document.getElementById('save-status').textContent = '✓ Настройки сохранены'; setTimeout(() => document.getElementById('save-status').textContent = '', 2500); toast('Настройки сохранены', 'ok'); } catch(e) { toast('Ошибка: '+e.message, 'err'); } } // ── PHOTO MODAL ── function openPhoto(src) { document.getElementById('modal-img2').src = src; document.getElementById('photo-modal').classList.add('open'); } document.querySelectorAll('.modal-overlay').forEach(m => m.addEventListener('click', function(e){ if(e.target===this) this.classList.remove('open'); })); // ── UTILS ── async function api(url, opts={}) { const res = await fetch(url, { headers: {'Content-Type':'application/json'}, ...opts, }); const data = await res.json(); if (!res.ok || data.ok === false) throw new Error(data.error || 'Ошибка'); return data; } function toast(msg, type='') { const el = document.getElementById('toast'); el.textContent = msg; el.className = 'toast show '+(type||''); clearTimeout(el._t); el._t = setTimeout(() => el.classList.remove('show'), 3000); } // ── INIT ── const savedToken = ''; if (savedToken) loadStats();