1 多了不说,直接贴出相关部分的实现代码
  2
  3
  4
  5 加密部分实现:
  6
  7
  8
  9 package token.exe;
 10
 11 import java.math.BigInteger;
 12 import java.util.Random;
 13
 14 import org.apache.commons.codec.binary.Base64;
 15
 16 public class WeiboEncoder {
 17
 18     private static BigInteger n = null;
 19     private static BigInteger e = null;
 20
 21     /**
 22      * 使用Base64加密用户名(su的获取)
 23      * @param account
 24      * @return
 25      */
 26     @SuppressWarnings("deprecation")
 27     public static String encodeAccount(String account){
 28         return new String(Base64.encodeBase64(account.getBytes()));
 29     }
 30
 31     /**
 32      * 使用RSAEncrypt对用户密码进行加密(sp的获取)
 33      * @param pwd
 34      * @param nStr
 35      * @param eStr
 36      * @return
 37      */
 38     public static String RSAEncrypt(String pwd, String nStr, String eStr){
 39         n = new BigInteger(nStr,16);
 40         e = new BigInteger(eStr,16);
 41
 42         BigInteger r = RSADoPublic(pkcs1pad2(pwd,(n.bitLength()+7)>>3));
 43         String sp = r.toString(16);
 44         if((sp.length()&1) != 0 )
 45             sp = "0" + sp;
 46         return sp;
 47     }
 48
 49     private static BigInteger RSADoPublic(BigInteger x){
 50          return x.modPow(e, n);
 51     }
 52
 53     private static BigInteger pkcs1pad2(String s, int n){
 54         if(n < s.length() + 11) { // TODO: fix for utf-8
 55             System.err.println("Message too long for RSA");
 56             return null;
 57           }
 58         byte[] ba = new byte[n];
 59         int i = s.length()-1;
 60         while(i >= 0 && n > 0) {
 61             int c = s.codePointAt(i--);
 62             if(c < 128) { // encode using utf-8
 63               ba[--n] = new Byte(String.valueOf(c));
 64             }
 65             else if((c > 127) && (c < 2048)) {
 66               ba[--n] = new Byte(String.valueOf((c & 63) | 128));
 67               ba[--n] = new Byte(String.valueOf((c >> 6) | 192));
 68             }
 69             else {
 70               ba[--n] = new Byte(String.valueOf((c & 63) | 128));
 71               ba[--n] = new Byte(String.valueOf(((c >> 6) & 63) | 128));
 72               ba[--n] = new Byte(String.valueOf((c >> 12) | 224));
 73             }
 74           }
 75         ba[--n] = new Byte("0");
 76
 77         byte[] temp = new byte[1];
 78         Random rdm = new Random(47L);
 79
 80         while(n > 2) { // random non-zero pad
 81             temp[0] = new Byte("0");
 82             while(temp[0] == 0)
 83                 rdm.nextBytes(temp);
 84             ba[--n] = temp[0];
 85         }
 86         ba[--n] = 2;
 87         ba[--n] = 0;
 88
 89         return new BigInteger(ba);
 90     }
 91
 92
 93
 94 }
 95
 96  参数实体:
 97
 98
 99
