allegro / allegro-api

Issue tracker and wiki for Allegro REST API
https://developer.allegro.pl/
213 stars 39 forks source link

Błąd autoryzacji lub REDIRECT_URI #8909

Open RLaszczak opened 5 months ago

RLaszczak commented 5 months ago

Dzień dobry,

Potrzebuję pobrać z Allegro dane dotyczące ofert z kategorii modelarstwa do swojej aplikacji do porównywania cen. Od tygodnia próbuję zrozumieć temat, ale nie jestem w stanie znaleźć co robię źle. Zarejestrowałem swoją aplikację, dodałem adres przekierowania (tutaj nie jestem pewny czy go dobrze dodałem). Porównywarkę cen tworzę w ASP.NET MVC, więc nie wiem na co mam ustawić adres przekierowania. Na początku próbowałem pobrać dane wykorzystując access_token, ale potem wyczytałem że potrzebuję to zrobić inaczej. Pierwotnie ustawiłem w poniższym kodzie REDIRECT_URI na https://allegro.pl/auth/oauth/token, dostałem w odpowiedzi w linku zapytanie czy chcę powiązać swoje konto ze swoją aplikacją. Po ponownym uruchomieniu dostałem błąd 4d322281ea5e6106 lub 36b9dc0357e406f2. Potem próbowałem jeszcze zmienić adres przekierowania, ale program się wykonywał i uruchamiał stronę przekierowania a nie dostałem strony z kodem... Tak obecnie wygląda mój kod w Pythonie:

import requests import base64 from pymongo import MongoClient

mongo_client = MongoClient('localhost', 27017)
db = mongo_client['NAZWABAZY']
collection = db['NAZWAKOLEKCJI']

category_id = "1061" # modelarstwo

CLIENT_ID = "klient_ID" # w kodzie mam podane własne dane CLIENT_SECRET = "klient_secret" REDIRECT_URI = "https://SaleCheckApp.com/allegro/oauth/callback" AUTH_URL = "https://allegro.pl/auth/oauth/authorize?response_type=code&client_id=" + CLIENT_ID + "&redirect_uri=" + REDIRECT_URI

print("Proszę zalogować się na Allegro i zezwolić na dostęp do danych:") print(AUTH_URL)

auth_code = input("Po autoryzacji proszę podać kod autoryzacyjny: ")

TOKEN_URL = "https://allegro.pl/auth/oauth/token" token_data = { "grant_type": "authorization_code", "code": auth_code, "redirect_uri": REDIRECT_URI } client_credentials = f"{CLIENT_ID}:{CLIENT_SECRET}" encoded_credentials = base64.b64encode(client_credentials.encode()).decode() token_headers = { "Authorization": "Basic " + encoded_credentials } token_response = requests.post(TOKEN_URL, data=token_data, headers=token_headers)

if token_response.status_code == 200: access_token = token_response.json()['access_token']

url = "https://api.allegro.pl/offers/listing"
headers = {
    "Authorization": f"Bearer {access_token}",
    "Accept": "application/vnd.allegro.public.v1+json"
}
params = {
    "category.id": category_id,
    "limit": 100  
}

response = requests.get(url, headers=headers, params=params)

if response.status_code == 200:
    data = response.json()
    # Zapisz dane do bazy MongoDB
    collection.insert_many(data['offers'])
    print("Dane zapisane w bazie MongoDB.")
else:
 print("Wystąpił problem podczas wymiany kodu autoryzacyjnego na token dostępu. Status:", token_response.status_code)

Próbowałem też pobierać dane w ten sposób:

import requests from pymongo import MongoClient

mongo_client = MongoClient('localhost', 27017)
db = mongo_client['BAZA']
collection = db['KOLEKCJA']

ACCESS_TOKEN = "ey..."

category_id = "1061"

url = "https://api.allegro.pl/offers/listing" headers = { "Authorization": f"Bearer {ACCESS_TOKEN}", "Accept": "application/vnd.allegro.public.v1+json" } params = { "category.id": category_id, "limit": 100
}

response = requests.get(url, headers=headers, params=params)

if response.status_code == 200: data = response.json() collection.insert_many(data['offers']) print("Dane zapisane w bazie MongoDB.") else: print("Wystąpił problem z żądaniem API. Status:", response.status_code)

Czy istnieje inny sposób, by pobrać dane o produktach z danej kategorii do bazy lub pliku csv? Byłbym wdzięczny za poradę co poprawić oraz co robię źle. Dziękuję i pozdrawiam

MarekBartczak commented 5 months ago

https://developer.allegro.pl/news/get-offers-listing-tylko-dla-zweryfikowanych-aplikacji-GRax4oVgrs1

MaciejFrackowiak commented 5 months ago

Dokładnie, jak @MarekBartczak wspomniał - dostęp do zasobu /offers/listing jest limitowany, więc bez weryfikacji nie pobierzesz z niego danych. Co do samej autoryzacji - adres przekierowania, który podajesz powinien być 1:1 zgodny z tym, który zapisałeś podczas rejestracji aplikacji. Jak widzę w logach, dokonałeś wielu zmian i często adresy te były niezgodne. Struktura adresu powinna być zgodna z opisanymi w tym artykule.

RLaszczak commented 5 months ago

Czyli w pierwszej kolejności muszę mieć zarejestrowaną aplikację przez Allegro i dopiero potem mogę uzyskać dostęp do danych, czy źle to rozumiem i Allegro nie udostępnia już danych ofert w ramach Allegro API? Co do przekierowania - zmieniłem w Allegro API oraz w kodzie, bo zmianie kod pomijał logowanie i przekierowywał na stronę przekierowania.

MaciejFrackowiak commented 5 months ago

Tak, musisz posiadać zarejestrowaną aplikację, a następnie skontaktować się z obsługą serwisu, aby aplikacja ta przeszła proces weryfikacji (to proces całkowicie poza nami). Dopiero po pozytywnym rozpatrzeniu wniosku uzyskujesz dostęp do /offers/listing.

stale[bot] commented 4 months ago

W tym wątku nie pojawiła się żadna nowa odpowiedź w ciągu 7 dni, dlatego automatycznie oznaczamy go jako przeterminowany. Jeśli w ciągu kolejnych 7 dni nie pojawi się żadna odpowiedź, wątek zostanie zamknięty. Dziękujemy za zaangażowanie w dyskusję i zachęcamy Cię do wypełnienia ankiety dotyczącej naszego wsparcia na forum.


There was no new reply in this thread within 7 days, therefore, we automatically marked it as expired. If no response is received within the next 7 days, this thread will be closed. Thank you for engaging in the discussion. We encourage you to complete our forum support survey.