trueler5
Любитель трепать не по делу
Наверное не надо больше бусины с этого магаза*** Скрытый текст не может быть процитирован. ***
Кто хотел уже взял, да и самому в магазине найти можно, он прогружен.
Наверное не надо больше бусины с этого магаза*** Скрытый текст не может быть процитирован. ***
догружаютсяНаверное не надо больше бусины с этого магаза
Кто хотел уже взял, да и самому в магазине найти можно, он прогружен.
Ох, это круто! Уверена, всё будет хорошо)Не пугай меня, у меня послезавтра 14000![]()
а как автоматизирвоал фотографии?сколько вообще времени на отзывы тратите?
вроде удобно все настроил за час 132 вышло
старый телефон повесил над столом камерой вниз, через стандартное приложение камеры на винде фоткаюа как автоматизирвоал фотографии?
Вот и мне тоже, я на них смотреть уже не могу)Мне эти бусины в страшных снах будут сниться. Всё я спать, уже почти 7 утра
скрипт же выкладывали который отметку куплено ставит на все товары в бзо и к нему второй, которой собирает артикулы на оставленные отзывыЕсть два товара, с одинаковым названием и картинкой, но разными артикулами. Один в бзо, второй нет. Как понять какой отменять?
// ==UserScript==
// @name Ozon Сбор всех SKU оцененных покупок
// @namespace http://tampermonkey.net/
// @version 1.0
// @description Сбор SKU со всех страниц отзывов Ozon (кроме /promo)
// @author MFG
// @match https://www.ozon.ru/my/reviews
// @match https://www.ozon.ru/my/reviews?*
// @exclude https://www.ozon.ru/my/reviews/promo
// @exclude https://www.ozon.ru/my/reviews/promo?*
// @grant none
// ==/UserScript==
(function() {
'use strict';
const MIN_DELAY = 3000;
const MAX_DELAY = 6000;
const STORAGE_KEY = 'ozon_sku_data';
const STATE_KEY = 'ozon_collector_state';
let allSKUs = new Set();
const saved = localStorage.getItem(STORAGE_KEY);
if (saved) allSKUs = new Set(JSON.parse(saved));
let emptyPageCount = 0;
let lastProcessedPage = 0;
let isCollectorRunning = false;
const savedState = localStorage.getItem(STATE_KEY);
if (savedState) {
try {
const state = JSON.parse(savedState);
emptyPageCount = state.emptyPageCount || 0;
lastProcessedPage = state.lastProcessedPage || 0;
isCollectorRunning = state.isRunning || false;
} catch (e) {}
}
const urlParams = new URLSearchParams(window.location.search);
const currentPage = parseInt(urlParams.get('page')) || 1;
const panel = document.createElement('div');
panel.style.cssText = `
position: fixed;
top: 10px;
right: 10px;
background: white;
border: 2px solid #005BFF;
border-radius: 8px;
padding: 15px;
z-index: 99999;
font-family: Arial, sans-serif;
font-size: 13px;
box-shadow: 0 2px 10px rgba(0,0,0,0.2);
min-width: 280px;
`;
panel.innerHTML = `
<div style="font-weight:bold; margin-bottom:10px; color:#005BFF; font-size:16px;">📦 Сборщик SKU</div>
<div style="margin-bottom:5px;">📊 Собрано: <span id="skuCount" style="font-weight:bold; color:#005BFF;">${allSKUs.size}</span></div>
<div style="margin-bottom:5px;">📄 Текущая страница: ${currentPage}</div>
<div style="margin-bottom:5px;">📉 Пустых подряд: <span id="emptyCount" style="font-weight:bold; color:#dc3545;">${emptyPageCount}</span>/2</div>
<div style="margin-bottom:10px;" id="skuOnPage">🔍 SKU на стр: 0</div>
<div style="display:flex; gap:5px; margin-bottom:5px;">
<button id="startBtn" style="flex:1; padding:8px; background:#005BFF; color:white; border:none; border-radius:4px; cursor:pointer;" ${isCollectorRunning ? 'disabled' : ''}>▶ Старт</button>
<button id="stopBtn" style="flex:1; padding:8px; background:#dc3545; color:white; border:none; border-radius:4px; cursor:pointer;" ${!isCollectorRunning ? 'disabled' : ''}>⏹ Стоп</button>
</div>
<button id="copyBtn" style="width:100%; padding:8px; background:#28a745; color:white; border:none; border-radius:4px; cursor:pointer; margin-bottom:5px;">📋 Копировать все SKU</button>
<button id="resetDataBtn" style="width:100%; padding:8px; background:#dc3545; color:white; border:none; border-radius:4px; cursor:pointer; margin-bottom:5px;">🗑 Сброс данных (очистить все SKU)</button>
<div id="status" style="margin-top:10px; padding:8px; background:#f8f9fa; border-radius:4px; min-height:20px; font-size:12px; color:#666;"></div>
`;
document.body.appendChild(panel);
function hasRealReviews() {
const reviewBlocks = document.querySelectorAll('.q2l_28, [data-review-uuid]');
if (reviewBlocks.length > 0) return true;
const links = document.querySelectorAll('a[href*="/product/"]');
let realProductLinks = 0;
links.forEach(link => {
const href = link.href;
if (href.includes('/compare')) return;
const match = href.match(/(\d+)\/?$/);
if (match && match[1]) {
const isInContent = link.closest('main, .content, .container, .q2l_28') !== null;
if (isInContent) realProductLinks++;
}
});
return realProductLinks > 0;
}
function collectSKU() {
const reviewBlocks = document.querySelectorAll('.q2l_28, [data-review-uuid]');
const pageSKUs = [];
reviewBlocks.forEach(block => {
const links = block.querySelectorAll('a[href*="/product/"]');
links.forEach(link => {
const match = link.href.match(/(\d+)\/?$/);
if (match && match[1]) pageSKUs.push(match[1]);
});
});
let newCount = 0;
pageSKUs.forEach(sku => {
if (!allSKUs.has(sku)) {
allSKUs.add(sku);
newCount++;
}
});
document.getElementById('skuOnPage').textContent = `🔍 SKU на стр: ${pageSKUs.length}`;
if (newCount > 0) {
localStorage.setItem(STORAGE_KEY, JSON.stringify(Array.from(allSKUs)));
document.getElementById('skuCount').textContent = allSKUs.size;
}
return { totalOnPage: pageSKUs.length, newOnPage: newCount };
}
function saveState(isRunning) {
const state = {
emptyPageCount: emptyPageCount,
lastProcessedPage: currentPage,
isRunning: isRunning
};
localStorage.setItem(STATE_KEY, JSON.stringify(state));
document.getElementById('emptyCount').textContent = emptyPageCount;
}
function getRandomDelay() {
return Math.floor(Math.random() * (MAX_DELAY - MIN_DELAY + 1)) + MIN_DELAY;
}
function setStatus(text) {
document.getElementById('status').textContent = text;
}
function startCollecting() {
if (emptyPageCount >= 2) {
setStatus('⛔ Достигнут лимит пустых страниц');
return;
}
isCollectorRunning = true;
saveState(true);
document.getElementById('startBtn').disabled = true;
document.getElementById('stopBtn').disabled = false;
setStatus(`🚀 Страница ${currentPage}...`);
setTimeout(() => {
if (!hasRealReviews()) {
emptyPageCount++;
setStatus(`⚠️ Пусто (${emptyPageCount}/2)`);
saveState(true);
if (emptyPageCount >= 2) {
setStatus(`⛔ Остановлено: 2 пустые страницы подряд`);
stopCollecting();
return;
}
} else {
const result = collectSKU();
setStatus(`✅ +${result.newOnPage} новых`);
emptyPageCount = 0;
saveState(true);
}
const nextPage = currentPage + 1;
const delay = getRandomDelay();
setStatus(`⏳ ${Math.round(delay/1000)}с → стр.${nextPage}`);
setTimeout(() => {
if (isCollectorRunning) {
window.location.href = `/my/reviews?page=${nextPage}`;
}
}, delay);
}, 2000);
}
function stopCollecting() {
isCollectorRunning = false;
saveState(false);
document.getElementById('startBtn').disabled = false;
document.getElementById('stopBtn').disabled = true;
setStatus('⏸ Остановлено');
}
function resetAllData() {
if (confirm('Очистить все собранные SKU? Это действие нельзя отменить.')) {
allSKUs.clear();
emptyPageCount = 0;
localStorage.removeItem(STORAGE_KEY);
saveState(isCollectorRunning);
document.getElementById('skuCount').textContent = '0';
document.getElementById('skuOnPage').textContent = '🔍 SKU на стр: 0';
setStatus('🗑 Все данные очищены');
}
}
document.getElementById('startBtn').onclick = startCollecting;
document.getElementById('stopBtn').onclick = stopCollecting;
document.getElementById('resetDataBtn').onclick = resetAllData;
document.getElementById('copyBtn').onclick = () => {
const list = Array.from(allSKUs).sort((a, b) => a - b).join('\n');
navigator.clipboard.writeText(list);
setStatus(`✅ Скопировано ${allSKUs.size} SKU`);
};
if (isCollectorRunning && currentPage > lastProcessedPage) {
setTimeout(startCollecting, 3000);
}
setTimeout(() => {
collectSKU();
document.getElementById('emptyCount').textContent = emptyPageCount;
if (emptyPageCount > 0) {
setStatus(`ℹ️ Предыдущий запуск: ${emptyPageCount} пустых страниц`);
}
}, 2000);
})();
Молодец прочитал историю а выводы сделал?За бусы голландцы купили Манхэттен. А папуасов просто истребляли.