скрипт для сайта ozon выделяющий товары где предлагаемые баллы за отзыв выше цены

Aliex

Король флуда
Дней с нами
1.450
Розыгрыши
0
Сообщения
644
Репутация
10
Реакции
1.131
работает или на этой странице https://www.ozon.ru/highlight/bally-za-otzyv-1171518/ или где применен фильтр "баллы за отзывы"
JavaScript:
// ==UserScript==
// @name         Ozone Points for Reviews Filtering
// @namespace    http://tampermonkey.net/
// @version      2024.12.01
// @description  визуальное выделение товаров, где предлагаемые баллы за отзывы больше цены
// @author       k-dmitriy
// @match        https://www.ozon.ru/highlight/bally-za-otzyv-1171518/*
// @match        https://www.ozon.ru/*has_points_from_reviews=t*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=ozon.ru
// @require      https://cdnjs.cloudflare.com/ajax/libs/arrive/2.4.1/arrive.min.js
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    let discountPercent = 25; // стандартная 25% скидка озон за баллы, цена с этой скидкой будет показана в скобках перед основной ценою. поставить 0, чтобы не учитывать ее. можно выставить больше 25 (25+n), чтобы выделялись и товары с ценою на n% выше баллов за отзыв.
    let delta = 0; // мин. разница между предлагаемыми баллами и стоимостью. к примеру 150 - под этот фильтр попадут товары за которые начисляют 200 баллов и их стоимость меньше 50р. (с учетом 25% скидки за баллы, если не стоит 0 строкою выше). можно указать отрицательное число, выделятся товары где цена выше предлагаемых баллов на это значение.

    const queries = {
      couponContainer: 'div[class*="tile-root"]',
      priceContainer: 'span[class*="tsHeadline500Medium"]',
    };
    discountPercent /= 100;

// filtering function start
    let filtering = function (tthis) {
      const elemsContainer = tthis.innerText.split('\n');
      let points = Number(elemsContainer[0].replace(/\D/g, ''));
      let priceContainer = tthis.querySelector(queries.priceContainer);
      let price = Number(priceContainer.innerText.replace(/\D/g, ''));

      if ( points-delta < price-price*discountPercent ) {
          tthis.style.opacity = 0.20
      }

      priceContainer.textContent = '(' + (price-Math.floor(price*0.25)) + ') ' + priceContainer.textContent;

    }
// filtering function end

    let firstElemsContainer = document.querySelectorAll(queries.couponContainer);
    firstElemsContainer.forEach (elemContainer => {
        filtering(elemContainer);
    });
    document.arrive(queries.couponContainer, function () {
        filtering(this);
    });

})();
настройки в начале:
let discountPercent = 25; // стандартная 25% скидка озон за баллы, цена с этой скидкой будет показана в скобках перед основной ценою. поставить 0, чтобы не учитывать ее. можно выставить больше 25 (25+n), чтобы выделялись и товары с ценою на n% выше баллов за отзыв.
let delta = 0; // мин. разница между предлагаемыми баллами и стоимостью. к примеру 150 - под этот фильтр попадут товары за которые начисляют 200 баллов и их стоимость меньше 50р. (с учетом 25% скидки за баллы, если не стоит 0 строкою выше). можно указать отрицательное число, выделятся товары где цена выше предлагаемых баллов на это значение.
Screenshot (213).png
 
Последнее редактирование:
пусть будет тут
добавляет кнопочек
Untitled.png

JavaScript:
// ==UserScript==
// @name         Ozon wannaDiscount
// @namespace    http://tampermonkey.net/
// @version      2025.01.08
// @description  добавление кнопок 10% 15% 20% 25% 30% 35% и соотв. цен в форму запроса скидки
// @author       k-dmitriy
// @match        https://www.ozon.ru/product/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=ozon.ru
// @grant        none
// @require      https://cdnjs.cloudflare.com/ajax/libs/arrive/2.4.1/arrive.min.js
// ==/UserScript==

(function() {
    'use strict';

    // https://www.ozon.ru/api/entrypoint-api.bx/page/json/v2?url=%2Fmodal%2Fwanna-discount%3Fsku%3D1678475755%26page_changed%3Dtrue

    document.arrive('div[data-widget="wannaDiscount"]', {onceOnly: true}, function () {
        let price = this.querySelector('div[style*="price-strikethrough"]').innerText.split('\n');
        price = Number(price[1].replace(/\D/g, ''));
        let inpt = this.querySelector('input');
        let buttonContainer = this.querySelector('button').parentElement.parentElement.parentElement;
        let buttons = new Array();
        for (let i = 2; i <= 7; i++) {
            buttons.push(document.createElement('input'));
            buttons.at(-1).type = 'button'; buttons.at(-1).value = '-'+ i*5 +'%\n'+Math.floor(price*(1-i*5/100));
            buttons.at(-1).addEventListener('click', () => {
//                navigator.clipboard.writeText(Math.floor(price*(1-i*5/100)));
                inpt.dispatchEvent(new Event('input'));
                inpt.value = Math.floor(price*(1-i*5/100));
                inpt.focus();
                inpt.dispatchEvent(new Event('input'));
            });
            buttonContainer.append(buttons.at(-1));
        }
    });
})();