iskuzik / alleRSS

Skrypt tworzenia kanałów RSS z nowymi ofertami z serwisu Allegro.pl
23 stars 2 forks source link

Dodanie listowania z konkretnej kategorii #1

Closed tomekk2304 closed 6 years ago

tomekk2304 commented 6 years ago

if(isset($_GET['category'])) { $filterOptions[] = array('filterId' => 'category', 'filterValueId' => array($_GET['category'])); } Umożliwia podanie id kategorii. Na allegro id widoczne jest np. jako ostatni parametr w url: https://allegro.pl/kategoria/klocki-lego-17865

rydzyk184 commented 6 years ago

Czekam z niecierpliwością aż powyższy kod zostanie dodany do skryptu bo bardzo mi zależny na podaniu ID kategori. Zalezy mi równiez na wynikach wyszukiwania po podaniu tylko samej kategori ID i przedziału cenowego, z pominięciem 'string=szukany+przedmiot'

tomekk2304 commented 6 years ago

@rydzyk184 kod możesz sobie dodać do pliku sam. Np. po if(isset($_GET['description']) && $_GET['description'] == 1) { $filterOptions[] = array('filterId' => 'description', 'filterValueId' => array(true)); }

A listowanie kategorii, bez podania słów kluczowych osiągniesz wykomentowując (czyli dodając // na początku) poniższe linie } else { die("Parametr \"string\" musi zawierac przynajmniej 2 znaki!");

tomekk2304 commented 6 years ago

@rydzyk184 bo mają być wykomentowane obie linie: //} else { // die("Parametr \"string\" musi zawierac przynajmniej 2 znaki!");

rydzyk184 commented 6 years ago

@tomekk2304 poprawiłem i jest dobrze ale gdy używam szukania w danej kategori z zakresem cenowym a wynikach w kanale RSS pokazuje ze znalazło najnowsze oferty. Promowane: 7/43 a faktycznie pokazuje ok 10-15 ofert

problem nie wystepuje gdy uzywam listingowania uzywajac string=nazwa bez kategori, wtedy gdy znajdzie nawet 60 ofert to wszystkie 60 jest faktycznie w wynikach

iskuzik commented 6 years ago

@ tomekk2304 Oj, dopiero zauważyłem to "Issue". W każdym razie wczoraj dodałem opcje filtrowania po id kategorii oraz id użytkownika. Usunąłem też wymaganie podania parametru string i poprawiłem opis kanału, który korzystał z tego parametru. Jak na razie niestety wszystko nadal trzeba ustawiać ręcznie, za pomocą parametrów, ale pracuje już nad graficznym generowaniem linku do kanału.

@rydzyk184 Sprawdź czy z aktualną wersją skryptu działa ok. Jeśli nie, to daj jakiś przykład zapytania w którym występuje błąd, to postaram się sprawdzić w czym rzecz.

iskuzik commented 6 years ago

@rydzyk184 Okazało się, że otomoto trochę inaczej wyświetla oferty, np. nie zawsze podając sprzedającego, przez co mógł pojawić się błąd, przez który Thunderbird mógł nie przyjmować kanału. Tak samo było z ceną, która po prostu miała inny typ niż aukcje na allegro. W każdym razie poprawione. Pobierz nową wersję skryptu i sprawdź, czy już wszystko ok.

iskuzik commented 6 years ago

@rydzyk184 co do błędów w validatorze, to czepia się właściwie tylko o tytuł jednej z aukcji, gdzie ktoś dodał znaki "<<" oraz ">>"

iskuzik commented 6 years ago

@rydzyk184 Dokładnie, konkretnie z tytułem oferty https://allegro.pl/i29430597.html, bo jak trafi na nią, to pozostałe oferty nie są już wczytywane. Za chwile pewnie zniknie ona z listy, więc wtedy będziesz mógł dodać kanał do Thunderbirda, ale to oczywiście nie jest rozwiązanie na dłuższą metę, jeśli jakiś znak rozwala feed. Pomyślę, jak to rozwiązać.

iskuzik commented 6 years ago

@rydzyk184 Chodziło o dwa znaki: < oraz &, które trzeba było pozamieniać przed wyświetleniem. Wrzuciłem poprawkę i sprawdź, czy teraz zadziała.

rydzyk184 commented 6 years ago

@iskuzik czytniki wczytują kanał wiec jest dobrze. zapytam teraz dla własnej wygody; które linie wykomentowac/usunąc żebym nie otrzymywał informacji o dacie zakończenia oferty ? liczbe dni do konca chce zostawic.

jeszcze sytuacja która obserwuje od wczoraj podczas użytkowania skryptu; w czytniku mam ustawione odświeżanie kanałów co 1 min, czasem kanał jest blokowany losowo na 2 min, 5, 10 czasem nawet 25min. Nie sadze abym przekraczał limity WebAPI

rydzyk184 commented 6 years ago

tzn nie dostaje komentarza blokada czy informacji o nieprawidłowej formie kanału. Moj czytnik pokazuje mi kiedy kanał faktycznie jest świeży i ze nie pobiera tych samych informacji z przed 15 min. zazwyczaj blokuje sie w przedziale 3-15min całkowicie losowo. nie mowie tu opóźnieniach miedzy serwerami allegro.pl a webapiallegro

iskuzik commented 6 years ago

@rydzyk184 zakomentuj linie od 217 do 221 (włącznie), czyli: if (isSet($object->endingTime)) { echo " ("; echo str_replace("T", ", ", $object->endingTime); echo ")"; }

Co do tej blokady, to też mi się to zdarzyło, ale sam nie wiem do końca dlaczego. Jest mała szansa, że problem był przez te znaki. Jeśli jednak dalej będzie występował, to na Twoim miejscu bym trochę zmniejszył częstotliwość odświeżania i sprawdził, czy wtedy będzie ok.

rydzyk184 commented 6 years ago

link usuniety ze wzgledów bezpieczenstwa

w tym linku jakis wynik (pewnie znak) rozwala kanał rss i czytnik go nie łyka...

iskuzik commented 6 years ago

@rydzyk184 problem był z zamknięciem CDATA, który był dodany w złym miejscu. Przez co jeśli oferta nie miała zdjęcia, to nie był on zamykany i pojawiał się problem. Błąd oczywiście poprawiłem, można pobrać nowszą wersję.

rydzyk184 commented 6 years ago

problem rozwiązany, testuje jeszcze sytuacje z blokadą odświeżań ale potrzebuje jeszcze trochę czasu aby wyciągnąć wnioski.

rydzyk184 commented 6 years ago

@iskuzik Czy istnieje możliwość dodania filtrów które są dostępne dla konkretnych kategorii ? np: kolor, rozmiar, czy inne parametry... (pytam bo użyłeś filtra description=1 którego nie widze w dokumentacji webApi a mimo to filtr działa)

Przydatne było by też dać możliwość wyszukiwania po nazwie któregokolwiek ze szukanych słów string=nazwa1 lub nazwa 2 lub nazwa 3 - dawniej allegro/rss.php realizowało to dodajac linie &search_type=3

tomekk2304 commented 6 years ago

@rydzyk184 użyj string=(nazwa1 nazwa2 nazwa3) i zadziała. Reszta filtrów jest specyficzna dla konkretnych kategorii - i tu bez jakiegoś gui, raczej będzie ciężko, ale niech się developer wypowie ;)

