2016-05-13 7 views
2

Итак, это мой первый вопрос в StackOverflow, поэтому, пожалуйста, дайте мне знать, есть ли что-то, к чему я пренебрег!Образец кода Blogger API

Я пытаюсь получить данные блога из общедоступных блогов Blogger для некоторых исследований анализа языка, которые я делаю. Хотя API-интерфейс java выглядит довольно прямолинейно, я обнаружил, что образец кода Google в https://developers.google.com/blogger/docs/3.0/reference/posts/list#examples не работает, так как существует много отсутствующих зависимостей, от LocalServerReceiver() до целого множества зависимостей, необходимых для OAuthorization. Исследователь API работает отлично, но, очевидно, мне нужно что-то для моего собственного кода.

Я также пытался использовать фрагменты кода из других вопросов StackOverflow, которые, как я видел, были похожи на мои, и я все еще сталкиваюсь с проблемами зависимости.

Вот список некоторых из вопросов, который я смотрел, которые не решить мою проблему из-за какого-то кода устаревания:

Я использовал OAuthPlayground для получить код авторизации и пытались воспроизвести некоторые функциональные возможности решения iamkhova в Proper Form of API request to Blogger using Java/App Engine -error 401. Обратите внимание, что я на самом деле не пытаюсь писать что-либо в любом из блогов, к которым я обращаюсь. Я просто хочу получить данные для анализа.

В настоящее время я только что изменил решение iamkhova, вытащив регистратор и добавив функцию getPosts(), которая дублирует то, что мне нужно от образца кода Google.

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

} 

В настоящее время у меня следующее сообщение об ошибке:

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) 

нажав на строки кода для обеих ошибок в MemcacheServiceImpl и AppIdentityServiceImpl сказать мне, что нет строк кода в этой точке. Я использую Maven в Eclipse для зависимостей.

Единственное, о чем я не уверен в этом коде, это идея областей, но я не думаю, что это должно было вызывать ошибки.

Я был бы признателен за любые идеи по этому поводу, поскольку получение этих данных было более трудоемким, чем я думал, что это будет!

Обновление: getting strange exception trying to implement asynchronous http in google app engine for java предоставил немного больше информации об ошибке выше. По-видимому, эту банку ApiProxy нельзя вызвать через консольное приложение.

+0

Что вы передаете как метод executeGetBlogByUrl()? – ManoDestra

+0

В настоящее время это всего лишь строка URL-адреса случайного блога (не мой, только один для целей тестирования). Я проверил, что блог на самом деле был блогером Blogger. – tatertot

+0

ManoDestra, по вашему вопросу, я решил попробовать лучший URL-адрес тестирования (тот, который на самом деле принадлежит мне) - вот блог: https://chstesting.blogspot.com/. – tatertot

ответ

1

Не очень полезный ответ, но это то, что в конечном итоге работает в моей ситуации.

Клиент Google Java API очень устарел, поэтому вместо этого я переключился на клиент Python API Google, так как он обновлен лучше, а OAuth фактически работает в клиенте Python. Он расположен по адресу: https://github.com/google/google-api-python-client. Файлы примеров очень полезны и на самом деле интуитивно понятны.

Обратите внимание, что образцы Java API Java сломаны, по крайней мере, на стороне Blogger.

0

Из нескольких ссылок у меня есть отдельный автономный класс Java WORKING для blogger api v3 (используются ключи api и учетные данные oauth2). Хотя я должен вручную вставить маркер из запроса uri на консоли.

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; 
      }  
    } 
Смежные вопросы