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

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

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

  • Да

    Голосов: 293 63,8%
  • Нет

    Голосов: 166 36,2%

  • Всего проголосовало
    459


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');
                        }
                    }
                }
            });
        });
    });
})();

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

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

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'];
}
 
Последнее редактирование:
  • Like
Реакции: ASSAUS
Али поломал ответ на 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);
})();
я так понимаю, уже не работает скрипт, постоянно лезет новая форма адреса(
 
  • Like
Реакции: Author
Скрипт работает на всех страницах алиэкпресса, воткнуть кнопку на каждую страницу невозможно, а делать плавающую - не эргономично, и так уже всяких кнопок на каждой странице.


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

Скрипт автоматически меняет страну доставки на выбранную и валюту. Исправленная версия, не должен конфликтовать со скриптом мипеда. Можно выбирать что менять, если параметр оставить пустым, то он меняться не будет, вот так:
Код:
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();
        }
    }
})();
Привет! Спасибо за скрипт смены страны и валюты. В целом скрипт хорош, но почему в нём нет смены языка? Ведь если не сменить язык с русского на английский, то и страна и валюта автоматом переключаются на Россию и рубли. И тогда смысла в этом скрипте нет. Сделай пожалуйста чтоб в нём ещё и смена языка была.
Или если такой скрипт со сменой ещё и языка уже есть, то дай ссылку.
 
Последнее редактирование: