2009-09-16 4 views
5

J'ai travaillé sur un client pour google reader. Tout fonctionne bien, sauf que je ne peux pas modifier les entrées pour ajouter des balises telles que "étoilé" et "lire". Les instructions sur code.google.com/p/pyrfeed/wiki/GoogleReaderAPI et www.niallkennedy.com/blog/2005/12/google-reader-api.html semblent être obsolètes. Ce qui est plus étrange, c'est que j'ai inspecté les données POST que Google utilise lui-même et que je tente de reproduire exactement, mais je n'arrive toujours pas à le faire fonctionner. Le plus proche que je suis venu est, par exemple, http://www.google.com/reader/api/0/edit-tag avec des données POST a =/utilisateur/-/état/com.google/starré & async = vrai & s = [flux] & i = [élément] & T = [jeton ]Comment marquer des éléments lus avec google reader API?

Cela semble être exactement ce que google lui-même fait, mais je reçois toujours "nom de flux invalide." Aucun conseil?

+0

des mises à jour? Merci. –

+0

Je suppose que vous n'avez pas authentifié votre requête, donc '/ user/-/state/...' aboutit à une réponse de flux invalide. –

+0

Quel environnement utilisez-vous pour écrire l'application? Vous devez vous assurer que vous êtes (1) connecté et que vous transmettez le cookie SID à Google lors des appels. (2) Assurez-vous d'encoder en url les valeurs que vous placez dans la chaîne url. –

Répondre

3

Je n'ai pas de réponse définitive pour vous, mais j'avais aussi des problèmes avec l'API api/0/edit-tag et j'ai réussi à les faire fonctionner.

J'utilisais déjà d'autres parties de l'API sans aucun problème (api/0/flux/items/ids, api/0/non-compte), mais celui-ci ne fonctionnait pas aussi facilement. Après un certain temps, j'ai commencé par inspecter les demandes envoyées à Google Reader par leur interface Web (en utilisant les outils de développement Chrome), et j'ai pris un exemple codé en dur (vous pouvez utiliser ce code et stream pour toi - fais juste attention à ce qu'ils aient tous les préfixes nécessaires: feed/for stream, et 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()**; 

Voici mon code final pour le marquage d'un élément spécifique d'un flux comme suit (la méthode translateToItemAtomId est utilisée pour convertir les longues ids entiers comme retourné par api/0/flux/pièce/ids dans l'atome xml ids acceptés par cette 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(); 

code supplémentaire vous pouvez avoir besoin (basé sur 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; 
} 

Hope this helps!

Questions connexes