2014-09-17 6 views
13

मैं शर्मिंदा हूँ कि मैं बस कोड का एक उदाहरण टुकड़े के साथ नाकाम रहने रहा हूँ, लेकिन मैं इस तथ्य है कि यह देर हो चुकी है पर यह दोष देंगे ...GmailApiQuickstart -

मैं एक प्रति और का पेस्ट ले लिया है: https://developers.google.com/gmail/api/quickstart/quickstart-java और डाउनलोड क्लाइंट लाइब्रेरी: https://code.google.com/p/google-api-java-client/ और https://developers.google.com/api-client-library/java/apis/gmail/v1

जब मैं नमूना चलाने के लिए, मैं निम्नलिखित अपवाद:

Exception in thread "main" java.lang.IllegalArgumentException 
    at com.google.api.client.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:76) 
    at com.google.api.client.util.Preconditions.checkArgument(Preconditions.java:37) 
    at com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets.getDetails(GoogleClientSecrets.java:82) 
    at com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow$Builder.<init>(GoogleAuthorizationCodeFlow.java:195) 
    at com.emailreply.musterion.GmailApiQuickstart.main(GmailApiQuickstart.java:40) 

Googling, मैं एक साधारण उत्तर नहीं मिलता है, तो एक मैं मूर्खता या पुस्तकालय गायब/गलत मानते हैं।

मैं उन्हें है के रूप में पुस्तकालय हैं:

/libs/commons-logging-1.1.1.jar 
/libs/google-api-client-1.19.0.jar 
/libs/google-api-client-android-1.19.0.jar 
/libs/google-api-client-appengine-1.19.0.jar 
/libs/google-api-client-gson-1.19.0.jar 
/libs/google-api-client-jackson2-1.19.0.jar 
/libs/google-api-client-java6-1.19.0.jar 
/libs/google-api-client-servlet-1.19.0.jar 
/libs/google-http-client-1.19.0.jar 
/libs/google-http-client-android-1.19.0.jar 
/libs/google-http-client-appengine-1.19.0.jar 
/libs/google-http-client-gson-1.19.0.jar 
/libs/google-http-client-jackson2-1.19.0.jar 
/libs/google-http-client-jdo-1.19.0.jar 
/libs/google-oauth-client-1.19.0.jar 
/libs/google-oauth-client-appengine-1.19.0.jar 
/libs/google-oauth-client-java6-1.19.0.jar 
/libs/google-oauth-client-jetty-1.19.0.jar 
/libs/google-oauth-client-servlet-1.19.0.jar 
/libs/gson-2.1.jar 
/libs/httpclient-4.0.1.jar 
/libs/httpcore-4.0.1.jar 
/libs/jackson-core-2.1.3.jar 
/libs/jdo2-api-2.3-eb.jar 
/libs/jetty-6.1.26.jar 
/libs/jetty-util-6.1.26.jar 
/libs/jsr305-1.3.9.jar 
/libs/transaction-api-1.1.jar 
google-api-services-gmail-v1-rev10-1.19.0.jar 

उदाहरण ऊपर उल्लेख किया है: कोई अन्य कारण से

new BufferedReader(new InputStreamReader(GmailApiQuickstart.class.getResourceAsStream(CLIENT_SECRET_PATH))) 

:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.Arrays; 
import java.util.List; 

import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; 
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; 
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; 
import com.google.api.client.googleapis.auth.oauth2.GoogleOAuthConstants; 
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.JsonFactory; 
import com.google.api.client.json.jackson2.JacksonFactory; 
import com.google.api.services.gmail.Gmail; 
import com.google.api.services.gmail.model.ListThreadsResponse; 
import com.google.api.services.gmail.model.Thread; 


public class GmailApiQuickstart { 

    // Check https://developers.google.ciom/gmail/api/auth/scopes for all available scopes 
    private static final String SCOPE = "https://www.googleapis.com/auth/gmail.readonly"; 
    private static final String APP_NAME = "Gmail API Quickstart"; 
    // Email address of the user, or "me" can be used to represent the currently authorized user. 
    private static final String USER = "me"; 
    // Path to the client_secret.json file downloaded from the Developer Console 
    private static final String CLIENT_SECRET_PATH = "./client_secret.json"; 


