perl 实现微信登录 获取好友 群信息的简单实现
2016-01-25 14:10
676 查看
<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 "\n"; } else { die $response->status_line; } print "111111111111111111111111111111111\n"; print "\$r is $r\n"; print "111111111111111111111111111111111\n"; if ( $r =~ /window\.QRLogin\.code = 200; window\.QRLogin\.uuid = "(.*?)"/g ) { $uuid = $1; print "\$uuid is $uuid\n"; } 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\n"; print "222222222222222222222222222\n"; print "\n"; } 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 ] \n"; #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\n"; print "\$r is $r\n"; next unless defined $r; my %data = $r =~ /window\.(.+?)=(.+?);/g; if ( $data{code} == 201 ) { print "手机微信扫码成功,请在手机微信上点击 [登录] 按钮...\n"; my $show_tip = 0; next; } elsif ( $data{code} == 200 ) { print "正在进行登录...\n"; foreach ($r) { if ( $_ =~ /window.redirect_uri="(.*?)"/ ) { $api = $1; print "\$api is $api\n"; 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\n"; } }; foreach ($api) { if ( $_ =~ /https\:\/\/wx\.qq\.com\/cgi\-bin\/mmwebwx-bin\/webwxnewloginpage\?ticket=(.*?)\&uuid=(.*?)\&lang=(.*?)\&scan=(.*)/ ) { print "\$1 is $1\n"; print "\$2 is $2\n"; print "\$3 is $3\n"; print "\$4 is $4\n"; $user = $4; print "\$user is $user\n"; 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\n"; print "\$wxsid is $wxsid\n"; print "\$wxuin is $wxuin\n"; print "\$pass_ticket is $pass_ticket\n"; use POSIX; my $a = "e"; for(my $b = 0;15 > $b;$b++){ $a .= POSIX::floor(10 * rand()); }; $DeviceID=$a; } }}; sub RUN { print "启动全局事件循环...\n"; 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-----------------\n"; print $res->status_line."\n"; 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 "----------------\n"; print $m->{UserName}; if ($m->{UserName} =~/\@\@/){ push (@chatroom_id ,$m->{UserName}); }; print "\n"; }; ##获取聊天群数目 $chat_num=$d->{Count}; print "\$chat_num is $chat_num\n"; print "\@chatroom_id is @chatroom_id\n"; print "-------------init-----------------\n"; #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 "\n"; }}; 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\n"; my $res = $ua->request($req); print $res->status_line."\n"; print $res->as_string();#获取的是原始内容,包括响应头,响应正文 print $res->content();#获取的是响应正文 print "10101010101010101010010101010\n"; }; &get_ticket(); &get_init(); &get_friend(); &get_chatroom(); &RUN();
相关文章推荐
- 微信公众平台入门到精通四
- 微信模板信息发送给用户(JAVA)
- 微信公众平台开发调试方法
- 微信公众号与服务器对接验证
- 微信公众平台入门到精通三
- 微信公众平台从入门到精通二
- 微信公众平台入门到精通一
- "抢红包"大战,你准备好了吗?
- 微信公众平台消息体加解密实现
- Android微信支付签名错误解决方法
- 仿微信password控件,实现密码可见于不可见功能
- 微信打开第三方应用
- 微信开发之 获取用户地址
- 微信开发 之 自定义菜单
- 微信企业号如何在十分钟内发送一万个红包
- 【微信你妹】中间人攻击截获微信数据
- wemall——让你意想不到的微信商城的机遇
- 模仿微信的多图片上传功能
- 一百多篇热门经典计算文章 来自 11 个热门的技术类微信公众
- 基于百度BAE快速部署微信公众号后台服务程序