zoukankan      html  css  js  c++  java
  • perl 实现微信登录 获取好友 群信息的简单实现

    <pre name="code" class="python">use LWP::UserAgent;
    use Net::Ping;
    use JSON qw(encode_json);
    use Socket;
    use Net::SMTP;
    use LWP;
    use LWP::Simple;
    use LWP::UserAgent;
    use HTTP::Cookies;
    use HTTP::Headers;
    use HTTP::Response;
    use Encode;
    use URI::Escape;
    use URI::URL;
    use File::Temp qw/tempfile/;
    use AE;
    my $api          = 'https://login.weixin.qq.com/jslogin';
    my $now          = time();
    my @query_string = (
        appid        => 'wx782c26e4c19acffb',
        redirect_uri => 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage',
        fun          => 'new',
        lang         => 'zh_CN',
        _            => $now,
    );
    
    my $ua = LWP::UserAgent->new;
    $ua->timeout(5);
    $ua->env_proxy;
    $ua->agent("Mozilla/8.0");
      my $cookie_jar = HTTP::Cookies->new(
          file=>'lwp_cookies.txt',
          autosave=>1,
          ignore_discard=>1);
          $ua->cookie_jar($cookie_jar);
    
    $host =
    "https://login.weixin.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=zh_CN&_=$now";
    my $response = $ua->get($host);
    $ua->default_headers;
    
    if ( $response->is_success ) {
        print $response->decoded_content;    # or whatever
        $r = $response->decoded_content;
        print "
    ";
    }
    else {
        die $response->status_line;
    }
    print "111111111111111111111111111111111
    ";
    print "$r is $r
    ";
    print "111111111111111111111111111111111
    ";
    if ( $r =~ /window.QRLogin.code = 200; window.QRLogin.uuid = "(.*?)"/g ) {
        $uuid = $1;
        print "$uuid is $uuid
    ";
    }
    
    my $api      = "https://login.weixin.qq.com/qrcode/$uuid";
    my $response = $ua->get($api);
    $ua->default_headers;
    if ( $response->is_success ) {
        $r = $response->decoded_content;    # or whatever
        $r = $response->decoded_content;
    print "22222222222222222222222222222
    ";
    print "222222222222222222222222222
    ";
        print "
    ";
    }
    else {
        die $response->status_line;
    }
    
    my ( $fh, $filename ) =
      tempfile( "weixin_qrcode_XXXX", SUFFIX => ".jpg", DIR => '/tmp' );
    binmode $fh;
    print $fh $r;
    close $fh;
    print "登录二维码已经下载到本地 [ $filename ] 
    ";
    
    #https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=YaZ1MmzJ3Q==&tip=0&r=-$now&_=1453360034431
    
    my $show_tip = 1;
    
    sub login {
        while (1) {
            my $api =
    "https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=$uuid&tip=$show_tip&r=-$now&_=$now";
            my $response = $ua->get($api);
            $ua->default_headers;
            if ( $response->is_success ) {
                $r = $response->decoded_content;
    print "3333333333333333333
    ";
    print "$r is $r
    ";
                next unless defined $r;
                my %data = $r =~ /window.(.+?)=(.+?);/g;
    
                if ( $data{code} == 201 ) {
                    print
    "手机微信扫码成功,请在手机微信上点击 [登录] 按钮...
    ";
                    my $show_tip = 0;
                    next;
                }
                elsif ( $data{code} == 200 ) {
                    print "正在进行登录...
    ";
                    foreach ($r) {
                        if ( $_ =~ /window.redirect_uri="(.*?)"/ ) {
                             $api = $1;
                            print "$api is $api
    ";
                            my $response = $ua->get($api);
                            $ua->default_headers;
                        }
                    };
    
                      foreach ($r) {
                        if ( $_ =~ /https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=(.*?)&uuid=*/ ) {
                             $ticket = $1;
                            print "$ticket is $ticket
    ";
                        }
                    };
    
    
                          foreach ($api) {
                        if ( $_ =~ /https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=(.*?)&uuid=(.*?)&lang=(.*?)&scan=(.*)/ ) {
                             print "$1 is $1
    ";
                             print "$2 is $2
    ";
                             print "$3 is $3
    ";
                             print "$4 is $4
    ";
                             $user = $4;
                            print "$user is $user
    ";
                            return 1;
                        }
                    };
    
                }
                else {
                    die $response->status_line;
                }
    
            }
        }
    };
    &login();
    sleep(5);
    
    sub get_ticket {
    my $api="https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=$ticket&uuid=$uuid&lang=zh_CN&scan=$user&fun=new&version=v2&lang=zh_CN";
    my $response = $ua->get($api);
    $ua->default_headers;
    
    if ( $response->is_success ) {
        print $response->decoded_content;    # or whatever
    $r=$response->decoded_content;
     if ($r =~/<error.*<skey>(.*?)</skey><wxsid>(.*?)</wxsid><wxuin>(.*?)</wxuin><pass_ticket>(.*?)</pass_ticket.*/) 
    {
      $Skey = $1;
      $wxsid=$2;
      $wxuin=$3;
      $pass_ticket=$4;
     
     print "$Skey is $Skey
    ";
     print "$wxsid is $wxsid
    ";
     print "$wxuin is $wxuin
    ";
     print "$pass_ticket is $pass_ticket
    ";
    use POSIX;
     my $a = "e";
        for(my $b = 0;15 > $b;$b++){
            $a .= POSIX::floor(10 * rand());
        };
    $DeviceID=$a;
    }
    
    }};
    
    sub RUN {
        print "启动全局事件循环...
    ";
        AE::cv->recv;
    };
    
    sub get_init {
    @chatroom_id=();
    #my $response= $browser->post("https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit", [ "r" => "-$now","lang" => "zh_CN","pass_ticket"=>"$pass_ticket"]); #多加了
    $login_url="https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=-1816029078&lang=zh_CN&pass_ticket=$pass_ticket";
    my $post = {
    BaseRequest =>  {
                Uin         =>  $wxuin,
                Sid         =>  $wxsid,
                Skey        =>  $Skey,
                DeviceID    =>  $DeviceID,
            }
    };
    use JSON qw(encode_json);
    $json_string = encode_json($post);
    
    my $req = HTTP::Request->new('POST' => $login_url,[ 'r'=>"-$now", 'lang'=>'zh_CN', 'pass_ticket'=>"$pass_ticket"]); 
    $req->referer("https://wx.qq.com/?&lang=zh_CN");
    $req->content_type('application/json; charset=UTF-8');#post请求,如果有发送参数,必须要有这句  
    $req->content("$json_string");#发送post的参数  
    my $res = $ua->request($req);  
    print "-------------init-----------------
    ";
    print $res->status_line."
    ";  
    print $res->as_string();#获取的是原始内容,包括响应头,响应正文  
    print $res->content();#获取的是响应正文
    $d=$res->content();
    ##导入 encode_json decode_json
    use JSON qw/encode_json decode_json/;
    $d=encode_utf8($d);
    $d = decode_json($d);
    
    foreach $m (@{$d->{ContactList}}){
    print "----------------
    ";
    print $m->{UserName};
    if ($m->{UserName} =~/@@/){
    push (@chatroom_id ,$m->{UserName});
    };
    print "
    ";
    };
    ##获取聊天群数目
    $chat_num=$d->{Count};
    print "$chat_num is $chat_num
    ";
    print "@chatroom_id is @chatroom_id
    ";
    print "-------------init-----------------
    ";
    #use Data::Dumper;
    };
    
    sub get_friend{
    use JSON qw(encode_json);
    $url="https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?lang=zh_CN&pass_ticket=$pass_ticket&seq=0&skey=$skey";
    my $response = $ua->get($url);
    $ua->default_headers;
    
    if ( $response->is_success ) {
        print $response->decoded_content;    # or whatever
    $d=$response->decoded_content;
    
    };
    use JSON qw/encode_json decode_json/;  
    $d=encode_utf8($d);
    $d = decode_json($d);  
    
    
    foreach $m (@{$d->{MemberList}}){
    print $m->{UserName};
    push (@chatroom_id ,$m->{UserName});
    print "
    ";
    }};
    
    sub get_chatroom {
    #$login_url="https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxbatchgetcontact?type=ex&r=$now&pass_ticket=$pass_ticket";
    $login_url="https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxbatchgetcontact?type=ex&r=$now&lang=zh_CN&pass_ticket=$pass_ticket";
    
    my $post = {
    BaseRequest =>  {
                Uin         =>  $wxuin,
                Sid         =>  $wxsid,
                Skey        =>  $Skey,
                DeviceID    =>  $DeviceID,
            },
            Count       =>  $chat_num,
            List        =>  [map { {UserName=>$_,ChatRoomId=>""} } @chatroom_id ],
        };
    use JSON qw(encode_json);
    $json_string = encode_json($post);
    
    my $req = HTTP::Request->new('POST' => $login_url,[ 'lang'=>'zh_CN', 'pass_ticket'=>"$pass_ticket",'r'=>"$now",'type'=>'ex']);
    
    $req->referer("https://wx.qq.com/?&lang=zh_CN");
    $req->content_type('application/json; charset=UTF-8');#post请求,如果有发送参数,必须要有这句  
    $req->content("$json_string");#发送post的参数  
    print "10101010101010101010010101010
    ";
    my $res = $ua->request($req);
    print $res->status_line."
    ";
    print $res->as_string();#获取的是原始内容,包括响应头,响应正文  
    print $res->content();#获取的是响应正文
    print "10101010101010101010010101010
    ";
    
    
    };
    
    
    &get_ticket();
    &get_init();
    &get_friend();
    &get_chatroom();
    &RUN();
    


    
                                        
    
  • 相关阅读:
    使用Skaffold一键将项目发布到Kubernetes
    线性代数回头看——线性方程组
    Python 函数 初学者笔记
    Python 用户输入&while循环 初学者笔记
    Python If&字典 初学者笔记
    Python 变量&列表 初学者笔记
    SQL 常见优化指南
    垃圾回收机制
    MySQL 前缀索引
    MySQL 常用优化
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13351067.html
Copyright © 2011-2022 走看看