I don't have a definitive answer for you, but I was also having some trouble with the API api/0/edit-tag and managed to get them working.
I was already using other parts of the API without any trouble (api/0/stream/items/ids, api/0/unread-count), but this one was not working as easily.
After a while, I started over by inspecting the requests sent to Google Reader by their web frontend (using Chrome dev tools), and made an hardcoded example (you can use this code and you just need to change the ids and stream for you own - just be careful that they have all the needed prefixes: feed/ for stream, and tag:google.com,2005:reader/item/ for id).
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", "feed/http://www.gizmodo.com/index.xml",
"i", "tag:google.com,2005:reader/item/1a68fb395bcb6947",
"T", "//wF1kyvFPIe6JiyITNnMWdA"
)
.userAgent("[YOUR_APP_ID_GOES_HERE].apps.googleusercontent.com")
.timeout(10000)
.**post()**;
Here is my final code for marking a specific item from a stream as read (the translateToItemAtomId method is used for converting the long integer ids as returned by api/0/stream/items/ids into the atom xml ids 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();
Some extra 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();
String _AUTHKEY = doc
.body()
.text()
.substring(doc.body().text().indexOf("Auth="),
doc.body().text().length());
_AUTHKEY = _AUTHKEY.replace("Auth=", "");
return _AUTHKEY;
}
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();
String _TOKEN = doc.body().text();
return _TOKEN;
}
Hope this helps!
/user/-/state/...
results in invalid stream response. – Ali Shakiba