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

  • Автор темы Автор темы Tysha
  • Дата начала Дата начала
Статус
В этой теме нельзя размещать новые ответы.
У меня какая то шляпа с модерацией. Сейчас полез докинуть фотки в отложки, за которые должны капнуть баллы завтра. После добавления фоток, виснут на модерации. Вот не знаю, есть смысл трогать оставшиеся. Или еще хуже себе сделаю и даже за текст не начислят. Я так понимаю, если на момент отсечки отзыв на модерации, то баллов не будет. Да, и этот акк был в бане в январе.
 
  • Думаю
  • Wow
Реакции: pipka347 и MFG
У меня какая то шляпа с модерацией. Сейчас полез докинуть фотки в отложки, за которые должны капнуть баллы завтра. После добавления фоток, виснут на модерации. Вот не знаю, есть смысл трогать оставшиеся. Или еще хуже себе сделаю и даже за текст не начислят. Я так понимаю, если на момент отсечки отзыв на модерации, то баллов не будет. Да, и этот акк был в бане в январе.
Сегодня так один застрял на несколько часов, удалять уже поздно. Убираю фото - модерацию проходит. Сделала видео и прошло наконец.
 
  • Like +1
Реакции: MFG, Garryson79 и pipka347
Сегодня так один застрял на несколько часов, удалять уже поздно. Убираю фото - модерацию проходит. Сделала видео и прошло наконец.
Это уже опубликованный ранее редактировался? Или свежий не проходил?
 
Ага. Попробуй на одном с видео.
Да, с видео прошел модерацию. Минут за 15. Пришлось снимать чужое с экрана)
Под рукой этого барахла нет уже. На зависшем фотку удалил, он опубликовался заново.
Засада, конечно. На остальные карточки и переснять неоткуда. Тыкнулся сейчас, а они удалены уже. Точнее "товар закончился", ну и отзывов в карточке нет.
 
  • Like +1
Реакции: pipka347 и Зимняя
А если я после публикации моменталок и начисления баллов, спустя час опубликовал отзывы без бзо (надоели висеть) , моменталки соответственно тоже сдвинулись?
 
может есчо ссылку на скрипт, который за тебя покупает скинуть? =)
этот?
JavaScript:
// ==UserScript==
// @name         ozon-wait-and-order
// @namespace    http://ozon.ru
// @version      0.2
// @description  wait for discount and order
// @author       br4instormer
// @homepageURL  https://gist.github.com/br4instormer/24b029f34d00359bb4c0adec62dd5bb9
// @match        https://www.ozon.ru/product/*
// @match        https://www.ozon.ru/cart*
// @match        https://www.ozon.ru/gocheckout*
// @icon         https://www.ozon.ru/public/favicon.ico
// @grant        none
// ==/UserScript==

