文档章节

java 后台模拟登陆新浪微博

tongqu
 tongqu
发布于 2015/03/10 14:05
字数 1197
阅读 342
收藏 3

一.需要用到的包:

commons-codec-1.4.jar

commons-httpclient-3.0.1.jar

commons-logging-1.1.1.jar

二.分析新浪通行证登录页面

登录页面:      

       新浪微博的登录页面中,我发现密码在传过去之前已经被js加密过,而js中加密方法很难找,而新浪通行证中的密码并没有加密,所以选择通过新浪通行证登录

地址:http://login.sina.com.cn/signup/signin.php?entry=sso

简要说明登录过程:

         1.将用户信息提交到https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_=1425914562105中,

火狐浏览器中测出,它返回了一部分cookie和一个json格式的响应信息,但这部分cookie是不能作用在微博中的,因为他们和微博的主机、作用域不同

        2.用js处理返回的json信息,构建一个get请求,其参数主要由json中的信息构成

        3.返回微博的cookie

        4.用这部分cookie可以获取微博的信息

       

三.具体登录过程:

      1.将用户名、密码等信息通过post请求传入https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_=1425914562105中,获得许多cookie和一个json格式的响应体。

                

    public static void main(String[] args) {
        HttpClient client=new HttpClient();
        NameValuePair pairs[]={
            new NameValuePair("cdult","3"),
            new NameValuePair("encoding","UTF-8"),
            new NameValuePair("from",null),
            new NameValuePair("gateway","1"),
            new NameValuePair("prelt","0"),
            new NameValuePair("pagerefer","http://login.sina.com/sso/login.php"),
            new NameValuePair("returntype","TEXT"),
            new NameValuePair("savestate","30"),
            new NameValuePair("service","sso"),
            new NameValuePair("sp","密码"),
            new NameValuePair("sr","1366*778"),
            new NameValuePair("su",getBASE64("用户名")),
            new NameValuePair("useticket","0"),
            new NameValuePair("vsnf","1")

        };

        HttpMethod method=getPostMethod("https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_="+new Date().getTime(), null, pairs);
        client.getParams().setContentCharset("GBK");
        try {
            client.executeMethod(method);
//        System.out.println(method.getResponseBodyAsString());
            InputStream stream = method.getResponseBodyAsStream();  
                   
                 BufferedReader br = new BufferedReader(new InputStreamReader(stream, "UTF-8"));  
                 StringBuffer buf = new StringBuffer();  
                 String line;  
                 while (null != (line = br.readLine())) {  
                     buf.append(line).append("\n");  
                 }  
                 System.out.println(buf.toString());  
             method.releaseConnection();  
             
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        
    }
    public static HttpMethod getPostMethod(String url,Header headers[],NameValuePair pairs[]){
        PostMethod method=new PostMethod(url);
        if(headers!=null){
            for(Header header:headers){
                method.setRequestHeader(header);
            }
        }
        method.setRequestBody(pairs);
        return method;
    }

            上述代码中,最重要的部分是post参数中returntype,“TEXT”因为在ie中如果接收到json或者text格式的数据会自动提示下载,所以ie中这部分参数对应的value是“JFrame”格式的,由于拿不到我想要的东西,其登录过程我没有分析。

            经运行,我们得到下述json格式的代码:

{"retcode":"0","uid":"2136324567",
"nick":"\u7528\u62372136324567",
"crossDomainUrlList":
["https:\/\/passport.weibo.com\/wbsso\/login?ticket=ST-MjEzNjMyNDU2Nw%3D%3D-1425964519-ja-B24DC4AB2894692B3B38928C36A11009&ssosavestate=1457500519",
"https:\/\/crosdom.weicaifu.com\/sso\/crosdom?action=login&savestate=1457500519",
"http:\/\/passport.weibo.cn\/sso\/crossdomain?action=login&savestate=1"]}

            2.      根据返回json构建get请求例如

https://passport.weibo.com/wbsso/login?ticket=ST-MjEzNjMyNDU2Nw%3D%3D-1425965391-ja-BB03424873E09D9B8E6FF8BA8763304F&ssosavestate=1457501391&callback=sinaSSOController.doCrossDomainCallBack&scriptId=ssoscript0&client=ssologin.js(v1.4.15)&_=1425965215809

                这里我理解的是新浪会根据我们提交的信息给我们一张票去访问微博,这些参数中,ticket和ssosavestate是json中给的_=后面是new Date().getTime(),其它固定,更新上面代码,全部代码如下

private static String username="xxxxx";
    private    static String password="xxxxx";
    public static void main(String[] args) {
        String ticket="";
        String ssosavestate="";
        HttpClient client=new HttpClient();
        NameValuePair pairs[]={
            new NameValuePair("cdult","3"),
            new NameValuePair("encoding","UTF-8"),
            new NameValuePair("from",null),
            new NameValuePair("gateway","1"),
            new NameValuePair("prelt","0"),
            new NameValuePair("pagerefer","http://login.sina.com/sso/login.php"),
            new NameValuePair("returntype","TEXT"),
            new NameValuePair("savestate","30"),
            new NameValuePair("service","sso"),
            new NameValuePair("sp","wobuaini50"),
            new NameValuePair("sr","1366*778"),
            new NameValuePair("su",getBASE64(username)),
            new NameValuePair("useticket","0"),
            new NameValuePair("vsnf","1")

        };

        HttpMethod method=getPostMethod("https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_="+new Date().getTime(), null, pairs);
        client.getParams().setContentCharset("GBK");
        try {
            client.executeMethod(method);
            String temp=method.getResponseBodyAsString();
            if(temp.contains("ticket")){
                ticket=temp.substring(temp.indexOf("ticket="),temp.indexOf("&"));
                ssosavestate=temp.substring(temp.indexOf("ssosavestate"),temp.indexOf("\"", temp.indexOf("ssosavestate")));
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        String url2="https://passport.weibo.com/wbsso/login?"+ticket+"&"+ssosavestate+"&callback=sinaSSOController.doCrossDomainCallBack&scriptId=ssoscript0&client=ssologin.js(v1.4.15)&_="+new Date().getTime();
        String cookieStr="";
        Header[] headers=null;
        HttpClient client2=new HttpClient();
        GetMethod method2=new GetMethod(url2);
        try {
            client2.executeMethod(method2);
            headers=method2.getResponseHeaders();
            method2.releaseConnection();
        } catch (HttpException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        Cookie[] cookies=client2.getState().getCookies();
        for (int i = 0; i < cookies.length; i++) {
            String temp=cookies[i].getName();
            if(temp.equals("SUE")||temp.equals("SUS")||temp.equals("SUP")){
                cookieStr+=cookies[i].getName()+"="+cookies[i].getValue()+";";
            }
        }
        cookieStr+="un="+username;
        System.out.println(cookieStr);
    }
    public static HttpMethod getPostMethod(String url,Header headers[],NameValuePair pairs[]){
        PostMethod method=new PostMethod(url);
        if(headers!=null){
            for(Header header:headers){
                method.setRequestHeader(header);
            }
        }
        method.setRequestBody(pairs);
        return method;
    }
    public HttpMethod getGetMethod(String url,Header headers[]){
        HttpMethod method=new GetMethod(url);
        if(headers!=null){
            for(Header header:headers){
                method.setRequestHeader(header);
            }
        }
        return method;
    }
    @SuppressWarnings("restriction")
    public static String getBASE64(String s) {
        if (s == null) return null;
        return (new sun.misc.BASE64Encoder()).encode( s.getBytes() );
        }

返回结果是:

SUS=SID-2136324567-1425965890-JA-6hy0f-a36939ccbd9b8192ecfa6b7dd7fd4122;SUE=es%3D72da1b83721474c9606bbec7bc8080b7%26ev%3Dv1%26es2%3Da0aa1dcd967281462c90f257a9daed9c%26rs0%3DgD8KqazZqR7q%252F3ytvcgRcNWY1frB7gvFQRxN3w0XLhZ3BvZy5tMWHZ58BMpG1X6a%252FisOZ0UPUCyuCdJOv6wfUfp1k1f9AadexOQoOAVFbkqr3LTiLI6u%252FkHe6fezN842YuY0w110jhU0Ls4vFOJvgOksPp4vpi5HOGKhqbmyGWQ%253D%26rv%3D0;SUP=cv%3D1%26bt%3D1425965890%26et%3D1426052290%26d%3Dc909%26i%3D4122%26us%3D1%26vf%3D0%26vt%3D0%26ac%3D0%26st%3D0%26uid%3D2136324567%26name%3D15201315239%2540sina.cn%26nick%3D%25E7%2594%25A8%25E6%2588%25B72136324567%26fmp%3D%26lcp%3D2014-04-29%252018%253A44%253A36;un=yourusername

这时我们只需要在我们的请求头中 setRequestHeader("Cookie", cookieStr);就可以访问微博的各个页面了

举例部分代码如下,可以放到上述代码的main中

HttpClient client3=new HttpClient();
        GetMethod method3=new GetMethod("http://weibo.com/friends?leftnav=1&wvr=6&isfriends=1&step=2");
        method3.setRequestHeader("Cookie", cookieStr);
        try {
            client3.executeMethod(method3);
            System.out.println(method3.getResponseBodyAsString());
        } catch (HttpException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

测试成功~

代码不合理的地方还请指教

            


     










© 著作权归作者所有

tongqu
粉丝 38
博文 37
码字总数 26162
作品 0
海淀
私信 提问
Java 有什么微信、QQ、微博的登陆框架

请大家帮忙推荐一个集成了微信、QQ、新浪微博 OAuth 登陆的 Java 库

公孙二狗
2016/06/10
725
4
如何让Java和C++接口互相调用:JNI使用指南

写在前面的话 对于cocos2d-x开发者而言,游戏对多平台的支持是一个刚需,一般而言需要支持Android和iOS。然而,在开发过程中,android 平台遇到的一系列问题着实让人头疼,本文以集成新浪微博...

zhangyujsj
2015/08/23
0
0
新浪微博授权登陆自动获取accesstoken

新浪微博用java sdk做一个授权登陆,授权之后回调后才产生code,然后手动获取accesstoken,但是自动获取accesstoken,不知道怎么获取,谁做过?

功夫panda
2012/09/10
3K
6
新浪微博oauth 2.0中,怎么样才能自动获取code

目前在做一个调用新浪微博API的项目,当输入网址https://api.weibo.com/oauth2/authorize?client_id=appkey&redirect_uri=回调地址时,需要登陆密码账号再授权,才能访问回调地址,回调地址后...

Andyagg
2018/04/17
132
0
java抓取到用户的新浪微博的好友关系,最新的代码谁有呀?急需呀

java抓取到用户的新浪微博的好友关系,最新的代码谁有呀?急需呀 java抓取到用户的新浪微博的好友关系,最新的代码谁有呀?急需呀 博客也行,不过要能用的,

天池番薯
2015/11/18
110
1

没有更多内容

加载失败,请刷新页面

加载更多

二、Docker

1、Docker - The TLDR(Too Long,Don't Read,Linxu 终端工具 ) Docker是在Linux和Windows上运行的软件。它创建、管理和编排容器。该软件以开源方式开发,在Github上作为Moby开源项目的一部分。...

倪伟伟
36分钟前
2
0
Python猫荐书系列之七:Python入门书籍有哪些?

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/ArN-6mLPzPT8Zoq0Na_tsg 最近,猫哥的 Python 技术学习群里进来了几位比较特殊的同学:一...

豌豆花下猫
今天
5
0
Guava RateLimiter限流源码解析和实例应用

在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流 缓存 缓存的目的是提升系统访问速度和增大系统处理容量 降级 降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高...

算法之名
今天
13
0
国产达梦数据库与MySQL的区别

背景 由于项目上的需要,把项目实现国产化,把底层的MySQL数据库替换为国产的达梦数据库,花了一周的时间研究了国产的数据库-达梦数据库,它和MySQL有一定的区别,SQL的写法也有一些区别。 ...

TSMYK
今天
2
0
老也有错?35岁程序员是一道坎,横亘在每个技术职场人的心中

随着互联网的高速发展变革,大龄恐惧症越来越多地在技术圈被人讨论。很多程序员在工作5-10年以后,都会开始思考5年、10年甚至更久以后的自己,会是怎样一种生活工作状态,以及是否会被时代抛...

我最喜欢三大框架
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部