File Coverage

blib/lib/Mojo/Webqq/Model/Ext.pm
Criterion Covered Total %
statement 3 51 5.8
branch 1 30 3.3
condition 0 11 0.0
subroutine 1 6 16.6
pod 0 1 0.0
total 5 99 5.0


line stmt bran cond sub pod time code
1             package Mojo::Webqq::Model::Ext;
2             BEGIN{
3 1     1   6 eval{
4 1         225 require Webqq::Encryption;
5             };
6 1 50       926 unless($@){
7 0           $Mojo::Webqq::Model::Ext::has_webqq_encryption = 1;
8             }
9             }
10             our $_retcode;
11             our $_verifycode;
12             our $_md5_salt;
13             our $_verifysession;
14             our $_is_rand_salt;
15             our $_api_check_sig;
16              
17             sub model_ext_authorize{
18 0     0 0   my $self = shift;
19 0 0         if(not $Mojo::Webqq::Model::Ext::has_webqq_encryption){
20 0           $self->warn("未安装 Webqq::Encryption 模块,无法获取扩展信息,安装方法参见: https://metacpan.org/pod/distribution/Webqq-Encryption/lib/Webqq/Encryption.pod");
21 0           $self->model_ext(0);
22 0           return;
23             }
24            
25 0 0 0       if($self->login_type eq 'login' and $self->account !~ /^\d+$/){
26 0           $self->error("使用账号密码登录方式,account参数不是有效的QQ号码");
27 0           $self->stop();
28             }
29 0 0         if($self->pwd){
30 0 0         $self->info("开始账号密码方式登录...") if $self->login_type eq 'login';
31 0 0         $self->info("尝取扩展信息授权...") if $self->login_type eq 'qrlogin';
32 0   0       my $ret = $self->_model_ext_prepare() && $self->_model_ext_check() && $self->_model_ext_login() && $self->_model_ext_check_sig();
33 0 0         if($ret){
34 0           $self->model_ext($ret);
35             #$self->info("账号密码方式登录成功");
36 0           return 1;
37             }
38             else{
39             #$self->info("账号密码方式失败");
40 0           return 0;
41             }
42             }
43             else{
44 0           $self->warn("未设置有效的登录密码,无法进行登录");
45 0           return 0;
46             }
47 0           return 1;
48             }
49             sub _model_ext_prepare {
50 0     0     my $self = shift;
51 0           $self->debug("账号登录中(prepare)...");
52 0           my(undef,$ua,$tx) = $self->http_get('https://xui.ptlogin2.qq.com/cgi-bin/xlogin?appid=715030901&daid=73&pt_no_auth=1&s_url=http%3A%2F%2Fqun.qq.com%2F',{Referer=>'http://qun.qq.com/',ua_debug_res_body=>0, blocking=> 1});
53 0 0         return $tx->res->code == 200?1:0;
54             }
55              
56             sub _model_ext_check {
57 0     0     my $self = shift;
58 0           $self->debug("账号登录中(check)...");
59 0 0         my $content = $self->http_get(
60             $self->gen_url('https://ssl.ptlogin2.qq.com/check',
61             (
62             regmaster => '',
63             pt_tea => 2,
64             pt_vcode => 1,
65             uin => ($self->login_type eq 'login'?$self->account:$self->uid),
66             appid => 715030901,
67             js_ver => 10233,
68             js_type => 1,
69             login_sig => $self->search_cookie("pt_login_sig"),
70             u1 => 'http%3A%2F%2Fqun.qq.com%2F',
71             r => rand(),
72             pt_uistyle=> 40,
73             pt_jstoken=> 485008785
74             )
75             ),
76             {blocking=>1,Referer => 'https://xui.ptlogin2.qq.com/cgi-bin/xlogin?appid=715030901&daid=73&pt_no_auth=1&s_url=http%3A%2F%2Fqun.qq.com%2F'},
77             );
78 0           my($retcode,$verifycode,$md5_salt,$verifysession,$is_rand_salt) = $content =~/'([^']*)'/g;
79              
80 0 0         if($retcode == 0 ){
81 0           $_retcode = $retcode;
82 0           $_verifycode = $verifycode;
83 0           $_md5_salt = $md5_salt;
84 0           $_verifysession = $verifysession;
85 0           $_is_rand_salt = $is_rand_salt;
86             }
87             else{
88 0           $self->error("账号登录失败: 可能因为登录环境变化引起,解决方法参见:https://github.com/sjdy521/Mojo-Webqq/issues/183");
89             }
90 0 0         return $retcode == 0? 1 : 0;
91             }
92              
93             sub _model_ext_login{
94 0     0     my $self = shift;
95 0           $self->debug("账号登录中(login)...");
96 0 0 0       my $content = $self->http_get(
      0        
97             $self->gen_url('https://ssl.ptlogin2.qq.com/login',
98             (
99             u => ($self->login_type eq 'login'?$self->account:$self->uid),
100             verifycode => $_verifycode,
101             pt_vcode_v1 => 0,
102             pt_verifysession_v1 => ,$_verifysession // $self->search_cookie('verifysession'),
103             p => Webqq::Encryption::pwd_encrypt($self->pwd,$_md5_salt,$_verifycode,1),
104             pt_randsalt => $_is_rand_salt || 0,,
105             pt_jstoken => 485008785,
106             u1 => 'http%3A%2F%2Fqun.qq.com%2F',
107             ptredirect => 1,
108             h => 1,
109             t => 1,
110             g => 1,
111             from_ui => 1,
112             ptlang => 2052,
113             action => '1-14-1515074375763',
114             js_ver => 10233,
115             js_type => 1,
116             login_sig => $self->search_cookie("pt_login_sig"),
117             pt_uistyle => 40,
118             aid => 715030901,
119             daid => 73,
120             has_onekey => 1,
121             )
122             ) . '&',
123             {
124             Referer => 'https://xui.ptlogin2.qq.com/cgi-bin/xlogin?appid=715030901&daid=73&pt_no_auth=1&s_url=http%3A%2F%2Fqun.qq.com%2F',
125             blocking => 1,
126             },
127             );
128              
129 0           my($retcode,undef,$api_check_sig,undef,$info,$nick) = $content =~/'([^']*)'/g;
130 0 0         if($retcode != 0){
131 0           $self->warn("账号登录失败: $info");
132             }
133             else{
134 0           $_api_check_sig = $api_check_sig;
135             }
136 0 0         return $retcode == 0?1:0;
137             }
138              
139             sub _model_ext_check_sig {
140 0     0     my $self = shift;
141 0           $self->debug("账号登录中(check_sig)...");
142 0           my(undef,$ua,$tx) = $self->http_get($_api_check_sig,{ua_debug_res_body=>0});
143 0 0         return $tx->res->code == 200?1:0;
144             }
145              
146             1;