Learn how to import contacts from Gmail accounts using Java: https://blog.aspose.com/2022/03/24/import-gmail-contacts-in-java/
Last active
March 24, 2022 15:06
-
-
Save aspose-com-gists/4f01b0affc2beaa1c63b58c4716d67a2 to your computer and use it in GitHub Desktop.
Import Gmail Contact Programmatically in Java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.io.BufferedReader; | |
import java.io.IOException; | |
import java.io.InputStream; | |
import java.io.InputStreamReader; | |
import java.io.OutputStream; | |
import java.io.UnsupportedEncodingException; | |
import java.net.HttpURLConnection; | |
import java.net.URL; | |
import java.net.URLDecoder; | |
import java.net.URLEncoder; | |
import java.nio.charset.StandardCharsets; | |
import java.security.MessageDigest; | |
import java.security.NoSuchAlgorithmException; | |
import java.util.HashMap; | |
import java.util.Map; | |
import java.util.UUID; | |
import javax.xml.bind.DatatypeConverter; | |
/** | |
* <p> | |
* Developers console https://console.developers.google.com/projectselector/apis/credentials?pli=1 | |
* Documentation https://developers.google.com/identity/protocols/OAuth2InstalledApp | |
* </p> | |
*/ | |
class GoogleOAuthHelper { | |
public static final String AUTHORIZATION_URL = "https://accounts.google.com/o/oauth2/v2/auth"; | |
public static final String TOKEN_REQUEST_URL = "https://oauth2.googleapis.com/token"; | |
public static final String REDIRECT_URI = "urn:ietf:wg:oauth:2.0:oob"; | |
public static final String REDIRECT_TYPE = "code"; | |
public static final String SCOPE = "https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar" // Calendar | |
+ "+https%3A%2F%2Fwww.google.com%2Fm8%2Ffeeds%2F" // Contacts | |
+ "+https%3A%2F%2Fmail.google.com%2F"; // IMAP & SMTP | |
static String createCodeChalange() { | |
String verifierStr = UUID.randomUUID().toString() + "-" + UUID.randomUUID().toString(); | |
System.out.println("Code Verifier: " + verifierStr); | |
MessageDigest digest; | |
try { | |
digest = MessageDigest.getInstance("SHA-256"); | |
} catch (NoSuchAlgorithmException e) { | |
throw new IllegalAccessError(e.getMessage()); | |
} | |
byte[] hash = digest.digest(verifierStr.getBytes(StandardCharsets.UTF_8)); | |
String base64Hash = DatatypeConverter.printBase64Binary(hash); | |
base64Hash = base64Hash.split("=")[0]; | |
base64Hash = base64Hash.replace('+', '-').replace('/', '_'); | |
return base64Hash; | |
} | |
static String getAuthorizationCodeUrl(OAuthUser acc) { | |
return getAuthorizationCodeUrl(acc, SCOPE, REDIRECT_URI, REDIRECT_TYPE); | |
} | |
static String getAuthorizationCodeUrl(OAuthUser acc, String scope, String redirectUri, String responseType) { | |
System.out.println("---------------------------------------------------------"); | |
System.out.println("------------- OAuth 2.0 AuthorizationCodeUrl -------------"); | |
System.out.println("---------------------------------------------------------"); | |
System.out.println("Login: " + acc.email); | |
String codeChallenge = createCodeChalange(); | |
String state = urlEncode(UUID.randomUUID().toString()); | |
String approveUrl = AUTHORIZATION_URL + "?client_id=" + acc.clientId + "&redirect_uri=" + redirectUri + "&response_type=" + responseType + "&scope=" + scope | |
+ "&code_challenge=" + codeChallenge + "&code_challenge_method=S256&state=" + state; | |
System.out.println("Approve Url: " + approveUrl); | |
return approveUrl; | |
} | |
static String urlEncode(String value) { | |
try { | |
return URLEncoder.encode(value, StandardCharsets.UTF_8.toString()); | |
} catch (UnsupportedEncodingException e) { | |
throw new IllegalAccessError(e.getMessage()); | |
} | |
} | |
static String urlDecode(String value) { | |
try { | |
return URLDecoder.decode(value, StandardCharsets.UTF_8.toString()); | |
} catch (UnsupportedEncodingException e) { | |
throw new IllegalAccessError(e.getMessage()); | |
} | |
} | |
static String getAccessTokenByAuthCode(String authorizationCode, String codeVerifier, OAuthUser user) { | |
String encodedParameters = "client_id=" + urlEncode(user.clientId) + "&client_secret=" + urlEncode(user.clientSecret) + "&code=" + urlEncode(authorizationCode) | |
+ "&code_verifier=" + codeVerifier + "&redirect_uri=" + urlEncode(REDIRECT_URI) + "&grant_type=authorization_code"; | |
System.out.println("---------------------------------------------------------"); | |
System.out.println("------------- OAuth 2.0 AccessTokenByAuthCode -------------"); | |
System.out.println("---------------------------------------------------------"); | |
System.out.println("Authorization code: " + authorizationCode); | |
String result = ""; | |
Map<String, String> token = geToken(encodedParameters); | |
for (String key : token.keySet()) { | |
System.out.println(key + ": " + token.get(key)); | |
if (key.equals("refresh_token")) { | |
result = token.get(key); | |
} | |
} | |
System.out.println("---------------------------------------------------------"); | |
return result; | |
} | |
static String getAccessTokenByRefreshToken(OAuthUser user) { | |
String encodedParameters = "client_id=" + urlEncode(user.clientId) + "&client_secret=" + urlEncode(user.clientSecret) + "&refresh_token=" + urlEncode(user.refreshToken) | |
+ "&grant_type=refresh_token"; | |
System.out.println("---------------------------------------------------------"); | |
System.out.println("----------- OAuth 2.0 AccessTokenByRefreshToken -----------"); | |
System.out.println("---------------------------------------------------------"); | |
System.out.println("Login: " + user.email); | |
String result = ""; | |
Map<String, String> token = geToken(encodedParameters); | |
for (String key : token.keySet()) { | |
System.out.println(key + ": " + token.get(key)); | |
if (key.equals("access_token")) { | |
result = token.get(key); | |
} | |
} | |
System.out.println("---------------------------------------------------------"); | |
return result; | |
} | |
static Map<String, String> geToken(String encodedParameters) { | |
try { | |
HttpURLConnection connection = (HttpURLConnection) new URL(TOKEN_REQUEST_URL).openConnection(); | |
connection.setRequestMethod("POST"); | |
byte[] requestData = encodedParameters.getBytes(StandardCharsets.UTF_8); | |
connection.setUseCaches(false); | |
connection.setDoInput(true); | |
connection.setDoOutput(true); | |
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); | |
connection.setRequestProperty("Content-Length", "" + requestData.length); | |
final OutputStream st = connection.getOutputStream(); | |
try { | |
st.write(requestData, 0, requestData.length); | |
} finally { | |
st.flush(); | |
st.close(); | |
} | |
connection.connect(); | |
if (connection.getResponseCode() >= HttpURLConnection.HTTP_BAD_REQUEST) { | |
throw new IllegalAccessError("Operation failed: " + connection.getResponseCode() + "/" + connection.getResponseMessage() + "\r\nDetails:\r\n{2}" | |
+ readInputStream(connection.getErrorStream())); | |
} | |
String responseText = readInputStream(connection.getInputStream()); | |
Map<String, String> result = new HashMap<String, String>(); | |
System.out.println(responseText); | |
String[] strs = responseText.replace("{", "").replace("}", "").replace("\"", "").replace("\r", "").replace("\n", "").split(","); | |
for (String sPair : strs) { | |
String[] pair = sPair.split(":"); | |
String name = pair[0].trim().toLowerCase(); | |
String value = urlDecode(pair[1].trim()); | |
result.put(name, value); | |
} | |
return result; | |
} catch (IOException e) { | |
throw new IllegalAccessError(e.getMessage()); | |
} | |
} | |
static String readInputStream(InputStream is) { | |
if (is == null) | |
return ""; | |
BufferedReader reader = new BufferedReader(new InputStreamReader(is)); | |
StringBuilder result = new StringBuilder(); | |
String line; | |
try { | |
while ((line = reader.readLine()) != null) { | |
result.append(line); | |
} | |
} catch (IOException e) { | |
// ignore | |
} | |
return result.toString(); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
OAuthUser user = new OAuthUser(); | |
// Set clientId, clientSecret and email | |
user.clientId = "<<clientID>>"; | |
user.clientSecret = "<<clientSecret>>"; | |
user.email = "<<email>>"; | |
// You have to retrieve AuthorizationCode manually with generated AuthorizationCodeUrl | |
// Set authorizationCode | |
String authorizationCode = "<<authCode>>"; | |
// Copy Code Verifier from the previous step output | |
// Set codeVerifier | |
String codeVerifier = "<<codeVerifier>>"; | |
// Get Refresh Token | |
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user); | |
user.refreshToken = refreshToken; | |
// Get Access Token | |
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user); | |
// Use Access Token in API | |
IGmailClient client = GmailClient.getInstance(accessToken, user.email); | |
// Fetch contacts from a specific group | |
ContactGroupCollection groups = client.getAllGroups(); | |
GoogleContactGroup group = null; | |
for (GoogleContactGroup g : groups) { | |
if ("TestGroup".equals(g.getTitle())) { | |
group = g; | |
} | |
} | |
// Retrieve contacts from the Group | |
if (group != null) { | |
Contact[] contacts2 = client.getContactsFromGroup(group.getId()); | |
for (Contact con : contacts2) | |
System.out.println(con.getDisplayName() + "," + con.getEmailAddresses().get_Item(0).toString()); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
OAuthUser user = new OAuthUser(); | |
// Set clientId, clientSecret and email | |
user.clientId = "<<clientID>>"; | |
user.clientSecret = "<<clientSecret>>"; | |
user.email = "<<email>>"; | |
// You have to retrieve AuthorizationCode manually with generated AuthorizationCodeUrl | |
// Set authorizationCode | |
String authorizationCode = "<<authCode>>"; | |
// Copy Code Verifier from the previous step output | |
// Set codeVerifier | |
String codeVerifier = "<<codeVerifier>>"; | |
// Get Refresh Token | |
String refreshToken = GoogleOAuthHelper.getAccessTokenByAuthCode(authorizationCode, codeVerifier, user); | |
user.refreshToken = refreshToken; | |
// Get Access Token | |
String accessToken = GoogleOAuthHelper.getAccessTokenByRefreshToken(user); | |
// Use Access Token in API | |
IGmailClient client = GmailClient.getInstance(accessToken, user.email); | |
Contact[] contacts = client.getAllContacts(); | |
for (Contact contact : contacts) | |
System.out.println(contact.getDisplayName() + ", " + contact.getEmailAddresses().get_Item(0)); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class OAuthUser { | |
String email; | |
String clientId; | |
String clientSecret; | |
String refreshToken; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment