• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            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 胡雨田 閱讀(534) 評論(0)  編輯 收藏 引用 所屬分類: 網絡編程編程技巧
            午夜精品久久久久久久| 亚洲精品无码久久一线| www亚洲欲色成人久久精品| 久久精品国产亚洲沈樵| 国产成人久久精品二区三区| 狠狠色丁香婷婷综合久久来来去| 欧美与黑人午夜性猛交久久久| 国产香蕉久久精品综合网| 日韩av无码久久精品免费| 久久九九亚洲精品| 免费久久人人爽人人爽av| 国产精品免费看久久久| 性做久久久久久久久| 国产精品久久国产精品99盘 | 久久噜噜久久久精品66| 欧美久久久久久| 97精品国产97久久久久久免费| 欧美久久久久久| 国产日韩久久免费影院| 国产精品久久久久AV福利动漫| 久久久久久国产精品无码下载| 日韩人妻无码精品久久久不卡| 久久国产热这里只有精品| 久久精品国产亚洲av日韩| 久久天天躁狠狠躁夜夜av浪潮| 韩国免费A级毛片久久| 久久久亚洲欧洲日产国码是AV| 国产2021久久精品| 久久久久夜夜夜精品国产| 久久久无码精品亚洲日韩蜜臀浪潮| 久久综合九色综合久99| 国产精品一区二区久久精品无码 | 成人免费网站久久久| 国产A级毛片久久久精品毛片| 久久精品国产第一区二区| 色综合久久88色综合天天| 2020久久精品国产免费| 97久久综合精品久久久综合| 久久香蕉国产线看观看精品yw | 97香蕉久久夜色精品国产| 久久久久亚洲AV成人网人人网站 |