huyutian

他强由他强,清风拂山岗;他横由他横,明月照大江。他自狠来他自恶,我自一口真气足

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  20 随笔 :: 47 文章 :: 22 评论 :: 0 Trackbacks
     这次学习的目标是实现115.com的自动登录、签到、摇一摇。115是国内流行的网盘。容量大,可分享的资源丰富。115网站为吸引用户,设置了签到功能和摇一摇功能。本篇希望写出一个能自动登录签到的python程序。搜索了一下,网上已经有高手9deadblue@gmail.com写好:妖妖舞娘为一个Google App Engine(GAE)应用,利用GAE的调度系统实现了定时签到、领取空间等工作。但现在115已经升级了安全登录管理,不知道这个程序还能用否。
1.静态分析
首先看看115首页源文件中,查找与登录相关的代码如下:
                    var goto = "http://115.com";
                    //... ...部分省略
                    ;(function(){
                        // 登录
                        var $doms = $('#js-passwd,#js-account');
                        Common.bindLabelHide($doms);
                        $("#js-account").addVerify("notnull",null,"输入115网盘帐号/手机/邮箱");
                        $("#js-passwd").addVerify("notnull",null,"输入你的密码");
                        $doms.keydown(function(e){
                            if(e.keyCode!=13){
                                valiSuccess($(this));
                            }
                        })
                        setTimeout(function(){
                            $("#js-account").focus();
                            if($.trim($("#js-account").val())!=""){
                                $("#js-passwd").focus();
                            }
                        },200)

                        $("#js-submit").click(function(){
                            if(Common.validate.validate($doms,valiError,valiSuccess)){
                                var code = "";
                                Common.setLoginData({goto:goto});
                                Common.login($("#js-account").val(),$("#js-passwd").val(),code,1,$("#js-remember_pwd").is(":checked"),function(json){
                                    if(json.state){
                                        $("#js-passwd").val(Common.encode_safe_pwd($("#js-passwd").val()));
                                        $("#js-login_form").attr("action",json.goto)[0].submit();
                                        setTimeout(function(){
                                            location.href = json.goto;
                                        },1000);
                                        //location.href = json.goto;
                                    }else{
                                        if(json.err_name){
                                            var $t = $doms.filter("[name="+json.err_name+"]");
                                            if($t.length){
                                                valiError(json.err_msg,$t.focus());
                                                return;
                                            }
                                        }
                                        $.alertTip(json.err_msg);
                                    }
                                });
                                //登录
                            }
                            return false;
                        });

                    }());
当输入用户名和密码后,网页先校验用户名和密码的长度非空,调用common.js进行登录。
2.动态分析,用http analyser记录登录全过程的HTTP数据流。验证自己对登录过程的理解。
根据我的分析,大致描述115网盘登录过程
(1)查看第一条post命令(http://passport.115.com/?ct=login&ac=ajax&is_ssl=1),截图如下

登录时需要post的参数有
Parameter Name Value
login[ssoent] A1
login[version] 2.0
login[ssoext]      *************(13位)
login[ssoln]        ***********(用户名,明码)
login[ssopw]      *************(加密后密码,40位)
login[ssovcode]  *************(13位,同ssoext)
login[safe] 1
login[time] 0  (是否勾选5天内免登录)
login[safe_login] 0
goto  http://115.com
common.js中计算13位(16进制字符串)ssoext:前8位是当前时间秒值,后5位是一个小于123456789的随机数
ssovcode与ssoext一样。
ssopw采用了sha1算法,sha1( sha1(sha1(pwd)+sha1(account)) + ssovcode.toUpperCase())
返回页面包含重定向网址链接“http:\/\/passport.115.com\/?ct=login&ac=gotos&goto=http%3A%2F%2Fpassport.115.com%2F%3Fct%3Dlogin%26ac%...”
并设置记录登录状态的cookies信息(ssoidA1,ssoinfoA1,OORA,OOFA)
(2)post消息到刚才获得的重定向网址,登录完成。
Parameter Name Value
account ***********(用户名,明码)
passwd ************************(密码用Common.encode_safe_pwd函数加密)
(3)访问115个人中心,获取用户信息
GET命令 http://my.115.com/?ct=ajax&ac=get_user_aq&js_return=abc
返回状态var abc = {"state":true,"data":{"uid":"********","uname":"******",......},......}
测试了一下,这一步似乎不能省略。否则下面签到时不会返回token值
(4)GET命令 http://115.com/?ct=event&ac=get_active_param&_=1391498007778(时间戳)  获取签到状态信息
返回签到状态{"state":true,"is_take":true,"is_take_token":"a1f1ad317b680d0f3ce34153a247383e","is_checkin":"11","this_turn":"11",...}
(5)POST命令 http://115.com/?ct=ajax_user&ac=checkin 签到
Parameter Name Value
token a1f1ad317b680d0f3ce34153a247383e(刚才服务器返回的token)
返回签到状态{"state":true,"data":{"this_turn":11,"this_turn_space":"11GB","next_turn":12,"next_turn_space":"12GB"}}
(6)摇一摇 GET命令 http://115.com/?ct=yao   (记住要携带cookie)
查看返回的源文件,可以看到如下片段,记录下take_token串值,后面摇一摇时要用到
    /*
        @摇一摇获取数据
    
*/
    var take_token = 'daadb242dfbb9756a16323c6ef548321'
        , is_take = Number('1')
        , is_allow = Number('1')
        , is_login = Number('********')
        , is_vip = Number('1')
        , is_go = true
        , is_me = 1;//Number('');
继续向下可以看到与摇一摇有关代码片段如下:
(6)GET命令摇一摇http://115.com/?ct=ajax_user&ac=pick_spaces&u=1&token=daadb242dfbb9756a16323c6ef548321
返回摇一摇获得的空间信息
{"state":true,"picked":"2728MB","picked_num":2728,"flag":false,"total_size":"22910570MB","used_percent":"0%","exp":793}

到这里整个115登录、签到、摇一摇的过程分析完了。下面就是如何用python来模仿以上过程了。首先需要有一个python下方便好用的http包。
posted on 2014-02-15 21:09 胡雨田 阅读(504) 评论(0)  编辑 收藏 引用 所属分类: 网络编程编程技巧

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理