Скрипты на JavaScript для Алиэкспресс

Тема закреплена бессрочно

Пользуетесь ли этими скриптами?

  • Да

    Голосов: 294 63,6%
  • Нет

    Голосов: 168 36,4%

  • Всего проголосовало
    462
Andronio
У тебя есть скрипт который @description Получает ID, название, цену и конфигурацию.
Очень мне нравится его функционал, но сдох уже некоторое время назад.
Кнопка иногда появляется но ничего не копирует.
Исправь пожалуйста.
Отличный по задумке скрипт. Но у меня так и не заработал. При нажатии на кнопку "Получить ID" на странице товара ничего не происходит (в буфере обмена пусто). FF52портабл, перепробовал все три ...monkey. Так и не разобрался. Может кто-то направит, куда копать?
 
Ну вот здесь же все расписано с картинками.
Двойное сообщение соединено:
Код:
// ==UserScript==
// @name         Aliexpress Order info getter track
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Получение информации из заказа и трека
// @author       Andronio
// @match        https://trade.aliexpress.ru/orderList.htm*
// @match        https://trade.aliexpress.ru/order_list.htm*
// @match        https://trade.aliexpress.com/orderList.htm*
// @match        https://trade.aliexpress.com/order_list.htm*
// @noframes
// ==/UserScript==
/*
prodName  - Название товара
picURL    - URL-ссылка на картинку-превью товара
prodPrice - Цена товара
today     - Сегодняшняя дата
orderNum  - Номер заказа
\t        - Табуляция, переход к следующей ячейке
picPrefix - 1 - добавлять префик picURL= для адреса картинки, 0 - не добавлять
track     - Трек-номер заказа
date      - Дата автозакрытия заказа
Строка должна начинаться и заканчиваться символом обратной кавычки
*/
var orderStr  = `prodName + '\t' + picURL + '\t' + prodPrice + '\t' + today +  '\t' + orderNum`;
var trackStr  = `track + '\t' + date`;
let picPrefix = 1;
/*
Далее не трогать
*/
let ordersMass = [];
let trackMass = [];
(function () {
    'use strict';
// Рисуем окно с кнопками
    var div = document.createElement('div');
    div.className = 'mybox';
    let product = document.querySelectorAll('.order-item-wraper');
    let hasTrackable = false;
    if (product.length == 0) {
        div.innerHTML = '<p class="noorders">Нет заказов</p>';
    } else {
        let str = document.body.innerHTML.split("var appealInfoParams = encodeURIComponent('")[1].split("');")[0];
        if (str.match(/\[(\{("\w+":["\w]+,)+"\w+":["\w]+\},){0,30}\{("\w+":["\w]+,)+"\w+":["\w]+\}\]/g)) {
            ordersMass = eval(str);
            ordersMass.forEach(order => {
                if (order.orderStatus == "WAIT_BUYER_ACCEPT_GOODS") {
                    hasTrackable = true;
                }
            });
        }
        div.innerHTML = `<button class="infoGetter" myattr="-1">Все заказы</button>`;
        if (hasTrackable) div.innerHTML +=`<button class="trackGetter" myattr="99" disabled>Треки</button>`;
        for (let i = 0; i < product.length; i++) {
            let productName = product[i].querySelectorAll(".product-title > a.baobei-name")[0].getAttribute("title").substr(0,20);
            div.innerHTML += `<br><button class="infoGetter" myattr="${i}">${i+1} - <span style="color:green">${productName}</span></button>`;
            if (hasTrackable && ordersMass[i].orderStatus == 'WAIT_BUYER_ACCEPT_GOODS')
                div.innerHTML += `<button class="trackGetter" myattr="${i+100}" disabled>Трек</button>`;
        }
    }
    document.body.append(div);
    var styles = `
    .mybox {
    position: fixed;
    top: 0;
    right: 0;
    background: white;
    box-shadow: 1px -1px 4px 1px;
    max-width: 40%;
    max-height: 400px;
    padding: 10px 10px;
    overflow-y: auto;
    overflow-x: hidden;
    z-index:9999;
    }
    .noorders {
    color: red;
    text-align: center;
    font-size: 1.5em;
    padding: 5px;
    margin: 0;
    }
    .infoGetter {
    display: inline;
    margin-right:auto;
    margin-top: 2px;
    cursor:pointer;
    padding: 5px;
    width: 180px;
    text-align: left;
    }
    .trackGetter {
    display: inline;
    margin-right:auto;
    margin-top: 2px;
    cursor:pointer;
    padding: 5px;
    width: 46px;
    text-align: left;
    }
    .greenbutton{
    background-color: LightGreen;
    }`
    var styleSheet = document.createElement("style")
    styleSheet.type = "text/css"
    styleSheet.innerText = styles
    document.head.append(styleSheet)
    div.addEventListener('click', buttonClick);
    if (hasTrackable) getTracks();
})();
function buttonClick(event) {
    let elem = event.target;
    if (elem.tagName != "BUTTON") {
        elem = elem.parentNode;
        if (elem.tagName != "BUTTON") return;
    }
    let orderString;
    let num = +elem.getAttribute('myattr');
    if (num > 98) return trackBuff(num, elem);
    else {
        let product = document.querySelectorAll('.order-item-wraper');
        let productPrice = document.querySelectorAll(".amount-num");
        let orderNumber = document.querySelectorAll(".order-info > .first-row > span.info-body");
        let today = formatDate();
        let prodName, prodPrice, orderNum;
        if (num > -1) {
            // один заказ
            let productName = product[num].querySelectorAll(".product-title > a.baobei-name");
            let picURL = product[num].querySelectorAll(".pic.s50 > img")[0].src;
            if (picPrefix) picURL = "picURL=" + picURL;
            prodName = `=ГИПЕРССЫЛКА("https:\/\/www.aliexpress.ru\/item\/${productName[0].getAttribute("productid")}.html";` +
                `"${productName[0].getAttribute("title").substr(0,80)}")`;
            prodPrice = productPrice[num].innerText.match(/\d+\.\d+/);
            if (prodPrice)
                prodPrice = prodPrice[0].replace(/\./,",");
            else
                prodPrice = productPrice[num].innerText.trim();
            orderNum = orderNumber[num].innerText;
            orderString = eval(orderStr);
        } else {
            // много заказов
            orderString = "";
            for (let num = 0; num < orderNumber.length; num++) {
                let productName = product[num].querySelectorAll(".product-title > a.baobei-name");
                let picURL = product[num].querySelectorAll(".pic.s50 > img")[0].src;
                if (picPrefix) picURL = "picURL=" + picURL;
                prodName = `=ГИПЕРССЫЛКА("https:\/\/www.aliexpress.ru\/item\/${productName[0].getAttribute("productid")}.html";` +
                    `"${productName[0].getAttribute("title").substr(0,80)}")`;
                prodPrice = productPrice[num].innerText.match(/\d+\.\d+/);
                if (prodPrice)
                    prodPrice = prodPrice[0].replace(/\./,",");
                else
                    prodPrice = productPrice[num].innerText.trim();
                orderNum = orderNumber[num].innerText;
                orderString += eval(orderStr);
                orderString += "\r\n";
            }
        }
    }
    navigator.clipboard.writeText(orderString).then(function () {
        console.log('Async: Copying to clipboard was successful!');
        window.mybtn = elem;
        window.mybtn.classList.add("greenbutton");
        setTimeout(() => window.mybtn.classList.remove("greenbutton"), 500);
    }, function (err) {
        console.error('Async: Could not copy text: ', err);
    });
}
function trackBuff(num, elem){
    num -= 100;
    let date, track, orderString = "";
    let trackMassCopy = trackMass.slice();
    if (num > -1) {
        let el = trackMassCopy.find(index => index.id == ordersMass[num].id);
        date = el.date;
        track = el.track;
        orderString = eval(trackStr);
    } else {
        for (let i = 0; i < ordersMass.length; i++) {
            if (ordersMass[i].orderStatus == "WAIT_BUYER_ACCEPT_GOODS") {
                let el = trackMassCopy.shift();
                date = el.date;
                track = el.track;
                orderString += eval(trackStr);
            }
            orderString += "\r\n";
        }
    }
    navigator.clipboard.writeText(orderString).then(function () {
        console.log('Async: Copying to clipboard was successful!');
        window.mybtn = elem;
        window.mybtn.classList.add("greenbutton");
        setTimeout(() => window.mybtn.classList.remove("greenbutton"), 500);
    }, function (err) {
        console.error('Async: Could not copy text: ', err);
    });
}
function getTracks() {
    ordersMass.forEach(order => {
        if (order.orderStatus == "WAIT_BUYER_ACCEPT_GOODS") {
            trackMass.push({id: order.id, track: "", date: ""});
        }
    });
    let requests = trackMass.map(order => fetch(`${location.protocol}//${location.hostname}/order_detail.htm?orderId=${order.id}`));
    Promise.all(requests)
        .then(responses => Promise.all(responses.map(r => r.text())))
        .then(texts => {
            for (let i = 0; i < texts.length; i++) {
                let obj = document.createElement('html');
                obj.innerHTML = texts[i];
                let track = obj.querySelector(".flush-btn").getAttribute("logisticsNo");
                let date = obj.querySelector('.order-reminder');
                if (!track || !date) return alert("Не получил информацию о заказе");
                date = date.innerText.match(/\d{4}-\d\d-\d\d/g);
                if (date.length > 0) date = date[0].replace(/\d\d(\d\d)-(\d\d)-(\d\d)/, '$3.$2.$1');
                else return alert("Не правильная дата в заказе");
                trackMass[i].track = track;
                trackMass[i].date = date;
            }
            document.querySelectorAll(".trackGetter").forEach(elem => elem.removeAttribute("disabled"));
        })
        .catch(err => alert(`Ошибка ${err}`));
}
function formatDate() {
    let date = new Date();
    let dd = date.getDate();
    if (dd < 10)
        dd = '0' + dd;
    let mm = date.getMonth() + 1;
    if (mm < 10)
        mm = '0' + mm;
    let yy = date.getFullYear() % 100;
    if (yy < 10)
        yy = '0' + yy;
    return dd + '.' + mm + '.' + yy;
}
Добрый день. Планируете ли обновить скрипт ? В данный момент он не работает
 
Скрипт переключения валюты в КОРЗИНЕ. Появляются две кнопки - USD и RUB - переключают на соответствующую валюту. Также в скрипте осталось изменение страны. Если указать стану пустую строку "", то страна меняться не будет. Если указать страну, например KZ, то страна будет меняться на указанную.

Код:
// ==UserScript==
// @name         Aliexpress in Cart Currency Changer
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Изменяет валюту в корзине
// @author       Andronio
// @match        https://shoppingcart.aliexpress.ru/shopcart/shopcartDetail.htm*
// @match        https://shoppingcart.aliexpress.com/shopcart/shopcartDetail.htm*
// @grant        none
// ==/UserScript==

let myCountry = "";

(function repeat() {
    'use strict';
    let cart = document.querySelector(".captain h2");
    if (!cart) return setTimeout(repeat, 200);
    let btnBox = document.createElement("div");
    btnBox.id = "btn-box";
    btnBox.style.display = "inline-block";
    cart.style.display = "inline-block";
    cart.after(btnBox);
    btnBox.innerHTML = `<div class="currency-button" data-curr="USD"><span class="css_flag css_us" style="display:inline"><span class="shipping-text" style="display:inline">USD</span></span></div>
                        <div class="currency-button" data-curr="RUB"><span class="css_flag css_ru" style="display:inline"><span class="shipping-text" style="display:inline">RUB</span></span></div>`;
    let style = document.createElement("style");
    style.innerHTML = `.currency-button {
                            display: inline-block;
                            padding: 5px 10px;
                            margin-left: 20px;
                            border: 2px solid black;
                            border-radius: 0.5em;
                            cursor:pointer;
                        }

                        .no-modify-btn {background-color: OrangeRed;}

                        .yes-modify-btn {background-color: Lime;}
                            `;
    document.head.append(style);
    btnBox.addEventListener("click", btnClickHandler);
})();



function btnClickHandler(event) {
    'use strict';

    let btn = event.target.closest(".currency-button");
    if (!btn) return;
    let currency = btn.dataset.curr;
    let cookies = document.cookie.split('; ');
    let isNeedModif = false;
    let str;
    for (let i = 0; i < cookies.length; i++) {
        if (cookies[i].startsWith("aep_usuc_f=")) { // Если нашел нужную куку
            let cookie = cookies[i].slice(11).split('&'); // Убираем aep_usuc_f= и разделяем
            cookie = cookie.map(elem => { // Смотрим, что в куке
                if (elem.startsWith("c_tp=")) {
                    if (elem.slice(5) == currency)
                        return elem;
                    else {
                    isNeedModif = true;
                    return "c_tp=" + currency;
                    }
                } else if (elem.startsWith("region=")) {
                    let currCountry = elem.slice(7);
                    if (myCountry == "")
                        return elem;
                    else if (currCountry == myCountry)
                        return elem
                    else {
                        isNeedModif = true;
                        return "region=" + myCountry;
                    }

                } else return elem;
            });
            str = cookie.join("&");
            break;
        }
    }
    if (isNeedModif) {
        if (window.location.hostname.includes("aliexpress.ru")) {
            let str2 = `aep_usuc_f=${str}; path=/; expires=Tue, 19 Jan 2088 03:14:07 GMT; domain=.aliexpress.ru`;
            document.cookie = str2;
            window.location.reload();
        } else if (window.location.hostname.includes("aliexpress.com")) {
            let str2 = `aep_usuc_f=${str}; path=/; expires=Tue, 19 Jan 2088 03:14:07 GMT; domain=.aliexpress.com`;
            document.cookie = str2;
            window.location.reload();
        } else {alert("Ошибка в скрипте")};
        window.mybtn = btn;
        window.mybtn.classList.add("yes-modify-btn");
        setTimeout(() => window.mybtn.classList.remove("yes-modify-btn"), 300);
        window.location.reload();
    } else {
        window.mybtn = btn;
        window.mybtn.classList.add("no-modify-btn");
        setTimeout(() => window.mybtn.classList.remove("no-modify-btn"), 300);
    }
}
Привет Andronio. Перестал работать.Есть возможность исправить?
 
Есть расширение для али чтоб цену в рублях, долларах сразу показывало?
 
Исправил свой скрипт "Скрипт для отображения списка вариантов товара с сортировкой по цене" -
Т.к. после обновлений Али он сломался.
Работает сейчас на .com версии.

JavaScript:
// ==UserScript==
// @name         Show price combinations list (10.05.2022)
// @namespace    http://tampermonkey.net/
// @version      0.7
// @author       Dimokin - https://mipped.com/f/members/dimokin.65355/
// @match        https://ru.aliexpress.com/item/*
// @match        https://www.aliexpress.com/item/*
// @match        https://aliexpress.ru/item/*
// @grant        none
// @require http://code.jquery.com/jquery-3.3.1.min.js
// ==/UserScript==
(function() {
    'use strict';
    var $ = window.jQuery;

    $(document).ready(function() {
        let startHTML = document.querySelector("html").outerHTML.split('window.runParams =')[1];
        let endHTML = startHTML.split('var GaData')[0];

        function strToObj(str) {
            var obj = {};
            if (str && typeof str === 'string') {
                var objStr = str.match(/\{(.)+\}/g);
                eval("obj =" + objStr);
            }

            return obj
        }

        let mainObject = strToObj(endHTML);


        mainObject.skuModule.skuPriceList.sort(function(a, b) {
            let actPriceField = a.skuVal.skuActivityAmount ? 'skuActivityAmount' : 'skuAmount';
            let defaultPriceField;

            if (a.skuVal.skuActivityAmount || a.skuVal.skuAmount) {
                defaultPriceField = a.skuVal.skuActivityAmount ? 'skuActivityAmount' : 'skuAmount';
            } else {
                defaultPriceField = a.skuVal.skuAmount ? 'skuAmount' : 'skuActivityAmount';
            }


            var keyA = parseFloat(a.skuVal[actPriceField].value),
                keyB = parseFloat(b.skuVal[actPriceField].value),
                keyC = parseFloat(a.skuVal[defaultPriceField].value),
                keyD = parseFloat(b.skuVal[defaultPriceField].value);

            if (keyA == keyB) {
                return (keyC > keyD) ? -1 : (keyA < keyD) ? 1 : 0;
            } else {
                return (keyA < keyB) ? -1 : 1;
            }
        });

        var div = document.createElement('div');
        div.className = 'prices';

        div.innerHTML += `
    <button class="price-toggle">
        Show/Hide
    </button>
    `;

        $(div).append('<div class="price-list"></div>');

        let pricesIndexes = [];

        let newPriceList = [];

        let hasCountries = false;

        mainObject.skuModule.productSKUPropertyList.forEach(function(element) {
            if (element.skuPropertyId === 200007763) {
                hasCountries = true;
            }
        });


        mainObject.skuModule.skuPriceList.forEach(function(element) {
            if (hasCountries) {
                if (element.skuPropIds.includes('201336100') || element.skuPropIds.includes('201336103') || element.skuPropIds.includes('203124901')) {
                    newPriceList.push(element);
                }
            } else {
                newPriceList.push(element);
            }

        });



        newPriceList.forEach(function(element) {
            let propsId = element.skuPropIds.split(',');
            let availableCount = element.skuVal.availQuantity;
            let propString = '';
            let propIndex = [];

            if (propsId.length) {
                propsId.forEach(function(prop, index) {
                    if (mainObject.skuModule.productSKUPropertyList && mainObject.skuModule.productSKUPropertyList.length) {
                        mainObject.skuModule.productSKUPropertyList.forEach(function(listItem) {
                            listItem.skuPropertyValues.forEach(function(skuProp, skuIndex) {
                                if (prop == skuProp.propertyValueId && availableCount > 0) {
                                    propString += skuProp.propertyValueDisplayName;
                                    propIndex.push(skuIndex);
                                }
                            });
                        });

                        if (index !== propsId.length - 1) {
                            propString += ' - '
                        }
                    }

                });
            }


            if (propIndex.length) {
                pricesIndexes.push(propIndex);
            }


            let priceField = element.skuVal.skuActivityAmount ? 'skuActivityAmount' : 'skuAmount';
            let price = element.skuVal[priceField].value;

            var oldHtml = $(div).find('.price-list').html();

            if (element.skuVal.availQuantity > 0) {
                $(div).find('.price-list').html(oldHtml + `
            <div class="price-row">
                <div class="price-row__left">${propString} </div>
                <div class="price-row__right">${price} ${mainObject.commonModule.currencyCode}</div>
            </div>
            `);
            }


        });


        var styles = `
        .prices {
        position: fixed;
        top: 0;
        right: 0;
        background: white;
        box-shadow: 1px -1px 4px 1px;
        max-width: 40%;
        max-height: 400px;
        padding: 10px 20px;
        overflow-y: auto;
        overflow-x: hidden;
        z-index:9999;
        }

        .price-list {
        margin-top: 15px;
        }

        .price-row {
        display:flex;
        padding:3px;
        margin-bottom:0;
        justify-content: space-between;
        cursor:pointer;
        }

        .price-row:hover,.price-row.active {
        background: lightgrey;
        }

        .price-row__left {}

        .price-row__right {
        min-width: 90px;
        text-align: right;
        margin-left: 20px;
        width: 10%;
        flex-shrink: 0;
        }

        .price-toggle {
        display: block;
        margin-right: auto;
        cursor:pointer;
        }`

        var styleSheet = document.createElement("style")
        styleSheet.type = "text/css"
        styleSheet.innerText = styles
        document.head.appendChild(styleSheet)
        document.body.appendChild(div);

        $(document).on("click", ".price-toggle", function() {
            $(div).find('.price-list').toggle();
            setTimeout($(window).trigger('resize'), 300);
        });


        let propertyLists = $('.product-sku').find('.sku-property-list');

        if (pricesIndexes.length) {
            pricesIndexes[0].forEach(function(price, priceIndex) {
                for (var i = 0; i < propertyLists.length; i++) {
                    if (i === priceIndex) {
                        let propIndex = pricesIndexes[0][priceIndex];
                        let prop = $('.sku-property-list').eq(i).find('.sku-property-item').eq(propIndex)

                        if (prop.hasClass("selected")) {} else {
                            prop.trigger('click');
                        }
                    }
                }
            });
        }

        $('.price-row').eq(0).addClass('active');


        $('.price-row').click(function(event) {
            let index = $(this).index();

            $('.price-row').each(function() {
                if ($(this).hasClass("active")) {
                    $(this).removeClass('active');
                }
            });

            $(this).addClass('active');


            let propertyLists = $('.product-sku').find('.sku-property-list');

            pricesIndexes[index].forEach(function(price, priceIndex) {
                for (var i = 0; i < propertyLists.length; i++) {
                    if (i === priceIndex) {
                        let propIndex = pricesIndexes[index][priceIndex];
                        let prop = $('.sku-property-list').eq(i).find('.sku-property-item').eq(propIndex)

                        if (prop.hasClass("selected")) {} else {
                            prop.trigger('click');
                        }
                    }
                }
            });
        });
    });
})();

 
Народ, подскажите, есть ли возможность (метод) избавиться на аккаунтах при попытке получить купоны ДНВ от ошибки: "Из соображений безопасности ваш запрос не может быть обработан"? Может есть нормальные чекеры для получения такого вида купонов? Заранее благодарен.
 
Обновил скрипт для отключения новой формы адреса на странице оформления.

Со скриптом была замечена проблемка - бывает, что оформление не проходит, кружок крутится бесконечно. После обнаружения проблемы чуть-чуть поправил, возможно, теперь проблемы нет, после того не оформлял заказы на новой странице.

JavaScript:
// ==UserScript==
// @name        AliExpress - Disable New Address Form
// @description Отключает появление новой формы адреса на странице оформления
// @author      longnull
// @namespace   longnull
// @version     1.1
// @match       https://shoppingcart.aliexpress.com/orders.htm*
// @match       https://shoppingcart.aliexpress.com/order/confirm_order.htm*
// @match       https://www.aliexpress.com/p/trade/confirm.html*
// ==/UserScript==

(() => {
  'use strict';

  // https://gist.github.com/jasperck/130651ca255eec1772074e5d5428c363
  const XHR = unsafeWindow.XMLHttpRequest;

  function newXHR() {
    const xhr = new XHR();

    xhr.addEventListener('readystatechange', () => {
      if (xhr.readyState === 4 && xhr.responseURL.includes('mtop.aliexpress.address.sdk.getsupportcountrynew')) {
        const originalResponse = xhr.responseText;
        Object.defineProperty(xhr, 'responseText', { writable: true });
        xhr.responseText = originalResponse.replace(/"sdkCountryList":\[.*?\]/, '"sdkCountryList":[]');
      }
    });

    return xhr;
  }

  newXHR.prototype = XHR.prototype;
  unsafeWindow.XMLHttpRequest = newXHR;

  const timer = setInterval(() => {
    if (unsafeWindow.runParams && unsafeWindow.runParams._ajax_sdk_country_list_) {
      unsafeWindow.runParams._ajax_sdk_country_list_ = [];
      clearInterval(timer);
    }
  }, 500);
})();
 
Доброго дня. Плз ткните носом если есть на работающий скрипт быстрого входа по
Login:пароль
Стоял
AliExpress User Paste
на новых версиях сайта не работает, найти рабочий не могу (
 
Ну вот здесь же все расписано с картинками.
Двойное сообщение соединено:
Код:
// ==UserScript==
// @name         Aliexpress Order info getter track
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Получение информации из заказа и трека
// @author       Andronio
// @match        https://trade.aliexpress.ru/orderList.htm*
// @match        https://trade.aliexpress.ru/order_list.htm*
// @match        https://trade.aliexpress.com/orderList.htm*
// @match        https://trade.aliexpress.com/order_list.htm*
// @noframes
// ==/UserScript==
/*
prodName  - Название товара
picURL    - URL-ссылка на картинку-превью товара
prodPrice - Цена товара
today     - Сегодняшняя дата
orderNum  - Номер заказа
\t        - Табуляция, переход к следующей ячейке
picPrefix - 1 - добавлять префик picURL= для адреса картинки, 0 - не добавлять
track     - Трек-номер заказа
date      - Дата автозакрытия заказа
Строка должна начинаться и заканчиваться символом обратной кавычки
*/
var orderStr  = `prodName + '\t' + picURL + '\t' + prodPrice + '\t' + today +  '\t' + orderNum`;
var trackStr  = `track + '\t' + date`;
let picPrefix = 1;
/*
Далее не трогать
*/
let ordersMass = [];
let trackMass = [];
(function () {
    'use strict';
// Рисуем окно с кнопками
    var div = document.createElement('div');
    div.className = 'mybox';
    let product = document.querySelectorAll('.order-item-wraper');
    let hasTrackable = false;
    if (product.length == 0) {
        div.innerHTML = '<p class="noorders">Нет заказов</p>';
    } else {
        let str = document.body.innerHTML.split("var appealInfoParams = encodeURIComponent('")[1].split("');")[0];
        if (str.match(/\[(\{("\w+":["\w]+,)+"\w+":["\w]+\},){0,30}\{("\w+":["\w]+,)+"\w+":["\w]+\}\]/g)) {
            ordersMass = eval(str);
            ordersMass.forEach(order => {
                if (order.orderStatus == "WAIT_BUYER_ACCEPT_GOODS") {
                    hasTrackable = true;
                }
            });
        }
        div.innerHTML = `<button class="infoGetter" myattr="-1">Все заказы</button>`;
        if (hasTrackable) div.innerHTML +=`<button class="trackGetter" myattr="99" disabled>Треки</button>`;
        for (let i = 0; i < product.length; i++) {
            let productName = product[i].querySelectorAll(".product-title > a.baobei-name")[0].getAttribute("title").substr(0,20);
            div.innerHTML += `<br><button class="infoGetter" myattr="${i}">${i+1} - <span style="color:green">${productName}</span></button>`;
            if (hasTrackable && ordersMass[i].orderStatus == 'WAIT_BUYER_ACCEPT_GOODS')
                div.innerHTML += `<button class="trackGetter" myattr="${i+100}" disabled>Трек</button>`;
        }
    }
    document.body.append(div);
    var styles = `
    .mybox {
    position: fixed;
    top: 0;
    right: 0;
    background: white;
    box-shadow: 1px -1px 4px 1px;
    max-width: 40%;
    max-height: 400px;
    padding: 10px 10px;
    overflow-y: auto;
    overflow-x: hidden;
    z-index:9999;
    }
    .noorders {
    color: red;
    text-align: center;
    font-size: 1.5em;
    padding: 5px;
    margin: 0;
    }
    .infoGetter {
    display: inline;
    margin-right:auto;
    margin-top: 2px;
    cursor:pointer;
    padding: 5px;
    width: 180px;
    text-align: left;
    }
    .trackGetter {
    display: inline;
    margin-right:auto;
    margin-top: 2px;
    cursor:pointer;
    padding: 5px;
    width: 46px;
    text-align: left;
    }
    .greenbutton{
    background-color: LightGreen;
    }`
    var styleSheet = document.createElement("style")
    styleSheet.type = "text/css"
    styleSheet.innerText = styles
    document.head.append(styleSheet)
    div.addEventListener('click', buttonClick);
    if (hasTrackable) getTracks();
})();
function buttonClick(event) {
    let elem = event.target;
    if (elem.tagName != "BUTTON") {
        elem = elem.parentNode;
        if (elem.tagName != "BUTTON") return;
    }
    let orderString;
    let num = +elem.getAttribute('myattr');
    if (num > 98) return trackBuff(num, elem);
    else {
        let product = document.querySelectorAll('.order-item-wraper');
        let productPrice = document.querySelectorAll(".amount-num");
        let orderNumber = document.querySelectorAll(".order-info > .first-row > span.info-body");
        let today = formatDate();
        let prodName, prodPrice, orderNum;
        if (num > -1) {
            // один заказ
            let productName = product[num].querySelectorAll(".product-title > a.baobei-name");
            let picURL = product[num].querySelectorAll(".pic.s50 > img")[0].src;
            if (picPrefix) picURL = "picURL=" + picURL;
            prodName = `=ГИПЕРССЫЛКА("https:\/\/www.aliexpress.ru\/item\/${productName[0].getAttribute("productid")}.html";` +
                `"${productName[0].getAttribute("title").substr(0,80)}")`;
            prodPrice = productPrice[num].innerText.match(/\d+\.\d+/);
            if (prodPrice)
                prodPrice = prodPrice[0].replace(/\./,",");
            else
                prodPrice = productPrice[num].innerText.trim();
            orderNum = orderNumber[num].innerText;
            orderString = eval(orderStr);
        } else {
            // много заказов
            orderString = "";
            for (let num = 0; num < orderNumber.length; num++) {
                let productName = product[num].querySelectorAll(".product-title > a.baobei-name");
                let picURL = product[num].querySelectorAll(".pic.s50 > img")[0].src;
                if (picPrefix) picURL = "picURL=" + picURL;
                prodName = `=ГИПЕРССЫЛКА("https:\/\/www.aliexpress.ru\/item\/${productName[0].getAttribute("productid")}.html";` +
                    `"${productName[0].getAttribute("title").substr(0,80)}")`;
                prodPrice = productPrice[num].innerText.match(/\d+\.\d+/);
                if (prodPrice)
                    prodPrice = prodPrice[0].replace(/\./,",");
                else
                    prodPrice = productPrice[num].innerText.trim();
                orderNum = orderNumber[num].innerText;
                orderString += eval(orderStr);
                orderString += "\r\n";
            }
        }
    }
    navigator.clipboard.writeText(orderString).then(function () {
        console.log('Async: Copying to clipboard was successful!');
        window.mybtn = elem;
        window.mybtn.classList.add("greenbutton");
        setTimeout(() => window.mybtn.classList.remove("greenbutton"), 500);
    }, function (err) {
        console.error('Async: Could not copy text: ', err);
    });
}
function trackBuff(num, elem){
    num -= 100;
    let date, track, orderString = "";
    let trackMassCopy = trackMass.slice();
    if (num > -1) {
        let el = trackMassCopy.find(index => index.id == ordersMass[num].id);
        date = el.date;
        track = el.track;
        orderString = eval(trackStr);
    } else {
        for (let i = 0; i < ordersMass.length; i++) {
            if (ordersMass[i].orderStatus == "WAIT_BUYER_ACCEPT_GOODS") {
                let el = trackMassCopy.shift();
                date = el.date;
                track = el.track;
                orderString += eval(trackStr);
            }
            orderString += "\r\n";
        }
    }
    navigator.clipboard.writeText(orderString).then(function () {
        console.log('Async: Copying to clipboard was successful!');
        window.mybtn = elem;
        window.mybtn.classList.add("greenbutton");
        setTimeout(() => window.mybtn.classList.remove("greenbutton"), 500);
    }, function (err) {
        console.error('Async: Could not copy text: ', err);
    });
}
function getTracks() {
    ordersMass.forEach(order => {
        if (order.orderStatus == "WAIT_BUYER_ACCEPT_GOODS") {
            trackMass.push({id: order.id, track: "", date: ""});
        }
    });
    let requests = trackMass.map(order => fetch(`${location.protocol}//${location.hostname}/order_detail.htm?orderId=${order.id}`));
    Promise.all(requests)
        .then(responses => Promise.all(responses.map(r => r.text())))
        .then(texts => {
            for (let i = 0; i < texts.length; i++) {
                let obj = document.createElement('html');
                obj.innerHTML = texts[i];
                let track = obj.querySelector(".flush-btn").getAttribute("logisticsNo");
                let date = obj.querySelector('.order-reminder');
                if (!track || !date) return alert("Не получил информацию о заказе");
                date = date.innerText.match(/\d{4}-\d\d-\d\d/g);
                if (date.length > 0) date = date[0].replace(/\d\d(\d\d)-(\d\d)-(\d\d)/, '$3.$2.$1');
                else return alert("Не правильная дата в заказе");
                trackMass[i].track = track;
                trackMass[i].date = date;
            }
            document.querySelectorAll(".trackGetter").forEach(elem => elem.removeAttribute("disabled"));
        })
        .catch(err => alert(`Ошибка ${err}`));
}
function formatDate() {
    let date = new Date();
    let dd = date.getDate();
    if (dd < 10)
        dd = '0' + dd;
    let mm = date.getMonth() + 1;
    if (mm < 10)
        mm = '0' + mm;
    let yy = date.getFullYear() % 100;
    if (yy < 10)
        yy = '0' + yy;
    return dd + '.' + mm + '.' + yy;
}
А этот можно починить? Очень удобный
 
Доброго дня. Плз ткните носом если есть на работающий скрипт быстрого входа по
Login:пароль
Стоял
AliExpress User Paste
на новых версиях сайта не работает, найти рабочий не могу (
Версия 1.2 не работает?
Двойное сообщение соединено:
по ходу с корзины отключили автозаплнение
Али поломал ответ на CORS запрос, поэтому браузер блочит запрос сохранения :6:

Как временное решение можно использовать скрипт для фидлера (вставлять в OnBeforeResponse)
JavaScript:
if (oSession.HTTPMethodIs('OPTIONS')) {
    oSession.oResponse['Access-Control-Allow-Methods'] = oSession.oRequest['Access-Control-Request-Method'];
    oSession.oResponse['Access-Control-Allow-Headers'] = oSession.oRequest['Access-Control-Request-Headers'];
    oSession.oResponse['Access-Control-Allow-Origin'] = oSession.oRequest['Origin'];
}
 
Последнее редактирование:
Али поломал ответ на CORS запрос, поэтому браузер блочит запрос сохранения :6:

Как временное решение можно использовать скрипт для фидлера (вставлять в OnBeforeResponse)
JavaScript:
if (oSession.HTTPMethodIs('OPTIONS')) {
    oSession.oResponse['Access-Control-Allow-Methods'] = oSession.oRequest['Access-Control-Request-Method'];
    oSession.oResponse['Access-Control-Allow-Headers'] = oSession.oRequest['Access-Control-Request-Headers'];
    oSession.oResponse['Access-Control-Allow-Origin'] = oSession.oRequest['Origin'];
}
Пришлось поковырять и переписать под Украину отдельной версией с новым шаблоном, таким образом они работают паралельно
 
Автор давно не заходил на форум. Жаль, что многие скрипты уже не работают и активности в теме нет.
 
Обновил скрипт для отключения новой формы адреса на странице оформления.

Со скриптом была замечена проблемка - бывает, что оформление не проходит, кружок крутится бесконечно. После обнаружения проблемы чуть-чуть поправил, возможно, теперь проблемы нет, после того не оформлял заказы на новой странице.

JavaScript:
// ==UserScript==
// @name        AliExpress - Disable New Address Form
// @description Отключает появление новой формы адреса на странице оформления
// @author      longnull
// @namespace   longnull
// @version     1.1
// @match       https://shoppingcart.aliexpress.com/orders.htm*
// @match       https://shoppingcart.aliexpress.com/order/confirm_order.htm*
// @match       https://www.aliexpress.com/p/trade/confirm.html*
// ==/UserScript==

(() => {
  'use strict';

  // https://gist.github.com/jasperck/130651ca255eec1772074e5d5428c363
  const XHR = unsafeWindow.XMLHttpRequest;

  function newXHR() {
    const xhr = new XHR();

    xhr.addEventListener('readystatechange', () => {
      if (xhr.readyState === 4 && xhr.responseURL.includes('mtop.aliexpress.address.sdk.getsupportcountrynew')) {
        const originalResponse = xhr.responseText;
        Object.defineProperty(xhr, 'responseText', { writable: true });
        xhr.responseText = originalResponse.replace(/"sdkCountryList":\[.*?\]/, '"sdkCountryList":[]');
      }
    });

    return xhr;
  }

  newXHR.prototype = XHR.prototype;
  unsafeWindow.XMLHttpRequest = newXHR;

  const timer = setInterval(() => {
    if (unsafeWindow.runParams && unsafeWindow.runParams._ajax_sdk_country_list_) {
      unsafeWindow.runParams._ajax_sdk_country_list_ = [];
      clearInterval(timer);
    }
  }, 500);
})();
я так понимаю, уже не работает скрипт, постоянно лезет новая форма адреса(
 
Скрипт работает на всех страницах алиэкпресса, воткнуть кнопку на каждую страницу невозможно, а делать плавающую - не эргономично, и так уже всяких кнопок на каждой странице.


Это надо проводить исследования, на которые у меня нет времени.

Скрипт автоматически меняет страну доставки на выбранную и валюту. Исправленная версия, не должен конфликтовать со скриптом мипеда. Можно выбирать что менять, если параметр оставить пустым, то он меняться не будет, вот так:
Код:
let myCurrency    = "";
let myCountry    = "";

Код:
// ==UserScript==
// @name         Aliexpress Country Changer
// @namespace    http://tampermonkey.net/
// @version      0.2
// @description  Изменяет страну и валюту
// @author       Andronio
// @match        https://*.aliexpress.ru/*
// @match        https://*.aliexpress.com/*
// @grant        none
// @run-at       document-start
// ==/UserScript==

let myCurrency    = "USD";
let myCountry    = "KZ";

(function () {
    'use strict';

    if (!location.href.includes("mydata=123")) {
        let cookies = document.cookie.split('; ');
        let isNeedModif = false;
        let str;
        for (let i = 0; i < cookies.length; i++) {
            if (cookies[i].startsWith("aep_usuc_f=")) { // Если нашел нужную куку
                let cookie = cookies[i].slice(11).split('&'); // Убираем aep_usuc_f=
                cookie = cookie.map(elem => { // Смотрим, что в куке
                    if (elem.startsWith("c_tp=")) {
                        if (myCurrency != "" && elem.slice(5) != myCurrency) {
                            isNeedModif= true;
                            return "c_tp=" + myCurrency;
                        } else return elem;
                    }
                    if (elem.startsWith("region=")) {
                        if (myCountry != "" && elem.slice(7) != myCountry) {
                            isNeedModif= true;
                            return "region=" + myCountry;
                        } else return elem;
                    }
                    return elem;
                });
                str = cookie.join("&");
            }
        };
        if (isNeedModif) {
            if (location.hostname.includes("aliexpress.ru")) {
                document.cookie = `aep_usuc_f=${str}; path=/; expires=Tue, 19 Jan 2038 03:14:07 GMT; domain=.aliexpress.ru`;
            } else if (location.hostname.includes("aliexpress.com")) {
                document.cookie = `aep_usuc_f=${str}; path=/; expires=Tue, 19 Jan 2038 03:14:07 GMT; domain=.aliexpress.com`;
            } else {alert("Ошибка в скрипте")};
            location.reload();
        }
    }
})();
Привет! Спасибо за скрипт смены страны и валюты. В целом скрипт хорош, но почему в нём нет смены языка? Ведь если не сменить язык с русского на английский, то и страна и валюта автоматом переключаются на Россию и рубли. И тогда смысла в этом скрипте нет. Сделай пожалуйста чтоб в нём ещё и смена языка была.
Или если такой скрипт со сменой ещё и языка уже есть, то дай ссылку.
 
Последнее редактирование:
Назад
Сверху