File Coverage

blib/lib/Mojo/Weixin/Client/Remote/_login.pm
Criterion Covered Total %
statement 3 78 3.8
branch 0 32 0.0
condition 0 16 0.0
subroutine 1 3 33.3
pod n/a
total 4 129 3.1


line stmt bran cond sub pod time code
1             sub Mojo::Weixin::_login {
2 0     0     my $self = shift;
3 0           $self->info("客户端准备登录...");
4 0           my $api = 'https://login.'. $self->domain .'/cgi-bin/mmwebwx-bin/login';
5 0 0         if(not $self->_is_need_login()){
6 0           $self->info("检测到近期登录活动,尝试直接恢复登录");
7 0           $self->wxuin($self->search_cookie("wxuin"));
8 0           $self->wxsid($self->search_cookie("wxsid"));
9 0 0 0       if(defined $self->wxuin and defined $self->wxsid){
10 0           $self->login_state("success");
11 0           return 1;
12             }
13             }
14             else{
15 0           $self->info("登录状态已失效,需要重新登录");
16 0           $self->clear_cookie();
17             }
18 0           my $qrcode_uuid = $self->_get_qrcode_uuid();
19 0 0         if(not defined $qrcode_uuid){
20 0           $self->info("无法获取到登录二维码,登录失败");
21 0           $self->stop();
22             }
23 0           $self->qrcode_uuid($qrcode_uuid);
24 0 0         if(not $self->_get_qrcode_image($qrcode_uuid)){
25 0           $self->info("下载二维码失败,客户端退出");
26 0           $self->stop();
27             }
28 0           my $i=1;
29 0           $self->info("等待手机微信扫描二维码...");
30 0           $self->state('scaning');
31 0           while(1){
32 0           $self->check_controller();
33             my @query_string = (
34             loginicon => 'true',
35             uuid => $qrcode_uuid,
36             tip => $show_tip ,
37 1     1   6 r => sub{use integer;unpack 'i',~ pack 'l',$self->now() & 0xFFFFFFFF}->(),
  1     0   2  
  1         10  
  0            
  0            
38             _ => $self->now(),
39             );
40 0           my $r = $self->http_get($self->gen_url($api,@query_string));
41 0 0         next unless defined $r;
42 0           my %data = $r=~/window\.(.+?)=(.+?);/g;
43 0 0         $data{redirect_uri}=~s/^["']|["']$//g if defined $data{redirect_uri};
44 0 0         if($data{code} == 408){
    0          
    0          
    0          
    0          
45 0           select undef,undef,undef,0.5;
46 0 0         if($i==5){
47 0           $self->emit("qrcode_expire");
48 0           $self->info("登录二维码已失效,重新获取二维码");
49 0           $qrcode_uuid = $self->_get_qrcode_uuid();
50 0           $self->_get_qrcode_image($qrcode_uuid);
51 0           $self->state('scaning');
52 0           $i = 1;
53 0           next;
54             }
55 0           $i++;
56             }
57             elsif($data{code} == 201){
58 0           $self->info("手机微信扫码成功,请在手机微信上点击 [登录] 按钮...");
59 0           $self->state('confirming');
60 0           $show_tip = 0;
61 0           next;
62              
63             }
64             elsif($data{code} == 200){
65 0           $self->info("正在进行登录...");
66 0 0         if($data{redirect_uri}=~m#https?://([^/]+)#m){
67 0 0 0       $self->domain($1) if ($1 and $1 ne $self->domain);
68             }
69 0           my $data = $self->http_get($data{redirect_uri} . '&fun=new&version=v2&lang=zh_CN',{Referer=>'https://' . $self->domain . '/'});
70             #0OK@crypt_859d8a8a_3f3db5290570080d1db29da9507e35dersuMHe7xmA0aHW1D138122335hWdpMVCMqXIVfhXLcsJxYrC6bv785tVDLZAres096ZE%3D
71 0 0         if($data !~ m#^.*#){
72 0           $self->error("登录返回数据格式无效");
73 0           return 0;
74             }
75 0           my %d = $data=~/<([^<>]+?)>([^<>]+?)<\/\1>/g;
76 0 0         if($d{ret}!=0){
77 0           $self->error("登录返回状态码异常: $d{ret}, $d{message}");
78 0           $self->emit(login => -1,$d{message});
79 0           return 0;
80             }
81 0   0       $self->skey($d{skey} || '');
82 0   0       $self->wxsid($d{wxsid} || $self->search_cookie("wxsid"));
83 0   0       $self->wxuin($d{wxuin} || $self->search_cookie("wxuin"));
84 0   0       $self->pass_ticket($d{pass_ticket} || '');
85 0           $self->info("微信登录成功");
86 0           $self->login_state("success");
87 0           return 2;
88             }
89             elsif($data{code} == 400){
90 0           $self->info("登录错误,客户端退出");
91 0           $self->stop();
92 0           last;
93             }
94             elsif($data{code} == 500){
95 0           $self->info("登录错误,客户端尝试重新登录...");
96 0           $i = 1;
97 0           $show_tip = 1;
98 0           $qrcode_uuid = $self->_get_qrcode_uuid();
99 0           $self->_get_qrcode_image($qrcode_uuid);
100 0           $self->state('scaning');
101 0           next;
102             }
103             }
104             }
105             1;