Wrzasq.pl

Allegro WebAPI tutorial vol. 4

Wednesday, 19 November 2008, 00:07

Część I
Część II

Kolejne pytania

Na początek odpowiedź z kategorii FAQ, na pytanie dotyczące błędu, który pokazuje się w momencie używania przykłądów z mojego kursu na witrynie testwebapi.pl. Wiele osób pisze do mnie, że po uruchomieniu kodu prosto z mojej strony na tym serwisie, otrzymują błąd ERR_INVALID_STATE w trakcie tworzenia aukcji. Otóż mój kod jest przystosowany do wystawiania aukcji w normalnym serwisie i ustawia ID województwa na 16 - co odpowiada zachodniopomorskiemu, gdyż mieszkam w Szczecinie i oprogramowanie pod WebAPI robiłem dla szczecińskich firm, a na platwormie testowej są tylko 4 dostępne województwa. Dlatego należy to ID zmienić. Ja jednak kursów nie uaktualnie poprzednich - stwierdziłem, że dobrze gdzieś zostawić haczyk, żeby ktoś nawet po przeklejeniu kodu mógł trochę nad tym pomyśleć :).

Natomiast kolejne pytanie przesłał 333kylix999, a może raczej przesłał problem. Tym razem pyta o pobieranie danych klientów z zakończonych aukcji, a ja odpowiadam :).

Pobieranie zakończonych aukcji

Pierwszym krokiem będzie pobranie ilości aukcji w zakłądce "Sprzedane" z panelu konta Allegro. Oczywiście przedtem musimy zalogować się do usługi WebAPI. Gdy już będziemy zalogowani wykonujemy zapytanie doMyAccountItemsCount() aby zobaczyć ile aukcji znajduje się w danej zakładce ponieważ dane zarówno o zakończonych aukcjach jak i klientach możemy pobierać jedynie porcjami po 25 elementów:

    // pobieranie ilości elementów w zakładce
    $count = $client->doMyAccountItemsCount($session['session-handle-part'], 'sold', array() );

Pierwszym argumentem jest oczywiście używany przez nas wszędzie uchwyt sesji po zalogowaniu. Drugi argument opisuje zakładkę, z której chcemy pobrać listę aukcji, w tym wypadku jest to zakłądka "Sprzedałem". Argument ten jest zwykłem stringiem, a listę innych możliwości odpowiadających pozostałym zakładkom można znaleźć w dokumentacji WebAPI. Ostatni parametr zawiera listę ID aukcji i jest zwykłą tablicą liczb. W teorii ma to za zadanie filtrować wyniki, ale szczerze mówiąc nie miałem jak tego przetestować - nie mniej my przekazujemy pustą tablicę.

Drugim krokiem będzie pobieranie aukcji z tej zakładki (porcjami po 25 elementów). Do tego posłuży nam wywołanie doMyAccount2():

    // tablica to przechowywania pobranych elementów
    $auctions = array();
    // pierwsza strona na początek
    $offset = 0;

    // pobieramy aukcje tak długo jak mamy następną stronę
    while($count > 0)
    {
        // pobieramy daną stronę
        $auctions = array_merge($auctions, $client->doMyAccount2($session['session-handle-part'], 'sold', $offset, array() ) );

        // pobraliśmy 25 elementów
        $count -= 25;
        // przechodzimy do następnej strony
        $offset += 25;
    }

Jak widać samo wywołanie jest dość podobne do poprzedniego. I odpowiednie parametry również są te same co w poprzednim fragmencie, jedynie przed tablicę aukcji doszedł parametr okreslający, od którego elementu stronę wyników chcemy pobrać. Sama mechanika kodu też raczej nie powinna stwarzać problemu - pobieramy porcję 25 elementów, przechodzimy do następnej strony i zmniejszamy liczbę pozostałych do pobrania aukcji o 25. Wywołanie to zwraca tablicę obiektów, gdzie każdy obiekt zawiera w polu my-account-array informacje o aukcji. Dokładny opis struktury można znaleźć tutaj. Ja nie będę jej objaśniał, gdzyż samo wypisanie wszystkich pól zajęło by drugie tyle co ten odcinek tutoriala, a nam potrzebne jest jedynie ID aukcji, które jest przechowywane w pierwszym elemencie (indeks 0) tablicy my-account-array. Czyli teraz generujemy tablicę zawierającą jedynie ID aukcji, z których chcemy pobrać dane klientów:

    // tablica do przechowywania listy ID
    $ids = array();

    // zapisujemy wszystkie ID aukcji
    foreach($auctions as $auction)
    {
        $ids[] = $auction->{'my-account-array'}[0];
    }

