perl 微信 获取消息

use LWP::UserAgent;
use URI::Escape;
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);

use Data::Dumper;

  my $var= Dumper($d);
  print $var;

foreach $m (@{$d->{ContactList}}){
print "----------------
";
print $m->{UserName};
if ($m->{UserName} =~/@@/){
push (@chatroom_id ,$m->{UserName});
};
print "
";

};

use Data::Dumper;

$m=$d->{SyncKey};
  my $var= Dumper($m);
  print $var;
$count=$m->{Count};
print "$count is $count
";
for ($i = 0;$i <= $count-1;$i++){
print $m->{List}->[$i]->{Val};
print $m->{List}->[$i]->{Key};
$synckey .="$m->{List}->[$i]->{Key}\_$m->{List}->[$i]->{Val}|";
  
};

$synckey =~ s/|$//; 
$synckey = uri_escape($synckey);
print "$synckey is $synckey
"; 
 

print "SyncKey----------------
";

$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 "-------------friend-----------------
";
    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 "
";
print "-------------friend-----------------
";
}};

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 "--------chatromm------------------
";
my $res = $ua->request($req);
print $res->status_line."
";
print $res->as_string();#获取的是原始内容,包括响应头,响应正文  
print $res->content();#获取的是响应正文
print "--------chatromm------------------
";


 $Skey =  uri_escape($Skey);
};
sub get_synccheck  {
$now=time();
 $url="https://webpush.weixin.qq.com/cgi-bin/mmwebwx-bin/synccheck?r=$now&skey=$Skey&sid=$wxsid&uin=$wxuin&deviceid=$DeviceID&synckey=$synckey&_=$now";
print "$url is $url
";
use AnyEvent;
use AnyEvent::HTTP;

$cv = AnyEvent->condvar;
http_get("$url", # 不存在watcher作用域问题
sub {
my ($data, $headers) = @_;
print $headers->{Status}, "
";
print $data, "
";
#$cv->send;
});
}





&get_ticket();
&get_init();
&get_friend();
&get_chatroom();
my $t = AnyEvent->timer(
  after =>0,
  interval=>5,
  cb =>&get_synccheck
);
#my $cv = AnyEvent->condvar;
##不要再每秒打印时间
##undef $t;
#$cv->recv;

print "bonblock------------
";
&RUN();

原文地址:https://www.cnblogs.com/hzcya1995/p/13351060.html