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

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

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

  • Да

    Голосов: 289 64,5%
  • Нет

    Голосов: 159 35,5%

  • Всего проголосовало
    448
Код:
// ==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 к данным для копирования.
 
Переписал скрипт выбора страны в профиле для игры. Теперь можно делать неограниченное количество стран.
Настройка скрипта так:
"US", "ES", "DE", "RU", "KZ", 500
где коды стран в кавычках перечислены через запятую. Последнее число без кавычек - это задержка после выбора страны перед выбором области. Это актуально для стран USA, UK и некоторых других. Если скрипт неправильно работает с выбором области, то можно увеличить эту задержку.

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

Вложения

  • 1110.PNG
    1110.PNG
    9,6 KB · Просмотры: 128
  • Like
Реакции: AlS00, enottik007 и Author
+
Сегодня что-то изменилось и скрипт входа автоматом не срабатывает
 
  • Like
Реакции: qwerta и enottik007
Есть такое. Через раз работает.
 
  • Like
Реакции: Author
Andronio скрипт входа полностью поломался, посмотри по свободе пожалуйста
 
Али модифицируют форму входа, теперь она не реагирует на пробел после логина, поэтому обход слайдера не работает. Пока сделал простенький скрипт входа без всего. Если всплыл слайдер, то обновляйте страницу и опять вход.

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;
    }
})();
 
У меня тоже не работает вход. Если я в новом окне инкогнито открываю к примеру ссылку на адрес или заказы, то появляется стандартное окно входа (как на скриен), но скрипт не срабатывает. Я клацаю вход, а скрипт не переносит логин и пароль в графы али. Все версии перепробовал
 

Вложения

  • 7777.png
    7777.png
    29,8 KB · Просмотры: 98
У меня тоже не работает вход. Если я в новом окне инкогнито открываю к примеру ссылку на адрес или заказы, то появляется стандартное окно входа (как на скриен), но скрипт не срабатывает. Я клацаю вход, а скрипт не переносит логин и пароль в графы али. Все версии перепробовал
Что интересно на мозиле старая версия 2.0 работает. Вообще что то они там мутят с кукисами. Нужно подождать пока все не закончится.
 
Если всплыл слайдер, то обновляйте страницу и опять вход.
Спасибо! Так и получается. Если ничего не меняя обновить страницу, слайдер пропадает. Может кто-то найдет причину
P.S. если не вводить пароль сразу, а обновить один раз страницу логина после полной загрузки - слайдер не появляется
 
Последнее редактирование:
Вот в этом и причина появления слайдера. Излишняя чистота не нравится Али. Поэтому f5 его и убирает - кукисы и сессия уже не новые.
 
  • Like
Реакции: AlS00
Вот в этом и причина появления слайдера. Излишняя чистота не нравится Али. Поэтому 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), то там хоть сколько жди - будет слайдер. Но, если быстро заходить с древнего акка, то слайдера не будет. Поэтому куки здесь не при чем.
 
  • Like
Реакции: Qant
Andronio "Если всплыл слайдер, то обновляйте страницу и опять вход"
Т.к. всегда все открывают инкогнито, слайдер вылазит в 100% случаях и после обновления страницы все ок. Можно более автоматизировать скрипт, типа:
Вставили (Cntr+V) логин:пароль и дальше скрипт сам нажал войти, через полсекунды/секунду скрипт обновил страницу и повтор первого действия (скрипт сам подставил вводимый несколько секунд назад логин:пароль и дальше скрипт сам нажал войти)?
 
Последнее редактирование:
Andronio "Если всплыл слайдер, то обновляйте страницу и опять вход"
Т.к. всегда все открывают инкогнито, слайдер вылазит в 100% случаях и после обновления страницы все ок. Можно более автоматизировать скрипт, типа:
Вставили (Cntr+V) логин:пароль и дальше скрипт сам нажал войти, через полсекунды/секунду скрипт обновил страницу и повтор первого действия (скрипт сам подставил вводимый несколько секунд назад логин:пароль и дальше скрипт сам нажал войти)?
Согласен. Тут в сторону f5 нужно рыть. Ещё заметил что если авторизация на страницах типа адреса доставки - скрипт вообще не срабатывает. Но тут скорее всего css полей ввода меняется.
 
Cделал простенький скрипт
Приветствую, есть вариант сделать скриптик который будет вставлять в поля пароля тот пароль который я задам? У меня прост на всех логинах один и запарки каждый раз его вставлять
 
Приветствую, есть вариант сделать скриптик который будет вставлять в поля пароля тот пароль который я задам? У меня прост на всех логинах один и запарки каждый раз его вставлять
просто добавь его в редакторе через : хоть в екселе хоть в блокноте можно сделать
 
Приветствую, есть вариант сделать скриптик который будет вставлять в поля пароля тот пароль который я задам? У меня прост на всех логинах один и запарки каждый раз его вставлять
замени строку
mass = parseString(namepass.value);
на
mass[0] = namepass.value;

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