新的起点 新的开始

快乐生活 !

实现从MSN Yahoo和Google导出用户联系人信息系列(4)—从Yahoo导出用户联系人(Step by Step) Setp 2 简单实现

     接上节,在上节中,我们申请了自己的域名,并且在Yahoo Developer上将该域名注册得到了Oauth中的Consumer Key和Consumer secret,在这节里,我们将实现从Yahoo导出用户联系人信息。
     首先准备本地的环境,1. 安装最新的Tomcat 当然其他的Servlert容器都可以 http 端口改为80。2 修改本地的C:\Windows\System32\drivers\etc\hosts 文件, 添加 127.0.0.1      advincenting.appspot.com(修改成你申请的域名)。
     第一步:调用 Yahoo的 get_request_token 代码如下:
    
 1     String key = "dj0yJmk9QTVZcVN4QmVFYUlRJmQ9WVdrOU5uVnpZa3BxTXpZbWNHbzlOakEyTURRek1Ua3gmcz1jb25zdW1lcnNlY3JldCZ4PTQ3";// 这里是你注册Yahoo 返回的consumer Key
 2     String secret = "2e8ac43ec5a506162a13acda0536d031cf94a9b4";";// 这里是你注册Yahoo 返回的consumer secret
 4     String callback = "http://advincenting.appspot.com/delauth/threelegged/yahoo.jsp";
 5     String loginUrl ="";
 6     String guid ="";
 7     Map get_request_token = null;
 8     String oauth_token_secret =(String)session.getAttribute(TOKENSECRET);
 9     String oauthToken  =(String)session.getAttribute(TOKEN);
