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