Github-api gibt 404 bei der Übergabe von json-data mit python + urllib2

Ich habe den folgenden Code, der den ersten Teil des Erstellens eines neuen Downloads bei github durchführen sollte. Es sollte die Json-Daten mit POST senden.

jsonstring = '{"name": "test", "size": "4"}' req = urllib2.Request("https://api.github.com/repos/<user>/<repo>/downloads") req.add_header('Authorization', 'token ' + '<token>') result = urllib2.urlopen(req, jsonstring) 

Wenn ich die , jsonstring von der urlopen() entfernen , jsonstring es nicht, und gibt mir die Liste der verfügbaren Downloads. Allerdings, wenn ich versuche, POST die Json-String, bekomme ich 404 Fehler.

Das Problem muss mit dem Json sein, oder in der Art, wie ich es schicke, aber ich kann nicht herausfinden, was das Problem ist. Die Streicher bei <...> sind im eigentlichen Code richtig, ich habe sie einfach aus dem Posten entfernt

Ich habe das gleiche mit curl auf der Kommandozeile versucht, mit einer etwas anderen Methode der Authentifizierung, und es funktionierte.

Geprüft:

Arbeitet (kehrt das gewünschte json zurück):

 curl -u "user:password" --data "json..." https://api.github.com/repos/<user>/<repo>/downloads 

Werke:

 curl -H 'Authorization: token <token>' https://api.github.com/ 

Funktioniert nicht (gibt "ungültige Anmeldeinformationen" zurück):

 curl -H 'Authorization: token <invalid_token>' https://api.github.com/ 

Funktioniert nicht ("nicht gefunden"):

 curl -H 'Authorization: token <valid_token>' --data "json..." https://api.github.com/repos/<user>/<repo>/downloads 

Dies scheint nicht ein Problem zu sein, das für den Python-Code spezifisch ist. Die json-POST-Daten scheinen gut zu sein, und die OAuth-Token-Berechtigung scheint (zumindest teilweise) zu arbeiten. Aber wenn diese zusammen sind, hört es auf zu arbeiten.

4 Solutions collect form web for “Github-api gibt 404 bei der Übergabe von json-data mit python + urllib2”

Ich konnte endlich ausarbeiten, warum es nicht geklappt hat.

Ich habe nicht die Autorisierungsbereiche für das Autorisierungs-Token richtig eingestellt. Das Token, das ich verwendete, war nicht "autorisiert", irgendwelche Änderungen vorzunehmen, und jede Handlung, die es verwendet, die versucht, etwas zu ändern (fügen Sie einen Download), fehlgeschlagen.

Ich musste die korrekten Bereiche der Berechtigung hinzufügen, damit es funktioniert.

Ich habe eine Antwort gegeben, wie man POST JSON Daten an die V3 API ohne Authentifizierung, aber gesehen, wie Sie festgestellt haben, dass das ursprüngliche Problem war mit nicht die Einrichtung Ihrer OAUTH Token richtig, ich dachte, ich würde eine programmatische Lösung zu bekommen Eins (diese Implementierung bekommt jedes Mal, wenn das Skript ausgeführt wird, ein Token, während es in der Praxis nur einmal geschehen würde und das Token lokal gespeichert wäre).

 import urllib2 import json import getpass import base64 # Generate a token from the username and password. # NOTE: this is a naive implementation. Store pre-retrieved tokens if possible. username = 'pelson' passwd = getpass.getpass() # <- this just puts a string in passwd (plaintext) req = urllib2.Request("https://api.github.com/authorizations") # add the username and password info to the request base64string = base64.encodestring('%s:%s' % (username, passwd)).replace('\n', '') req.add_header("Authorization", "Basic %s" % base64string) data = json.dumps({"scopes":["repo"], "note":"Access to your repository."}) result = urllib2.urlopen(req, data) result = json.loads('\n'.join(result.readlines())) token = result['token'] 

Sobald Sie dieses Token haben, kann es für alle "Repo" Bereich Aktionen verwendet werden. Lasst uns ein neues Problem zu einem Repository hinzufügen:

 # add an issue to the tracker using the new token repo = 'name_of_repo' data = json.dumps({'title': 'My automated issue.'}) req = urllib2.Request("https://api.github.com/repos/%s/%s/issues" % (username, repo)) req.add_header("Authorization", "token %s" % token) result = urllib2.urlopen(req, data) result = json.loads('\n'.join(result.readlines())) print result['number'] 

Hoffe, das hilft jemandem.

Die v3 github api hat ein nettes Feature, wo es konvertieren kann markdown to html. Es ist keine Authentifizierung erforderlich, um diese Informationen anzufordern, daher macht es ein schönes Beispiel zu versuchen, bevor Sie sich in die kniffligere Welt der Authentifizierung.

Die API-Dokumente geben an:

Render ein arbriträres Markdown-Dokument

POST / Markdown Eingang

Text Erforderlicher String – Der Markdown-Text zum Rendern

Und sogar ein Beispiel für eine Markdown-Zeichenfolge umgewandelt werden:

 {"text": "Hello world github/linguist#1 **cool**, and #1!"} 

Angesichts dieser Informationen, können Sie eine urllib2 Anforderung für die html-ified Version dieses Markdowns erstellen.

 import urllib2 import json data = {"text": "Hello world github/linguist#1 **cool**, and #1!"} json_data = json.dumps(data) req = urllib2.Request("https://api.github.com/markdown") result = urllib2.urlopen(req, json_data) print '\n'.join(result.readlines()) 

Und das Ergebnis ist einige html, die den Abschlag darstellen.

Angesichts dieses Beispiels ist es nicht die JSON, die die 404 bei der Buchung Ihrer Anfrage verursacht, sondern eher die Authentifizierung (wie Sie bereits beantwortet haben).

Sind die Daten nicht URL-codiert, nicht JSON? Versuchen:

 data = {"name": "test", "size": "4"} req = urllib2.Request("https://api.github.com/repos/<user>/<repo>/downloads") req.add_header('Authorization', 'token ' + '<token>') result = urllib2.urlopen(req, urllib.parse.urlencode(data)) 
  • Drosseln mit urllib2
  • Wie öffne ich ein Bild aus dem Internet in PIL?
  • Wie benutzt man python urllib2, um Service POST mit Bitbucket API zu erstellen?
  • Offene url von pythonanywhere
  • Urllib2 nicht die vollständige HTTP-Antwort abrufen
  • Python3-Fehler: "Importfehler: Kein Modulname urllib2"
  • Urllib2 basic authentication oddites
  • Beautifulsoup Funktionalität funktioniert nicht richtig in bestimmten senario
  • Urllib2 wirft einen Fehler für eine URL, während er sich im Browser richtig öffnet
  • Python Link zu File Iterator nicht Iterating
  • Konvertieren von gepackten Daten, die von urllib2 in HTML geholt werden
  • Python ist die beste Programmiersprache der Welt.