(function () {
  "use strict";

  const LOCAL_STORAGE_OPTIONS_KEY = "0rderOptions";
  const CLAIM_BUTTON_SELECTOR = "div[text='Перейти к оформлению'] > button";
  const ORDER_BUTTON_SELECTOR = "div[text='Оплатить онлайн'] > button";
  const DATA_CONTAINER_SELECTOR = "div[id^='state-webPrice']";
  const PRICE_CONTAINER_SELECTOR = "div[data-widget='webPrice']";
  const ADD_TO_CART_BUTTON_SELECTOR = "div[data-widget='webAddToCart'] button";
  const GO_TO_CART_BUTTON_SELECTOR =
    "div[data-widget='webAddToCart'] button:has(> span > span > span)";
  const WAIT_TIMEOUT = 500; // интервал между обновлениями карточки товара
  const SLEEP_TIMEOUT = 200; // интервал ожидания появления селектора (технический)
  const SPAM_ORDER_BUTTON_TIMEOUT = 200; // интервал между нажатиями при спаме кнопки оплаты (технический)
  const SPAM_ORDER_BUTTON_TIME = 1000 * 15; // время в течение которого идёт спам кнопки оплаты

  const getProductId = () => window.location.pathname.match(/(\d+)\/$/)[1];
  const sleep = (timeout) =>
    new Promise((resolve) => setTimeout(resolve, timeout));
  const parsePrice = (price) =>
    Number.parseInt(price.trim().replace(/[^\d]/g, ""));

  const defaultOptions = {
    watch: false,
    price: 0,
    productId: undefined,
  };

  const Reload = {
    timeoutId: undefined,
    start() {
      if (this.timeoutId) {
        this.stop();
      }

      this.timeoutId = setTimeout(reload, WAIT_TIMEOUT);
    },
    stop() {
      clearTimeout(this.timeoutId);

      this.timeoutId = undefined;
    },
  };

  const optionsRaw = sessionStorage.getItem(LOCAL_STORAGE_OPTIONS_KEY);
  const options = optionsRaw ? JSON.parse(optionsRaw) : { ...defaultOptions };
  const stage = Stage(window.location.pathname);

  async function addToCart(options) {
    const { watch, productId: watchProductId, price: oldPrice } = options;
    const currentProductId = getProductId();
    const currentPrice = getCurrentPrice();
    const isSameProduct = watchProductId === currentProductId;
    const isWatchingSameProduct = watch && isSameProduct;

    waitForSelector(PRICE_CONTAINER_SELECTOR)
      .then(() => insertCheckbox(isWatchingSameProduct));

    if (!watch) {
      console.warn(`Наблюдение не проводится`);

      return;
    }

    if (watchProductId && !isSameProduct) {
      console.warn(`Наблюдение не за этим товаром`);

      return;
    }

    if (currentPrice >= oldPrice) {
      console.warn(
        `Товар не стал дешевле. Ожидание и обновление страницы через ${WAIT_TIMEOUT}мс`,
      );

      return Reload.start();
    }

    console.warn(`Обнаружена цена со скидкой. Заказ товара`);

    await waitForSelector(ADD_TO_CART_BUTTON_SELECTOR);
    document.querySelector(ADD_TO_CART_BUTTON_SELECTOR).click();

    await waitForSelector(GO_TO_CART_BUTTON_SELECTOR);
    await clickSelectorUntil(
      GO_TO_CART_BUTTON_SELECTOR,
      SPAM_ORDER_BUTTON_TIME,
      SPAM_ORDER_BUTTON_TIMEOUT,
    );
  }

  async function claimOrder({ watch }) {
    const selector = CLAIM_BUTTON_SELECTOR;

    if (!watch) {
      return;
    }

    await clickSelectorUntil(
      selector,
      SPAM_ORDER_BUTTON_TIME,
      SPAM_ORDER_BUTTON_TIMEOUT,
    );
  }

  async function order({ watch }) {
    const selector = ORDER_BUTTON_SELECTOR;

    if (!watch) {
      return;
    }

    disable();
    await clickSelectorUntil(
      selector,
      SPAM_ORDER_BUTTON_TIME,
      SPAM_ORDER_BUTTON_TIMEOUT,
    );
  }

  async function clickSelectorUntil(selector, dueTime, timeout) {
    const Spam = { continue: true };

    await Promise.allSettled([
      sleep(dueTime).then(() => (Spam.continue = false)),
      (async () => {
        while (Spam.continue) {
          try {
            document.querySelector(selector).click();
          } catch (e) {}

          await sleep(timeout);
        }
      })(),
    ]);
  }

  async function waitForSelector(selector) {
    let repeat = false;

    do {
      repeat = document.querySelector(selector) === null;

      await sleep(SLEEP_TIMEOUT);
    } while (repeat);
  }

  function Stage(path) {
    if (path.startsWith(`/product/`)) {
      return addToCart;
    }

    if (path.startsWith(`/cart`)) {
      return claimOrder;
    }

    if (path.startsWith(`/gocheckout`)) {
      return order;
    }

    throw new Error(`No hadler for this operaion`);
  }

  function reload() {
    window.location.reload();
  }

  function toggleWatching(event) {
    const isChecked = event.target.checked;

    if (isChecked) {
      enable({
        watch: true,
        price: getCurrentPrice(),
        productId: getProductId(),
      });
      Reload.start();
      console.warn(`Наблюдение включено`);
    } else {
      disable();
      Reload.stop();
      console.warn(`Наблюдение отключено`);
    }
  }

  function enable(options) {
    sessionStorage.setItem(LOCAL_STORAGE_OPTIONS_KEY, JSON.stringify(options));
  }

  function disable() {
    sessionStorage.removeItem(LOCAL_STORAGE_OPTIONS_KEY);
  }

  function insertCheckbox(isChecked) {
    const checkboxElement = document.createElement("INPUT");
    const labelElement = document.createElement("LABEL");
    const containerElement = document.querySelector(PRICE_CONTAINER_SELECTOR);

    checkboxElement.type = "checkbox";
    checkboxElement.id = "watch-price";
    checkboxElement.onclick = toggleWatching;
    labelElement.setAttribute("for", "watch-price");
    labelElement.innerText = "Следить за ценой";

    if (isChecked) {
      checkboxElement.setAttribute("checked", "");
    }

    containerElement.insertAdjacentElement("afterend", labelElement);
    containerElement.insertAdjacentElement("afterend", checkboxElement);
  }

  function getCurrentPrice() {
    const { price, cardPrice } = JSON.parse(
      document.querySelector(DATA_CONTAINER_SELECTOR).dataset.state,
    );
    const current = cardPrice || price;
    const cleanPrice = parsePrice(current);

    return cleanPrice;
  }

  stage(options);
})();
 
  • Love +1
  • Like +1