    public static void main (String [] args) throws IOException { 
    HttpTransport httpTransport = new NetHttpTransport(); 
    JsonFactory jsonFactory = new JacksonFactory(); 

    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(jsonFactory, new BufferedReader(new InputStreamReader(GmailApiQuickstart.class.getResourceAsStream(CLIENT_SECRET_PATH)))); 

    // Allow user to authorize via url. 
    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
     httpTransport, jsonFactory, clientSecrets, Arrays.asList(SCOPE)) 
     .setAccessType("online") 
     .setApprovalPrompt("auto").build(); 

    String url = flow.newAuthorizationUrl().setRedirectUri(GoogleOAuthConstants.OOB_REDIRECT_URI).build(); 


    System.out.println("Please open the following URL in your browser then type the authorization code:\n" + url); 

    // Read code entered by user. 
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
    String code = br.readLine(); 

    // Generate Credential using retrieved code. 
    GoogleTokenResponse response = flow.newTokenRequest(code) 
     .setRedirectUri(GoogleOAuthConstants.OOB_REDIRECT_URI).execute(); 
    GoogleCredential credential = new GoogleCredential() 
     .setFromTokenResponse(response); 

    // Create a new authorized Gmail API client 
    Gmail service = new Gmail.Builder(httpTransport, jsonFactory, credential) 
     .setApplicationName(APP_NAME).build(); 

    // Retrieve a page of Threads; max of 100 by default. 
    ListThreadsResponse threadsResponse = service.users().threads().list(USER).execute(); 
    List<Thread> threads = threadsResponse.getThreads(); 

    // Print ID of each Thread. 
    for (Thread thread : threads) { 
     System.out.println("Thread ID: " + thread.getId()); 
    } 
    } 

} 

मैं साथ CLIENT_SECRET_PATH के संदर्भ में जगह ले ली कुछ अलग करने की कोशिश करने के बजाय। यह काम करता है और फ़ाइल को सही ढंग से पढ़ता है।

कोई विचार?

उत्तर

45

कुछ और शोध (एक सहयोगी/प्रतिभा पूछने के बाद), मुझे समस्या मिली। मूल रूप से GoogleClientSecrets ऑब्जेक्ट को मेरी client_secrets.json फ़ाइल से जानकारी के साथ ठीक से बाध्य नहीं किया जा रहा था। इसका मतलब था कि प्रमाणीकरण के दौरान, वस्तुओं null थे जिसके परिणामस्वरूप IllegalArgumentException था।

तो मूल फ़ाइल जो इस तरह देखा:

{ 
     "private_key_id": "zzz", 
     "private_key": "-----BEGIN PRIVATE KEY-----\nxyz\n-----END PRIVATE KEY-----\n", 
     "client_email": "[email protected]", 
     "client_id": "1wdfghyjmp.apps.googleusercontent.com", 
     "type": "service_account" 
} 

इस तरह देखने के लिए संपादित किया गया था:

{ 
    "web" : { 
     "private_key_id": "zzz", 
     "private_key": "-----BEGIN PRIVATE KEY-----\nxyz\n-----END PRIVATE KEY-----\n", 
     "client_email": "[email protected]", 
     "client_id": "1wdfghyjmp.apps.googleusercontent.com", 
     "type": "service_account" 
    } 
} 

यह मैं प्रमाणीकरण के साथ कोड के माध्यम से प्रगति करने की अनुमति दी।

उम्मीद है कि इससे मदद मिलती है।

+0

हां, बेहद सहायक। धन्यवाद! –

+2

Exxxxtremelyyy helpul ... धन्यवाद! आपने यह कैसे खोजा? मेरा मतलब है, यह "वेब" हल क्यों कर रहा है। –

+2

इसी तरह की समस्या। मूल फ़ाइल "कंसोल अकाउंट" के साथ Google कंसोल पर जेनरेट की गई थी। जेसन फ़ाइल में "वेब" तत्व नहीं है और प्रवाह बाल्क का निर्माण नहीं है। "सेवा खाते" के बजाय "वेब" का उपयोग करके प्रमाण-पत्रों को पुन: उत्पन्न करने से "वेब" और "प्रवाह" निर्मित संरचना शामिल है। – Glenn

2

यहाँ गूगल Non-interactive authorization with Google OAuth2 के लिए गैर-सहभागी प्रमाणन की एक काम उदाहरण समस्या ग्राहक json में "वेब" टैग में नहीं है, बल्कि तथ्य यह है कि उनके उदाहरण वेब प्रमाणीकरण के लिए है जबकि पैदा करने के अपने द्वारा सुझाए गए रास्ते प्रमाण-पत्र गैर-इंटरैक्टिव "सेवा खाता" के लिए है। उनके दस्तावेज के साथ उन्हें कई समस्याएं हैं।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^