Skip to content

Instantly share code, notes, and snippets.

@BaNru
Last active October 4, 2022 13:06
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save BaNru/1ad008c65c3359ddb494393fa9c71afe to your computer and use it in GitHub Desktop.
Save BaNru/1ad008c65c3359ddb494393fa9c71afe to your computer and use it in GitHub Desktop.
AliExpress Improve
// ==UserScript==
// @name AliExpress Improve
// @description Разные мелкие улучшения AliExpress: подсчёт общей цены, возвращение breadcrumb на верх
// @version 1.9.4
// @author BaNru
// @run-at document-end
// @include https://*.aliexpress.com/*
// @match https://*.aliexpress.com/*
// @grant GM_xmlhttpRequest
// @downloadURL https://gist.githubusercontent.com/banru/1ad008c65c3359ddb494393fa9c71afe/raw
// @updateURL https://gist.githubusercontent.com/banru/1ad008c65c3359ddb494393fa9c71afe/raw
// ==/UserScript==
// Глобавльная переменная URLSearchParams
var url = new URLSearchParams(document.location.search);
/* Страница товара */
if(~document.location.href.indexOf('/item/')){
// Регулярка получения цен из строки
var REGEXP = new RegExp(/[\d\s]+(?:\.|,)\d+/),
REGEXP2 = new RegExp(/\d+/),
TOTALPRICE = 0;
// Вытаскиваем цены из строки и преобразуем в числа
function normaliseInt(str){
return parseFloat(
( str.match(REGEXP) && str.match(REGEXP)[0] || str.match(REGEXP2) && str.match(REGEXP2)[0] || 0 ).replace(/\s/,'').replace(',', '.')
);
}
// Основная функция подсчёта
function RunTotalPrise() {
// Основная цена
var price = document.querySelector('.product-price-value[itemprop="price"]');
if (price && (price.textContent.match(REGEXP) || price.textContent.match(REGEXP2))) {
price = normaliseInt(price.textContent);
} else {
price = 0;
}
// Доставка
var shippingPrice = document.querySelector('.product-shipping-price .bold');
if (shippingPrice && (shippingPrice.textContent.match(REGEXP) || shippingPrice.textContent.match(REGEXP2))) {
shippingPrice = normaliseInt(shippingPrice.textContent);
} else {
shippingPrice = 0;
}
// Высчитываем
if (price) {
var INPUT_ = document.querySelector('.product-number-picker input').value;
if (shippingPrice) {
return (price * INPUT_ + shippingPrice).toFixed(2);
} else {
return (price * INPUT_).toFixed(2);
}
}
return 0;
}
// Функция вывода цен на страницу
function ReloadTotalPrise() {
TOTALPRICE = RunTotalPrise();
document.querySelector('.USER_totalPrice').textContent = 'Общая сумма: ' + TOTALPRICE;
}
// Отрисовываем блок для вывода цены и кнопку "Пересчитать"
document.querySelector('.product-action').insertAdjacentHTML('beforebegin',
'<span class="USER_totalPrice" style="color:#FF4747;font:bold 1.2em/2em serif;padding-right:20px;">Общая сумма: ' + RunTotalPrise() + '</span><span class="USER_RunTotalPrice" style="background:#FF4747;color:#FFF;cursor:pointer;padding:2px 10px;">Пересчитать</span>');
// Создаём блок для подсчёта за единицу
document.querySelector('.product-sku').insertAdjacentHTML('afterend','<small class="USER_SiglePrice" style="top:-6px;position:relative;"></small>');
// Клик по кнопки "Пересчитать"
document.querySelector('.USER_RunTotalPrice').addEventListener('click', ReloadTotalPrise);
// Инициализация скрипта подсчёта при выборе характеристик товара и количества
// Отслеживание изменения доставки пользователем не предусмотрено
document.querySelectorAll('.product-quantity button,.sku-property-item').forEach(item => {
item.addEventListener('click', e=>{
setTimeout(()=>{
ReloadTotalPrise();
// Подсчёт за единицу. Пока оставим тут.
if(e.target.textContent.match(REGEXP2)){
document.querySelector('.USER_SiglePrice').textContent = parseFloat( TOTALPRICE / e.target.textContent.match(REGEXP2)[0] ).toFixed(2);
}
}, 500); // Увеличить цифру 2+ раза, если не будет успевать считать
});
});
// Возавращение breadcrumb (хлебные крошек, категорий) в верх страницы
var breadcrumb = document.querySelector('.breadcrumb'),
productMain = document.querySelector('.product-main');
if(breadcrumb && productMain){
productMain.insertAdjacentHTML('afterbegin', '<style>.breadcrumb_ {text-align: center; margin: -15px 0 15px;}.breadcrumb_ a {padding: 0 5px;color:#666;font-size:0.8em;} .breadcrumb_ a:hover {color:#ff4747}</style><div class="breadcrumb_"></div>');
var breadcrumb_ = document.querySelector('.breadcrumb_');
breadcrumb.querySelectorAll('a').forEach( function(element) {
let el = element.cloneNode(true);
breadcrumb_.append(el);
});
}
// Показать оригинальное (на английском) название
// ?isOrigTitle=true
if(!document.querySelector('.product-title-switch')){
url.set("isOrigTitle", "true");
// Отрисовываем ссылку переключения
document.querySelector('.product-title').insertAdjacentHTML('afterend','<div class="product-title-switch"><a href="'+ window.location.pathname + '?' + url.toString() +'"><svg class="svg-icon m product-title-icon" aria-hidden="true"><use xlink:href="#icon-translate"></use></svg>Посмотреть оригинальное название</a></div>');
}
}
/* / Страница товара */
// Дополнительный поиск
var breadcrumb_search = document.querySelector('.product-container .nav-breadcrumb');
if (breadcrumb_search) {
breadcrumb_search.insertAdjacentHTML('afterend', '<div class="next-input next-small""><input placeholder="Дополнить" autocomplete="off" value="" class="AEsearch"></div>')
var AEsearch = document.querySelector('.AEsearch');
AEsearch.addEventListener('keyup', e => {
if (e.keyCode == 13) {
let oldS = url.get("SearchText");
oldS = oldS ? oldS + "+" : "";
url.delete("SearchText");
var u = window.location.pathname;
if (~document.location.href.indexOf('w/wholesale')) {
oldS = u.replace('/w/wholesale-', '').replace('.html', '') + '+';
u = '/wholesale';
}
url.set("SearchText", oldS + e.target.value);
window.location.href = u + '?' + url.toString();
}
})
}
// Переключение на старый дизайн
var navtop = document.querySelector('#nav-global');
url.delete("switch_new_app");
url.set("switch_new_app", 'n');
navtop.insertAdjacentHTML('afterbegin', `<style>
.ng-item-wrap.oldD a {
background: #ff4747;
color:#fff;
margin: 0px 5px;
display: inline-block;
padding: 0 10px;
font-weight: bold;
}
.ng-item-wrap.oldD a:hover {
background: #a63c24;
color:#fff;
}
</style>
<div class="ng-item-wrap oldD"><div class="ng-item"><a href="${window.location.pathname}?${url.toString()}">&#8822; старый дизайна</a></div></div>
`);
// Скрытие надоедливой Евы
document.querySelector('body').insertAdjacentHTML('afterend', `<style>
#J_xiaomi_dialog {visibility: hidden;bottom: 20px!important;}
#J_xiaomi_dialog .J_weak, #J_xiaomi_dialog .J_weak:hover {
width: auto;
height: auto;
background: transparent;
box-shadow: none;
}
#J_xiaomi_dialog .J_weak .alime-avatar {
width: 32px !important;
height: auto;
opacity: 0.5;
transition: all;
position:relative;
top:0;
}
#J_xiaomi_dialog .J_weak .alime-avatar:hover {
opacity: 1;
}
#J_xiaomi_dialog .J_weak .alime-text {
display:none;
}
</style>`);
window.onload = function() {
var eva = document.querySelector('#J_xiaomi_dialog');
if (eva) {
var eva2 = eva.querySelector('.close-icon');
if (eva2) {
eva2.click();
setTimeout(() => { eva.style.visibility = "visible"; }, 2000);
}
}
}
/* Отключение aotoplay у карусели при добавление в корзину */
/* Спасибо за помощь Джентльменам */
/*
НЕ РАБОТАЕТ в Greasemonkey! Он не хочет читать Object.key у элемента.
Проверена работа в Tampermonkey
*/
function stopSlider() {
var tI = 0;
var timerCard = setInterval(() => {
tI > 20 ? clearInterval(timerCard) : tI++; // Останавливаем таймер, если элемент не найден в течение 10 секунд
// console.log('Ищем слайдер');
if (document.querySelector('.next-slick')) {
setTimeout(()=>{
document.querySelector('.next-slick')[Object.keys(document.querySelector('.next-slick'))[0]].alternate.memoizedProps.children.props.autoplay = false;
}, 500); // Хак на дни распродаж. Если не поможет, то увеличить в x2-x4 раза и на медленных компьютерах
clearInterval(timerCard);
}
}, 500);
}
document.querySelector('.product-action').addEventListener('click', (e) => {
if (e.target.classList.contains('addcart')) {
if (document.querySelector('.product-action .addcart-wrap:not([aria-expanded]) button')) {
stopSlider();
}
}
if (e.target.closest('.add-wishlist-wrap')) {
stopSlider();
}
});
// Номера треков на странице заказов
// Генерация цветов (на входе 0-255 - яркость цвета)
function randomColor(brightness) {
function randomChannel(brightness) {
var r = 255 - brightness;
var n = 0 | ((Math.random() * r) + brightness);
var s = n.toString(16);
return (s.length == 1) ? '0' + s : s;
}
return '#' + randomChannel(brightness) + randomChannel(brightness) + randomChannel(brightness);
}
// Удаление дубликатов в массиве (треков)
function removeDublicate(tracknumber) {
return tracknumber.filter((v, i) => tracknumber.indexOf(v) === i);
}
// Получение тректов
function gettrack(el, ordernumber, refresh) {
return new Promise((resolve, reject) => {
var inLS = localStorage.getItem(ordernumber);
if (inLS && !refresh) {
console.log('local', JSON.parse(inLS));
return resolve([el, JSON.parse(inLS)]);
}
GM_xmlhttpRequest({
method: "GET",
url: 'https://track.aliexpress.com/logisticsdetail.htm?tradeId=' + ordernumber,
withCredentials: true,
onload: response => {
var tracknumber = [];
if (/"logisticsNo":"(.*?)"/.exec(response.responseText)) {
tracknumber.push(/"logisticsNo":"(.*?)"/.exec(response.responseText)[1]);
}
if (/"interMailNo":"(.*?)"/.exec(response.responseText)) {
tracknumber.push(/"interMailNo":"(.*?)"/.exec(response.responseText)[1]);
}
if (/"lgOrderCode":"(.*?)"/.exec(response.responseText)) {
tracknumber.push(/"lgOrderCode":"(.*?)"/.exec(response.responseText)[1]);
}
if (/"realMailNo":"(.*?)"/.exec(response.responseText)) {
tracknumber.push(/"realMailNo":"(.*?)"/.exec(response.responseText)[1]);
}
if (/"mailNo":"(.*?)"/.exec(response.responseText)) {
tracknumber.push(/"mailNo":"(.*?)"/.exec(response.responseText)[1]);
}
if (tracknumber.length > 0) {
tracknumber = removeDublicate(tracknumber);
localStorage.setItem(ordernumber, JSON.stringify(tracknumber));
return resolve([el, tracknumber]);
} else {
return resolve([el, []]);
}
},
onerror: error => {
console.log(error);
return reject('Ошибка получения страницы отслеживания');
}
});
});
}
// Вставка треков на страницу (с поиском и подсветкой дублей/консолидированных)
function insertTrack(el, track) {
var thisBTN = el.closest('.order-item-wraper').querySelector('.order-action button');
track.forEach(c => {
var color = 'transparent';
document.querySelectorAll('.inproveTrack').forEach(ie => {
if (ie.textContent == c) {
if(color == 'transparent'){color = randomColor(160);}
ie.style.backgroundColor = color;
}
});
thisBTN.insertAdjacentHTML('afterend', `
<a class="inproveTrack" href="https://gdeposylka.ru/${c}" target="_blank" style="background:${color};">${c}</a>
`);
});
var trackrefresh = document.createElement('span');
trackrefresh.className = 'trackrefresh';
trackrefresh.textContent = '↺';
trackrefresh.addEventListener('click', () => {
el.closest('.order-item-wraper').querySelectorAll('.inproveTrack, .trackrefresh').forEach(r => {
r.remove();
});
gettrack(el, el.textContent.trim(), true).then(e => {
insertTrack(e[0], e[1]);
});
});
thisBTN.parentNode.insertBefore(trackrefresh, thisBTN.nextSibling);
}
// Запуск скрипта отображения треков
if (~document.location.href.indexOf('orderList.htm')) {
document.querySelector('body').insertAdjacentHTML('afterend', `<style>
.inproveTrack {
font-size: .8em;
display: inline-block;
position: relative;top: -6px;
padding: 1px 5px 2px;
}
.trackrefresh {
float: right;
font-size: 1.3em;
cursor: pointer;
margin-top: -7px;
}
.trackrefresh:hover {
color:#f60;
}
</style>`);
var ordernumbers = [];
document.querySelectorAll('.order-info .first-row .info-body').forEach(el => {
//localStorage.clear();
ordernumbers.push(
gettrack(el, el.textContent.trim())
.then(r => {
return r;
}).catch(e => {
return e;
})
);
});
Promise.all(ordernumbers).then(t => {
t.forEach(e => {
if (e[0] && e[1]) {
insertTrack(e[0], e[1]);
}
});
}, e => {
console.log(e);
});
}
/*
* CHANGELOG
* 1.0 - Первая версия
* 1.0.1 - Добавил поддержку разных валют. Были только доллары.
* 1.1 - Переименовал в AliExpress Improve
* - Добавил навигацию по категориям (скопировал с низу в верх)
* 1.2 - Исправлена ошибка получения цен: теперь извлекаются цены с отбивкой тысячных пробелом "$1 000" или "1 000 рублей"
* 1.2.1 - Исправлена ошибка получения цен: теперь извлекаются целые цены "$2" или "100 руб."
* 1.2.2 - Исправлена ошибка получения объекта: TypeError: price/shippingPrice is null
* 1.3.0 - Добавлен подсчёт цены за единицу товара, если есть возможность выбирать количество товара
* 1.4.0 - Добавлена ссылка переключения на оригинальный заголовок
* 1.4.1 - Обновлено получение цены доставки. Теперь снова суммируется.
* 1.5.0 - Попытка восстановить дополнительный поиск
* 1.6.0 - Переключение на старый дизайн (переключает не на всех страницах)
* 1.7.0 - Скрытие надоедливой Евы
* 1.8.0 - Отключение aotoplay у карусели при добавление в корзину
* 1.8.1 - Отключение aotoplay у карусели при добавление в избранное
* 1.9.0 - Добавлены номера треков на странице заказов с ссылкой на гдепосылка
* 1.9.1 - Удалён дубль кода
* 1.9.2 - Заменена функция генерации цветов для подсветки консолидированных заказов
* 1.9.3 - Добавлен хак на остановку карусели во время распродаж
* 1.9.4 - Исправлены цвета для консолидированных посылок. Теперь все одинаковые треки одного цвета.
*/
@mortifactor
Copy link

