How to mark items read with google reader API?

戏子无情 提交于 2019-12-01 05:25:41

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();
        // 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 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();

    // 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!

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!