2009-11-08 5 views
7

Ich verwende die Funktion folgende Python ein Element zu markieren, wie in Google Reader lesen, aber es gibt immer httperrors Fehler: HTTP 401: Nicht autorisiert:Wie kann ich ein Element markieren, wie mit Google Reader api (mit Python) lesen

def mark_as_read(SID, entryid): 
    token = get_token(SID) 
    mark_as_read_url = 'http://www.google.com/reader/api/0/edit-tag' 
    header = {'Content-type': 'application/x-www-form-urlencoded'} 
    post_data = urllib.urlencode({ 'i': entryid, 'a': 'user/-/state/com.google/read', 'ac': 'edit', 'T': token }) 
    request = urllib2.Request(mark_as_read_url, post_data, header) 
    f = urllib2.urlopen(request) 
    result = f.read()

Andere Funktionen können Feeds und Einträge erfolgreich abrufen. Es handelt sich also nicht um einen einfachen Benutzernamen oder ein falsches Passwort. Ich habe gelesen, dass Urlencoding erforderlich ist, also habe ich das getan. Eine Beispieleintrag-ID sieht so aus: tag: google.com, 2005: reader/item/f66ad0fb64f56a22

Was mache ich falsch?

+1

Dies ist eine POST und die Beispiele, die Sie erfolgreicher Anforderungen verwenden klingen wie GETs. Haben Sie andere erfolgreiche POSTs? Vielleicht gibt es einen Unterschied zwischen den beiden in dieser API, die Sie noch nicht richtig verstanden haben? PS: Neds vereinen! –

+0

Ich habe auf dieselbe Art und Weise mit Perl auf Google Reader zugegriffen, und alles funktioniert gut für mich, außer dass ich den Status von Elementen ändere (Markierung als gelesen, in der Hauptrolle usw.). Das Auflisten von Elementen in Reader funktioniert gut für mich ... Ich habe das Gefühl, dass dies etwas auf Google-Seite sein könnte, oder ist die inoffizielle API möglicherweise nicht auf dem neuesten Stand, wie man Elemente als gelesen markiert? – BrianH

+0

gibt es ein Update dazu. Ich muss Mark auch als gelesen in einer Python-App implementieren. Vielen Dank –

Antwort

0

Wenn ich das mit der Anfrage, die ich in Firefox mache (mit Liveheadern geprüft), vergleiche, sieht es gut aus. Ich habe nur die zusätzlichen Parameter

async=true 
sync=true 
s=feed/http://feeds.feedburner.com/37signals/beM 

Und in dem Benutzer, über den Ort der - eine lange id ist.

Sie könnten also versuchen, die beiden Sync-Parameter hinzuzufügen, den s-Parameter hinzuzufügen und eine ID für die - einzugeben.

In Bezug auf die Url Codierung, die Sie tun, scheint das in Ordnung zu sein.

2

Es scheint, dass Sie den Authentication Header fehlen:

header = { 
    'Content-type': 'application/x-www-form-urlencoded', 
    'Authorization': 'GoogleLogin auth=YOUR_AUTH_TOKEN' 
}