Отлично, еще бы вернуть строку поиска - "поиск среди найденного".

@BaNru
Copy link
Author

BaNru commented Sep 20, 2019

@mortifactor, сделано.
Также вернул поиск в категории. Мне кажется это существенно.
Также добавил переключение на старый дизайн. Работает не везде, но точно работает в поиске.

Поэтому, пока есть возможность переключаться на старый дизайн - есть вероятность восстановить в новом дизайне многое. Пишите свои предложения.

В скором времени юзер-скрипт будет сделан в виде расширения для браузера.

@HAS-BORN
Copy link

Не понимаю.Установил я Ваш скрипт,Tampermonkey показывает что скрипт включен,но на Алиэкспресс ничего не изменилось.Показывает клавишу "старый дизайн",но старого дизайна нет.Что можно сделать? Спасибо.

@BaNru
Copy link
Author

BaNru commented Sep 29, 2019

@HAS-BORN похоже на днях прикрыли лавочку. У меня тоже перестало работать. До этого работало только в поиске/каталоге, а не на страницах товара. Когда писал данную функцию можно было и вручную переключить добавив в адрес &switch_new_app=n и переключиться (именно так работает функционал скрипта), теперь Али сам всегда автоматически добавляет &switch_new_app=y, не давая переключиться.

Если вдруг узнаю о другом способе, то добавлю в скрипт.