Реакции: aomame и ichi88
этот?
JavaScript:
// ==UserScript==
// @name         ozon-wait-and-order
// @namespace    http://ozon.ru
// @version      0.2
// @description  wait for discount and order
// @author       br4instormer
// @homepageURL  https://gist.github.com/br4instormer/24b029f34d00359bb4c0adec62dd5bb9
// @match        https://www.ozon.ru/product/*
// @match        https://www.ozon.ru/cart*
// @match        https://www.ozon.ru/gocheckout*
// @icon         https://www.ozon.ru/public/favicon.ico
// @grant        none
// ==/UserScript==

(function () {
  "use strict";

  const LOCAL_STORAGE_OPTIONS_KEY = "0rderOptions";
  const CLAIM_BUTTON_SELECTOR = "div[text='Перейти к оформлению'] > button";
  const ORDER_BUTTON_SELECTOR = "div[text='Оплатить онлайн'] > button";
  const DATA_CONTAINER_SELECTOR = "div[id^='state-webPrice']";
  const PRICE_CONTAINER_SELECTOR = "div[data-widget='webPrice']";
  const ADD_TO_CART_BUTTON_SELECTOR = "div[data-widget='webAddToCart'] button";
  const GO_TO_CART_BUTTON_SELECTOR =
    "div[data-widget='webAddToCart'] button:has(> span > span > span)";
  const WAIT_TIMEOUT = 500; // интервал между обновлениями карточки товара
  const SLEEP_TIMEOUT = 200; // интервал ожидания появления селектора (технический)
  const SPAM_ORDER_BUTTON_TIMEOUT = 200; // интервал между нажатиями при спаме кнопки оплаты (технический)
  const SPAM_ORDER_BUTTON_TIME = 1000 * 15; // время в течение которого идёт спам кнопки оплаты

  const getProductId = () => window.location.pathname.match(/(\d+)\/$/)[1];
  const sleep = (timeout) =>
    new Promise((resolve) => setTimeout(resolve, timeout));
  const parsePrice = (price) =>
    Number.parseInt(price.trim().replace(/[^\d]/g, ""));

  const defaultOptions = {
    watch: false,
    price: 0,
    productId: undefined,
  };

  const Reload = {
    timeoutId: undefined,
    start() {
      if (this.timeoutId) {
        this.stop();
      }

      this.timeoutId = setTimeout(reload, WAIT_TIMEOUT);
    },
    stop() {
      clearTimeout(this.timeoutId);

      this.timeoutId = undefined;
    },
  };

  const optionsRaw = sessionStorage.getItem(LOCAL_STORAGE_OPTIONS_KEY);
  const options = optionsRaw ? JSON.parse(optionsRaw) : { ...defaultOptions };
  const stage = Stage(window.location.pathname);

  async function addToCart(options) {
    const { watch, productId: watchProductId, price: oldPrice } = options;
    const currentProductId = getProductId();
    const currentPrice = getCurrentPrice();
    const isSameProduct = watchProductId === currentProductId;
    const isWatchingSameProduct = watch && isSameProduct;

    waitForSelector(PRICE_CONTAINER_SELECTOR)
      .then(() => insertCheckbox(isWatchingSameProduct));

    if (!watch) {
      console.warn(`Наблюдение не проводится`);

      return;
    }

    if (watchProductId && !isSameProduct) {
      console.warn(`Наблюдение не за этим товаром`);

      return;
    }

    if (currentPrice >= oldPrice) {
      console.warn(
        `Товар не стал дешевле. Ожидание и обновление страницы через ${WAIT_TIMEOUT}мс`,
      );

      return Reload.start();
    }

    console.warn(`Обнаружена цена со скидкой. Заказ товара`);

    await waitForSelector(ADD_TO_CART_BUTTON_SELECTOR);
    document.querySelector(ADD_TO_CART_BUTTON_SELECTOR).click();

    await waitForSelector(GO_TO_CART_BUTTON_SELECTOR);
    await clickSelectorUntil(
      GO_TO_CART_BUTTON_SELECTOR,
      SPAM_ORDER_BUTTON_TIME,
      SPAM_ORDER_BUTTON_TIMEOUT,
    );
  }

  async function claimOrder({ watch }) {
    const selector = CLAIM_BUTTON_SELECTOR;

    if (!watch) {
      return;
    }

    await clickSelectorUntil(
      selector,
      SPAM_ORDER_BUTTON_TIME,
      SPAM_ORDER_BUTTON_TIMEOUT,
    );
  }

  async function order({ watch }) {
    const selector = ORDER_BUTTON_SELECTOR;

    if (!watch) {
      return;
    }

    disable();
    await clickSelectorUntil(
      selector,
      SPAM_ORDER_BUTTON_TIME,
      SPAM_ORDER_BUTTON_TIMEOUT,
    );
  }

  async function clickSelectorUntil(selector, dueTime, timeout) {
    const Spam = { continue: true };

    await Promise.allSettled([
      sleep(dueTime).then(() => (Spam.continue = false)),
      (async () => {
        while (Spam.continue) {
          try {
            document.querySelector(selector).click();
          } catch (e) {}

          await sleep(timeout);
        }
      })(),
    ]);
  }

  async function waitForSelector(selector) {
    let repeat = false;

    do {
      repeat = document.querySelector(selector) === null;

      await sleep(SLEEP_TIMEOUT);
    } while (repeat);
  }

  function Stage(path) {
    if (path.startsWith(`/product/`)) {
      return addToCart;
    }

    if (path.startsWith(`/cart`)) {
      return claimOrder;
    }

    if (path.startsWith(`/gocheckout`)) {
      return order;
    }

    throw new Error(`No hadler for this operaion`);
  }

  function reload() {
    window.location.reload();
  }

  function toggleWatching(event) {
    const isChecked = event.target.checked;

    if (isChecked) {
      enable({
        watch: true,
        price: getCurrentPrice(),
        productId: getProductId(),
      });
      Reload.start();
      console.warn(`Наблюдение включено`);
    } else {
      disable();
      Reload.stop();
      console.warn(`Наблюдение отключено`);
    }
  }

  function enable(options) {
    sessionStorage.setItem(LOCAL_STORAGE_OPTIONS_KEY, JSON.stringify(options));
  }

  function disable() {
    sessionStorage.removeItem(LOCAL_STORAGE_OPTIONS_KEY);
  }

  function insertCheckbox(isChecked) {
    const checkboxElement = document.createElement("INPUT");
    const labelElement = document.createElement("LABEL");
    const containerElement = document.querySelector(PRICE_CONTAINER_SELECTOR);

    checkboxElement.type = "checkbox";
    checkboxElement.id = "watch-price";
    checkboxElement.onclick = toggleWatching;
    labelElement.setAttribute("for", "watch-price");
    labelElement.innerText = "Следить за ценой";

    if (isChecked) {
      checkboxElement.setAttribute("checked", "");
    }

    containerElement.insertAdjacentElement("afterend", labelElement);
    containerElement.insertAdjacentElement("afterend", checkboxElement);
  }

  function getCurrentPrice() {
    const { price, cardPrice } = JSON.parse(
      document.querySelector(DATA_CONTAINER_SELECTOR).dataset.state,
    );
    const current = cardPrice || price;
    const cleanPrice = parsePrice(current);

    return cleanPrice;
  }

  stage(options);
})();
ну теперь точно прикручу к своему такое. :troll: чо еще есть?) спасибо!
 
  • Haha
Реакции: aomame
Ставлю всех в известность - я покачала пресс, щас закидываюсь белком (курой)
фото давай чего ты там накачала и чего там сверху поднялось
---------Двойное сообщение соединено: ---------

190/150 4.9/2076 Масло усьмы для бровей и ресниц, масло усьмы для волос
10135945600.jpg
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.