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

实现从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了。



你可能感兴趣的:(实现从MSN Yahoo和Google导出用户联系人信息系列(4)—从Yahoo导出用户联系人(Step by Step) Setp 2 简单实现)