@HAS-BORN
Copy link

HAS-BORN commented Sep 30, 2019 via email

@reallyuniquename
Copy link

За скрипт спасибо, особенно за вытаскивание треков и подсветку консолидации.

https://gist.github.com/BaNru/1ad008c65c3359ddb494393fa9c71afe#file-aliexpressimprove-user-js-L205

НЕ РАБОТАЕТ в Greasemonkey! Он не хочет читать Object.key у элемента.

Не работает потому, что из-за @grant GM_xmlhttpRequest сам скрипт запускается в отдельном контексте (в песочнице). Решается это пробросом кода через объект unsafeWindow (может не работать в последних версиях GM) или через создание на странице тега <script> с нужным кодом (должно универсально работать).

@BaNru
Copy link
Author

BaNru commented Nov 17, 2019

За скрипт спасибо, особенно за вытаскивание треков и подсветку консолидации.

На здоровье. Рад что кому-то пригодилось.
Буду рад услышать новые пожелания и хотелки. Принимаются любые идеи.

Решается это пробросом кода через объект unsafeWindow (может не работать в последних версиях GM) или через создание на странице тега <script> с нужным кодом (должно универсально работать).

Спасибо, знаю про unsafeWindow, но лет 5-7 назад там начались дикие проблемы с ним, долго не мог его победить в то время. Поэтому плюнул на это дело. Через script не думал решать, но там тоже надо будет обходные пути. аналогичные unsafeWindow (раньше именно его и надо было использовать для проброса в песочницу), чтобы пробросить данные в песочницу и не факт, что на Али разрешён кросс-доменный запрос. В общем я не стал с этим всем заморачиваться. На подходе полноценное расширение с блекджеком и девочками с настройками, где этих проблем не будет.

