2009-09-16 16 views
5

Pracuję nad klientem dla czytnika Google. Wszystko działa dobrze, z tym wyjątkiem, że nie mogę edytować wpisów, aby dodać znaczniki, takie jak "oznaczony gwiazdką" i "odczytany". Instrukcje na stronie code.google.com/p/pyrfeed/wiki/GoogleReaderAPI i www.niallkennedy.com/blog/2005/12/google-reader-api.html wydają się być nieaktualne. Dziwne jest to, że sprawdzałem dane POST, których sam Google używa i próbuje dokładnie je skopiować, ale nadal nie mogę go uruchomić. Najbliższy, na który przyszedłem, to na przykład http://www.google.com/reader/api/0/edit-tag z danymi POST a =/user/-/state/com.google/oznaczony gwiazdką & async = true & s = [kanał] & i = [element] & T = [token ]Jak oznaczać elementy czytane za pomocą interfejsu API czytnika Google?

To wydaje się być dokładnie tym, co robi sam Google, ale wracam do "Nieprawidłowa nazwa strumienia". Jakakolwiek rada?

+0

jakieś aktualizacje? dzięki. –

+0

Domyślam się, że nie uwierzytelniłeś twojego żądania, więc '/ user/-/state/...' powoduje niepoprawną odpowiedź strumienia. –

+0

W jakim środowisku piszesz aplikację? Musisz upewnić się, że jesteś (1) zalogowany i przekazujesz ciasteczko SID z powrotem do Google podczas wykonywania połączeń. (2) Upewnij się, że kodujesz wartości, które umieszczasz w ciągu url. –

Odpowiedz

3

Nie mam dla ciebie ostatecznej odpowiedzi, ale miałem też problemy z interfejsem API api/0/edit-tag i udało mi się je uruchomić.

Już korzystałem z innych części interfejsu API bez żadnych problemów (api/0/stream/items/ids, api/0/unread-count), ale ten nie działał tak łatwo.

Po pewnym czasie zacząłem od sprawdzenia żądań wysłanych do Czytnika Google za pomocą ich interfejsu sieciowego (przy użyciu narzędzi do Chrome Chrome) i wykonałem zakodowany przykład (możesz użyć tego kodu i wystarczy zmienić identyfikatory i Strumień własny - po prostu pamiętaj, że ma on wszystkie potrzebne przedrostki: kanał/strumień i 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()**; 

Tu jest mój ostateczny kod do oznaczania konkretnego elementu ze strumienia jako przeczytane (metoda translateToItemAtomId służy do konwersji długie identyfikatory całkowite zwracanego przez api/0/potok/pozycje/numery do xml atomu Identyfikatory zaakceptowane przez tego 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(); 

Niektóre dodatkowy kod może trzeba (na podstawie 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; 
} 

nadzieję, że to pomaga!

Powiązane problemy