100 package token.def;
101
102 import java.io.Serializable;
103
104 public class LoginParams implements Serializable {
105
106     private static final long serialVersionUID = -5775728968372860382L;
107     private String pcid;
108     private String servertime;
109     private String nonce;
110     private String rsakv;
111     private String imgUrl;
112     private String sp;
113     private String code;
114     private boolean isLogin = true;
115
116     public String getPcid() {
117         return pcid;
118     }
119
120     public void setPcid(String pcid) {
121         this.pcid = pcid;
122     }
123
124     public String getServertime() {
125         return servertime;
126     }
127
128     public void setServertime(String servertime) {
129         this.servertime = servertime;
130     }
131
132     public String getNonce() {
133         return nonce;
134     }
135     public void setNonce(String nonce) {
136         this.nonce = nonce;
137     }
138
139     public String getRsakv() {
140         return rsakv;
141     }
142
143     public void setRsakv(String rsakv) {
144         this.rsakv = rsakv;
145     }
146
147     public String getImgUrl() {
148         return imgUrl;
149     }
150
151     public void setImgUrl(String imgUrl) {
152         this.imgUrl = imgUrl;
153     }
154
155     public String getSp() {
156         return sp;
157     }
158
159     public void setSp(String sp) {
160         this.sp = sp;
161     }
162
163     public String getCode() {
164         return code;
165     }
166
167     public void setCode(String code) {
168         this.code = code;
169     }
170
171     public boolean isLogin() {
172         return isLogin;
173     }
174
175     public void setLogin(boolean isLogin) {
176         this.isLogin = isLogin;
177     }
178
179     @Override
180     public String toString() {
181         return "LoginParams [pcid=" + pcid + ", servertime=" + servertime
182                 + ", nonce=" + nonce + ", rsakv=" + rsakv + ", imgUrl="
183                 + imgUrl + ", sp=" + sp + ", code=" + code + ", isLogin="
184                 + isLogin + "]";
185     }
186
187 }
188
189
190
191
192
193
194
195  登陆部分实现:
196
197
198
199 package token.exe;
200
201 import java.io.FileOutputStream;
202 import java.io.IOException;
203 import java.net.URLEncoder;
204 import java.security.KeyManagementException;
205 import java.security.NoSuchAlgorithmException;
206 import java.util.ArrayList;
207 import java.util.Date;
208 import java.util.HashMap;
209 import java.util.List;
210 import java.util.Properties;
211 import java.util.Scanner;
212
213 import org.apache.commons.httpclient.Header;
214 import org.apache.commons.httpclient.HttpClient;
215 import org.apache.commons.httpclient.HttpException;
216 import org.apache.commons.httpclient.HttpStatus;
217 import org.apache.commons.httpclient.HttpVersion;
218 import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
219 import org.apache.commons.httpclient.NameValuePair;
220 import org.apache.commons.httpclient.cookie.CookiePolicy;
221 import org.apache.commons.httpclient.methods.GetMethod;
222 import org.apache.commons.httpclient.methods.PostMethod;
223 import org.apache.commons.httpclient.params.HttpClientParams;
224 import org.apache.commons.httpclient.params.HttpConnectionManagerParams;
225 import org.apache.commons.httpclient.protocol.Protocol;
226 import org.jsoup.Jsoup;
227 import org.jsoup.nodes.Document;
228 import org.jsoup.nodes.Element;
229
230 import token.SinaWeiboOAuth;
231 import token.def.LoginParams;
232 import weibo4j.model.MySSLSocketFactory;
233
234
235 public class WeiboLoginer {
236
237     private HttpClient httpClient; //httpClient实例初始化
238
239     public  WeiboLoginer() {
240
241         //httpclient连接配置
242         MultiThreadedHttpConnectionManager httpManager = new MultiThreadedHttpConnectionManager();
243         HttpConnectionManagerParams connectParams = httpManager.getParams();
244         connectParams.setConnectionTimeout(3000);
245         connectParams.setDefaultMaxConnectionsPerHost(100);
246         connectParams.setSoTimeout(3000);
247         //httpclient参数配置
248         HttpClientParams httpParams = new HttpClientParams();
249         httpParams.setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
250         httpParams.setVersion(HttpVersion.HTTP_1_1);
251         //设置默认Header
252         List<Header> headers = new ArrayList<Header>();
253         headers.add(new Header("Content-Type", "application/x-www-form-urlencoded"));
254         headers.add(new Header("Host", "login.sina.com.cn"));
255         headers.add(new Header("User-Agent","Mozilla/5.0 (Windows NT 6.1; rv:25.0) Gecko/20100101 Firefox/25.0"));
256         headers.add(new Header("API-RemoteIP", "192.168.0.1"));//伪造新浪验证IP
257         headers.add(new Header("X-Forwarded-For","192.168.0.1"));//伪造真实IP
258         headers.add(new Header("CLIENT-IP", "192.168.0.1"));//伪造客户端IP
259         //初始化httpclient
260         httpClient = new HttpClient(httpParams, httpManager);
261         httpClient.getHostConfiguration().getParams().setParameter("http.default-headers", headers);
262         //设置ssl协议
263         Protocol protocol = new Protocol("https",new MySSLSocketFactory(), 443);
264         Protocol.registerProtocol("https", protocol);
265         //设置代理
266 //        httpClient.getHostConfiguration().setProxy("", 0);
267 //        httpClient.getParams().setAuthenticationPreemptive(false);
268     }
269
270     /**
271      * 登陆并获取code值,如果出现验证码则返回还有验证码的参数信息
272      * @return
273      */
274     public LoginParams doLogin(String username, String password) {
275
276         Properties properties = initProperties();
277         String base64UserCount = WeiboEncoder.encodeAccount(username);
278         HashMap<String, String> pubkeyMap = null;
279         String sp = null;
280         String imgUrl = null;
281         LoginParams loginParams = new LoginParams();
282         try {
283             pubkeyMap = pubKeyMap(base64UserCount);
284             sp = WeiboEncoder.RSAEncrypt(password, pubkeyMap.get("pubkey"),"10001");
285             imgUrl = getPin(pubkeyMap);
286             if (imgUrl != null) {
287                 loginParams.setPcid(pubkeyMap.get("pcid"));
288                 loginParams.setNonce(pubkeyMap.get("nonce"));
289                 loginParams.setServertime(pubkeyMap.get("servertime"));
290                 loginParams.setRsakv(pubkeyMap.get("rsakv"));
291                 loginParams.setImgUrl(imgUrl);
292                 loginParams.setSp(sp);
293                 return loginParams;
294             }
295         } catch (IOException e) {
296             // TODO Auto-generated catch block
297             e.printStackTrace();
298         }
299
300         HashMap<String, String> ticketMap = null;
301         try {
302             ticketMap = getTicket(base64UserCount, sp, pubkeyMap);
303         } catch (Exception e1) {
304             // TODO Auto-generated catch block
305             e1.printStackTrace();
306         }
307
308         //确认在最终登陆后是否再需要验证码(账号为新浪的注册邮箱)
309         String vcUrl = isHasPinAgain(pubkeyMap, ticketMap);
310         if (vcUrl != null) {
311             loginParams.setPcid(pubkeyMap.get("pcid"));
312             loginParams.setNonce(pubkeyMap.get("nonce"));
313             loginParams.setServertime(pubkeyMap.get("servertime"));
314             loginParams.setRsakv(pubkeyMap.get("rsakv"));
315             loginParams.setImgUrl(imgUrl);
316             loginParams.setSp(sp);
317             return loginParams;
318         }
319
320         try {
321             String code = authorize(ticketMap.get("ticket"), properties.getProperty("authorizeURL"),
322                     properties.getProperty("redirect_URI"), properties.getProperty("client_ID"),
323                     username, ticketMap.get("uid"));
324
325             loginParams.setCode(code);
326         } catch (KeyManagementException e) {
327             // TODO Auto-generated catch block
328             e.printStackTrace();
329         } catch (NoSuchAlgorithmException e) {
330             // TODO Auto-generated catch block
331             e.printStackTrace();
332         } catch (IOException e) {
333             // TODO Auto-generated catch block
334             e.printStackTrace();
335         }
336         return loginParams;
337
338     }
339
340     /**
341      * 有验证码时登陆
342      * @param sp
343      * @param pin
344      * @param pcid
345      * @param servertime
346      * @param nonce
347      * @param rsakv
348      * @return
349      */
350     public LoginParams doLoginByPin(String username, String sp, String pin, String pcid,
351             String servertime,String nonce,String rsakv ) {
352
353         Properties properties = initProperties();
354         String base64UserCount = WeiboEncoder.encodeAccount(username);
355         HashMap<String, String> ticketMap = null;
356         LoginParams params = new LoginParams();
357         try {
358             ticketMap = getTicket(base64UserCount, sp, pin, pcid,
359                     servertime, nonce, rsakv);
360             if (ticketMap.containsKey("reason")) {
361                 //意为"输入的验证码不正确"
362                 String reply = "\\u8f93\\u5165\\u7684\\u9a8c\\u8bc1\\u7801\\u4e0d\\u6b63\\u786e";
363                 String reasonStr = ticketMap.get("reason");
364                 if (reasonStr.equals(reply)) {
365                     params.setLogin(false);
366                     return params;
367                 }
368             }
369             String code = authorize(ticketMap.get("ticket"), properties.getProperty("authorizeURL"),
370                     properties.getProperty("redirect_URI"), properties.getProperty("client_ID"),
371                     username, ticketMap.get("uid"));
372             params.setCode(code);
373         } catch (Exception e) {
374             // TODO Auto-generated catch block
375             e.printStackTrace();
376         }
377
378         return params;
379     }
380
381     /**
382      * 模拟新浪授权
383      * @param ticket ticket参数
384      * @param redirectURI 回调地址
385      * @param clientId appKey
386      * @param username 用户名
387      * @return token
388      * @throws IOException
389      * @throws KeyManagementException
390      * @throws NoSuchAlgorithmException
391      */
392     private String authorize(String ticket, String authorizeURL, String redirectURI,
393             String clientId, String username, String uid) throws IOException,
394             KeyManagementException, NoSuchAlgorithmException {
395
396         String code = null;
397         String url = authorizeURL + "?client_id=" + clientId + "&redirect_uri="
398                 + redirectURI + "&response_type=code&forcelogin=true";
399         String regCallback = authorizeURL + "?client_id=" + clientId + "&redirect_uri="
400                 + redirectURI + "&response_type=code&display=default&from=&with_cookie=";
401         PostMethod post = new PostMethod(authorizeURL);
402         //模拟申请token的链接,如果不添加,那么回调地址返回则为空
403         post.setRequestHeader("Referer",url);
404         // 模拟登录时所要提交的参数信息
405         NameValuePair[] formpPairs=new NameValuePair[]{
406                 new NameValuePair("action", "login"),
407                 new NameValuePair("userId",username),
408                 new NameValuePair("ticket", ticket),
409                 new NameValuePair("response_type", "code"),
410                 new NameValuePair("redirect_uri", redirectURI),
411                 new NameValuePair("client_id", clientId),
412                 new NameValuePair("regCallback", URLEncoder.encode(regCallback, "UTF-8"))
413                 };
414         post.setRequestBody(formpPairs);
415         int status = httpClient.executeMethod(post);
416         if (status == HttpStatus.SC_OK) {
417             byte[] htmlDatas = post.getResponseBody();
418             code = authorizeAgain(htmlDatas, ticket, authorizeURL,
419                     redirectURI, clientId, username, uid);
420         }else if (status == 302) {
421             Header locationHeader = post.getResponseHeader("location");
422             String location = locationHeader.getValue();
423             code = location.substring(location.indexOf("=")+1);
424         }
425
426         return code;
427     }
428
429     /**
430      * 二次提交授权申请
431      * @param htmlDatas 第一次授权申请返回的页面数据
432      * @return
433      * @throws IOException
434      * @throws HttpException
435      */
436     private String authorizeAgain(byte[] htmlDatas, String ticket, String authorizeURL,
437             String redirectURI,String clientId, String username,
438             String uid) throws HttpException, IOException {
439
440         String verifyToken = null;
441         String html = new String(htmlDatas, "utf-8");
442         Document doc = Jsoup.parse(html);
443         Element verifyTokeneElement = doc.select("input[name=verifyToken]").first();
444         verifyToken = verifyTokeneElement.attr("value");
445
446
447         String code = null;
448         String url = authorizeURL + "?client_id=" + clientId + "&redirect_uri="
449                 + redirectURI + "&response_type=code&forcelogin=true";
450         String regCallback = authorizeURL + "?client_id=" + clientId + "&redirect_uri="
451                 + redirectURI + "&response_type=code&display=default&from=&with_cookie=";
452         PostMethod post = new PostMethod(authorizeURL);
453         //模拟申请token的链接,如果不添加,那么回调地址返回则为空
454         post.setRequestHeader("Referer",authorizeURL);
455         // 模拟登录时所要提交的参数信息
456         NameValuePair[] formpPairs=new NameValuePair[]{
457                 new NameValuePair("action", "authorize"),
458                 new NameValuePair("uid",uid),
459                 new NameValuePair("url", url),
460                 new NameValuePair("response_type", "code"),
461                 new NameValuePair("redirect_uri", redirectURI),
462                 new NameValuePair("client_id", clientId),
463                 new NameValuePair("verifyToken", verifyToken),
464                 new NameValuePair("regCallback", URLEncoder.encode(regCallback, "UTF-8"))
465                 };
466         post.setRequestBody(formpPairs);
467         int status = httpClient.executeMethod(post);
468         if (status == 302) {
469             Header locationHeader = post.getResponseHeader("location");
470             String location = locationHeader.getValue();
471             if (location == null) {
472                 throw new NullPointerException("redirect_uri is null");
473             }
474             code = location.substring(location.indexOf("=")+1);
475         }
476         return code;
477     }
478
479     /**
480      * 模拟用户预登录
481      * @param unameBase64
482      * @return
483      * @throws IOException
484      */
485     private HashMap<String, String> pubKeyMap(String unameBase64)
486             throws IOException {
487
488         String url = "https://login.sina.com.cn/sso/prelogin.php?"
489                 + "entry=openapi&"
490                 + "callback=sinaSSOController.preloginCallBack&" + "su="
491                 + unameBase64 + "&" + "rsakt=mod&" + "checkpin=1&"
492                 + "client=ssologin.js(v1.4.5)" + "&_=" + new Date().getTime();
493         return getParaFromResult(get(url));
494     }
495
496     /**
497      * 预登陆是否需要验证码
498      * @param pubkeyMap
499      * @return
500      */
501     private String getPin(HashMap<String, String> pubkeyMap) {
502
503         String imgUrl = null;
504         int isShowpin = 0;
505         if (pubkeyMap != null) {
506             String showpin = pubkeyMap.get("showpin");
507             if (showpin != null) {
508                 isShowpin = Integer.parseInt(showpin);
509                 if (isShowpin == 1) {
510                     String url = "https://login.sina.com.cn/cgi/pin.php?"
511                             + "r=" + Math.floor(Math.random() * 100000000)
512                             + "&s=0"
513                             + "&p=" + pubkeyMap.get("pcid");
514
515                     imgUrl = url;
516                 }
517             }
518         }
519         return imgUrl;
520     }
521
522
523     /**
524      * 确认登陆后是否需要再验证
525      * @return
526      */
527     private String isHasPinAgain(HashMap<String, String> pubkeyMap,
528             HashMap<String, String> ticketMap) {
529
530         String imgUrl = null;
531         int isHasPin = 0;
532         if ((pubkeyMap != null) && (ticketMap != null)) {
533             //意为"为了您的帐号安全,请输入验证码"
534             String str = "\\u4e3a\\u4e86\\u60a8\\u7684\\u5e10\\u53f7\\u5b89" +
535                     "\\u5168\\uff0c\\u8bf7\\u8f93\\u5165\\u9a8c\\u8bc1\\u7801";
536
537             if (ticketMap.containsKey("reason")) {
538                 String reasonStr = ticketMap.get("reason");
539                 if (reasonStr.equals(str)) {
540                     isHasPin = 1;
541                     String url = "https://login.sina.com.cn/cgi/pin.php?"
542                             + "r=" + Math.floor(Math.random() * 100000000)
543                             + "&s=0"
544                             + "&p=" + pubkeyMap.get("pcid");
545
546                     imgUrl = url;
547                 }
548             }
549         }
550         return imgUrl;
551     }
552
553     /**
554      * 获取验证码
555      */
556     public String getVCode(String pcid) {
557
558         String imgUrl = null;
559         if (pcid != null) {
560             String url = "https://login.sina.com.cn/cgi/pin.php?"
561                     + "r=" + Math.floor(Math.random() * 100000000)
562                     + "&s=0"
563                     + "&p=" + pcid;
564
565             imgUrl = url;
566         }
567         return imgUrl;
568     }
569
570     /**
571      * 保存验证码
572      * @param url 验证码链接
573      */
574     public void saveVCodeImg(String url) {
575
576         GetMethod getImages = new GetMethod(url);
577         try {
578             int status = httpClient.executeMethod(getImages);
579             if (status == HttpStatus.SC_OK) {
580                 FileOutputStream outputStream = new FileOutputStream("vc.jpg");
581                 outputStream.write(getImages.getResponseBody());
582                 outputStream.close();
583             }
584         } catch (HttpException e) {
585             // TODO Auto-generated catch block
586             e.printStackTrace();
587         } catch (IOException e) {
588             // TODO Auto-generated catch block
589             e.printStackTrace();
590         }
591
592     }
593
594     /**
595      * 无验证码时模拟用户登录,并获取ticket
596      * @param usernameBase64 使用Base64加密的用户名
597      * @param sp 使用SHA1加密后的用户密码
598      * @return
599      * @throws Exception
600      */
601     private HashMap<String, String> getTicket(String usernameBase64,
602             String sp, HashMap<String, String> pubkeyMap) throws Exception {
603         String url = null;
604         if (pubkeyMap != null) {
605             url = "https://login.sina.com.cn/sso/login.php?"
606                     + "entry=openapi&"
607                     + "gateway=1&"
608                     + "from=&"
609                     + "savestate=0&"
610                     + "useticket=1&"
611                     + "pagerefer=&"
612                     + "ct=1800&"
613                     + "s=1&"
614                     + "vsnf=1&"
615                     + "vsnval=&"
616                     + "door=&"
617                     + "su="+ usernameBase64
618                     + "&"
619                     + "service=miniblog&"
620                     + "servertime="+ pubkeyMap.get("servertime")
621                     + "&"
622                     + "nonce="+ pubkeyMap.get("nonce")
623                     + "&"
624                     + "pwencode=rsa&"
625                     + "rsakv="+ pubkeyMap.get("rsakv")
626                     + "&"
627                     + "sp="+ sp
628                     + "&"
629                     + "encoding=UTF-8&"
630                     + "callback=sinaSSOController.loginCallBack&"
631                     + "cdult=2&"
632                     + "domain=weibo.com&"
633                     + "prelt=37&"
634                     + "returntype=TEXT&"
635                     + "client=ssologin.js(v1.4.5)&" + "_=" + new Date().getTime();
636
637         }
638         return getParaFromResult(get(url));
639     }
640
641
642     /**
643      * 有验证码时模拟用户登录,并获取ticket
644      * @param usernameBase64
645      * @param sp
646      * @param pin
647      * @param pcid
648      * @param servertime
649      * @param nonce
650      * @param rsakv
651      * @return
652      * @throws Exception
653      */
654     public HashMap<String, String> getTicket(String usernameBase64, String sp, String pin,
655             String pcid, String servertime,String nonce,String rsakv) throws Exception {
656
657         String url = "https://login.sina.com.cn/sso/login.php?"
658                         + "entry=openapi&"
659                         + "gateway=1&"
660                         + "from=&"
661                         + "savestate=0&"
662                         + "useticket=1&"
663                         + "pagerefer=&"
664                         + "pcid=" + pcid + "&"
665                         + "ct=1800&"
666                         + "s=1&"
667                         + "vsnf=1&"
668                         + "vsnval=&"
669                         + "door=" + pin + "&"
670                         + "su="+ usernameBase64
671                         + "&"
672                         + "service=miniblog&"
673                         + "servertime="+ servertime
674                         + "&"
675                         + "nonce="+ nonce
676                         + "&"
677                         + "pwencode=rsa&"
678                         + "rsakv="+ rsakv
679                         + "&"
680                         + "sp="+ sp
681                         + "&"
682                         + "encoding=UTF-8&"
683                         + "callback=sinaSSOController.loginCallBack&"
684                         + "cdult=2&"
685                         + "domain=weibo.com&"
686                         + "prelt=37&"
687                         + "returntype=TEXT&"
688                         + "client=ssologin.js(v1.4.5)&" + "_=" + new Date().getTime();
689
690         return getParaFromResult(get(url));
691     }
692
693     /**
694      * 分析结果,取出所需参数
695      * @param result 页面内容
696      * @return
697      */
698     private HashMap<String, String> getParaFromResult(String result) {
699
700         HashMap<String, String> hm = new HashMap<String, String>();
701         result = result.substring(result.indexOf("{") + 1, result.indexOf("}"));
702         String[] r = result.split(",");
703         String[] temp;
704         for (int i = 0; i < r.length; i++) {
705             temp = r[i].split(":");
706             for (int j = 0; j < 2; j++) {
707                 if (temp[j].contains("\""))
708                     temp[j] = temp[j].substring(1, temp[j].length() - 1);
709             }
710             hm.put(temp[0], temp[1]);
711         }
712         return hm;
713     }
714
715     /**
716      * 执行给定的URL,并输出目标URL返回的页面结果
717      * @param url
718      * @return
719      * @throws IOException
720      */
721     private String get(String url) throws IOException {
722
723         String surl = null;
724         GetMethod getMethod = new GetMethod(url);
725         int status = httpClient.executeMethod(getMethod);
726         if (status == HttpStatus.SC_OK) {
727             surl = new String(getMethod.getResponseBody(), "UTF-8");
728         }
729         getMethod.releaseConnection();
730         return surl;
731     }
732
733     /**
734      * 配置信息初始化
735      * @return
736      */
737     private Properties initProperties() {
738
739         Properties prop = new Properties();
740         try {
741             prop.load(Thread.currentThread().getContextClassLoader().
742                     getResourceAsStream("config.properties"));
743
744         } catch (IOException e) {
745             // TODO Auto-generated catch block
746             e.printStackTrace();
747         }
748         return prop;
749     }
750
751     /**
752      * @param args
753      */
754     public static void main(String[] args) {
755
756         WeiboLoginer loginer = new WeiboLoginer();
757         LoginParams loginParams = loginer.doLogin("","");
758             //有验证码时
759         if (loginParams.getCode() == null) {
760             String pcid = loginParams.getPcid();
761             String nonce = loginParams.getNonce();
762             String rsakv = loginParams.getRsakv();
763             String servertime = loginParams.getServertime();
764             String sp = loginParams.getSp();
765
766             System.err.println(loginParams.getImgUrl());
767             //再次获取验证码
768             System.err.println(loginer.getVCode(pcid));
769
770             Scanner input = new Scanner(System.in);
771             String pin = input.nextLine();
772
773             LoginParams loginResult = loginer.doLoginByPin("",sp, pin, pcid, servertime, nonce, rsakv);
774             if (!loginResult.isLogin()) {
775                 System.err.println("验证码错误!重新录入");
776
777                 //获取验证码并保存(测试)
778                 String imgUrl = loginer.getVCode(pcid);
779                 loginer.saveVCodeImg(imgUrl);
780
781                 Scanner input1= new Scanner(System.in);
782                 String pin1 = input1.nextLine();
783
784                 String code = loginer.doLoginByPin("",sp, pin1, pcid, servertime, nonce, rsakv).getCode();
785                 System.out.println(SinaWeiboOAuth.getToken(code));
786             }
787
788         }else {
789             //无验证码时
790             String code = loginParams.getCode();
791             System.out.println(SinaWeiboOAuth.getToken(code));
792         }
793     }
794
795 }
796
797
798
799  上述代码完整模拟了微博登陆的全过程,并获得最终授权
800
801
802
803  