@reallyuniquename
Copy link

Хотелок целый вагон.

Сортировка товаров с учетом стоимости доставки, принудительный редирект с регионального домена на глобальный, автовыбор самой дешевой доставки с треком, очистка мусора из параметров в адресе страницы, отключение десятка ненужных обработчиков на страницах Aliexpress.
Можно посмотреть, что там на <html> навешано - часть никак не влияет на прямой функционал, зато "стреляет" даже от движения курсора на странице и напрягает браузер. Например, один из них при клике как раз добавляет ко всем ссылкам мусорные параметры.

Сортировку уже вроде делали, но после очередного обновления сайта автор забросил скрипт.

Кстати, оптимально перейти от setTimeout к MutationObserver: с ним надежнее ловить изменения DOM и не нужно угадывать интервал для таймера.

Вообще стоит опубликовать код на Greasyfork. Если просто из гугла искать скрипты к Aliexpress, то добраться до этой страницы нереально. Я сюда попал совершенно случайно, когда наткнулся на упоминание на форуме.

Через script не думал решать, но там тоже надо будет обходные пути

Ну можно блок, касающийся stopSlider, встроить в страницу через <script>, чтобы выйти из песочницы. Но я думаю мало кто использует GM и нет смысла вносить такие правки. У себя я сделал совсем уж костыль и прокинул нужный блок в глобальный контекст через unsafeWindow.eval(), ну зато работает с минимум правок.

