API Zugriff (unauthorisiert)

Hey Leute,

wahrscheinlich bin ich einfach nur dumm, wäre aber trotzdem nice, wenn mir jemand weiterhelfen könnte. Ich habe mich durch die API eingeloggt und will nun meine Designs retrieven, jedoch bin ich unauthorisiert. Ich weiß nicht, wie ich mich authorisieren kann. Hab versucht meinen ApiKey und meine Session ID in die URL einzubetten, funktioniert trotzdem nicht. Bitte um Hilfe!

Hi,

Kämpfe dich hier mal durch, da sind einige Beispiele und fertige pastebins.

Wenn du da nicht weiter kommst, einfach wieder melden.

Gruß
Thimo

Hey Thimo,
danke für die Antwort. Leider versteh ich nur etwas php/JavaScript und mache alles mit Python. :b Mein Problem ist dieser Authorisation Header. Ich verstehe nicht ganz, wie dieser aussehen soll und wo er eingefügt werden soll.

Hier mein Code, hoffe du siehst durch.

import requests
email="XXX"
password="XXX"
xml="""<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<login xmlns:xlink="http://www.w3.org/1999/xlink"      
       xmlns="http://api.spreadshirt.net">   
   <username>"""+email+"""</username>
   <password>"""+password+"""</password>
</login>"""
log_in=requests.post("https://api.spreadshirt.net/api/v1/sessions/?apiKey=XXX",data=xml)
print(log_in.status_code,log_in.reason)
session_id=dict(log_in.headers)["Location"][44:]        #extrahiert sessionid

retrieve_user_design_url="https://api.spreadshirt.net/api/v1/users/USERID/designs"
retrieve_user_design=requests.get(retrieve_user_design_url)
print(retrieve_user_design.status_code,retrieve_user_design.reason)
delete_session=requests.delete("https://api.spreadshirt.net/api/v1/sessions/"+session_id)
print(delete_session.status_code)

Bei retrieve_user_design kommt ein Fehler auf. (401 Unauthorized)

Um dir zu sagen was überhaupt mein Ziel ist, ich will die Farben meiner Designs automatisch ändern, da das echt ziemlich lange braucht :smiley:

Willst du die Grundfarben der Designs ändern oder die Farben auf den Produkten?
Die Grundfarben der Designs gehen leider nicht zu ändern - dies unterstützt die api nicht. Bei den Produkten würde ich empfehlen einfach neue anzulegen.
(Ps, die Empfehlungen gelten für die alte Nutzeroberfläche - Account erstellt vor Oktober 2016. Neue Accounts haben noch keine api, obwohl du mit der alten Api die Designs laden kannst, kannst du jedoch keine Produkte erstellen)

Du musst bei jedem request den useragent und den authorization Header mitschicken. Du brauchst keine Session erstellen.

Der authorization Header braucht api key und Secret und wird wie unten erstellt:

$apiKey = "my-api-key";
    $secret = "my-api-secret";
    $time = time()*1000;
 
    $data = "$method $url $time";
    $sig = sha1("$data $secret");
 
    $herader = "Authorization: SprdAuth apiKey=\"$apiKey\", data=\"$data\", sig=\"$sig\"";

Das ist jetzt in php, da ich kein Python kann, kannst du sicherlich die Equivalente zu sha1 finden.
Also einfach bei jedem request den useragent und authorization Header anfügen und fertig.

Sag Bescheid wenn du nicht weiter kommst, dann versuche ich mich kurz in py einzulesen :slight_smile:

Wow, danke dafür! Was ist genau in der data enthalten und was genau ist die Time? Einfach nur die jetzige Zeit?

$method wäre ‘POST’, ‘GET’, ‘PUT’, ‘DELETE’
$url wäre die anzufragende URL
time() — Gibt den aktuellen Unix-Timestamp/Zeitstempel zurück

hoffe das hilft

Gibt mir immernoch 401. Welcher Datentyp ist denn dein Header? Hab´s mit nem Dictionary versucht, bin jedoch immernoch unauthorisiert.
Habe keinen String benutzt, da er keine “Items” hat.

    import hashlib
    import time
    import requests

    apiKey="apiKey"
    secret=b"secret"   #bytes um es mit sha1 zu bearbeiten
    time=str(time.time()*1000) #str um es später zusammenzufügen
    method= "GET"
    url="https://api.spreadshirt.net/api/v1/users/USERID/designs"
    data = method + url+ time
    sig= hashlib.sha1(bytes(data,"utf-8"))
    sig.update(secret)
    header={"Authorization": "SprdAuth", "apiKey":apiKey, "data":data, "sig":sig.hexdigest()}
    print(requests.get(url, headers=header))

Glaube Useragent fehlt noch, wie ich oben schrieb. Code kann ich nicht sagen, ob so korrekt.

Funktioniert immernoch nicht :confused: In der documentation konnte ich auch nichts von dem User-Agent finden…

Mein Header sieht jetzt so aus:

{"Authorization": "SprdAuth apiKey=\\apiKey\\, data=\\data\\, sig=\\sig\\, User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36"}

Trotzdem klappt das ganze nicht :frowning:

Könnte es daran liegen, dass aus dem einen Backslash vor und nach der data, dem apiKey usw. automatisch zwei gemacht werden?

Hi @User_EU-ce6c6063-d8d9-4fc4-8c28-532ba14b0c54,

ich hatte nun etwas Zeit gehabt und konnte mich mit python beschäftigen.
Der folgende Code ist getestet und funktioniert:

Spreadshirt API login & fetch designs working code for Python

https://pastebin.com/DweFNWAF

Die session_Id wird gebraucht, damit man die User-Designs, also seine eigenen Designs lesen kann, daher auch der vorherige Login mit Username und Password. Dies ist eine Absicherung und ein kleiner Unterschied zu den sonstigen API-Anfragen, bei denen man nur den Authorization Header braucht.

P.s. Ich habe den Inline-Code entfernt, da das Forum automatisch https den URLs hinzufügt. Bei den xmlns funktioniert dies nicht.

Gruß
Thimo

1 Like

Ich danke dir! Das hilft mir so unglaublich weiter. Du leistest hier im Forum echt tolle Arbeit und bitte mach weiter so. Danke vielmals! Außerdem kann ich mir echt was von deiner Coding-Struktur abgucken, ist viel übersichtlicher :smiley:

2 Likes