2016-05-13 15 views
2

Also das ist meine erste Frage zu StackOverflow, also lass es mich wissen, wenn ich etwas vernachlässigt habe!Blogger API Beispielcode

Ich versuche, Blog-Post-Daten aus öffentlichen Blogger-Blogs für einige Sprachanalyse-Forschung, die ich mache, zu bekommen. Obwohl die Java-API recht einfach zu sein scheint, habe ich festgestellt, dass Googles Codebeispiel unter https://developers.google.com/blogger/docs/3.0/reference/posts/list#examples nicht funktioniert, da viele Abhängigkeiten fehlen, die von LocalServerReceiver() bis zu einer ganzen Reihe von Abhängigkeiten reichen, die für OAuthorization benötigt werden. Der API-Explorer funktioniert gut, aber offensichtlich brauche ich etwas für meinen eigenen Code.

Ich habe auch versucht, Codefragmente aus anderen StackOverflow-Fragen zu verwenden, die meiner Ansicht nach ähnlich waren und immer noch mit Abhängigkeitsproblemen konfrontiert sind.

Hier ist eine Liste von einigen der Fragen, die ich angeschaut habe, die mein Problem nicht gelöst haben aufgrund irgendeiner Art von Code deprecation:

Ich habe den OAuthPlayground verwendet Holen Sie sich einen Autorisierungscode, und habe versucht, einige der Funktionen von iamkhova Lösung in Proper Form of API request to Blogger using Java/App Engine -error 401 zu replizieren. Beachte, dass ich nicht versuche, irgendwas in irgendeinen der Blogs zu schreiben, auf die ich zugreife. Ich möchte nur die Postdaten zur Analyse bekommen.

Zur Zeit habe ich gerade die Lösung von iamkhova geändert, indem ich den Logger weggenommen habe und eine getPosts() - Funktion hinzugefügt habe, die das, was ich brauche, aus dem Beispielcode von Google kopiert.

public class BlogHandler 
{ 
    static final String API_KEY = {My API Key}; 
    public Blogger blogger = null; 
    public Blog blog; 
    public java.util.List<Post> posts; 

    public BlogHandler() {} 

    public void executeGetBlogByUrl (String url) throws IOException { 
    GetByUrl request = blogger.blogs().getByUrl(url); 
    this.blog = request.setKey(API_KEY).execute(); 

    } 
    public void getPosts() throws IOException 
    { 
     List postsListAction = blogger.posts().list(this.blog.getId()); 

    // Restrict the result content to just the data we need. 
    postsListAction.setFields("items(author/displayName,content,published,title,url),nextPageToken"); 

    // This step sends the request to the server. 
    PostList posts = postsListAction.execute(); 

    // Now we can navigate the response. 
    int postCount = 0; 
    int pageCount = 0; 
    while (posts.getItems() != null && !posts.getItems().isEmpty()) { 
      for (Post post : posts.getItems()) { 
        System.out.println("Post #"+ ++postCount); 
        System.out.println("\tTitle: "+post.getTitle()); 
        System.out.println("\tAuthor: "+post.getAuthor().getDisplayName()); 
        System.out.println("\tPublished: "+post.getPublished()); 
        System.out.println("\tURL: "+post.getUrl()); 
        System.out.println("\tContent: "+post.getContent()); 
      } 

      // Pagination logic 
      String pageToken = posts.getNextPageToken(); 
      if (pageToken == null || ++pageCount >= 5) { 
        break; 
      } 
      System.out.println("-- Next page of posts"); 
      postsListAction.setPageToken(pageToken); 
      posts = postsListAction.execute(); 
    } 

    } 

    public void setupService() throws IOException { 

    AppIdentityCredential credential = null; 
    credential = new AppIdentityCredential(Arrays.asList(BloggerScopes.BLOGGER)); // Add your scopes here 
    this.blogger = new Blogger.Builder(new UrlFetchTransport(), new JacksonFactory(), credential).setApplicationName("chsBlogResearch").build(); 
    } 

} 

Derzeit bin ich mit den folgenden Fehler:

Exception in thread "main" com.google.apphosting.api.ApiProxy$CallNotFoundException: The API package 'memcache' or call 'Get()' was not found. 
    at com.google.apphosting.api.ApiProxy$1.get(ApiProxy.java:173) 
    at com.google.apphosting.api.ApiProxy$1.get(ApiProxy.java:171) 
    at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:89) 
    at com.google.appengine.api.memcache.MemcacheServiceImpl.quietGet(MemcacheServiceImpl.java:26) 
    at com.google.appengine.api.memcache.MemcacheServiceImpl.get(MemcacheServiceImpl.java:49) 
    at com.google.appengine.api.appidentity.AppIdentityServiceImpl.getAccessToken(AppIdentityServiceImpl.java:286) 
    at com.google.api.client.googleapis.extensions.appengine.auth.oauth2.AppIdentityCredential.intercept(AppIdentityCredential.java:98) 
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:859) 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419) 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352) 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469) 
    at BloggerData.BlogHandler.executeGetBlogByUrl(BlogHandler.java:29) 

Ein Klick auf die Codezeilen für beide Fehler in MemcacheServiceImpl und AppIdentityServiceImpl mir sagen, dass es keine Codezeilen an diesem Punkt. Ich verwende Maven in Eclipse für Abhängigkeiten.

Die einzige Sache, über die ich mich in diesem Code nicht wirklich sicher bin, ist die Idee von Bereichen, aber ich denke nicht, dass das meine Fehler verursachen sollte.