rydzyk184 commented 6 years ago

super, a cos w zamian za wykluczane słowa ? dawniej &exclude=słowa w tytule oferty pomijane z wyników wyszukiwania

iskuzik commented 6 years ago

@rydzyk184 Szukanie któregokolwiek ze słów i konkretnej frazy właściwie już zrobiłem, ale dodam razem właśnie z wyłączeniem podanych słów. Póki co, możesz wyłączyć dane słowo poprzez dodanie go po minusie, np.

mac+mini+-ssd

co wyszuka w tytułach wszystkie oferty, bez "ssd". Tutaj opisane są wszystkie opcje w wyszukiwarce.

Co do filtrów z konkretnych kategorii to oczywiście jest możliwe, ale starałem się to zrobić możliwie jak najogólniej, żeby pasowało do większości ofert. Jest tak jak pisze @tomekk2304 , że trzeba by do tego zrobić jakieś bardziej zaawansowane graficzne wybieranie filtrów, żeby to miało ręce i nogi.

rydzyk184 commented 6 years ago

rozumiem, zależy mi właściwie na jednym filtrze. W kategorii nr 252961, filtr: układ bieżny - gąsienice jesli by sie dało dodam sobie fragment kodu do skryptu.

Co do opóźnień w aktualizacjach, testowałem troche w ofertach odziezowych gdzie co minute pojawia sie nowa oferta i na rss pojawiają się z opóźnieniem rzędu 5-15min. można temu zaradzić - przed każdym ponownym czytaniem kanału przez czytnik można modyfikować kolejność filtrów w linku lub zakres cenowy o kilka złotych (ten sposób pomaga ale nie zawsze !) najlepszym wyjsciem pewnie było by przed każda aktualizacja podmieniac w skrypcie klucz webapi. innego pomysłu nie mam

