How to mark items read by google reader API?

I am working on a client for Google Reader. Everything works fine, except that I cannot edit entries to add tags, such as tagged and read. The instructions on code.google.com/p/pyrfeed/wiki/GoogleReaderAPI and www.niallkennedy.com/blog/2005/12/google-reader-api.html seem deprecated. What's even weirder is that I checked the POST data that Google itself uses and tries to reproduce it accurately, but I still can't get it to work. The closest I came, for example, http://www.google.com/reader/api/0/edit-tag with POST data a = / user / - / state / com.google / played the main role & asynchronous = true & s = [filing] & r = [paragraph] & T = [token]

This seems to be exactly what Google itself does, but I always get back to the "Invalid Stream Name". Any tips?

+5
google-reader
source share
1 answer

I don't have a final answer for you, but I also had problems with the api / 0 / edit-tag API and managed to get them working.

I already used the other parts of the API (api / 0 / stream / items / ids, api / 0 / uncread-count) without any problems, but this process did not work so easily.

After some time, I started by checking the requests sent to Google Reader via their web interface (using Chrome dev tools), and made hard code (you can use this code, and you just need to change the identifiers and the stream for yourself - be careful that they have all the necessary prefixes: feed / for stream and 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()**; 

Here is my last code for marking a specific element from a stream as read (the translateToItemAtomId method is used to convert long integer identifiers returned by api / 0 / stream / items / ids to atom xml identifiers accepted by this 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(); 

Additional code you may need (based on 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 = "USER_EMAIL@gmail.com"; 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!

+3
source share

All Articles