- 浏览: 142211 次
- 性别:
- 来自: 合肥
文章分类
最新评论
-
hzyhush:
Java模拟登录新浪微博 -
meaemz:
大神,这是完整的代码吗?怎么没有没有main(),我要怎么调用 ...
Java模拟登录新浪微博 -
meaemz:
大神,这是完整的代码吗?怎么没有没有main(),是要自己写一 ...
Java模拟登录新浪微博 -
c_he_n:
最后执行结果怎么获取到url
Java模拟登录新浪微博 -
hvang1988:
18.JEgg Java多线程开发包 ,这个到底怎么样哦,资料 ...
Java 常用的第三方组件
登录的类主要有3个,BigIntegerRSA.java加密类、SinaSSOEncoder密码加密类、SinaLogonDog登录类。
1、SinaLogonDog.java代码如下:
2、BigIntegerRSA.java相关的加密算法类
3、SinaSSOEncoder.java密码加密的类
1、SinaLogonDog.java代码如下:
package com.crawler.sina.login; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.spec.InvalidKeySpecException; import java.util.Date; import javax.crypto.BadPaddingException; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import org.apache.commons.httpclient.Cookie; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * @author TonyJ * @Time 2013-7-1 上午02:08:49 * */ public class SinaLogonDog { private static final Log logger = LogFactory.getLog(SinaLogonDog.class); static String SINA_PK = "EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D24" + "5A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD39" + "93CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE" + "1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443"; MultiThreadedHttpConnectionManager connectionManager =new MultiThreadedHttpConnectionManager(); HttpClient client = new HttpClient(connectionManager); public HttpClient logonAndValidate(String userName,String pwd) throws HttpException, IOException { String su = encodeAccount(userName); String initPageURL = "http://login.sina.com.cn/sso/prelogin.php?entry=sso&" + "callback=sinaSSOController.preloginCallBack&su=" + su + "&rsakt=mod&client=ssologin.js(v1.4.5)" + "&_=" + getServerTime(); GetMethod getMethod = newGetMethod(initPageURL); client.executeMethod(getMethod); InputStream is = getMethod.getResponseBodyAsStream(); String response = inputStreamToString(is, null); String jsonBody = StringUtils.substringBetween(response, "(", ")"); String nonce = ""; long servertime = 0L; String rsakv = ""; nonce = StringUtils.substringBetween(jsonBody, "nonce\":\"", "\""); rsakv = StringUtils.substringBetween(jsonBody, "rsakv\":\"", "\""); servertime = Long.parseLong(StringUtils.substringBetween(jsonBody, "servertime\":", ",")); getMethod.releaseConnection(); String logonPageURL = "http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.5)"; PostMethod postMethod2Logon = newPostMethod(logonPageURL); String pwdString = servertime + "\t" + nonce + "\n" + pwd; String sp = ""; try { sp = new BigIntegerRSA().rsaCrypt(SINA_PK, "10001", pwdString); } catch (InvalidKeyException e) { logger.error("AES加密密钥大于128!", e); } catch (IllegalBlockSizeException e) { logger.error(e); } catch (BadPaddingException e) { logger.error(e); } catch (NoSuchAlgorithmException e) { logger.error(e); } catch (InvalidKeySpecException e) { logger.error(e); } catch (NoSuchPaddingException e) { logger.error(e); } // SinaSSOEncoder sso = new SinaSSOEncoder(); // String sp = sso.encode(account.getPasswd(), servertime, nonce); logger.info("su=" + su); logger.info("servertime=" + servertime); logger.info("nonce=" + nonce); logger.info("sp=" + sp); logger.info("su=" + su + "&servertime=" + servertime + "&nonce=" + nonce + "&sp=" + sp); postMethod2Logon .setRequestBody(new NameValuePair[] { new NameValuePair("entry", "weibo"), new NameValuePair("gateway", "1"), new NameValuePair("from", ""), new NameValuePair("savestate", "7"), new NameValuePair("useticket", "1"), new NameValuePair("ssosimplelogin", "1"), new NameValuePair("useticket", "1"), new NameValuePair("vsnf", "1"), new NameValuePair("vsnval", ""), new NameValuePair("su", su), new NameValuePair("service", "miniblog"), new NameValuePair("servertime", servertime + ""), new NameValuePair("nonce", nonce), new NameValuePair("pwencode", "rsa2"), new NameValuePair("rsakv", rsakv), new NameValuePair("sp", sp), new NameValuePair("encoding", "UTF-8"), new NameValuePair("prelt", "115"), new NameValuePair("url", "http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack"), new NameValuePair("returntype", "META") }); int statusCode = client.executeMethod(postMethod2Logon); if (statusCode == HttpStatus.SC_OK) { System.out.println("ok"); } postMethod2Logon.releaseConnection(); logger.info(postMethod2Logon.getResponseHeaders()); // 验证是否登录成功 Cookie cookie = new Cookie("weibo.com", "wvr", "3.6", "/", new Date(2099, 12, 31), false); client.getState().addCookie(cookie); Cookie[] cookies = client.getState().getCookies(); boolean containsSue = false; boolean containsSup = false; for (Cookie singleCookie : cookies) { String domain = singleCookie.getDomain(); logger.info(domain); if (domain.equals(".sina.com.cn")) { singleCookie.setDomain("weibo.com"); } logger.info(singleCookie); if (singleCookie.getName().equals("SUE")) { containsSue = true; } if (singleCookie.getName().equals("SUP")) { containsSup = true; } } return client; } public void init(){ MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager(); client = new HttpClient(connectionManager); client.getParams().setCookiePolicy("compatibility"); client.getParams().setParameter("http.protocol.single-cookie-header", Boolean.valueOf(true)); client.getParams().setSoTimeout(20000); client.getHttpConnectionManager().getParams().setConnectionTimeout( 20000); } // inputstream转化为String类型 public static String inputStreamToString(InputStream is, String charset) throws IOException { int i = -1; ByteArrayOutputStream baos = new ByteArrayOutputStream(); while ((i = is.read()) != -1) { baos.write(i); } if (null == charset) { return baos.toString(); } else { return baos.toString(charset); } } protected PostMethod newPostMethod(String url) { PostMethod postMethod = new PostMethod(url); postMethod .setRequestHeader( "Accept", "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*"); postMethod.setRequestHeader("Referer", "http://weibo.com/"); postMethod.setRequestHeader("Accept-Language", "zh-cn"); postMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); postMethod.setRequestHeader("Accept-Encoding", "gzip, deflate"); postMethod .setRequestHeader( "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; InfoPath.2)"); postMethod.setRequestHeader("Connection", "Keep-Alive"); postMethod.setRequestHeader("Cache-Control", "no-cache"); return postMethod; } public static String decode(String string) { return string.replaceAll("%3A", ":").replaceAll("%2F", "/").replaceAll("%3D", "=") .replaceAll("%26", "&"); } // 用户名编码 @SuppressWarnings("deprecation") private String encodeAccount(String account) { return (new sun.misc.BASE64Encoder()).encode(URLEncoder.encode(account).getBytes()); } // 六位随机数nonce的产生(不用) public String makeNonce(int len) { String x = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; String str = ""; for (int i = 0; i < len; i++) { str += x.charAt((int) (Math.ceil(Math.random() * 1000000) % x.length())); } return str; } // servertime的产生(不用) public String getServerTime() { long servertime = new Date().getTime() / 1000; return String.valueOf(servertime); } protected GetMethod newGetMethod(String url) { GetMethod getMethod = new GetMethod(url); getMethod.setRequestHeader("Accept","image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*"); getMethod.setRequestHeader("Accept-Language", "zh-CN"); getMethod.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=utf-8"); getMethod.setRequestHeader("Accept-Encoding", "deflate"); getMethod.setRequestHeader("User-Agent","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; CIBA; MAXTHON 2.0)"); getMethod.setRequestHeader("Connection", "Keep-Alive"); getMethod.setRequestHeader("Cache-Control", "no-cache"); return getMethod; } }
2、BigIntegerRSA.java相关的加密算法类
package com.crawler.sina.login; import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.security.InvalidKeyException; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.interfaces.RSAPublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.RSAPublicKeySpec; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import org.apache.commons.codec.binary.Hex; /** * @author TonyJ * @Time 2013-7-1 上午02:12:46 * */ public class BigIntegerRSA { public String rsaCrypt(String modeHex, String exponentHex, String messageg) throws IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, UnsupportedEncodingException { KeyFactory factory = KeyFactory.getInstance("RSA"); BigInteger m = new BigInteger(modeHex, 16); /* public exponent */ BigInteger e = new BigInteger(exponentHex, 16); /* modulus */ RSAPublicKeySpec spec = new RSAPublicKeySpec(m, e); RSAPublicKey pub = (RSAPublicKey) factory.generatePublic(spec); Cipher enc = Cipher.getInstance("RSA"); enc.init(Cipher.ENCRYPT_MODE, pub); byte[] encryptedContentKey = enc.doFinal(messageg.getBytes("GB2312")); return new String(Hex.encodeHex(encryptedContentKey)); } }
3、SinaSSOEncoder.java密码加密的类
package com.crawler.sina.login; public class SinaSSOEncoder { private boolean i=false; private int g=8; public SinaSSOEncoder(){ } public String encode(String psw,String servertime,String nonce){ String password; password=hex_sha1(""+hex_sha1(hex_sha1(psw))+servertime+nonce); return password; } private String hex_sha1(String j) { return h(b(f(j,j.length()*g), j.length() * g)); } private String h(int[] l){ String k = i ? "0123456789ABCDEF" : "0123456789abcdef"; String m = ""; for (int j = 0; j < l.length * 4; j++) { m += k.charAt((l[j >> 2] >> ((3 - j % 4) * 8 + 4)) & 15) + "" + k.charAt((l[j >> 2] >> ((3 - j % 4) * 8)) & 15); } return m; } private int[] b(int[] A,int r){ A[r>>5]|=128<<(24-r%32); A[((r+64>>9)<<4)+15]=r; int[] B = new int[80]; int z = 1732584193; int y = -271733879; int v = -1732584194; int u = 271733878; int s = -1009589776; for (int o = 0; o < A.length; o += 16) { int q = z; int p = y; int n = v; int m = u; int k = s; for (int l = 0; l < 80; l++) { if (l < 16) { B[l] = A[o + l]; } else { B[l] = d(B[l - 3] ^ B[l - 8] ^ B[l - 14] ^ B[l - 16], 1); } int C = e(e(d(z, 5), a(l, y, v, u)), e(e(s, B[l]), c(l))); s = u; u = v; v = d(y, 30); y = z; z = C; } z = e(z, q); y = e(y, p); v = e(v, n); u = e(u, m); s = e(s, k); } return new int[]{z,y,v,u,s}; } private int a(int k,int j,int m,int l){ if(k<20){return(j&m)|((~j)&l);}; if(k<40){return j^m^l;}; if(k<60){return(j&m)|(j&l)|(m&l);}; return j^m^l; } private int c(int j){ return(j<20)?1518500249:(j<40)?1859775393:(j<60)?-1894007588:-899497514; } private int e(int j, int m) { int l = (j & 65535) + (m & 65535); int k = (j >> 16) + (m >> 16) + (l >> 16); return (k << 16) | (l & 65535); } private int d(int j,int k){ return(j<<k)|(j>>>(32-k)); } private int[] f(String m,int r){ int[] l; int j = (1<<this.g)-1; int len=((r+64>>9)<<4)+15; int k; for(k=0;k<m.length()*g;k+=g){ len = k>>5>len?k>>5:len; } l = new int[len+1]; for(k=0;k<l.length;k++){ l[k]=0; } for(k=0;k<m.length()*g;k+=g){ l[k>>5]|=(m.charAt(k/g)&j)<<(24-k%32); } return l; } }
评论
6 楼
hzyhush
2016-09-08
5 楼
meaemz
2015-09-01
大神,这是完整的代码吗?怎么没有没有main(),我要怎么调用?(我刚接触java)
4 楼
meaemz
2015-08-28
大神,这是完整的代码吗?怎么没有没有main(),是要自己写一个调用吗?(我刚接触java)
3 楼
c_he_n
2015-07-31
最后执行结果怎么获取到url
2 楼
magicyang919
2014-08-09
强,你是怎么想到的那?
1 楼
alleni123
2014-06-13
高手,,, 收我为徒吧。。。。
发表评论
-
maven使用和json解析的两遍文章地址
2015-03-19 22:26 568maven: http://blog.csdn.net/edw ... -
Java-大集合拆分为指定大小的小集合
2015-01-05 15:47 2857因为Oracle数据的in 最大允许1000 ,超过就会报错, ... -
Java实现数据库连接池技术
2012-03-16 08:57 932这个程序写得非常不错,思路清晰,代码注释清楚。 pa ... -
Java 常用的第三方组件
2011-07-04 17:51 8225java常用第三方软件包 网上收集的一些常用Java开发的第 ... -
一道Java面试题的做法
2011-06-21 10:16 1073题目:给定一段产品的英文表述,包含M个英文单词,每个英文单词以 ... -
Java实现中缀表达式转换为后缀表达式
2011-06-17 17:55 6389实现中缀表达式转换为后缀表达式主要包含三个类,一个主函数,一个 ... -
用自定义栈去实现字符串反转
2011-06-10 16:01 1829package date0610; import j ... -
Java中数组的排序方法的实现方式
2011-06-10 10:26 1210package date0609; /** *@ ... -
Java实现 栈
2011-06-09 16:46 1090package date0609; /** *@ ... -
统计一个字符串中出现最多的字符个数
2011-05-13 14:36 2347package date0513; import j ... -
统计一个字符串中出现最多的字符个数
2011-05-13 14:34 224[code="java"] packag ... -
计算时间差
2011-04-28 16:32 1042计算两个时间的差值 package date0428; ... -
根据传入字符串和截取个数分割字符串
2011-04-19 11:10 1147package date0419; public c ...
相关推荐
利用账号密码模拟登录新浪微博,文件中用到了shiro的base64加密以及一些JSON包,使用前请先下载。
新浪微博改版之后登陆变得非常复杂,这是使用java模拟登陆新浪微博。
简单的java swing 编写的新浪微博用户登陆客户端。 在本地运行时,需要自己修改config.properties中client_ID和client_SERCRET属性的值。这两个值需要自己通过注册得到。
httpclient4模拟登陆新浪微博 最新版
2016年4月7最新新浪微博模拟登录HttpClient4.5.2
java模拟浏览器登陆新浪微博爬取用户信息 新建java工程把包导入即可,仅供参考
java模拟新浪微博登录,通过调用微博SDK发布新信息.个人测试可以使用。 java模拟新浪微博登录,通过调用微博SDK发布新信息.个人测试可以使用。
新浪微博模拟登陆 可以获得AccessToken
Java模拟新浪和腾迅自动登录并发送微博(2013年3月更新可用)
本文主要介绍了Java模拟新浪微博登陆抓取数据的实现方法。具有很好的参考价值,下面跟着小编一起来看下吧
网上找了很久,没有发现C#的,最后参考了一个java的新浪微博模拟登录, 最后成功了,这里要注意的是每次加完密的密码要转为“小写”,否则登录不成功。
最新的腾讯和新浪微博模拟登录源码,java版本!
新浪微博模拟登陆源代码,java实现,微博数据抓取
重写了ListView控件和BaseAdapter适配器中的方法,添加了头部刷新功能,ListView中的数据中图片、昵称、文本都是在values目录中定义的arrays.xml资源,日期和人气则是通过java API中的Date、Random类模拟出来的。
主要为大家详细介绍了Java模拟新浪和腾讯自动登录并发送微博功能,感兴趣的小伙伴们可以参考一下
此资源为新浪微博和腾讯微博的HttpClient4模拟登录的代码Sina.java为新浪的,TencentClient.java为腾讯的。
信息资源的集成主要使用网络爬虫技术,利用java语言的regex包和selenium插件实现模拟登录以获取新浪微博,豆瓣电影,百度百科,相关新闻等不同数据源数据,以文档形式存储。查询扩展模块通过IKAnalayzer实现输入文本...
遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施...