Allegro Seller Info 0.1.15

tech • 292 słowa • 2 minuty czytania

Po 3 dniach kolejne wydanie allegrowego skryptu użytkownika, bo dziś znów coś na stronie uległo zmianie…

Na listach ofert przestały wyświetlać się informacje o sprzedającym. Na szybko ustaliłem, że zmieniono coś w strukturze i identyfikatorach elementów. Nie ma już kontenera #opbox-listing--base, za to jest .opbox-listing. Niestety elementów z taką klasą jest więcej, więc nie będzie to prosta aktualizacja selektora.

Tym razem trzeba dodać trochę więcej kodu, bo interesuje mnie ten kontener, w którym to znajdują się oferty zapakowane w <article/>. Gdyby przeglądarki wspierały już pseudo-klasę :has(), to pewnie taki selektor mógłby zadziałać:

// strona z lista aukcji
const listing = document.querySelector('.opbox-listing:has(article)');

Niestety nie ma lekko i trzeba to zrobić po staroświecku. Co nie znaczy, że nie da się tego zwięźle zapisać ;)

// strona z lista aukcji
const listing = Array.prototype.filter.call(
	document.getElementsByClassName('opbox-listing'),
	e => e.getElementsByTagName('article').length > 0
).pop();

Poprzednio (0.1.15) wprowadzone poprawki z pobieraniem lokacji użytkownika na stronach ofert nie do końca spełniają swoją rolę. W pewnych okolicznościach cała zawartość innerText wpada do zmiennej.

Pomyślałem, że skoro te elementy od dawna generowane i wyświetlane są jako warstwy, to może jakiś react-owy komponent w tym uczestniczy i z jakiś “propsów” wydobędę “czyste” dane bez zabawy w parsowanie i regex-y… no i znalazłem!

// pobierz lokalizacje z Opcji dostawy
var node = document.getElementsByClassName('opbox-showoffer-delivery')[0].firstElementChild;

var item = getReactInst(node);
if (!item || !item.pendingProps || !item.pendingProps.offerLocation)
	return;
var loc = item.pendingProps.offerLocation;

if (loc.endsWith(', Polska'))
	loc = loc.substr(0, loc.length - 8);

Kod do pobierania instancji komponentu Reacta wrzuciłem do osobnej funkcji (getReactInst), która zwraca obiekt spod pola return. Wydaje się to lepsze niż return.stateNode, gdyż nie zawsze jest on dostępny i podobnie jak props i pendingProps niekoniecznie zawiera jakieś dane. A tak będzie można specyfikować “ścieżkę” zależnie od potrzeb.

Nowa wersja dostępna jest już w moim gicie UserScripts.

Komentarze (0)

Dodaj komentarz

/dozwolony markdown/

/nie zostanie opublikowany/