2009-09-16 9 views
5

He estado trabajando en un cliente para google reader. Todo funciona bien, excepto que no puedo editar entradas para agregar etiquetas como "destacado" y "leído". Las instrucciones en code.google.com/p/pyrfeed/wiki/GoogleReaderAPI y www.niallkennedy.com/blog/2005/12/google-reader-api.html parecen estar desactualizadas. Lo que es más extraño es que he estado inspeccionando los datos POST que usa google e intentando replicarlos exactamente, pero aún no puedo hacer que funcionen. Lo más cerca que he venido es, por ejemplo, http://www.google.com/reader/api/0/edit-tag con datos POST a =/usuario/-/estado/com.google/starred & async = true & s = [feed] & i = [elemento] & T = [token ]¿Cómo marcar elementos leídos con google reader API?

Esto parece ser exactamente lo que hace Google, pero siempre obtengo el "Nombre del flujo inválido". ¿Algún consejo?

+0

¿Alguna actualización? Gracias. –

+0

Supongo que no ha autenticado su solicitud por lo que '/ user/-/state/...' da como resultado una respuesta de transmisión no válida. –

+0

¿Qué entorno estás usando para escribir la aplicación? Deberá asegurarse de estar (1) conectado y pasar la cookie SID a Google cuando realice las llamadas. (2) Asegúrese de que está codificando en URL los valores que coloca en la cadena url. –

Respuesta

3

No tengo una respuesta definitiva para usted, pero también estaba teniendo problemas con la API api/0/edit-tag y logré que funcionen.

Ya estaba usando otras partes de la API sin ningún problema (api/0/stream/items/ids, api/0/unread-count), pero este no funcionaba tan fácilmente.

Después de un tiempo, comencé inspeccionando las solicitudes enviadas a Google Reader por su interfaz web (usando las herramientas de desarrollo de Chrome), e hice un ejemplo codificado (puede usar este código y solo necesita cambiar los identificadores y transmisión por su cuenta, solo tenga cuidado de que tengan todos los prefijos necesarios: feed/for stream, y tag: google.com, 2005: reader/item/for id).

 String authToken = getGoogleAuthKey(); 
     // I use Jsoup for the requests, but you can use anything you 
     // like - for jsoup you usually just need to include a jar 
     // into your java project 
    Document doc = Jsoup.connect("http://www.google.com/reader/api/0/edit-tag") 
     .header("Authorization", _AUTHPARAMS + authToken) 
     .data(
        // you don't need the userid, the '-' will suffice 
       "a", "user/-/state/com.google/read", 
       "async", "true", 
       "s", "feed/http://www.gizmodo.com/index.xml", 
       "i", "tag:google.com,2005:reader/item/1a68fb395bcb6947", 
       "T", "//wF1kyvFPIe6JiyITNnMWdA" 
     ) 
     // I also send my API key, but I don't think this is mandatory 
     .userAgent("[YOUR_APP_ID_GOES_HERE].apps.googleusercontent.com") 
     .timeout(10000) 
     // don't forget the post! (using get() will not work) 
     .**post()**; 

Aquí está mi código final para el marcado de un elemento específico de una corriente como leer (el método translateToItemAtomId se utiliza para la conversión de los identificadores de enteros largos como devuelto por api/0/Secuencia/artículos/ids en el xml átomo ids aceptados por este API):

 String authToken = getGoogleAuthKey(); 
    Document doc = Jsoup.connect("http://www.google.com/reader/api/0/edit-tag") 
     .header("Authorization", _AUTHPARAMS + authToken) 
     .data(
       "a", "user/-/state/com.google/read", 
       "async", "true", 
       "s", stream, 
       "i", translateToItemAtomId(itemId), 
       "T", getGoogleToken(authToken) 
     ) 
     .userAgent("[YOUR_APP_ID_GOES_HERE].apps.googleusercontent.com") 
     .timeout(10000).post(); 

Algunos código adicional que pueda necesitar (basado en http://www.chrisdadswell.co.uk/android-coding-example-authenticating-clientlogin-google-reader-api/):

private static final String _AUTHPARAMS = "GoogleLogin auth="; 
private static final String _GOOGLE_LOGIN_URL = "https://www.google.com/accounts/ClientLogin"; 
private static final String _READER_BASE_URL = "http://www.google.com/reader/"; 
private static final String _API_URL = _READER_BASE_URL + "api/0/"; 
private static final String _TOKEN_URL = _API_URL + "token"; 
private static final String _USER_INFO_URL = _API_URL + "user-info"; 
private static final String _USER_LABEL = "user/-/label/"; 
private static final String _TAG_LIST_URL = _API_URL + "tag/list"; 
private static final String _EDIT_TAG_URL = _API_URL + "tag/edit"; 
private static final String _RENAME_TAG_URL = _API_URL + "rename-tag"; 
private static final String _DISABLE_TAG_URL = _API_URL + "disable-tag"; 
private static final String _SUBSCRIPTION_URL = _API_URL 
     + "subscription/edit"; 
private static final String _SUBSCRIPTION_LIST_URL = _API_URL 
     + "subscription/list"; 

public static String getGoogleAuthKey() throws IOException { 
    String _USERNAME = "[email protected]"; 
    String _PASSWORD = "USER_PASSWORD"; 

    Document doc = Jsoup 
      .connect(_GOOGLE_LOGIN_URL) 
      .data("accountType", "GOOGLE", "Email", _USERNAME, "Passwd", 
        _PASSWORD, "service", "reader", "source", 
        "[YOUR_APP_ID_GOES_HERE].apps.googleusercontent.com") 
      .userAgent("[YOUR_APP_ID_GOES_HERE].apps.googleusercontent.com") 
      .timeout(4000).post(); 

    // RETRIEVES THE RESPONSE TEXT inc SID and AUTH. We only want the AUTH 
    // key. 
    String _AUTHKEY = doc 
      .body() 
      .text() 
      .substring(doc.body().text().indexOf("Auth="), 
        doc.body().text().length()); 
    _AUTHKEY = _AUTHKEY.replace("Auth=", ""); 
    return _AUTHKEY; 
} 

// generates a token for edition, needed for edit-tag 
public static String getGoogleToken(String authToken) throws IOException { 
    Document doc = Jsoup.connect(_TOKEN_URL) 
      .header("Authorization", _AUTHPARAMS + getGoogleAuthKey()) 
      .userAgent("[YOUR_APP_ID_GOES_HERE].apps.googleusercontent.com") 
      .timeout(10000).get(); 

    // RETRIEVES THE RESPONSE TOKEN 
    String _TOKEN = doc.body().text(); 
    return _TOKEN; 
} 

Espero que esto ayude!

Cuestiones relacionadas