新浪微博数据抓取(java实现)相关推荐

  1. php抓取新浪微博数据抓取,php获取新浪微博数据API实例

    php获取新浪微博数据API实例 发布于 2014-11-29 12:36:06 | 118 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext Pr ...

  2. php抓取新浪微博数据抓取,php利用curl抓取新浪微博内容示例

    很多人都喜欢在网站上DIY自己的微博,所以我也写了一个. 这里直接抓取了新浪微博工具中的微博秀地址. 代码如下: set_time_limit(0); $url="http://widget ...

  3. php抓取新浪微博数据抓取,php利用curl抓取新浪微博内容实例

    很多人都喜欢在网站上DIY自己的微博,所以我也写了一个. 这里直接抓取了新浪微博工具中的微博秀地址. 复制代码 代码如下: set_time_limit(0); $url="http://w ...

  4. java模拟新浪微博_Java模拟新浪微博登陆抓取数据

    前言: 兄弟们来了来了,最近有人在问如何模拟新浪微博登陆抓取数据,我听后默默地抽了一口老烟,暗暗的对自己说,老汉是时候该你出场了,所以今天有时间就整理整理,浅谈一二. 首先: 要想登陆新浪微博需要预登 ...

  5. 分享:Python使用cookielib和urllib2模拟登陆新浪微博并抓取数据

    Python使用cookielib和urllib2模拟登陆新浪微博并抓取数据 http://my.oschina.net/leopardsaga/blog/94774

  6. 基于Java的阿里妈妈数据抓取技术

    基于Java的阿里妈妈数据抓取技术 前言: 对于需要登录的网站爬虫最大的困难就是需要登录,然后才能获取到数据,如微博,阿里妈妈,webqq等.之前也有看过使用浏览器登录到网站后直接从浏览器中获取coo ...

  7. java爬虫实现数据抓取

    这篇博客我们将用java来实现基本的爬虫数据抓取操作,基本思路就是通过java访问url,然后拿到返回的html文档,并用jsoup解析. 首先我们来看下需要抓取的页面,以我自己的csdn博客列表页面 ...

  8. java分页抓取数据_网页分页数据抓取的几种方式

    相信所有个人网站的站长都有抓取别人数据的经历吧,目前抓取别人网站数据的方式无非两种方式: 一.使用第三方工具,其中最著名的是火车头采集器,在此不做介绍. 二.自己写程序抓取,这种方式要求站长自己写程序 ...

  9. 查询数据 抓取 网站数据_有了数据,我就学会了如何在几个小时内抓取网站,您也可以...

    查询数据 抓取 网站数据 I had a shameful secret. It is one that affects a surprising number of people in the da ...

最新文章

  1. Java泛型:泛型类、泛型接口和泛型方法
  2. Ubuntu 18.04 LTS安装配置驱动、CUDA9.1和Amber18 AmberTools18
  3. 江苏“超牛”女博导:16岁考入北大,跨专业读博,成为全球第4个获此奖项的学者!...
  4. IP Header包
  5. JDBC连接方式有哪几种
  6. mxnet java 例子_mxnet(gluon) 实现DQN简单小例子
  7. linux 5005端口,Linux配置防火墙端口 8080端口
  8. 信息学奥赛一本通(1226:装箱问题)
  9. SpringBoot学习(五)
  10. 拿走不谢:一份历经线上考验的大规模系统的消息队列技术方案!
  11. ALSA驱动、设备函数调用关系
  12. 计算机应用技术专业的未来,计算机应用技术专业召开“2020级人才培养方案修订”主题网络研讨会...
  13. protel dxp教程 protel dxp经典视频教程
  14. 电感值、电容值的理解(上)
  15. L0到L4超全介绍!30+自动驾驶方案汇总
  16. python_sklearn机器学习算法系列之LogisticRegression(逻辑回归)----识别垃圾邮件(短信)
  17. POJ - 3311 Hie with the Pie
  18. 适用于Win和Mac的专业电脑数据恢复软件EasyRecovery易恢复14
  19. Android Studio 安装应用失败总结
  20. VM虚拟机扩容centos8的硬盘

热门文章

  1. 图像分割——DeepLabV3+
  2. windows 安装scoop踩坑之旅
  3. linux查找iso文件命令,Linux文件查找命令find,xargs详述
  4. arp -a命令的通俗解释
  5. 树莓派+omv+frp+阿里云轻量服务器=实现个人nas
  6. Peercast简介、分析及常见问题处理 (一)
  7. 618前夜,电商物流「涌向」B2B战场
  8. 【报告分享】2025美妆行业科技应用前瞻报告-36氪研究院(附下载)
  9. 每天领1天百度文库会员
  10. oracle cpio,解压cpio文件