@reallyuniquename
Copy link

@BaNru
Сегодня заметил, что скрипт не всегда определяет консолидацию/новые треки у заказов. В последних заказах он появляется в поле consoTagSecondMailNo.

@BaNru
Copy link
Author

BaNru commented Nov 23, 2019

Сегодня заметил, что скрипт не всегда определяет консолидацию/новые треки у заказов. В последних заказах он появляется в поле consoTagSecondMailNo.

Если это случай, когда на странице отслеживания имеются две вкладки, то проблема известна.
скрин

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

На данном этапе расширение работает на основе возможностей Али и не использует внешние базы:

  • Сортировку можно сделать только на показанной страницы, в мыслях было сделать что-то типа "показывать общую" сумму в поиске. Сейчас они поиск сделали на AJAX и есть вероятность что в их данных есть много интересного, что не используется в интерфейсе. Например может получится вычищать мусорные (обманные) "цвета", которых нет в наличии. Можно конечно брать 10 страниц (а может там можно, как обычно бывает, запросить сразу количество) и по ним делать сортировку (но за 10 страниц будут постоянно блокировать и просить ввести код, защита от ботов у них). В общем это всё будем смотреть позже.
  • Редирект посмотрю, вроде реализуемо
  • Автовыбор доставки - не думаю что будет сложно, но не думаю, что это востребовано будет
  • Отключение обработчиков - согласен, но там всё на реакт скомпилировано, а с ним я не знаком. Вешать костыли как со слайдером - небольшой выигрыш будет в производительности, разве что мешаться меньше будет. А удалять сами события...как-то сложно пока что это звучит :)

