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

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

  • Да

    Голосов: 66 64,1%
  • Нет

    Голосов: 37 35,9%

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

2009no1

Флудер
Дней с нами
470
Репутация
7
Розыгрыши
0
Сообщения
392
Лайки
468
Код:
// ==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;
}
Было бы неплохо добавить Product properties к данным для копирования.
 

Andronio

Флудер
Дней с нами
946
Репутация
46
Розыгрыши
0
Сообщения
343
Лайки
1.356
Переписал скрипт выбора страны в профиле для игры. Теперь можно делать неограниченное количество стран.
Настройка скрипта так:
"US", "ES", "DE", "RU", "KZ", 500
где коды стран в кавычках перечислены через запятую. Последнее число без кавычек - это задержка после выбора страны перед выбором области. Это актуально для стран USA, UK и некоторых других. Если скрипт неправильно работает с выбором области, то можно увеличить эту задержку.

Ссылка на гитхаб
 

Author

Активный участник
Дней с нами
265
Репутация
0
Розыгрыши
0
Сообщения
72
Лайки
33

qwerta

Знающий
Дней с нами
1.283
Репутация
0
Розыгрыши
0
Сообщения
112
Лайки
55

Вложения

Author

Активный участник
Дней с нами
265
Репутация
0
Розыгрыши
0
Сообщения
72
Лайки
33
+
Сегодня что-то изменилось и скрипт входа автоматом не срабатывает
 
  • Like
Лайки: qwerta и enottik007

L&M

Любитель трепать не по делу
Дней с нами
950
Репутация
14
Розыгрыши
0
Сообщения
1.885
Лайки
2.241
Есть такое. Через раз работает.
 
  • Like
Лайки: Author

Author

Активный участник
Дней с нами
265
Репутация
0
Розыгрыши
0
Сообщения
72
Лайки
33
Andronio скрипт входа полностью поломался, посмотри по свободе пожалуйста
 

Andronio

Флудер
Дней с нами
946
Репутация
46
Розыгрыши
0
Сообщения
343
Лайки
1.356
Али модифицируют форму входа, теперь она не реагирует на пробел после логина, поэтому обход слайдера не работает. Пока сделал простенький скрипт входа без всего. Если всплыл слайдер, то обновляйте страницу и опять вход.

JavaScript:
// ==UserScript==
// @name         Aliexpress Login no slide
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  Автоматический вход на Алиэкспресс
// @author       Andronio
// @match        https://login.aliexpress.com/*
// @match        https://login.aliexpress.ru/*
// @grant        none

// ==/UserScript==

(function() {
    'use strict';

    let div = document.createElement('div');
    div.className = 'regavhod-box';

    div.innerHTML += `
    <input type="text" id="namepass"></br>
    <input type="button" id="vhod" class="regavhod-btn" value="Вход">
    `;

// Стили
    let styles = `
    .regavhod-box {
    position: fixed;
    top: 0;
    right: 0;
    background: white;
    box-shadow: 1px -1px 4px 1px;
    padding: 10px 20px;
    z-index:9999;
    }

    .regavhod-btn {
    display: inline-block;
    padding: 5px 10px;
    margin-right:auto;
    cursor:pointer;
    }`

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

    let btn2 = document.getElementById("vhod");
    btn2.addEventListener('click', vhodFunc);
    let mytext = document.getElementById("namepass");
    mytext.addEventListener('keydown', event => {
        if (event.keyCode == "13") {
            document.getElementById('vhod').click();
        }
    });
    mytext.focus();

    // Функция входа
    function vhodFunc () {
        let namepass = document.getElementById("namepass");
        let mass;

        mass = parseString(namepass.value);
        if (mass) {
            let tabLogin = document.querySelectorAll(".fm-tabs-tab");
            if (!tabLogin.length) tabLogin = document.querySelectorAll(".next-tabs-tab");
            if (tabLogin.length) {
                if (!tabLogin[1].classList.contains("active")) tabLogin[1].click();
            }
            let signName = document.getElementById("fm-login-id");
            let signPass = document.getElementById("fm-login-password");
            let enterButton = document.querySelector(".fm-button");
            signPass.value = mass[1];
            signName.value = mass[0];
            enterButton.click();
        } else alert("Нет логина");
    }

    function parseString(str) {
        if (str == "") return null;
        if (/\w+@[\w\.]+\.\w+\t\w+/.test(str)) {
            return str.split('\t');
        } else if (/\w+@[\w\.]+\.\w+:\w+/.test(str)) {
            return str.split(':');
        } else return null;
    }
})();
 

Darson

Знающий
Дней с нами
82
Репутация
0
Розыгрыши
0
Сообщения
184
Лайки
61
У меня тоже не работает вход. Если я в новом окне инкогнито открываю к примеру ссылку на адрес или заказы, то появляется стандартное окно входа (как на скриен), но скрипт не срабатывает. Я клацаю вход, а скрипт не переносит логин и пароль в графы али. Все версии перепробовал
 

Вложения

Дней с нами
517
Репутация
4
Розыгрыши
0
Сообщения
294
Лайки
375
У меня тоже не работает вход. Если я в новом окне инкогнито открываю к примеру ссылку на адрес или заказы, то появляется стандартное окно входа (как на скриен), но скрипт не срабатывает. Я клацаю вход, а скрипт не переносит логин и пароль в графы али. Все версии перепробовал
Что интересно на мозиле старая версия 2.0 работает. Вообще что то они там мутят с кукисами. Нужно подождать пока все не закончится.
 

krysa

Король флуда
Дней с нами
319
Репутация
5
Розыгрыши
0
Сообщения
666
Лайки
1.006
Если всплыл слайдер, то обновляйте страницу и опять вход.
Спасибо! Так и получается. Если ничего не меняя обновить страницу, слайдер пропадает. Может кто-то найдет причину
P.S. если не вводить пароль сразу, а обновить один раз страницу логина после полной загрузки - слайдер не появляется
 
Последнее редактирование:
Дней с нами
517
Репутация
4
Розыгрыши
0
Сообщения
294
Лайки
375
Дней с нами
517
Репутация
4
Розыгрыши
0
Сообщения
294
Лайки
375
Вот в этом и причина появления слайдера. Излишняя чистота не нравится Али. Поэтому f5 его и убирает - кукисы и сессия уже не новые.
 
  • Like
Лайки: AlS00

Andronio

Флудер
Дней с нами
946
Репутация
46
Розыгрыши
0
Сообщения
343
Лайки
1.356
Вот в этом и причина появления слайдера. Излишняя чистота не нравится Али. Поэтому f5 его и убирает - кукисы и сессия уже не новые.
Неверная теория. Раньше было, если чуть подождать, секунд 5-10, то вход происходил с первого раза и без слайдера. Сейчас так и осталось если заходить на login.aliexpress.ru (перекидывает на https://login.aliexpress.ru/express/buyer_login_new.htm). Если быстро входить, то али что-то не успел подгрузить, поэтому слайдер.
Если же заходить на login.aliexpress.com (перекидывает на https://login.aliexpress.com/new_login.htm), то там хоть сколько жди - будет слайдер. Но, если быстро заходить с древнего акка, то слайдера не будет. Поэтому куки здесь не при чем.
 

Author

Активный участник
Дней с нами
265
Репутация
0
Розыгрыши
0
Сообщения
72
Лайки
33
Andronio "Если всплыл слайдер, то обновляйте страницу и опять вход"
Т.к. всегда все открывают инкогнито, слайдер вылазит в 100% случаях и после обновления страницы все ок. Можно более автоматизировать скрипт, типа:
Вставили (Cntr+V) логин:пароль и дальше скрипт сам нажал войти, через полсекунды/секунду скрипт обновил страницу и повтор первого действия (скрипт сам подставил вводимый несколько секунд назад логин:пароль и дальше скрипт сам нажал войти)?
 
Последнее редактирование:
Дней с нами
517
Репутация
4
Розыгрыши
0
Сообщения
294
Лайки
375
Andronio "Если всплыл слайдер, то обновляйте страницу и опять вход"
Т.к. всегда все открывают инкогнито, слайдер вылазит в 100% случаях и после обновления страницы все ок. Можно более автоматизировать скрипт, типа:
Вставили (Cntr+V) логин:пароль и дальше скрипт сам нажал войти, через полсекунды/секунду скрипт обновил страницу и повтор первого действия (скрипт сам подставил вводимый несколько секунд назад логин:пароль и дальше скрипт сам нажал войти)?
Согласен. Тут в сторону f5 нужно рыть. Ещё заметил что если авторизация на страницах типа адреса доставки - скрипт вообще не срабатывает. Но тут скорее всего css полей ввода меняется.
 

СУлик

Король флуда
Дней с нами
281
Репутация
2
Розыгрыши
0
Сообщения
486
Лайки
837
Cделал простенький скрипт
Приветствую, есть вариант сделать скриптик который будет вставлять в поля пароля тот пароль который я задам? У меня прост на всех логинах один и запарки каждый раз его вставлять
 

illich

Флудер
Дней с нами
882
Репутация
7
Розыгрыши
0
Сообщения
226
Лайки
338
Приветствую, есть вариант сделать скриптик который будет вставлять в поля пароля тот пароль который я задам? У меня прост на всех логинах один и запарки каждый раз его вставлять
просто добавь его в редакторе через : хоть в екселе хоть в блокноте можно сделать
 

Andronio

Флудер
Дней с нами
946
Репутация
46
Розыгрыши
0
Сообщения
343
Лайки
1.356
Приветствую, есть вариант сделать скриптик который будет вставлять в поля пароля тот пароль который я задам? У меня прост на всех логинах один и запарки каждый раз его вставлять
замени строку
mass = parseString(namepass.value);
на
mass[0] = namepass.value;

и строку
signPass.value = mass[1];
на
signPass.value = "Здесь твой пароль";
---------Двойное сообщение соединено: ---------
Мелкий скрипт для упрощения одного действия при анлоке аккаунтов. Если под хайд не проходите - мне не пишите, все равно не дам.
 
Последнее редактирование: