Ozon.ru - общая тема #2

  • Автор темы Автор темы Tysha
  • Дата начала Дата начала
Статус
В этой теме нельзя размещать новые ответы.
Наверное не надо больше бусины с этого магаза 😅
Кто хотел уже взял, да и самому в магазине найти можно, он прогружен.
догружаются

Скрытое содержимое доступно для зарегистрированных пользователей!


Скрытое содержимое доступно для зарегистрированных пользователей!
 
  • Like +1
Реакции: pipka347
Скрытое содержимое доступно для зарегистрированных пользователей!
 
сколько вообще времени на отзывы тратите?
вроде удобно все настроил за час 132 вышло
1774655584122.webp
 
  • Wow
  • Like +1
Реакции: Irina.Mgt и ksu25
Не засекала, я обычно заранее всё пишу подходами) Моменталки по таймеру
 
А днём бывает так много бзо? Я обычно с полуночи до 3 ночи сижу. Днем редко захожу, только когда есть время
 
Мне кажется эта акция от Озон скоро победит мою тягу к шопоголизму. Хочется хоть один день от всего этого отдохнуть, а заказы всё приходят и приходят, уже стала меньше заказывать, а они всё идут 😅
 
На этих бусинах недельное голодание закрыл, а они всё добавляются🤣 ну нафиг, спать надо🤣
 
  • Haha
Реакции: ksu25
Китайцы покупают лаоваев за бусы почти как англичане папуасов, чем это для папуасов закончилось все знают
 
Эт что за новая форма бана? В магазине товары есть, кидаю в корзину - там пишет "закончились". Возвращаюсь в магазин, там они снова в наличии🫣 точно надо спать
 
Есть два товара, с одинаковым названием и картинкой, но разными артикулами. Один в бзо, второй нет. Как понять какой отменять?
скрипт же выкладывали который отметку куплено ставит на все товары в бзо и к нему второй, которой собирает артикулы на оставленные отзывы




Второй скрипт по сбору артикулов по отзывам. Что-то не нашел пост кто и когда выкладывал, скопировал из обезьяны. он там список выдаст как все отзывы прогонит, и потом его в первый вручную вкинуть и можно выключить его
Код:
// ==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);
})();
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.