腾讯微博数据抓取(java实现)

来源:互联网 发布:731活体实验 知乎 编辑:程序博客网 时间:2024/06/10 02:54
  1 不多说,同样贴出相关代码  2   3    4   5 参数实体:  6   7 package token.def;  8   9 import java.io.Serializable; 10 import java.util.Properties; 11  12 public class TLoginParams implements Serializable { 13      14     private static final long serialVersionUID = 6120319409538285515L; 15     private String saltUin; 16     private String dataRedirect; 17     private String loginSig; 18     private String loginUrl; 19     private String imgURl; 20     private String imgCookie; 21     private boolean isLogin = true; 22     private Properties prop; 23      24     public String getSaltUin() { 25         return saltUin; 26     } 27     public void setSaltUin(String saltUin) { 28         this.saltUin = saltUin; 29     } 30     public String getDataRedirect() { 31         return dataRedirect; 32     } 33     public void setDataRedirect(String dataRedirect) { 34         this.dataRedirect = dataRedirect; 35     } 36     public String getLoginSig() { 37         return loginSig; 38     } 39     public void setLoginSig(String loginSig) { 40         this.loginSig = loginSig; 41     } 42     public String getLoginUrl() { 43         return loginUrl; 44     } 45     public void setLoginUrl(String loginUrl) { 46         this.loginUrl = loginUrl; 47     } 48     public String getImgURl() { 49         return imgURl; 50     } 51     public void setImgURl(String imgURl) { 52         this.imgURl = imgURl; 53     } 54     public String getImgCookie() { 55         return imgCookie; 56     } 57     public void setImgCookie(String imgCookie) { 58         this.imgCookie = imgCookie; 59     } 60     public boolean isLogin() { 61         return isLogin; 62     } 63     public void setLogin(boolean isLogin) { 64         this.isLogin = isLogin; 65     } 66     public Properties getProp() { 67         return prop; 68     } 69     public void setProp(Properties prop) { 70         this.prop = prop; 71     } 72      73     @Override 74     public String toString() { 75         return "TLoginParams [saltUin=" + saltUin + ", dataRedirect=" 76                 + dataRedirect + ", loginSig=" + loginSig + ", loginUrl=" 77                 + loginUrl + ", imgURl=" + imgURl + ", imgCookie=" + imgCookie 78                 + ", isLogin=" + isLogin + ", prop=" + prop + "]"; 79     } 80      81 } 82  83  加密实现: 84  85 package token.exe; 86  87 import java.io.ByteArrayOutputStream; 88 import java.io.UnsupportedEncodingException; 89 import java.security.MessageDigest; 90  91 public class TencentWeiboEncryption { 92  93     private static final String HEXSTRING = "0123456789ABCDEF"; 94  95  96     /** 97      * 获取指定字符串的md5值 98      * @param originalText 99      * @return100      * @throws Exception101      */102     private static String md5(String originalText) throws Exception {103         104         byte buf[] = originalText.getBytes("ISO-8859-1");105         StringBuffer hexString = new StringBuffer();106         String result = "";107         String digit = "";108         try {109             MessageDigest algorithm = MessageDigest.getInstance("MD5");110             algorithm.reset();111             algorithm.update(buf);112             byte[] digest = algorithm.digest();113             for (int i = 0; i < digest.length; i++) {114                 digit = Integer.toHexString(0xFF & digest[i]);115                 if (digit.length() == 1) {116                     digit = "0" + digit;117                 }118                 hexString.append(digit);119             }120             result = hexString.toString();121         } catch (Exception ex) {122             result = "";123         }124         return result.toUpperCase();125     }126 127 128     /**129      * 将16进制编码转换为相应的ASCII字符串130      * @param md5str131      * @return132      * @throws UnsupportedEncodingException133      */134     private static String hexchar2bin(String md5str) throws UnsupportedEncodingException {135         136         ByteArrayOutputStream baos = new ByteArrayOutputStream(md5str.length() / 2);137         for (int i = 0; i < md5str.length(); i = i + 2) {138             baos.write((HEXSTRING.indexOf(md5str.charAt(i)) << 4 | HEXSTRING.indexOf(md5str.charAt(i + 1))));139         }140         return new String(baos.toByteArray(), "ISO-8859-1");141     }142 143    144     /**145      * 获取加密后的密码146      * @param qq147      * @param password148      * @param verifycode149      * @return150      * @throws Exception151      */152     public static String getPassword(String qq, String password, String verifycode) throws Exception {153         String P = hexchar2bin(md5(password));154         String U = md5(P + hexchar2bin(qq.replace("\\x", "").toUpperCase()));155         String V = md5(U + verifycode.toUpperCase());156         return V;157     }158 159 }160 161  微博登陆实现:162 163 package token.exe;164 165 import java.io.ByteArrayInputStream;166 import java.io.FileOutputStream;167 import java.io.IOException;168 import java.io.InputStream;169 import java.io.UnsupportedEncodingException;170 import java.net.URLEncoder;171 import java.security.KeyManagementException;172 import java.security.NoSuchAlgorithmException;173 import java.security.cert.CertificateException;174 import java.security.cert.X509Certificate;175 import java.util.ArrayList;176 import java.util.Date;177 import java.util.HashMap;178 import java.util.List;179 import java.util.Properties;180 import java.util.Scanner;181 182 import javax.net.ssl.SSLContext;183 import javax.net.ssl.TrustManager;184 import javax.net.ssl.X509TrustManager;185 186 import org.apache.http.Header;187 import org.apache.http.HttpHeaders;188 import org.apache.http.HttpHost;189 import org.apache.http.HttpResponse;190 import org.apache.http.HttpVersion;191 import org.apache.http.client.ClientProtocolException;192 import org.apache.http.client.methods.HttpGet;193 import org.apache.http.client.params.CookiePolicy;194 import org.apache.http.client.params.HttpClientParams;195 import org.apache.http.conn.params.ConnRoutePNames;196 import org.apache.http.conn.routing.HttpRoute;197 import org.apache.http.conn.scheme.PlainSocketFactory;198 import org.apache.http.conn.scheme.Scheme;199 import org.apache.http.conn.scheme.SchemeRegistry;200 import org.apache.http.conn.ssl.SSLSocketFactory;201 import org.apache.http.impl.client.DefaultHttpClient;202 import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;203 import org.apache.http.message.BasicHeader;204 import org.apache.http.params.CoreConnectionPNames;205 import org.apache.http.params.HttpParams;206 import org.apache.http.params.HttpProtocolParams;207 import org.apache.http.params.SyncBasicHttpParams;208 import org.apache.http.util.EntityUtils;209 import org.jsoup.Jsoup;210 import org.jsoup.nodes.Document;211 import org.jsoup.nodes.Element;212 213 import token.TencentWeiboOAuth;214 import token.def.TLoginParams;215 216 import com.tencent.weibo.beans.RouteCfg;217 218 public class TencentWeiboLoginer {219     220     private DefaultHttpClient httpClient;221     222     //默认连接配置参数223     private static final int CONNECT_TIME_OUT = 5000;224     private static final int SOCKET_TIME_OUT = 5000;225     private static final int MAX_CONNECTIONS_PRE_HOST = 20;226     private static final int MAX_TOTAL_CONNECTIONS = 200;227     228     public TencentWeiboLoginer() {229         this(CONNECT_TIME_OUT, SOCKET_TIME_OUT, MAX_CONNECTIONS_PRE_HOST, MAX_TOTAL_CONNECTIONS, null, null);230     }231     232     public TencentWeiboLoginer(int connectTimeOut, int socketTimeOut, int maxConnectionsPreHost,233             int maxTotalConnections, List<RouteCfg> routeCfgs, HttpHost proxy) {234                 235         //注册ssl协议236         SSLContext ssl = null;237         SchemeRegistry schemeRegistry = null;238         X509TrustManager x509TrustManager = null;239         SSLSocketFactory sslSocketFactory = null;240         try {241             ssl = SSLContext.getInstance("TLS");242             x509TrustManager = new X509TrustManager() {243                 244                 @Override245                 public X509Certificate[] getAcceptedIssuers() {246                     // TODO Auto-generated method stub247                     return null;248                 }249                 250                 @Override251                 public void checkServerTrusted(X509Certificate[] chain, String authType)252                         throws CertificateException {253                     // TODO Auto-generated method stub254                     255                 }256                 257                 @Override258                 public void checkClientTrusted(X509Certificate[] chain, String authType)259                         throws CertificateException {260                     // TODO Auto-generated method stub261                     262                 }263             };264             ssl.init(null, new TrustManager[]{x509TrustManager}, null);265             sslSocketFactory = new SSLSocketFactory(ssl);            266             sslSocketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);267             268             //注册http和https协议269             schemeRegistry = new SchemeRegistry();270             schemeRegistry.register(new Scheme("https", 443, sslSocketFactory));271 //            schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));272         } catch (NoSuchAlgorithmException e) {273             // TODO Auto-generated catch block274             e.printStackTrace();275         } catch (KeyManagementException e) {276             // TODO Auto-generated catch block277             e.printStackTrace();278         }279         280         //配置客户端链接管理类281         ThreadSafeClientConnManager connManager = new ThreadSafeClientConnManager(schemeRegistry);282         connManager.setDefaultMaxPerRoute(maxConnectionsPreHost);283         connManager.setMaxTotal(maxTotalConnections);284         285         //配置http请求连接参数286         HttpParams httpParams = new SyncBasicHttpParams();287         httpParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, connectTimeOut);288         httpParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, socketTimeOut);289         290         //http协议参数配置291         HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1);292         HttpProtocolParams.setUseExpectContinue(httpParams, false);293         294         //启用cookie295         HttpClientParams.setCookiePolicy(httpParams, CookiePolicy.BROWSER_COMPATIBILITY);296         297         //对特定ip端口修改最大连接数298         if (routeCfgs != null) {299             for (RouteCfg routeCfg : routeCfgs) {300                 HttpHost host = new HttpHost(routeCfg.getHost(), routeCfg.getPort());301                 connManager.setMaxForRoute(new HttpRoute(host), routeCfg.getMaxConnetions());302             }303         }304         305         //初始化httpClient306         httpClient = new DefaultHttpClient(connManager,httpParams);307         308         //添加headers309         List<Header> headers = new ArrayList<Header>();310         headers.add(new BasicHeader(HttpHeaders.ACCEPT, "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"));311         headers.add(new BasicHeader(HttpHeaders.ACCEPT_LANGUAGE, "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3"));312         headers.add(new BasicHeader(HttpHeaders.ACCEPT_CHARSET, "UTF-8"));313         headers.add(new BasicHeader(HttpHeaders.USER_AGENT, "Mozilla/5.0 (Windows NT 5.1; rv:25.0) Gecko/20100101 Firefox/25.0"));314         headers.add(new BasicHeader(HttpHeaders.CONNECTION, "keep-alive"));315         headers.add(new BasicHeader("X-Forwarded-For", "192.168.0.1"));316         headers.add(new BasicHeader("Client-IP", "192.168.0.1"));317         headers.add(new BasicHeader("API-RemoteIP", "192.168.0.1"));318         httpClient.getParams().setParameter("http.default-headers", headers);319         320         //设置代理321         if (proxy != null) {322             httpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);323         }324                 325     }326     327     /**328      * 模拟腾讯微博登陆329      * @return code值330      */331     public TLoginParams doLogin(String username, String password) {332         333         Properties properties = initProperties();334         String clientID = properties.getProperty("client_id");335         String redirectURI = properties.getProperty("redirect_uri");336         337         HashMap<String, String> urlMap = getUrlMap(clientID, redirectURI);338         String dataRedirect = urlMap.get("data-redirect");339         340         HashMap<String, String> loginInfoMap = preLogin(urlMap);341         String loginSig = loginInfoMap.get("login_sig");342         String loginUrl = loginInfoMap.get("login_url");343         344         HashMap<String, String> checkMap = isHasVC(dataRedirect, username, loginSig, loginUrl);345         String isHasVC = checkMap.get("isHasVC");346         String vc = checkMap.get("vc");347         String saltUin = checkMap.get("saltUin");348         349         TLoginParams tLoginParams = new TLoginParams();350         if (Integer.parseInt(isHasVC) != 0) {351             tLoginParams.setDataRedirect(dataRedirect);352             tLoginParams.setLoginSig(loginSig);353             tLoginParams.setLoginUrl(loginUrl);354             tLoginParams.setSaltUin(saltUin);355             tLoginParams.setImgURl(getVCode(username));356             return tLoginParams;357         }358         359         String checkSigUrl = finalLogin(vc, saltUin, dataRedirect, username, 360                 password, loginSig, loginUrl);361         Properties result = authorize(loginUrl, checkSigUrl);362         tLoginParams.setProp(result);363         return tLoginParams;364     }365     366     /**367      * 有验证码时验证登陆368      * @param vc369      * @param saltUin370      * @param dataRedirect371      * @param username372      * @param password373      * @param loginSig374      * @param loginUrl375      * @return376      */377     public TLoginParams doLoginByVC(String vc, String saltUin, String dataRedirect, String username, 378             String password, String loginSig, String loginUrl) {379         380         TLoginParams tLoginParams = new TLoginParams();381         382         String checkSigUrl = finalLogin(vc, saltUin, dataRedirect, username, password, loginSig, loginUrl);383         if (checkSigUrl.equals("您输入的验证码不正确,请重新输入。")) {384             tLoginParams.setLogin(false);385             return tLoginParams;386         }387         Properties prop = authorize(loginUrl, checkSigUrl);388         389         tLoginParams.setProp(prop);390         return tLoginParams;391     }392     393     /**394      * 初始化登陆,获取含有sessionkey的url提交链接395      * @param clientID 应用ID396      * @param redirectURI 应用回调地址397      * @return398      */399     private HashMap<String, String> getUrlMap(String clientID, String redirectURI) {400         401         String url = "https://open.t.qq.com/cgi-bin/oauth2/authorize?" 402                 + "client_id=" + clientID403                 + "&response_type=code"404                 + "&redirect_uri=" + redirectURI405                 + "&forcelogin=true";406         Header[] headers = new BasicHeader[]{407                 new BasicHeader(HttpHeaders.HOST, "open.t.qq.com")408         };409 410         String htmlDatas = httpGetDatas(url, headers);411         HashMap<String, String> map = new HashMap<String, String>();412         String data_redirect = null;413         String data_proxy = null;414         415         Document  document = Jsoup.parse(htmlDatas);416         Element element = document.getElementsByTag("noscript").first();417         data_redirect = element.attr("data-redirect");418         map.put("data-redirect", data_redirect);419         data_proxy = element.attr("data-proxy");420         map.put("data-proxy", data_proxy);421         return map;422     }423     424     /**425      * 预登陆腾讯微博,获取login_sig426      * @param urlMap 初始化登陆返回的urlMap427      * @return428      */429     private HashMap<String, String> preLogin(HashMap<String, String> urlMap) {430         431         String s_url_encode = null;432         String proxy_url_encode = null;433         String script = null;434         try {435             s_url_encode = URLEncoder.encode(urlMap.get("data-redirect"), "UTF-8");436             proxy_url_encode = URLEncoder.encode(urlMap.get("data-proxy"), "UTF-8");437         } catch (UnsupportedEncodingException e) {438             // TODO Auto-generated catch block439             e.printStackTrace();440         }441         String url = "https://ui.ptlogin2.qq.com/cgi-bin/login?appid=46000101"442                 + "&s_url=" + s_url_encode443                 + "&proxy_url=" + proxy_url_encode444                 + "&f_url=loginerroralert"445                 + "&style=13" 446                 + "&daid=6"447                 + "&pt_no_auth=1"448                 + "&hide_close_icon=1" 449                 + "&link_target=blank"450                 + "&target=blank"451                 + "&hide_title_bar=1"452                 + "&no_drop_domain=1"453                 + "&dummy=1"454                 + "&bgcolor=ffffff"455                 + "&r=" + Math.random();456         Header[] headers = new BasicHeader[]{457                 new BasicHeader(HttpHeaders.HOST, "ui.ptlogin2.qq.com")458         };459         String htmlDatas = httpGetDatas(url, headers);460         461         Document document = Jsoup.parse(htmlDatas);462         Element headElement = document.getElementsByTag("head").first();463         Element element = headElement.getElementsByTag("script").first();464         script = element.html();465         466         String login_sig = script.substring(script.indexOf("login_sig:"), script.indexOf("\",clientip"));467         String login_sig_key = login_sig.substring(login_sig.indexOf("\"") + 1);468         469         HashMap<String, String>    loginMap = new HashMap<String, String>();470         loginMap.put("login_sig", login_sig_key);471         loginMap.put("login_url", url);472         return loginMap;473     }    474     475     /**476      * 检查预登陆时是否需要验证码477      * @param dataRedirect 初始化登陆返回的map478      * @param username 用户名479      * @param loginSig TODO480      * @param loginUrl TODO481      * @return482      */483     private HashMap<String, String> isHasVC(String dataRedirect, String username, 484             String loginSig, String loginUrl){485         486         String url = null;487         try {488             url = "https://ssl.ptlogin2.qq.com/check?"489                     + "regmaster="490                     + "&uin=" + username491                     + "&appid=46000101"492                     + "&js_ver=10052"493                     + "&js_type=1"494                     + "&login_sig=" + loginSig495                     + "&u1=" + URLEncoder.encode(dataRedirect, "UTF-8")496                     + "&r=" + Math.random();497         } catch (UnsupportedEncodingException e) {498             // TODO Auto-generated catch block499             e.printStackTrace();500         }501         Header[] headers = new BasicHeader[]{502                 new BasicHeader(HttpHeaders.REFERER, loginUrl)503         };504         505         String htmlDatas = httpGetDatas(url, headers);506                 507         String str = htmlDatas.substring(htmlDatas.indexOf("(") + 1, htmlDatas.indexOf(");"));508         String[] strs = str.split(",");509         510         String isHasVC = strs[0].substring(strs[0].indexOf("'") + 1, strs[0].lastIndexOf("'"));511         HashMap<String,String> checkVCMap = new HashMap<String, String>();512         checkVCMap.put("isHasVC", isHasVC);        513         String vc = strs[1].substring(strs[1].indexOf("'") + 1, strs[1].lastIndexOf("'"));514         checkVCMap.put("vc", vc);        515         String saltUin = strs[2].substring(strs[2].indexOf("'") + 1, strs[2].lastIndexOf("'"));516         checkVCMap.put("saltUin", saltUin);517     518         return checkVCMap;519     }520     521     /**522      * 获取当前用户登陆所需要的验证码523      * @param username 用户名524      * @return525      */526     public String getVCode(String username) {527         528         String imageUrl = "https://ssl.captcha.qq.com/getimage?"529         + "uin=" +username530         + "&aid=46000101"531         + "&" + Math.random();532         533         return imageUrl;534     }535     536     /**537      * 保存验证码538      * @param url 验证码链接539      */540     public void saveVCodeImg(String url) {541         542         HttpGet getImages = new HttpGet(url);543         HttpResponse response = null;544         try {545             response = httpClient.execute(getImages);546             byte[] imageBytes = EntityUtils.toByteArray(response.getEntity());                547             FileOutputStream fileWrite = new FileOutputStream("vc.jpg");548             fileWrite.write(imageBytes);549             fileWrite.close();550         } catch (ClientProtocolException e) {551             // TODO Auto-generated catch block552             e.printStackTrace();553         } catch (IOException e) {554             // TODO Auto-generated catch block555             e.printStackTrace();556         }557     }558     559     /**560      * 模拟最终登陆561      * @param vc 验证码信息562      * @param dataRedirect 链接信息563      * @param username 用户名564      * @param password 密码565      * @param loginSig TODO566      * @param loginUrl TODO567      * @param saltUin TODO568      * @return569      */570     private String finalLogin(String vc, String saltUin, String dataRedirect, String username, 571             String password, String loginSig, String loginUrl){572         573         String p = null;574         try {575             p = TencentWeiboEncryption.getPassword(saltUin, password, vc);576         } catch (Exception e) {577             // TODO Auto-generated catch block578             e.printStackTrace();579         }580         String url = null;581         try {582             url = "https://ssl.ptlogin2.qq.com/login?"583                     + "u=" + URLEncoder.encode(username, "UTF-8")584                     + "&p=" + p585                     + "&verifycode=" + vc586                     + "&aid=46000101"587                     + "&u1=" + URLEncoder.encode(dataRedirect, "UTF-8")588                     + "&h=1"589                     + "&ptredirect=1"590                     + "&ptlang=2052"591                     + "&daid=6"592                     + "&from_ui=1"593                     + "&dumy="594                     + "&low_login_enable=0"595                     + "&regmaster="596                     + "&fp=loginerroralert"597                     + "&action=2-20-" + new Date().getTime()598                     + "&mibao_css="599                     + "&t=1"600                     + "&g=1"601                     + "&js_ver=10052"602                     + "&js_type=1"603                     + "&login_sig=" + loginSig604                     + "&pt_rsa=0";605         } catch (UnsupportedEncodingException e) {606             // TODO Auto-generated catch block607             e.printStackTrace();608         }609         610         Header[] headers = new BasicHeader[]{611             new BasicHeader(HttpHeaders.REFERER, loginUrl)612         };613         614         String htmlDatas = httpGetDatas(url, headers);615         String str = htmlDatas.substring(htmlDatas.indexOf("(") + 1, htmlDatas.indexOf(");"));616         String[] strs = str.split(",");617         618         String checkUrl = strs[2].substring(strs[2].indexOf("'") + 1, strs[2].lastIndexOf("'"));619         String loginResult = strs[4].substring(strs[4].indexOf("'") + 1, strs[4].lastIndexOf("'"));620         621         if (loginResult.equals("登录成功!")) {622             return checkUrl;623         }624         return loginResult;625     }626     627     628     /**629      * 获取最终授权630      * @param loginUrl631      * @param checkSigUrl632      * @return633      */634     private Properties authorize(String loginUrl, String checkSigUrl) {635         636         Properties prop = null;637         if (checkSigUrl != null) {638             Header[] headers = new BasicHeader[]{639                 new BasicHeader(HttpHeaders.REFERER, loginUrl)640             };641             String htmlDatas = httpGetDatas(checkSigUrl, headers);642             643             Document  document = Jsoup.parse(htmlDatas);644             Element element = document.getElementsByTag("meta").first();645             String content = element.attr("content");;646         647             String subContent = content.substring(content.indexOf("?") + 1);648             String propStr = subContent.replace("&", "\n");649             650             prop = new Properties();651             InputStream stream = new ByteArrayInputStream(propStr.getBytes());652             try {653                 prop.load(stream);654             } catch (IOException e) {655                 // TODO Auto-generated catch block656                 e.printStackTrace();657             }658         }659         return prop;660     }661     662     663     /**664      * 提交URL,并获取页面数据(GET方式)665      * @param url 请求页面666      * @param headers http请求header667      * @return668      */669     private String httpGetDatas(String url,Header[] headers) {670         671         String response =null;672         HttpResponse httpResponse = null;673         if (url == null) {674             throw new NullPointerException("URL is null");675         }676         HttpGet httpGet = new HttpGet(url);677         httpGet.setHeaders(headers);678         679         try {680             httpResponse = httpClient.execute(httpGet);681             response = EntityUtils.toString(httpResponse.getEntity());682             683         } catch (ClientProtocolException e) {684             // TODO Auto-generated catch block685             e.printStackTrace();686         } catch (IOException e) {687             // TODO Auto-generated catch block688             e.printStackTrace();689         }690         return response;691     }692     693     /**694      * 初始化配置信息695      * @return696      */697     public Properties initProperties() {698         699         Properties properties = new Properties();700         InputStream inputStream = Thread.currentThread().701                 getContextClassLoader().getResourceAsStream("cfg.properties");702         try {703             properties.load(inputStream);704         } catch (IOException e) {705             // TODO Auto-generated catch block706             e.printStackTrace();707         }708         return properties;709     }710     711     public static void main(String[] args) {712 713         TencentWeiboLoginer loginer = new TencentWeiboLoginer();714         TLoginParams tLoginParams = loginer.doLogin("","");715             //有验证码时716         if (tLoginParams.getProp() == null) {717             String saltUin = tLoginParams.getSaltUin();718             String dataRedirect = tLoginParams.getDataRedirect();719             String loginSig = tLoginParams.getLoginSig();720             String loginUrl = tLoginParams.getLoginUrl();721             String imgUrl = tLoginParams.getImgURl();722             //要返回的验证码723             System.err.println(imgUrl);724             725             //测试再次获取验证码726             imgUrl = loginer.getVCode("");727             //保存验证码(用于测试并查看验证码)728             loginer.saveVCodeImg(imgUrl);729             730             Scanner input = new Scanner(System.in);731             String vc = input.nextLine();732             733             734             TLoginParams loginresult =loginer.doLoginByVC(vc, saltUin, dataRedirect, "", 735                     "", loginSig, loginUrl);736                 //如果验证码录入错误,则重新获取并返回验证码737             if (!loginresult.isLogin()) {738                 System.err.println("验证码错误!重新录入");739                 imgUrl = loginer.getVCode("");740                 loginer.saveVCodeImg(imgUrl);741                 Scanner input2 = new Scanner(System.in);742                 String vc1 = input2.nextLine();743                 Properties codeProp = loginer.doLoginByVC(vc1, saltUin, dataRedirect, "", 744                         "", loginSig, loginUrl).getProp();745                 System.out.println(TencentWeiboOAuth.getOAuthV2Instance(codeProp));746             }else {747                 //验证码正确则直接输出结果748                 Properties codeProp = loginresult.getProp();749                 System.out.println(TencentWeiboOAuth.getOAuthV2Instance(codeProp));750             }751             752         }else {753             //无验证码时754             Properties codeProp = tLoginParams.getProp();755             System.out.println(TencentWeiboOAuth.getOAuthV2Instance(codeProp));756         }757     }758 }759 760  761 762 上述代码完整模拟了腾讯微博的登陆过程,并最终获得授权
0 0