| line | stmt | bran | cond | sub | pod | time | code | 
| 1 | 1 |  |  | 1 |  | 601 | use JE; | 
|  | 1 |  |  |  |  | 81207 |  | 
|  | 1 |  |  |  |  | 78 |  | 
| 2 | 1 |  |  | 1 |  | 10 | use Digest::MD5 qw(md5 md5_hex); | 
|  | 1 |  |  |  |  | 2 |  | 
|  | 1 |  |  |  |  | 86 |  | 
| 3 | 1 |  |  | 1 |  | 8 | use Webqq::Client::Util qw(console); | 
|  | 1 |  |  |  |  | 4 |  | 
|  | 1 |  |  |  |  | 880 |  | 
| 4 |  |  |  |  |  |  | sub Webqq::Client::_login1{ | 
| 5 | 0 |  |  | 0 |  |  | console "尝试进行登录(阶段1)...\n"; | 
| 6 | 0 |  |  |  |  |  | my $self = shift; | 
| 7 | 0 |  |  |  |  |  | my $ua = $self->{ua}; | 
| 8 | 0 |  |  |  |  |  | my $api_url = 'https://ssl.ptlogin2.qq.com/login'; | 
| 9 | 0 | 0 |  |  |  |  | my @headers = $self->{type} eq 'webqq'? (Referer => 'https://ui.ptlogin2.qq.com/cgi-bin/login?daid=164&target=self&style=5&mibao_css=m_webqq&appid=1003903&enable_qlogin=0&no_verifyimg=1&s_url=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html&f_url=loginerroralert&strong_login=1&login_state=10&t=20140612002') | 
| 10 |  |  |  |  |  |  | :                           (Referer => 'https://ui.ptlogin2.qq.com/cgi-bin/login?daid=164&target=self&style=16&mibao_css=m_webqq&appid=501004106&enable_qlogin=0&no_verifyimg=1&s_url=http%3A%2F%2Fw.qq.com%2Fproxy.html&f_url=loginerroralert&strong_login=1&login_state=10&t=20131024001') | 
| 11 |  |  |  |  |  |  | ; | 
| 12 |  |  |  |  |  |  |  | 
| 13 | 0 |  |  |  |  |  | my $passwd; | 
| 14 |  |  |  |  |  |  |  | 
| 15 | 0 | 0 |  |  |  |  | if($self->{type} eq 'webqq'){ | 
| 16 | 0 |  |  |  |  |  | $md5_salt = eval qq{"$self->{qq_param}{md5_salt}"}; | 
| 17 | 0 |  |  |  |  |  | $passwd = pack "H*",$self->{qq_param}{pwd}; | 
| 18 | 0 |  |  |  |  |  | $passwd = uc md5_hex( uc(md5_hex( $passwd . $md5_salt)) . uc( $self->{qq_param}{verifycode}  ) ); | 
| 19 |  |  |  |  |  |  |  | 
| 20 |  |  |  |  |  |  | } | 
| 21 |  |  |  |  |  |  | else{ | 
| 22 | 0 |  |  |  |  |  | console "客户端加密算法生成中,这可能会花费几分钟,请耐心等待...\n"; | 
| 23 | 0 |  |  |  |  |  | my $je; | 
| 24 | 0 | 0 |  |  |  |  | if(defined $self->{je}){ | 
| 25 | 0 |  |  |  |  |  | $je = $self->{je}; | 
| 26 |  |  |  |  |  |  | } | 
| 27 |  |  |  |  |  |  | else{ | 
| 28 | 0 |  |  |  |  |  | my $javascript; | 
| 29 | 0 | 0 |  |  |  |  | if(defined $Webqq::Client::_javascript){ | 
| 30 | 0 |  |  |  |  |  | $javascript = $Webqq::Client::_javascript; | 
| 31 |  |  |  |  |  |  | } | 
| 32 |  |  |  |  |  |  | else{ | 
| 33 | 0 |  |  |  |  |  | local $/ = undef; | 
| 34 | 0 |  |  |  |  |  | $javascript = ; | 
| 35 | 0 |  |  |  |  |  | $Webqq::Client::_javascript = $javascript; | 
| 36 | 0 |  |  |  |  |  | close DATA; | 
| 37 |  |  |  |  |  |  | } | 
| 38 | 0 |  |  |  |  |  | $je = JE->new; | 
| 39 | 0 |  |  |  |  |  | $je->eval($javascript); | 
| 40 | 0 | 0 |  |  |  |  | if($@){ | 
| 41 | 0 |  |  |  |  |  | console "客户端加密算法执行错误:$@\n"; | 
| 42 | 0 |  |  |  |  |  | return 0; | 
| 43 |  |  |  |  |  |  | } | 
| 44 | 0 |  |  |  |  |  | $self->{je} = $je; | 
| 45 |  |  |  |  |  |  | } | 
| 46 | 0 |  |  |  |  |  | my $p = $je->eval(qq# | 
| 47 |  |  |  |  |  |  | var p = '$self->{qq_param}{pwd}'; | 
| 48 |  |  |  |  |  |  | var salt = '$self->{qq_param}{md5_salt}'; | 
| 49 |  |  |  |  |  |  | var verifycode = '$self->{qq_param}{verifycode}'; | 
| 50 |  |  |  |  |  |  | var r = \$.Encryption.getEncryption(p,salt,verifycode,1); | 
| 51 |  |  |  |  |  |  | return(r); | 
| 52 |  |  |  |  |  |  | #); | 
| 53 |  |  |  |  |  |  |  | 
| 54 | 0 | 0 | 0 |  |  |  | if($p and !$@){ | 
| 55 | 0 |  |  |  |  |  | $passwd  = $p; | 
| 56 |  |  |  |  |  |  | } | 
| 57 |  |  |  |  |  |  | else{ | 
| 58 | 0 |  |  |  |  |  | console "客户端加密算法执行错误:$@\n"; | 
| 59 | 0 |  |  |  |  |  | return 0; | 
| 60 |  |  |  |  |  |  | } | 
| 61 |  |  |  |  |  |  |  | 
| 62 |  |  |  |  |  |  | } | 
| 63 | 0 | 0 |  |  |  |  | my $query_string_ul = $self->{type} eq 'webqq'? 'http%3A%2F%2Fweb2.qq.com%2Floginproxy.html%3Flogin2qq%3D1%26webqq_type%3D10' | 
| 64 |  |  |  |  |  |  | :                           'http%3A%2F%2Fw.qq.com%2Fproxy.html%3Flogin2qq%3D1%26webqq_type%3D10' | 
| 65 |  |  |  |  |  |  | ; | 
| 66 | 0 | 0 |  |  |  |  | my $query_string_action = $self->{type} eq 'webqq' ? '3-14-15279' | 
| 67 |  |  |  |  |  |  | :                            '0-23-19230' | 
| 68 |  |  |  |  |  |  | ; | 
| 69 |  |  |  |  |  |  |  | 
| 70 |  |  |  |  |  |  |  | 
| 71 | 0 |  | 0 |  |  |  | my @query_string = ( | 
| 72 |  |  |  |  |  |  | u               =>  $self->{qq_param}{qq}, | 
| 73 |  |  |  |  |  |  | p               =>  $passwd, | 
| 74 |  |  |  |  |  |  | verifycode      =>  $self->{qq_param}{verifycode}, | 
| 75 |  |  |  |  |  |  | webqq_type      =>  10, | 
| 76 |  |  |  |  |  |  | remember_uin    =>  1, | 
| 77 |  |  |  |  |  |  | login2qq        =>  1, | 
| 78 |  |  |  |  |  |  | aid             =>  $self->{qq_param}{g_appid}, | 
| 79 |  |  |  |  |  |  | u1              =>  $query_string_ul, | 
| 80 |  |  |  |  |  |  | h               =>  1, | 
| 81 |  |  |  |  |  |  | ptredirect      =>  0, | 
| 82 |  |  |  |  |  |  | ptlang          =>  2052, | 
| 83 |  |  |  |  |  |  | daid            =>  $self->{qq_param}{g_daid}, | 
| 84 |  |  |  |  |  |  | from_ui         =>  1, | 
| 85 |  |  |  |  |  |  | pttype          =>  1, | 
| 86 |  |  |  |  |  |  | dumy            =>  undef, | 
| 87 |  |  |  |  |  |  | fp              =>  'loginerroralert', | 
| 88 |  |  |  |  |  |  | action          =>  $query_string_action, | 
| 89 |  |  |  |  |  |  | mibao_css       =>  $self->{qq_param}{g_mibao_css}, | 
| 90 |  |  |  |  |  |  | t               =>  1, | 
| 91 |  |  |  |  |  |  | g               =>  1, | 
| 92 |  |  |  |  |  |  | js_type         =>  0, | 
| 93 |  |  |  |  |  |  | js_ver          =>  $self->{qq_param}{g_pt_version}, | 
| 94 |  |  |  |  |  |  | pt_vcode_v1     =>  0, | 
| 95 |  |  |  |  |  |  | pt_verifysession_v1 =>   $self->{qq_param}{verifysession} || $self->search_cookie("verifysession"), | 
| 96 |  |  |  |  |  |  |  | 
| 97 |  |  |  |  |  |  | ); | 
| 98 | 0 | 0 |  |  |  |  | if($self->{type} eq 'webqq'){ | 
| 99 | 0 |  |  |  |  |  | splice @query_string,-4,0,(pt_uistyle => $self->{qq_param}{g_style}); | 
| 100 |  |  |  |  |  |  | } | 
| 101 |  |  |  |  |  |  | else{ | 
| 102 | 0 |  |  |  |  |  | splice @query_string,-4,0,(login_sig => $self->{qq_param}{g_login_sig}); | 
| 103 | 0 |  |  |  |  |  | splice @query_string,-4,0,(pt_randsalt => $self->{qq_param}{isRandSalt} ); | 
| 104 |  |  |  |  |  |  | } | 
| 105 |  |  |  |  |  |  |  | 
| 106 | 0 |  |  |  |  |  | my @query_string_pairs; | 
| 107 | 0 |  |  |  |  |  | push @query_string_pairs , shift(@query_string) . "=" . shift(@query_string) while(@query_string) ; | 
| 108 |  |  |  |  |  |  |  | 
| 109 | 0 |  |  |  |  |  | for(my $i=1;$i<=$self->{ua_retry_times};$i++){ | 
| 110 | 0 |  |  |  |  |  | my $response = $ua->get($api_url.'?'.join("&",@query_string_pairs),@headers ); | 
| 111 | 0 | 0 |  |  |  |  | if($response->is_success){ | 
| 112 | 0 | 0 |  |  |  |  | print $response->content() if $self->{debug}; | 
| 113 | 0 |  |  |  |  |  | my $content = $response->content(); | 
| 114 | 0 |  |  |  |  |  | my %d = (); | 
| 115 | 0 |  |  |  |  |  | @d{qw( retcode unknown_1 api_check_sig unknown_2 status uin )} = $content=~/'(.*?)'/g; | 
| 116 |  |  |  |  |  |  | #ptuiCB('4','0','','0','您输入的验证码不正确,请重新输入。', '12345678'); | 
| 117 |  |  |  |  |  |  | #ptuiCB('3','0','','0','您输入的帐号或密码不正确,请重新输入。', '2735534596'); | 
| 118 |  |  |  |  |  |  |  | 
| 119 | 0 | 0 |  |  |  |  | if($d{retcode} == 4){ | 
|  |  | 0 |  |  |  |  |  | 
|  |  | 0 |  |  |  |  |  | 
| 120 | 0 |  |  |  |  |  | console "您输入的验证码不正确,需要重新输入...\n"; | 
| 121 | 0 |  |  |  |  |  | return -1; | 
| 122 |  |  |  |  |  |  | } | 
| 123 |  |  |  |  |  |  | elsif($d{retcode} == 3){ | 
| 124 | 0 |  |  |  |  |  | console "您输入的帐号或密码不正确,客户端终止运行...\n"; | 
| 125 | 0 |  |  |  |  |  | $self->stop(); | 
| 126 |  |  |  |  |  |  | } | 
| 127 |  |  |  |  |  |  | elsif($d{retcode} != 0){ | 
| 128 | 0 |  |  |  |  |  | console "$d{status},客户端终止运行...\n"; | 
| 129 | 0 |  |  |  |  |  | $self->stop(); | 
| 130 |  |  |  |  |  |  | } | 
| 131 | 0 |  |  |  |  |  | $self->{qq_param}{api_check_sig} = $d{api_check_sig}; | 
| 132 | 0 |  |  |  |  |  | $self->{qq_param}{ptwebqq} = $self->search_cookie('ptwebqq'); | 
| 133 | 0 |  |  |  |  |  | return 1; | 
| 134 |  |  |  |  |  |  | } | 
| 135 |  |  |  |  |  |  | } | 
| 136 | 0 |  |  |  |  |  | return 0; | 
| 137 |  |  |  |  |  |  | } | 
| 138 |  |  |  |  |  |  | 1; | 
| 139 |  |  |  |  |  |  | __DATA__ |