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

  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      * @return
100      * @throws Exception
101      */
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 md5str
131      * @return
132      * @throws UnsupportedEncodingException
133      */
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 qq
147      * @param password
148      * @param verifycode
149      * @return
150      * @throws Exception
151      */
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                 @Override
245                 public X509Certificate[] getAcceptedIssuers() {
246                     // TODO Auto-generated method stub
247                     return null;
248                 }
249                 
250                 @Override
251                 public void checkServerTrusted(X509Certificate[] chain, String authType)
252                         throws CertificateException {
253                     // TODO Auto-generated method stub
254                     
255                 }
256                 
257                 @Override
258                 public void checkClientTrusted(X509Certificate[] chain, String authType)
259                         throws CertificateException {
260                     // TODO Auto-generated method stub
261                     
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 block
274             e.printStackTrace();
275         } catch (KeyManagementException e) {
276             // TODO Auto-generated catch block
277             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         //启用cookie
295         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         //初始化httpClient
306         httpClient = new DefaultHttpClient(connManager,httpParams);
307         
308         //添加headers
309         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 vc
369      * @param saltUin
370      * @param dataRedirect
371      * @param username
372      * @param password
373      * @param loginSig
374      * @param loginUrl
375      * @return
376      */
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 应用ID
396      * @param redirectURI 应用回调地址
397      * @return
398      */
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=" + clientID
403                 + "&response_type=code"
404                 + "&redirect_uri=" + redirectURI
405                 + "&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_sig
426      * @param urlMap 初始化登陆返回的urlMap
427      * @return
428      */
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 block
439             e.printStackTrace();
440         }
441         String url = "https://ui.ptlogin2.qq.com/cgi-bin/login?appid=46000101"
442                 + "&s_url=" + s_url_encode
443                 + "&proxy_url=" + proxy_url_encode
444                 + "&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 初始化登陆返回的map
478      * @param username 用户名
479      * @param loginSig TODO
480      * @param loginUrl TODO
481      * @return
482      */
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=" + username
491                     + "&appid=46000101"
492                     + "&js_ver=10052"
493                     + "&js_type=1"
494                     + "&login_sig=" + loginSig
495                     + "&u1=" + URLEncoder.encode(dataRedirect, "UTF-8")
496                     + "&r=" + Math.random();
497         } catch (UnsupportedEncodingException e) {
498             // TODO Auto-generated catch block
499             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      * @return
525      */
526     public String getVCode(String username) {
527         
528         String imageUrl = "https://ssl.captcha.qq.com/getimage?"
529         + "uin=" +username
530         + "&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 block
552             e.printStackTrace();
553         } catch (IOException e) {
554             // TODO Auto-generated catch block
555             e.printStackTrace();
556         }
557     }
558     
559     /**
560      * 模拟最终登陆
561      * @param vc 验证码信息
562      * @param dataRedirect 链接信息
563      * @param username 用户名
564      * @param password 密码
565      * @param loginSig TODO
566      * @param loginUrl TODO
567      * @param saltUin TODO
568      * @return
569      */
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 block
578             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=" + p
585                     + "&verifycode=" + vc
586                     + "&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=" + loginSig
604                     + "&pt_rsa=0";
605         } catch (UnsupportedEncodingException e) {
606             // TODO Auto-generated catch block
607             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 loginUrl
631      * @param checkSigUrl
632      * @return
633      */
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 block
656                 e.printStackTrace();
657             }
658         }
659         return prop;
660     }
661     
662     
663     /**
664      * 提交URL,并获取页面数据(GET方式)
665      * @param url 请求页面
666      * @param headers http请求header
667      * @return
668      */
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 block
685             e.printStackTrace();
686         } catch (IOException e) {
687             // TODO Auto-generated catch block
688             e.printStackTrace();
689         }
690         return response;
691     }
692     
693     /**
694      * 初始化配置信息
695      * @return
696      */
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 block
706             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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在现有省、市港口信息化系统进行有效整合基础上,借鉴新 一代的感知-传输-应用技术体系,实现对码头、船舶、货物、重 大危险源、危险货物装卸过程、航管航运等管理要素的全面感知、 有效传输和按需定制服务,为行政管理人员和相关单位及人员提 供高效的管理辅助,并为公众提供便捷、实时的水运信息服务。 建立信息整合、交换和共享机制,建立健全信息化管理支撑 体系,以及相关标准规范和安全保障体系;按照“绿色循环低碳” 交通的要求,搭建高效、弹性、高可扩展性的基于虚拟技术的信 息基础设施,支撑信息平台低成本运行,实现电子政务建设和服务模式的转变。 实现以感知港口、感知船舶、感知货物为手段,以港航智能 分析、科学决策、高效服务为目的和核心理念,构建“智慧港口”的发展体系。 结合“智慧港口”相关业务工作特点及信息化现状的实际情况,本项目具体建设目标为: 一张图(即GIS 地理信息服务平台) 在建设岸线、港口、港区、码头、泊位等港口主要基础资源图层上,建设GIS 地理信息服务平台,在此基础上依次接入和叠加规划建设、经营、安全、航管等相关业务应用专题数据,并叠 加动态数据,如 AIS/GPS/移动平台数据,逐步建成航运管理处 "一张图"。系统支持扩展框架,方便未来更多应用资源的逐步整合。 现场执法监管系统 基于港口(航管)执法基地建设规划,依托统一的执法区域 管理和数字化监控平台,通过加强对辖区内的监控,结合移动平 台,形成完整的多维路径和信息追踪,真正做到问题能发现、事态能控制、突发问题能解决。 运行监测和辅助决策系统 对区域港口与航运业务日常所需填报及监测的数据经过科 学归纳及分析,采用统一平台,消除重复的填报数据,进行企业 输入和自动录入,并进行系统智能判断,避免填入错误的数据, 输入的数据经过智能组合,自动生成各业务部门所需的数据报 表,包括字段、格式,都可以根据需要进行定制,同时满足扩展 性需要,当有新的业务监测数据表需要产生时,系统将分析新的 需求,将所需字段融合进入日常监测和决策辅助平台的统一平台中,并生成新的所需业务数据监测及决策表。 综合指挥调度系统 建设以港航应急指挥中心为枢纽,以各级管理部门和经营港 口企业为节点,快速调度、信息共享的通信网络,满足应急处置中所需要的信息采集、指挥调度和过程监控等通信保障任务。 设计思路 根据项目的建设目标和“智慧港口”信息化平台的总体框架、 设计思路、建设内容及保障措施,围绕业务协同、信息共享,充 分考虑各航运(港政)管理处内部管理的需求,平台采用“全面 整合、重点补充、突出共享、逐步完善”策略,加强重点区域或 运输通道交通基础设施、运载装备、运行环境的监测监控,完善 运行协调、应急处置通信手段,促进跨区域、跨部门信息共享和业务协同。 以“统筹协调、综合监管”为目标,以提供综合、动态、实 时、准确、实用的安全畅通和应急数据共享为核心,围绕“保畅通、抓安全、促应急"等实际需求来建设智慧港口信息化平台。 系统充分整合和利用航运管理处现有相关信息资源,以地理 信息技术、网络视频技术、互联网技术、移动通信技术、云计算 技术为支撑,结合航运管理处专网与行业数据交换平台,构建航 运管理处与各部门之间智慧、畅通、安全、高效、绿色低碳的智 慧港口信息化平台。 系统充分考虑航运管理处安全法规及安全职责今后的变化 与发展趋势,应用目前主流的、成熟的应用技术,内联外引,优势互补,使系统建设具备良好的开放性、扩展性、可维护性。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值