使用HttpClient模拟新浪微博登录,贴在这里做个备忘,也希望能帮助到有这方面需求的童鞋们,代码如下:
package com.yida.spider4j.crawler.test.sina; import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.net.URLEncoder; 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 java.util.HashMap; import java.util.Map; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import com.yida.spider4j.crawler.utils.common.FastJSonUtils; import com.yida.spider4j.crawler.utils.common.StringUtils; import com.yida.spider4j.crawler.utils.httpclient.HttpClientUtils; import com.yida.spider4j.crawler.utils.httpclient.Result; import com.yida.spider4j.crawler.utils.io.FileUtils; /** * @ClassName: LoginTest * @Description: 新浪微博登录测试 * @author Lanxiaowei(736031305@qq.com) * @date 2015年10月29日 下午5:48:58 * */ public class LoginTest { private static final char[] DIGITS_LOWER = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; private static final char[] DIGITS_UPPER = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; public static void main(String[] args) throws Exception { //登录账号和密码 String account = "xxxxxxxxx"; String pwd = "xxxxxxx"; //新浪微博登录 Result result = login(account,pwd); String cookie = result.getCookie(); cookie = getSUB(cookie); System.out.println("cookie:" + cookie); //访问【文章同学】的新浪微博首页 String html = visitWenZhang(cookie); //把返回的html内容写入文件,方便打开进行验证是否正确返回 FileUtils.writeFile(html, "C:/wenzhang.html", "UTF-8", false); } public static String getSUB(String cookie) { String sub = cookie.replaceAll(".*;SUB=(.*);SUBP=.*", "$1"); sub = "SUB=" + sub + ";"; return sub; } /** * @Author: Lanxiaowei(736031305@qq.com) * @Title: visitWenZhang * @Description: 访问【文章同学】的新浪微博 * @param @return * @param @throws Exception * @return String * @throws */ public static String visitWenZhang(String cookie) throws Exception { String wenzhang = "http://weibo.com/wenzhang626"; Map<String,String> headers = new HashMap<String,String>(); //SUB cookie项是关键 //SUB=_2A257NaVGDeTxGedH7lsZ8yvPwziIHXVYQpGOrDV8PUNbuNAMLROnkW8p9rH2Bsuc2yUSKU1PzJykmlLc7Q..; headers.put("Cookie", cookie); String html = HttpClientUtils.getHTML(wenzhang,headers); //System.out.println(html); return html; } /** * @Author: Lanxiaowei(736031305@qq.com) * @Title: login * @Description: 模拟新浪微博登录 * @param @param account * @param @param pwd * @param @return * @param @throws Exception * @return String * @throws */ public static Result login(String account,String pwd) throws Exception { String url = "http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)&_=" + System.currentTimeMillis(); String content = prelogin(); Map<String,Object> paramMap = FastJSonUtils.toMap(content); String pubkey = paramMap.get("pubkey").toString(); String servertime = paramMap.get("servertime").toString(); String nonce = paramMap.get("nonce").toString(); String rsakv = paramMap.get("rsakv").toString(); Map<String,String> headers = new HashMap<String,String>(); headers.put("Host", "login.sina.com.cn"); headers.put("Origin", "http://weibo.com"); headers.put("Content-Type", "application/x-www-form-urlencoded"); Map<String,String> params = new HashMap<String,String>(); params.put("entry", "weibo"); params.put("gateway", "1"); params.put("from", ""); params.put("savestate", "7"); params.put("useticket", "1"); params.put("pagerefer", "http://s.weibo.com/weibo/%25E6%2596%2587%25E7%25AB%25A0%25E5%2590%258C%25E5%25AD%25A6?topnav=1&wvr=6&b=1"); params.put("vsnf", "1"); params.put("su", encodeAccount(account)); params.put("service", "miniblog"); params.put("servertime", servertime); params.put("nonce", nonce); params.put("pwencode", "rsa2"); params.put("rsakv", rsakv); params.put("sp", getSP(pwd, pubkey, servertime, nonce)); params.put("encoding", "UTF-8"); params.put("cdult", "2"); params.put("domain", "weibo.com"); params.put("prelt", "154"); params.put("returntype", "TEXT"); Result result = HttpClientUtils.post(url, headers, params); //System.out.println(json); return result; } /** * @Author: Lanxiaowei(736031305@qq.com) * @Title: prelogin * @Description: 登录必需参数获取 * @param @return * @param @throws Exception * @return String * @throws */ public static String prelogin() throws Exception { String url = "http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=&rsakt=mod&client=ssologin.js(v1.4.18)&_=1446099453139"; String content = HttpClientUtils.getHTML(url); if(null != content && !content.equals("")) { content = content.replaceAll("sinaSSOController.preloginCallBack\\((.*)\\)", "$1"); } //System.out.println(content); return content; } /** * @Author: Lanxiaowei(736031305@qq.com) * @Title: getSP * @Description: 登录密码加密 * @param @param pwd * @param @param pubkey * @param @param servertime * @param @param nonce * @param @return * @return String * @throws */ public static String getSP(String pwd,String pubkey,String servertime,String nonce) { String t = "10001"; String message = servertime + "\t" + nonce + "\n" + pwd; String result = null; try { result = rsa(pubkey, t , message); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (InvalidKeySpecException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } System.out.println("RSA加密后的密码:" + result); return result; } /** * @Author: Lanxiaowei(736031305@qq.com) * @Title: encodeAccount * @Description: 登录账号编码 * @param @param account * @param @return * @return String * @throws */ private static String encodeAccount(String account) { String userName = ""; try { userName = StringUtils.base64Encode(URLEncoder.encode(account, "UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return userName; } /** * @Author: Lanxiaowei(736031305@qq.com) * @Title: rsa * @Description: RSA加密 * @param @param pubkey * @param @param exponentHex * @param @param pwd * @param @return * @param @throws IllegalBlockSizeException * @param @throws BadPaddingException * @param @throws NoSuchAlgorithmException * @param @throws InvalidKeySpecException * @param @throws NoSuchPaddingException * @param @throws InvalidKeyException * @param @throws UnsupportedEncodingException * @return String * @throws */ public static String rsa(String pubkey, String exponentHex, String pwd) throws IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, UnsupportedEncodingException { KeyFactory factory = KeyFactory.getInstance("RSA"); BigInteger m = new BigInteger(pubkey, 16); BigInteger e = new BigInteger(exponentHex, 16); 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(pwd.getBytes("UTF-8")); return new String(encodeHex(encryptedContentKey)); } protected static char[] encodeHex(final byte[] data, final char[] toDigits) { final int l = data.length; final char[] out = new char[l << 1]; for (int i = 0, j = 0; i < l; i++) { out[j++] = toDigits[(0xF0 & data[i]) >>> 4]; out[j++] = toDigits[0x0F & data[i]]; } return out; } public static char[] encodeHex(final byte[] data, final boolean toLowerCase) { return encodeHex(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER); } public static char[] encodeHex(final byte[] data) { return encodeHex(data, true); } }
很不幸,代码才仅仅公布一天,新浪微博方面就已经做出相应防御措施:如果你访问过于频繁的话,登录接口即http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=&rsakt=mod&client=ssologin.js(v1.4.18)&_=1446099453139会直接返回
<html><head><script language='javascript'>parent.sinaSSOController.feedBackUrlCallBack({"result":false,"errno":"4049","reason":"\u4e3a\u4e86\u60a8\u7684\u5e10\u53f7\u5b89\u5168\uff0c\u8bf7\u8f93\u5165\u9a8c\u8bc1\u7801"});</script></head><body></body></html>
经过Unicode解码后,就是
这TM比较蛋疼,我暂时不知道解决!
除此之外,提交参数新浪微博也做了小调整,如图:
Map<String,String> params = new HashMap<String,String>(); params.put("entry", "weibo"); params.put("gateway", "1"); params.put("from", ""); params.put("savestate", "7"); params.put("useticket", "1"); params.put("pagerefer", "http://s.weibo.com/weibo/%25E6%2596%2587%25E7%25AB%25A0%25E5%2590%258C%25E5%25AD%25A6?topnav=1&wvr=6&b=1"); params.put("vsnf", "1"); params.put("su", encodeAccount(account)); params.put("service", "miniblog"); params.put("servertime", servertime); params.put("nonce", nonce); params.put("pwencode", "rsa2"); params.put("rsakv", rsakv); params.put("sp", getSP(pwd, pubkey, servertime, nonce)); params.put("encoding", "UTF-8"); params.put("sr", "1366*768"); params.put("prelt", "1011"); params.put("url", "http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack"); params.put("domain", "weibo.com"); params.put("returntype", "META");
起始我也就是在研究爬虫想集成爬虫自动登录验证功能,拿新浪微博来试试手测试一下罢了,新浪微博不用紧张。如果你第一次运行此代码可能会模拟登录成功,试了好多次之后,可能也会出现跟我一样的情况,要求输入验证码啦。或许当你看到此篇博客时,新浪微博的登录验证逻辑已经发现变化,上面的代码已经完全失效,但我想还是能够给你们些许提示。验证码破解这个比较有难度,我就不趟这浑水了,你们有兴趣就继续研究去吧.OK,That's all,Thanks your Attention!
相关推荐
在本文中,我们将深入探讨如何使用Java来模拟登录新浪微博这一话题。模拟登录是网络爬虫或自动化测试中常见的技术,它允许程序以用户的身份与网站交互。对于Java开发者来说,理解这一过程对于构建自动化工具或者数据...
简单的java swing 编写的新浪微博用户登陆客户端。 在本地运行时,需要自己修改config.properties中client_ID和client_SERCRET属性的值。这两个值需要自己通过注册得到。
这个“腾讯新浪微博模拟登录最新源码(java版)”提供了一种使用Java编程语言实现这一功能的方法。下面将详细介绍这个源码可能涉及的关键知识点。 1. **HTTP协议与网络请求**:模拟登录首先需要理解HTTP协议,包括...
网上找了很久,没有发现C#的,最后参考了一个java的新浪微博模拟登录, 最后成功了,这里要注意的是每次加完密的密码要转为“小写”,否则登录不成功。
在新浪微博的情况下,由于其安全机制,登录过程可能涉及复杂的身份验证和数据加密。 2. **HTTPClient库**:Java中的HTTPClient是一个强大的库,用于执行HTTP请求。在这个项目中,它被用来与新浪服务器进行通信,...
2016年4月7最新新浪微博模拟登录HttpClient4.5.2
今天我们将聚焦于“新浪微博2模拟登陆”这一主题,学习如何通过编程方式模拟登录并获取AccessToken,以便进行自动化操作或者数据分析。 首先,我们需要了解什么是模拟登陆。模拟登陆是指通过编程代码来模拟用户在...
java模拟新浪微博登录,通过调用微博SDK发布新信息.个人测试可以使用。 java模拟新浪微博登录,通过调用微博SDK发布新信息.个人测试可以使用。
【描述】:“新浪微博模拟登陆源代码,java实现,微博数据抓取” 这段描述揭示了几个关键点: 1. **模拟登录源代码**:这是实现自动化登录的程序代码,通常包括发送登录请求、处理验证码(如果存在)、设置Cookie...
利用账号密码模拟登录新浪微博,文件中用到了shiro的base64加密以及一些JSON包,使用前请先下载。
在本文中,我们将深入探讨如何使用Java来模拟登录新浪微博,特别是在其改版后增加了复杂性的背景下。我们将不依赖新浪提供的官方API,而是通过模拟浏览器的行为,实现自动化登录和交互。 首先,我们需要理解模拟...
在这个场景中,我们关注的是如何使用HTTPClient 4库来模拟登录新浪微博。首先,我们需要理解HTTPClient库的基本概念。 HTTPClient是一个强大的Java库,用于处理HTTP请求和响应。它提供了丰富的功能,包括支持HTTPS...
"毕业设计,关于新浪微博API的Java编程" 这个标题表明这是一个针对毕业生的项目,主要涉及的是使用Java语言与新浪微博的API进行交互。在IT领域,API(Application Programming Interface)是软件之间交互的一种方式...
然而,许多网站为了保护用户隐私和防止恶意爬取,会设置登录验证机制,新浪微博就是其中之一。本篇将详细介绍一个解决“需要登录才能抓取的新浪微博爬虫例子”,帮助你理解和构建类似的爬虫程序。 首先,我们需要...
在本文中,我们将深入探讨如何使用OAuth2协议模拟登录新浪微博,并了解相关技术细节。OAuth2是一种授权框架,允许第三方应用代表用户与服务提供商进行交互,例如发布微博。在这个例子中,我们将使用Java的Apache ...
【标题】:selenium+phantomjs实现新浪微博模拟登陆 在Web自动化测试和网页操作中,Selenium和PhantomJS是两个重要的工具。Selenium是一个强大的浏览器自动化框架,支持多种编程语言,如Python、Java等,能模拟真实...
这个项目是基于对新浪微博功能的模拟,旨在提供一个类似平台,用户可以在这里分享他们的想法、上传图片,并与他人互动。通过分析“JustShare”这个文件名,我们可以推测这可能是实现这一功能的核心代码库或者模块。 ...
java模拟浏览器登陆新浪微博爬取用户信息 新建java工程把包导入即可,仅供参考
在本文中,我们将深入探讨如何实现新浪微博的代码登录,并理解其背后的原理和技术细节。通过登录微博,我们可以获取必要的Cookie信息,以便在后续的HTTP请求中模拟已登录状态,访问受保护的用户页面。 首先,我们...