10     session.removeAttribute(TOKENSECRET) ;
11     session.removeAttribute(TOKEN) ;
12    System.out.println("@@@@@@@@@@@@@@@@@@@@@@@"+oauthToken);
13    String oauth_verifier = (String) request.getParameter("oauth_verifier");
14    String oauth_token_request = (String) request.getParameter("oauth_token");
15    String oauth_token4Setup4 ="";
16    String oauth_token_secret_4Setup4 ="";
17   ArrayList email = new ArrayList();
18     if(oauthToken==null||oauthToken.equals("")){
19          get_request_token = new HashMap();
20        String reqUrl = 
21            "https://api.login.yahoo.com/oauth/v2/" + "get_request_token?" + 
22            "oauth_nonce=" + new Random().nextInt() + "&oauth_timestamp=" + 
23            ((int)(System.currentTimeMillis() / 1000)) + 
24            "&oauth_consumer_key=" + key + 
25            "&oauth_signature_method=plaintext" + "&oauth_signature=" + 
26            secret + "%26"  + "&oauth_version=1.0"+
27        "&oauth_callback=http://advincenting.appspot.com/delauth/threelegged/yahoo.jsp"
28            ;
29
30        System.out.println("##############################                          setup1:     "+reqUrl);
31        HttpClient client = new HttpClient();
32        GetMethod getm = new GetMethod(reqUrl);
33        String returnStr ="";
34
35        try {
36            client.executeMethod(getm);
37            returnStr= getm.getResponseBodyAsString();
38        }
 catch (HttpException e) {
39            // TODO
40        }
 catch (IOException e) {
41            // TODO
42        }

43        
44        String resp = returnStr;
45        StringTokenizer st = new StringTokenizer(resp, "&");
46        while (st.hasMoreTokens()) {
47            String token = st.nextToken();
48            get_request_token.put(token.substring(0, token.indexOf("=")), 
49                                  token.substring(token.indexOf("="+ 1
50                                                  token.length()));
51        }

52        System.out.println("Map got : " + get_request_token);
53              loginUrl =
54           URLDecoder.decode((String)get_request_token.get("xoauth_request_auth_url")) + 
55           "&oauth_callback=" + callback;
56
57          String oauthTokenTemp =  (String) get_request_token.get("oauth_token");
58          String oauth_token_secretTemp=  (String) get_request_token.get("oauth_token_secret");
59        System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%setup2:           "+loginUrl);
通过第一步的调用我们就得到了 loginURL。然后我们可以让用户点击该Link 跳转到Yahoo登陆页面   <a href="<%= loginUrl %>">Sign in</a>
 第二步:当用户登陆成功后,由于我们配置了CallBack URL 所有Yahoo会跳转到该JSP, 跳转回来 我们在调用 getToken API 获得Token 后就可以调用 getContact了
 
 1    if(oauthToken!=null&&!oauthToken.equals("")){
 2       Map accessMap = new HashMap();
 3       String accUrl = "https://api.login.yahoo.com/oauth/v2/get_token?"
 4        + "&oauth_consumer_key=" + key
 5        + "&oauth_signature_method=plaintext" + "&oauth_signature="
 6        +secret + "%26"  +oauth_token_secret  + "&oauth_version=1.0" + "&oauth_nonce="
 7        + new Random().nextInt() + "&oauth_timestamp="
 8        + ((int) (System.currentTimeMillis() / 1000)) + "&oauth_token="
 9        + oauthToken+"&oauth_verifier="
10        + oauth_verifier;
11        //System.out.println("oauth_verifier"+oauth_verifier);
12        HttpClient client = new HttpClient();
13        GetMethod getm = new GetMethod(accUrl);
14         System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%setup3:           "+accUrl);
15        try {
16            client.executeMethod(getm);
17            byte[] responseBody = getm.getResponseBody();
18              System.out.println(new String(responseBody));
19          returnStr2 =  URLDecoder.decode(new String(responseBody));
20            //returnStr2= getm.getResponseBodyAsString();
21        }
 catch (HttpException e) {
22            // TODO
23        }
 catch (IOException e) {
24            // TODO
25        }

26        
27        String resp =returnStr2;
28        //System.out.println(resp);
29        StringTokenizer st = new StringTokenizer(resp, "&");
30        while (st.hasMoreTokens()) {
31            String token = st.nextToken();
32            accessMap.put((String)token.substring(0, token.indexOf("=")), (String)token.substring(token.indexOf("="+ 1, token.length()));
33        }

34        System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"+accessMap);
35         guid = (String)accessMap.get("xoauth_yahoo_guid");
36       // System.out.println("guid"+guid);
37            oauth_token4Setup4 =(String)accessMap.get("oauth_token");
38        oauth_token_secret_4Setup4 =(String)accessMap.get("oauth_token_secret");
     第三步, 从上步,我们的到了 Token 和guid, 就可以调用getConttact API了


 1    if(guid!=null&&!guid.equals("")){
 2
 3        //String guidGetContact = "F2YX2QFU7D46NA6IWQBKT5DVMA";  //TODO replace to the real guid
 4          String resourceURL = "http://social.yahooapis.com/v1/user/"+ guid+"/contacts";
 5          List<Map.Entry<String, String>> parameters2 = new ArrayList<Map.Entry<String, String>>();
 6                parameters2.add(new OAuth.Parameter(
 7                      OAuth.OAUTH_SIGNATURE_METHOD,"HMAC-SHA1"));
 8                OAuthClient client = new OAuthClient(new HttpClient4());    
 9                OAuthConsumer consumer = new OAuthConsumer(
10                  null,
11               key,
12               // consumer key
13               secret, // consumer secret
14               new OAuthServiceProvider(
15               //
16               "https://api.login.yahoo.com/oauth/v2/get_request_token"//
17               "https://api.login.yahoo.com/oauth/v2/request_auth"//
18               "https://api.login.yahoo.com/oauth/v2/get_token"));
19                OAuthAccessor  accessor = new OAuthAccessor(consumer);
20                accessor.accessToken = oauth_token4Setup4;
21                accessor.tokenSecret = oauth_token_secret_4Setup4;
22                String httpMethod = OAuthMessage.GET;
23                OAuthMessage os =  client.invoke(accessor, httpMethod , resourceURL, parameters2);
24                System.out.println("os==========" + os);
25                System.out.println("os==========" + os.URL);
26                HttpClient client4Invoke = new HttpClient();
27                GetMethod getm = new GetMethod(os.URL);
28        try {
29            client4Invoke.executeMethod(getm);
30            byte[] responseBody = getm.getResponseBody();
31            
32            File outFile = new File("d:\\testYahoo.xml");
33            FileOutputStream fops = new FileOutputStream(outFile); 
34            fops.write(responseBody); 
35            fops.close();
36
37          returnStrContact =  URLDecoder.decode(new String(responseBody));
38            //returnStr2= getm.getResponseBodyAsString();
39            System.out.println(returnStrContact);
40        }
 catch (HttpException e) {
41            // TODO
42        }
 catch (IOException e) {
43            // TODO
44        }
finally{
45        
46        }

47        
      第四步,解析返回的XML格式的Contact

 

 1            
 2           SAXReader saxReader = new SAXReader();
 3
 4            Document document = null;
 5                document = saxReader.read(new File("d:\\testYahoo.xml"));
 6            Element root = document.getRootElement();
 7            int num = -1;
 8            for (Iterator iter = root.elementIterator(); iter.hasNext(); ) {
 9                Element element = (Element)iter.next();
10                num++;
11                System.out.println(element.elements("fields").size());
12                List contactList = element.elements("fields");
13                for(int i =0; i<contactList.size();i++){
14
15                  Element elementTemp = (Element)contactList.get(i);
16                       if( elementTemp.element("type").getTextTrim().equals("email")){
17                           System.out.println(elementTemp.element("value").getTextTrim());
18                           email.add(elementTemp.element("value").getTextTrim());
19                       }
;
20                       
21
22           
23
24                    }

25                
26                }

27      System.out.println(email.size());        
28

结果如下:
Setup 1:调用get_request_token  得到 loginURL 用户点击登陆

2. 登陆


3. 授权访问

4. CallBack到我们的JSP 然后调用getToken 得到Token和guid, 继续调用getContact API 获得Email等相关信息



     从Yahoo导出用户联系简单的例子就完成了,后续章节里我们将继续讨论MSN Google的实现。在最后我们将重新设计集成从这三个站点导出联系人的实现。 完整例子下载  
     下载完整的例子到你本地,仅仅修改你本地host的文件就Ok了。



posted on 2010-01-07 22:55 advincenting 阅读(3272) 评论(3)  编辑  收藏

评论

# re: 实现从MSN Yahoo和Google导出用户联系人信息系列(4)—从Yahoo导出用户联系人(Step by Step) Setp 2 简单实现 2010-01-08 12:32 乐蜂网精油

速度飞快的是开发  回复  更多评论   

# re: 实现从MSN Yahoo和Google导出用户联系人信息系列(4)—从Yahoo导出用户联系人(Step by Step) Setp 2 简单实现 2010-01-13 17:47 oyxz

google支持,但是msn好象暂时还不支持oauth验证功能.  回复  更多评论   

# re: 实现从MSN Yahoo和Google导出用户联系人信息系列(4)—从Yahoo导出用户联系人(Step by Step) Setp 2 简单实现 2013-01-08 23:10 nooneyanghui

OAuthMessage os = client.invoke(accessor, httpMethod , resourceURL, parameters2);这里的资源怎么释放掉,我看了这个方法的源代码没有释放资源的方法,求指教  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

公告

Locations of visitors to this page

导航

<2010年1月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

统计

常用链接

留言簿(13)

随笔分类(71)

随笔档案(179)

文章档案(13)

新闻分类

IT人的英语学习网站

JAVA站点

优秀个人博客链接

官网学习站点

生活工作站点

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