Ich würde mich über jede Idee zu diesem Thema freuen, da es viel zeitaufwendiger war, diese Postdaten zu bekommen, als ich dachte!

Update: getting strange exception trying to implement asynchronous http in google app engine for java lieferte ein wenig mehr Einblick in den Fehler oben. Anscheinend kann dieses ApiProxy-Jar nicht über eine Konsolen-App aufgerufen werden.

+0

Was übergeben Sie als URL an die Methode executeGetBlogByUrl()? – ManoDestra

+0

Momentan ist es nur eine zufällige Blog-URL (nicht meine, sondern nur eine für Testzwecke). Ich habe zuerst überprüft, ob es sich bei dem Blog tatsächlich um einen Blogger-Blog handelt. – tatertot

+0

ManoDestra, basierend auf Ihrer Frage, habe ich mich entschieden, eine bessere Test-URL zu testen (eine, die mir eigentlich gehört) - hier ist der Blog: https://chstesting.blogspot.com/. – tatertot

Antwort

1

Nicht wirklich eine super hilfreiche Antwort, aber es ist, was in meiner Situation funktioniert.

Der Google Java API-Client ist extrem veraltet, sodass ich stattdessen zum Google API-Python-Client wechselte, da er besser aktualisiert wird und OAuth tatsächlich im Python-Client funktioniert. Es befindet sich unter: https://github.com/google/google-api-python-client. Die Beispieldateien sind sehr nützlich und tatsächlich intuitiv.

Beachten Sie, dass die Java-API-Beispiele von Google alle aufgebrochen sind, zumindest auf der Blogger-Seite.

0

Von den mehreren Links, bekam ich die folgende eigenständige Java-Klasse für den Blogger API V3 WORKING (used API-Schlüssel und oauth2 Anmeldeinformationen). Obwohl ich das Token manuell von Request-URI auf der Konsole einfügen muss.

import java.io.BufferedReader; 
    import java.io.IOException; 
    import java.io.InputStreamReader; 
    import java.security.GeneralSecurityException; 
    import java.util.Arrays; 
    import java.util.List; 
    import org.apache.http.HttpResponse; 
    import org.apache.http.client.HttpClient; 
    import org.apache.http.client.methods.HttpPost; 
    import org.apache.http.entity.StringEntity; 
    import org.apache.http.impl.client.DefaultHttpClient; 
    import org.json.JSONException; 
    import org.json.JSONObject; 
    import com.google.api.client.auth.oauth2.Credential; 
    import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; 
    import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; 
    import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse; 
    import com.google.api.client.http.HttpTransport; 
    import com.google.api.client.http.javanet.NetHttpTransport; 
    import com.google.api.client.json.jackson2.JacksonFactory; 
    import com.google.api.services.blogger.BloggerScopes; 


    public class PostInsert { 
     private static final String REDIRECT_URI = "YOUR REDIRECT URI"; 
     private static final String CLIENT_SECRET = "YOUR CLIENT SECRET"; 
     private static final String CLIENT_ID = "YOUR CLIENT_ID"; 

     public static void main(String[] args) { 

      try { 
       HttpTransport HTTP_TRANSPORT = new NetHttpTransport(); 
       JacksonFactory JSON_FACTORY = new JacksonFactory(); 
       Credential credential = getCredentials(HTTP_TRANSPORT, JSON_FACTORY, Arrays.asList(BloggerScopes.BLOGGER)); 

       final JSONObject obj = new JSONObject(); 
       obj.put("id", "<enter your blogid>"); 

       final JSONObject requestBody = new JSONObject();     

       requestBody.put("title", "adding on 15feb 1.56pm"); 

       requestBody.put("content", "add this"); 

       final HttpPost request = new HttpPost("https://www.googleapis.com/blogger/v3/blogs/<enter your blogid>/posts?key=<enter your api key>"); 
       request.addHeader("Authorization", "Bearer " + credential.getAccessToken()); 
       request.addHeader("Content-Type", "application/json"); 
       HttpClient mHttpClient = new DefaultHttpClient(); 
       request.setEntity(new StringEntity(requestBody.toString())); 
       final HttpResponse response = mHttpClient.execute(request); 
       System.out.println(response.getStatusLine().getStatusCode() + " " + 
         response.getStatusLine().getReasonPhrase() 
         ); 
      } catch (JSONException | IOException | GeneralSecurityException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

      public static GoogleCredential getCredentials(HttpTransport httpTransport, JacksonFactory jacksonFactory, 
        List<String> scopes) throws IOException, GeneralSecurityException { 
       GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(httpTransport, jacksonFactory, 
         CLIENT_ID, CLIENT_SECRET, scopes).setAccessType("online").setApprovalPrompt("auto").build(); 
       String url = flow.newAuthorizationUrl().setRedirectUri(REDIRECT_URI).build(); 
       System.out.println("Please open the following URL in your " + "browser then type the authorization code:"); 
       System.out.println(" " + url); 
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
       String code = br.readLine(); 
       GoogleTokenResponse response = flow.newTokenRequest(code).setRedirectUri(REDIRECT_URI).execute(); 
       System.out.println("Response : " + response.toPrettyString()); 
       GoogleCredential credential = 
         new GoogleCredential.Builder() 
          .setTransport(httpTransport) 
          .setJsonFactory(jacksonFactory) 
          .setClientSecrets(CLIENT_ID, CLIENT_SECRET) 
          .build(); 
       credential.setAccessToken(response.getAccessToken()); 
       return credential; 
      }  
    }