iskuzik commented 6 years ago

@rydzyk184 możesz dodać, np. przed: /* Offer Options */ coś takiego:

if (isset($_GET['uklad_biezny'])) {
    $offerType = $_GET['uklad_biezny'];

    if ($offerType == "gasienice") {
        $filterOptions[] = array('filterId' => 'Układ bieżny',
                                'filterValueId' => array('Gąsienice'));

    } else if ($offerType == "kola") {
        $filterOptions[] = array('filterId' => 'Układ bieżny',
                                'filterValueId' => array('Koła'));
    }
}

A po tym w adresie dodać parametr: uklad_biezny=gasienice ale wartość kola też przyjmuje

iskuzik commented 6 years ago

@rydzyk184 dodałem też opcje, o których wcześniej wspominałem. Możliwość wyszukiwania któregokolwiek z podanych słów, konkretnie podanej frazy oraz wyłączania ofert, które zawierają podane przez nas słowa.

rydzyk184 commented 6 years ago

@iskuzik dodałem powyższy kod przed /* Offer Options */ ale filtr nie działa - zachowuje sie jakby go nie było. Myślałem ze to wina polskich znaków w filtrze ale podmieniałem i nie działa. Byc może ten filtr w webApi sie inaczej nazywa niz na stronie allegro.

iskuzik commented 6 years ago

Oj, rzeczywiście, pomyliłem się i źle to zrobiłem. Niby sprawdzałem czy działa, ale tylko po miniaturkach na szybko i jak widać - nieskutecznie. ;) Poniżej poprawny kod:

if (isset($_GET['uklad_biezny'])) {
    $uklad = $_GET['uklad_biezny'];

    if ($uklad == "gasienice") {
        $filterOptions[] = array('filterId' => '128831',
                                'filterValueId' => array(1));

    } else if ($uklad == "kola") {
        $filterOptions[] = array('filterId' => '128831',
                                'filterValueId' => array(2));
    }
}
rydzyk184 commented 6 years ago

@iskuzik oczywiście teraz działa jak należy. Zapytam o ostatnią już rzecz, czy jest szansa wyświetlać opisy oferty w kanale rss ? https://allegro.pl/webapi/documentation.php/show/id,342 parametr wejscia getDesc i chyba w zwracanych itDescription , co prawda tutaj już nie jest to doGetItemsList ale moze parametry da sie dołozyc...
Poza tym dziękuje za pomoc i ze rozwinąłeś ten projekt właściwie do końca.

iskuzik commented 6 years ago

@rydzyk184 Opis oferty jest dostępny w metodzie doShowItemInfoExt, ale ona już wymaga podania dodatkowo sesji, która z kolei wymaga użycia metody doLogin, co z kolei wymaga podania loginu i hasła do allegro. To już by chyba zbytnio skomplikowało skrypt.

rydzyk184 commented 6 years ago

@iskuzik Jasne, za duzo zachodu wiec niema sensu.