Ten fragment kodu chyba nie wymaga tłumaczenia…

Pobieranie danych klientów

Zatem teraz ostatnia sprawa - pobieranie danych użytkowników. Do tego służy operacja doGetPostBuyData(). Jako parametry pobiera ona po pierwsze identyfikator sesji, a po drugie tablicę ID aukcji z których chcemy uzyskać dane klienta (możemy jednocześnie przekazać maksymalnie 25 ID). Zwraca zaś tablicę obiektów:

    // tablica danych o klientach
    $customers = array();

    // pobieramy dane w porcjach po 25 aukcji
    while( count($ids) > 0)
    {
        // pobieramy aktualną stronę
        $customers = array_merge($customers, $client->doGetPostBuyData($session['session-handle-part'], array_slice($ids, 0, 25) ) );
        // usuwamy pierwsze 25 elementów z tablicy
        $ids = array_slice($ids, 25);
    }

I teraz zaczynają się lekkie schody, gdyż zwracana tablica jest dość pogmatwana. Otóż jest to tablica obiektów, zawierających pole z ID aukcji (item-id), oraz listą wszystkich użytkowników, którzy zakupili w danej aukcji towar (pole users-post-buy-data). I tutaj jest haczyk - według dokumentacji pole z danymi klientów jest tablicą obiektów, podczas gdy naprawdę jest to jednoelementowa tablica, która w swoim pierwszym polu dopiero zawiera tablice obiektów - innymi słowy zawartośc, o której mówi dokumentacja jest zamknięta wewnątrz jeszcze jednej tablicy. Moim zdaniem, jest to jakiś błąd, gdyż z dokumentacji jasno wynika format inny niż otrzymywany, jednak i tak jest on trzeba przyznać dość zagmatwany. Dane klienta są z kolei znowu przechowywane w 3-elementowych tablicach. Pierwszy element zawiera podstawowe dane osobowe użytkownika, drugi element zawiera dane adresowe - jest on zwracany jedynie w przypadku, gdy pobieramy dane klienta (czyli to, co właśnie robimy), natomiast ostatni element tej tablicy zawiera dane do wpłaty i jest on zwracany jedynie gdy pobieramy dane o sprzedającym, czyli u nas zawsze będzie on pusty. Ponieważ cała ta piramidka zawierających się tablic jest trochę zagmatwana, proponuję przekształcenie (uproszczenie) jej do takiej postacii, aby kluczowi (którym będzie ID aukcji) odpowiadała lista danych o klientach, którzy w tej aukcji zakupili towar:

    // nowa lista
    $data = array();

    // ogarniamy ten chaos
    foreach($customers as $customer)
    {
        // jako klucz obieramy ID aukcji i przypisujemy mu listę klientów
        $data[ $customer->{'item-id'} ] = $customer->{'users-post-buy-data'}[0];
    }

I teraz każdy element naszej tablicy jest listą klientów. Dane klientów z kolei to kolejne tablice składające się z elementu [0] z danymi podstawowymi (danymi użytkownika Allegro), oraz elementu [1] zawierającego dane z adresem do wysyłki. Element [2] tak jak mówiłem w przypadku pobierania danych o kupującym jest zawsze pusty. Jeśli to wszystko nadal brzmi zbyt zagmatwanie to mam nadzieję, że na koniec przykład pobierania z tej tablicy konkretnych tanych wyjaśni jak to jest:

    // przykład wypisywania danych w formacie: ID Aukcji, ID Klienta, Login klienta, Imię, Nazwisko, Adres E-Mail
    foreach($data as $id => $customers)
    {
        // każdy element tablicy aukcji jest kolejną tablicą - klientów, którzy w tej aukcji zakupili towar
        foreach($customers as $customer)
        {
            echo $id, ', ', $customer[0]->{'user-id'}, ', ', $customer[0]->{'user-login'}, ', ', $customer[0]->{'user-first-name'}, ', ', $customer[0]->{'user-last-name'}, ', ', $customer[0]->{'user-email'}, '<br />', "\n";
        }
    }

Jeśli macie jakiekolwiek pytania to walcie śmiało na maila, postaram się w miarę możliwości czasowych pomóc.

Część VI

Tags: , , , , ,