Объявления Avito

Токен активен API-ключи
Все объявления Avito
Нажмите «Загрузить» для получения объявлений
Режим:
Avito 0
Локальные 0
Синхронизировано 0
Цены обновлены 0
Деактивировано 0
Ошибки 0
АртикулНазваниеЦена AvitoЦена локальнаяОстаток
НазваниеЦена
АртикулНазваниеЦенаОстаток
АртикулНазваниеЦена AvitoЦена локальнаяРазницаДействие
АртикулНазваниеЦенаДействие
// ─── All Items Browser ──────────────────────────────────────── let _allItems = []; function esc(s){return String(s||'').replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"');} function loadAllItems() { const btn = document.getElementById('btnLoadItems'); btn.disabled = true; btn.innerHTML = 'Загружаем...'; document.getElementById('allItemsEmpty').classList.add('d-none'); fetch('/avito-items/all') .then(r => r.json()) .then(data => { btn.disabled = false; btn.innerHTML = 'Обновить'; if (!data.ok) { showToastAI('Ошибка: ' + (data.error||''), 'danger'); return; } _allItems = data.items || []; document.getElementById('allItemsInfo').textContent = 'Загружено: ' + _allItems.length + ' объявлений'; document.getElementById('allItemsInfo').classList.remove('d-none'); renderItems(_allItems); }) .catch(e => { btn.disabled = false; btn.innerHTML = 'Загрузить'; showToastAI('Ошибка загрузки: ' + e, 'danger'); }); } function filterItems() { const q = document.getElementById('itemSearch').value.toLowerCase(); renderItems(q ? _allItems.filter(i => (i.title||'').toLowerCase().includes(q)) : _allItems); } function renderItems(items) { const grid = document.getElementById('allItemsGrid'); const empty = document.getElementById('allItemsEmpty'); if (!items || items.length === 0) { grid.innerHTML = ''; empty.classList.remove('d-none'); return; } empty.classList.add('d-none'); grid.innerHTML = items.map(item => { const price = typeof item.price === 'number' ? item.price.toLocaleString('ru') + ' ₽' : (item.price||'Нет цены'); const imgs = item.images || []; const imgUrl = imgs.length ? (imgs[0].url||imgs[0]||'') : ''; const imgHtml = imgUrl ? '' : '
'; const url = item.url ? 'https://www.avito.ru'+item.url : ''; const itemJson = esc(JSON.stringify(item)); return '
' + imgHtml + '
' + '
'+esc(item.title||'—')+'
' + '
'+price+'
' + '
' + '' + '' + (url ? '' : '') + '
'; }).join(''); } function openEditModal(item) { document.getElementById('editItemId').value = item.id; document.getElementById('editTitle').value = item.title || ''; document.getElementById('editPrice').value = typeof item.price === 'number' ? item.price : ''; const url = item.url ? 'https://www.avito.ru'+item.url : '#'; document.getElementById('editOpenAvito').href = url; document.getElementById('editResult').classList.add('d-none'); new bootstrap.Modal(document.getElementById('editItemModal')).show(); } function saveItemPrice() { const itemId = document.getElementById('editItemId').value; const price = parseFloat(document.getElementById('editPrice').value); const resultEl = document.getElementById('editResult'); if (!itemId || isNaN(price)) { resultEl.className = 'alert alert-danger'; resultEl.textContent = 'Введите корректную цену'; resultEl.classList.remove('d-none'); return; } fetch('/avito-items/update-price', {method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify({item_id:itemId, price:price})}) .then(r => r.json()).then(data => { resultEl.className = 'alert ' + (data.ok ? 'alert-success' : 'alert-danger'); resultEl.textContent = data.ok ? 'Цена обновлена!' : ('Ошибка: '+(data.error||'')); resultEl.classList.remove('d-none'); if (data.ok) { const it = _allItems.find(i => String(i.id)===String(itemId)); if(it){it.price=price; renderItems(_allItems);} } }); } function duplicateItem(itemId, title) { if (!confirm('Дублировать объявление "' + title + '"?')) return; showToastAI('Создаём копию объявления...', 'info'); fetch('/avito-items/duplicate', {method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify({item_id:itemId})}) .then(r => r.json()).then(data => { showToastAI(data.ok ? 'Объявление дублировано!' : 'Ошибка: '+(data.error||''), data.ok ? 'success' : 'danger'); }); } function showToastAI(msg, type) { let c = document.getElementById('toastContainerAI'); if (!c) { c = document.createElement('div'); c.id = 'toastContainerAI'; c.style.cssText = 'position:fixed;top:16px;right:16px;z-index:9999;display:flex;flex-direction:column;gap:8px'; document.body.appendChild(c); } const t = document.createElement('div'); t.className = 'toast align-items-center text-bg-'+type+' border-0 show'; t.innerHTML = '
'+esc(msg)+'
'; c.appendChild(t); setTimeout(() => t.remove(), 4000); } document.addEventListener('DOMContentLoaded', () => loadAllItems());