Python-Anfrage mit Authentifizierung (access_token)


79

Ich versuche, eine API-Abfrage in Python zu bekommen. Die Befehlszeile

curl --header "Authorization:access_token myToken" https://website.com/id

gibt einige JSON-Ausgabe. myToken ist eine hexadezimale Variable, die durchgehend konstant bleibt. Ich möchte diesen Aufruf von Python aus ausführen, damit ich verschiedene IDs durchlaufen und die Ausgabe analysieren kann. Irgendwelche Ideen? Bevor eine Authentifizierung benötigt wurde, habe ich das mit urllib2 gemacht. Ich habe mir auch das Anforderungsmodul angesehen, konnte aber nicht herausfinden, wie das geht.

Danke vielmals.


Festlegen eines Authentifizierungstokens für die gesamte Sitzung: stackoverflow.com/a/47043335/911945
Anton Tarasenko

Antworten:


124

Das Anforderungspaket verfügt über eine sehr schöne API für HTTP-Anforderungen. Das Hinzufügen eines benutzerdefinierten Headers funktioniert folgendermaßen ( Quelle: offizielle Dokumente ):

>>> import requests
>>> response = requests.get(
... 'https://website.com/id', headers={'Authorization': 'access_token myToken'})

Wenn Sie keine externe Abhängigkeit verwenden möchten, sieht dasselbe mit urllib2 der Standardbibliothek folgendermaßen aus ( Quelle: das fehlende Handbuch ):

>>> import urllib2
>>> response = urllib2.urlopen(
... urllib2.Request('https://website.com/id', headers={'Authorization': 'access_token myToken'})

Vielen Dank für Ihre Antwort. Ich habe beide Implementierungen ausprobiert und erhalte den HTTP-Fehler 401: Nicht autorisiert. Die Befehlszeile funktioniert jedoch einwandfrei. Ich habe noch nie mit Zugriffstoken gearbeitet, um ganz klar zu sein: Das Token, das ich habe, besteht aus 40 Ziffern des Formulars 3f4264ff usw.
user1895406

1
Seltsam. Was mich ein wenig nervt, ist der Doppelpunkt in der Kopfzeile ... ah! Vielleicht habe ich (oder wir beide;) das einfach falsch gelesen. Der Header könnte "Authorization" heißen und sein Wert wäre dann "access_token long_hexadecimal_string". Willst du das mal ausprobieren?
Wosc

das hat funktioniert! ich danke dir sehr. Am Ende habe ich Folgendes eingegeben: url = ' website.com/id ' head = {'Authorization': 'access_token hex_string'} res = request.get (URL, Header = head)
user1895406

1
Diese Lösung ist veraltet oder funktioniert in der Standardinstallation von Anaconda nicht.
Blutwurzel

1
Es handelt sich um ein Authentifizierungstoken, mit dem der Server überprüft, ob Sie zum Zugriff auf die API berechtigt sind. Sie müssen Client-Anmeldeinformationen (Benutzername, Kennwort, API-Schlüssel) für die API abrufen, auf die Sie zugreifen möchten, und diese dann (z. B. über eine Get-Anforderung) an den Authentifizierungsserver senden. Der Server gibt eine Zeichenfolge zurück, die JSON-codiert sein könnte, und Sie verwenden diese als Token in Ihren API-Aufrufen. Suchen Sie nach JWT oder OAuth, um mehr zu lesen und einige Beispiele anzuzeigen.
Filip

28

Ich hatte das gleiche Problem, als ich versuchte, ein Token mit Github zu verwenden.

Die einzige Syntax, die für mich mit Python 3 funktioniert hat, ist:

import requests

myToken = '<token>'
myUrl = '<website>'
head = {'Authorization': 'token {}'.format(myToken)}
response = requests.get(myUrl, headers=head)

Was wäre das Zeichen hier? Oder wie bekomme ich ein Authentifizierungstoken?
Deep Jadia

7
>>> import requests
>>> response = requests.get('https://website.com/id', headers={'Authorization': 'access_token myToken'})

Wenn das oben genannte nicht funktioniert, versuchen Sie Folgendes:

>>> import requests
>>> response = requests.get('https://api.buildkite.com/v2/organizations/orgName/pipelines/pipelineName/builds/1230', headers={ 'Authorization': 'Bearer <your_token>' })
>>> print response.json()

1
Ich hatte diese Woche das gleiche Problem und was für mich letztendlich funktionierte, war die Option des Autorisierungsträgers. Ich bin mir nicht sicher, warum es einen Unterschied gibt, aber danke, dass ich diese Option bereitgestellt habe, damit ich versuchen kann, erfolgreich zu arbeiten!
Ryan Harris

@SowmiyaRagu Der zweite Teil funktioniert für mich, Bearer <my_token>der erste nicht, da die Antwort so ist, als ob die Anfrage nicht authentifiziert wäre.
Hydradon

2

Haben Sie das uncurlPaket ausprobiert ( https://github.com/spulec/uncurl )? Sie können es über pip installieren , pip install uncurl. Ihre Curl-Anfrage kehrt zurück:

>>> uncurl "curl --header \"Authorization:access_token myToken\" https://website.com/id"

requests.get("https://website.com/id",
    headers={
        "Authorization": "access_token myToken"
    },
    cookies={},
)

1

Ich füge einen kleinen Hinweis hinzu: Es scheint, dass das, was Sie als Schlüsselwert eines Headers übergeben, von Ihrem Berechtigungstyp abhängt, in meinem Fall PRIVATE-TOKEN

header = {'PRIVATE-TOKEN': 'my_token'}
response = requests.get(myUrl, headers=header)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.