用了好长的时间终于把这些搞定,拿出来分享下。
Outlook 联系人 导出
Outlook导出主要使用了第三方的jar包,但是该第三方Java Outlook Connector需要购买,试用版是60天,如果是试用版的话每次运行会弹出对话框。下载的文件中提供了示例。
Yahoo 联系人 导出
Yahoo,linkedin,gmail等邮箱都遵循了oaut协议。所以我们可以通过这个协议得到联系人信息。此处我主要使用的jar包是由fernandezpablo85提供的jar包scribe来连接并认证得到联系人信息(参考https://github.com/fernandezpablo85/scribe-java)。
在该jar包中提供了一些示例,但是这些示例是建立在桌面程序上的,也就是需要用户手动得到验证码放回原处之后才能得到联系人信息。如果在web程序中可以跨过此步,也就是当用户同意导出联系人信息后可以直接得到这些信息。主要是在创建认证服务的时候添加一个方法callback("http://localhost:8080/complex"),这个方法是当用户同意授权并得到验证码后回调到的地址。这时候我的页面显示的地址是http://localhost:8080/complex/?oauth_token=kqvrdkz&oauth_verifier=eawvhc,通过这个地址我们可以得到验证码也就是oauth_verifier参数所传递的信息。通过这个验证码我们可以得到yahoo联系人的guid,然后再通过guid得到该用户的所有联系人。(详见示例)
Linkedin 联系人 导出
Linkedin主要流程和yahoo的流程大概一致,但是linkedin不需要得到guid,可以通过oauth_verifier直接得到用户的联系人。
这里需要注意的是在linkedin是需要指定返回的列名的。而不像yahoo可以通过一个地址得到联系人的所有属性。(详见示例)
Hotmail 联系人 导出
Hotmail需要得到你的授权码(delegationToken)和你需要操作的人的标志信息(locationid)。
通过hotmail提供的示例(参考http://msdn.microsoft.com/en-us/library/cc287672.aspx)可以得到如何得到上面的两个值。得到这两个值后可以拼装地址并得到需要的信息。
此处我用的方法不是scribe中提供的方法,我使用的是自己写的类Hotmail.java,主要利用java.net包得到hotmail联系人的xml输出流。(详见示例)
Gmail 联系人 导出
gmail除了遵循oauth以外还提供了较好的接口通过这些接口我们可以直接得到联系人的信息或者编辑,添加,删除等操作。
参考http://code.google.com/intl/zh-CN/apis/contacts/docs/3.0/developers_guide_java.html
以下是我的导出yahoo邮箱的代码
<%@ page language="java" import="com.gozap.util.*" import="com.gozap.cache.*" import="java.util.*" import="org.scribe.model.*" import="org.scribe.builder.api.*" import="org.scribe.builder.*" import="org.scribe.oauth.*" %>
<%@page import="com.google.gdata.util.common.base.StringUtil"%>
<%@page import="java.io.InputStream" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%
String key="your key";
String secret="your secret";
//String PROTECTED_RESOURCE_URL = "http://social.yahooapis.com/v1/user/";
String GUID_URL="http://social.yahooapis.com/v1/me/guid";
OAuthService service = new ServiceBuilder()
.provider(YahooApi.class)
.apiKey(key)
.apiSecret(secret).callback("http://localhost:8080/complex")
.build();
TokenCache cache=TokenCache.getInstance();
String username=(String)request.getAttribute("username");
username="test";
String verif=request.getParameter("oauth_verifier");
String requestTokenKey=request.getParameter("oauth_token");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<% if(StringUtil.isEmptyOrWhitespace(verif)||StringUtil.isEmptyOrWhitespace(requestTokenKey)){
// Obtain the Request Token
Token requestToken = service.getRequestToken();
String AUTHORIZE_URL = "https://api.login.yahoo.com/oauth/v2/request_auth?oauth_token="+requestToken.getToken();
cache.addRequestToken(username,requestToken);
%>
<script>
window.location="<%=AUTHORIZE_URL%>"
</script>
<% }else{
Verifier verifier = new Verifier(verif);
//get the guid
Token requestToken=cache.getRequestToken(username);
Token guidToken = service.getAccessToken(requestToken,verifier);
OAuthRequest requestGuid = new OAuthRequest(Verb.GET, GUID_URL);
service.signRequest(guidToken, requestGuid);
Response responseGuid = requestGuid.send();
InputStream guidCont=responseGuid.getStream();
//String guidCont=responseGuid.getBody();
//out.println(guidCont);
String guid=XmlParse.getGuid(guidCont);//解析xml文件得到guid的值
//out.println("guid================="+guid);
//-----
Token accessToken = service.getAccessToken(requestToken, verifier);
String PROTECTED_RESOURCE_URL = "http://social.yahooapis.com/v1/user/"+guid+"/contacts";
OAuthRequest requestContacts = new OAuthRequest(Verb.GET, PROTECTED_RESOURCE_URL);
service.signRequest(accessToken, requestContacts);
Response mailResponse = requestContacts.send();
//String outbody=mailResponse.getBody();
//out.println(outbody);
InputStream contactsCont=mailResponse.getStream();
XmlParse.writeToFile(contactsCont);//将得到的xml流写入到文件中
//out.println(contactsCont);
}%>
</body>
</html>
其中key,secret改成自己相应的东东,第17行的callback方法里面的地址改成你自己的地址。
hotmail
经过上面的介绍得到locationId和delegationToken后
String locationId="";
String delegationToken="";
URL u=new URL("https://livecontacts.services.live.com/users/@L@" + locationId + "/rest/invitationsbyemail?");
HttpURLConnection urlConnection = (HttpURLConnection)u.openConnection();
urlConnection.setRequestMethod( "GET" );
urlConnection.setRequestProperty( "Authorization" , "DelegatedToken dt=\"" + delegationToken + "\"" );
urlConnection.setDoInput( true );
urlConnection.setDoOutput( true );
urlConnection.setUseCaches( false );
urlConnection.connect();
BufferedReader inStream = new BufferedReader( new InputStreamReader(urlConnection.getInputStream()));
int end=inStream.read();
while(end>=0){
System.out.print((char)end);
end=inStream.read();
}
urlConnection.disconnect();
这样就可以得到对应的用户的联系人。
Outlook 联系人 导出
Outlook导出主要使用了第三方的jar包,但是该第三方Java Outlook Connector需要购买,试用版是60天,如果是试用版的话每次运行会弹出对话框。下载的文件中提供了示例。
Yahoo 联系人 导出
Yahoo,linkedin,gmail等邮箱都遵循了oaut协议。所以我们可以通过这个协议得到联系人信息。此处我主要使用的jar包是由fernandezpablo85提供的jar包scribe来连接并认证得到联系人信息(参考https://github.com/fernandezpablo85/scribe-java)。
在该jar包中提供了一些示例,但是这些示例是建立在桌面程序上的,也就是需要用户手动得到验证码放回原处之后才能得到联系人信息。如果在web程序中可以跨过此步,也就是当用户同意导出联系人信息后可以直接得到这些信息。主要是在创建认证服务的时候添加一个方法callback("http://localhost:8080/complex"),这个方法是当用户同意授权并得到验证码后回调到的地址。这时候我的页面显示的地址是http://localhost:8080/complex/?oauth_token=kqvrdkz&oauth_verifier=eawvhc,通过这个地址我们可以得到验证码也就是oauth_verifier参数所传递的信息。通过这个验证码我们可以得到yahoo联系人的guid,然后再通过guid得到该用户的所有联系人。(详见示例)
Linkedin 联系人 导出
Linkedin主要流程和yahoo的流程大概一致,但是linkedin不需要得到guid,可以通过oauth_verifier直接得到用户的联系人。
这里需要注意的是在linkedin是需要指定返回的列名的。而不像yahoo可以通过一个地址得到联系人的所有属性。(详见示例)
Hotmail 联系人 导出
Hotmail需要得到你的授权码(delegationToken)和你需要操作的人的标志信息(locationid)。
通过hotmail提供的示例(参考http://msdn.microsoft.com/en-us/library/cc287672.aspx)可以得到如何得到上面的两个值。得到这两个值后可以拼装地址并得到需要的信息。
此处我用的方法不是scribe中提供的方法,我使用的是自己写的类Hotmail.java,主要利用java.net包得到hotmail联系人的xml输出流。(详见示例)
Gmail 联系人 导出
gmail除了遵循oauth以外还提供了较好的接口通过这些接口我们可以直接得到联系人的信息或者编辑,添加,删除等操作。
参考http://code.google.com/intl/zh-CN/apis/contacts/docs/3.0/developers_guide_java.html
以下是我的导出yahoo邮箱的代码
<%@ page language="java" import="com.gozap.util.*" import="com.gozap.cache.*" import="java.util.*" import="org.scribe.model.*" import="org.scribe.builder.api.*" import="org.scribe.builder.*" import="org.scribe.oauth.*" %>
<%@page import="com.google.gdata.util.common.base.StringUtil"%>
<%@page import="java.io.InputStream" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%
String key="your key";
String secret="your secret";
//String PROTECTED_RESOURCE_URL = "http://social.yahooapis.com/v1/user/";
String GUID_URL="http://social.yahooapis.com/v1/me/guid";
OAuthService service = new ServiceBuilder()
.provider(YahooApi.class)
.apiKey(key)
.apiSecret(secret).callback("http://localhost:8080/complex")
.build();
TokenCache cache=TokenCache.getInstance();
String username=(String)request.getAttribute("username");
username="test";
String verif=request.getParameter("oauth_verifier");
String requestTokenKey=request.getParameter("oauth_token");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<% if(StringUtil.isEmptyOrWhitespace(verif)||StringUtil.isEmptyOrWhitespace(requestTokenKey)){
// Obtain the Request Token
Token requestToken = service.getRequestToken();
String AUTHORIZE_URL = "https://api.login.yahoo.com/oauth/v2/request_auth?oauth_token="+requestToken.getToken();
cache.addRequestToken(username,requestToken);
%>
<script>
window.location="<%=AUTHORIZE_URL%>"
</script>
<% }else{
Verifier verifier = new Verifier(verif);
//get the guid
Token requestToken=cache.getRequestToken(username);
Token guidToken = service.getAccessToken(requestToken,verifier);
OAuthRequest requestGuid = new OAuthRequest(Verb.GET, GUID_URL);
service.signRequest(guidToken, requestGuid);
Response responseGuid = requestGuid.send();
InputStream guidCont=responseGuid.getStream();
//String guidCont=responseGuid.getBody();
//out.println(guidCont);
String guid=XmlParse.getGuid(guidCont);//解析xml文件得到guid的值
//out.println("guid================="+guid);
//-----
Token accessToken = service.getAccessToken(requestToken, verifier);
String PROTECTED_RESOURCE_URL = "http://social.yahooapis.com/v1/user/"+guid+"/contacts";
OAuthRequest requestContacts = new OAuthRequest(Verb.GET, PROTECTED_RESOURCE_URL);
service.signRequest(accessToken, requestContacts);
Response mailResponse = requestContacts.send();
//String outbody=mailResponse.getBody();
//out.println(outbody);
InputStream contactsCont=mailResponse.getStream();
XmlParse.writeToFile(contactsCont);//将得到的xml流写入到文件中
//out.println(contactsCont);
}%>
</body>
</html>
其中key,secret改成自己相应的东东,第17行的callback方法里面的地址改成你自己的地址。
hotmail
经过上面的介绍得到locationId和delegationToken后
String locationId="";
String delegationToken="";
URL u=new URL("https://livecontacts.services.live.com/users/@L@" + locationId + "/rest/invitationsbyemail?");
HttpURLConnection urlConnection = (HttpURLConnection)u.openConnection();
urlConnection.setRequestMethod( "GET" );
urlConnection.setRequestProperty( "Authorization" , "DelegatedToken dt=\"" + delegationToken + "\"" );
urlConnection.setDoInput( true );
urlConnection.setDoOutput( true );
urlConnection.setUseCaches( false );
urlConnection.connect();
BufferedReader inStream = new BufferedReader( new InputStreamReader(urlConnection.getInputStream()));
int end=inStream.read();
while(end>=0){
System.out.print((char)end);
end=inStream.read();
}
urlConnection.disconnect();
这样就可以得到对应的用户的联系人。