Кстати, оптимально перейти от setTimeout к MutationObserver: с ним надежнее ловить изменения DOM и не нужно угадывать интервал для таймера.

Не поклонник я MutationObserver. Слишком тяжёлая вещь и на чужом коде можно словить много неприятностей. Опыт такой имеется. Не смог я нормально подружить как-то на динамическом сайте (LinkedIn, если что) с MutationObserver, пришлось другими путями делать и всё летало.

Вообще стоит опубликовать код на Greasyfork.

Давно там, просто не обновляю
https://greasyfork.org/ru/scripts/390388-aliexpress-improve

Я сюда попал совершенно случайно, когда наткнулся на упоминание на форуме.

На этом форуме только и рекламирую его, обкатывал :)

Спасибо.

===

К сожалению предыдущая неделя была бешеная, не было времени закончить расширение. Следующая неделя будет ещё веселее, поэтому чуть-чуть незаконченная первая версия расширения ждёт своего часа.

@HAS-BORN
Copy link

HAS-BORN commented Nov 24, 2019 via email

@BaNru
Copy link
Author

BaNru commented Nov 30, 2019

@HAS-BORN
Copy link

HAS-BORN commented Nov 30, 2019 via email

@HAS-BORN
Copy link

HAS-BORN commented Dec 3, 2019 via email

@BaNru
Copy link
Author

BaNru commented Dec 3, 2019

Андрей!Отключение autoplay у карусели при добавление в корзину или избранное было самое лучшее из сделанного.Но иногда происходит сбой и карусель возобновляется.Что можно сделать чтобы остановить ее раз и навсегда?

Это может происходить на слабых компьютерах или медленном интернете. Для этого я добавил настройку "Таймер остановки слайдера (мс):" По умолчанию там значение 500. Необходимо увеличить до работающего значения. Люди писали что 1000 хватает, но можно указать 2000 или 3000.

@HAS-BORN
Copy link

HAS-BORN commented Dec 3, 2019 via email

@Rimpel
Copy link

Rimpel commented Apr 11, 2020

Расширение готово
https://chrome.google.com/webstore/detail/aliexpress-improve/apnpdngblnhmjgnidcclnjpjmhkfooed

Добрый день,

а скрипт уже не будет поддерживаться?

@BaNru
Copy link
Author

BaNru commented Apr 11, 2020

@Rimpel , добрый.
Расширять точно нет, продолжение теперь в виде расширения для браузеров.
Если что-то сломается, то можно будет исправить.

@Rimpel
Copy link

Rimpel commented Apr 11, 2020

@BaNru, Ну вот... А я добавил в скрипт небольшой модуль для подсветки даты истечения срока доставки Ontime-Delivery. Может я передам вам этот кусок кода и вы встроите его в свое расширение? Как можно это сделать?

@BaNru
Copy link
Author

BaNru commented Apr 11, 2020

@Rimpel

Если речь про юзерскрипт, то вы можете сделать форк и оставить тут ссылку.

Если речь про расширение, то оставляйте. В ближайшем релизе я добавлю. А до тех пор вы можете пользоваться сборками не из Store, все сборки, включая beta, лежат тут: http://download.g63.ru/index.php?dir=AliExpressImprove и вносить в них изменения.
Также сделал публичным git расширения https://github.com/BaNru/AliexpressImprover можете воспользоваться всем доступными возможностями git и github

@Rimpel
Copy link

Rimpel commented Apr 11, 2020

@BaNru
https://gist.github.com/Rimpel/f432cf885f41d5e3d5f495d436df5666
здесь вставил блок, начинается с коммента // проверка времени заказа на ontime delivery protection
Ограничение: этот блок ориентирован только на русский алик.
Возможно, у вас получше будет в расширении все выглядеть, я в JS не особо.

Идея такая:
Если "спор закрыт" - то сведения о заказе показываются зачеркнутым шрифтом.
Если до конца периода защиты есть время - то добавляется текст с количеством дней зеленым цветом.
Если до конца периода защиты остается меньше 5 дней - то добавляется текст с количеством дней оранжевым цветом.
Если период защиты истек, и нет подтверждения заказа - то добавляется текст с количеством дней просрочки красным цветом покрупней размером шрифта.
Насчет подтвержденных заказов здесь получилось 2 пути (не придумал, как лучше сделать) - для тех, что подтверждены до окончания периода защиты время заказа зачеркнуто. Для тех же, что подтверждены, а время защиты уже истекло, шрифт даты заказа фиолетовый. Так сделано, чтобы можно было визуально определить истекший период защиты, потому что некоторые заказы закрываются автоматически по истечении срока защиты. Минус данного решения - рано или поздно все завершенные подтвержденные заказы будут отображаться фиолетовым, но лично для меня это было некритично, поэтому не стал дальше заморачиваться.

@Starec666
Copy link

Автор спасибо.
после введения локализаций я добавил
// @include https://.aliexpress.ru/
// @match https://.aliexpress.ru/
так как по умолчанию на рус версии не срабатывало.

@BaNru
Copy link
Author

BaNru commented Nov 22, 2020

@Rimpel спустя полгода дошли руки до расширения и добавил твой код в расширение.
В ближайшее время в Store будет доступна версия 2.2.
Спасибо!

@Rimpel
Copy link

Rimpel commented Jan 28, 2021

@BaNru, изменил алгоритм обсчета статусов заказов, по идее сейчас это работает более корректно и относительно проще в управлении.

@MaximusPanin
Copy link

По моему .com страницы больше нет.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment