山寨版微信

摘要:
)“/g){$uuid=$1;打印”$uuids$uuid“;}我的$api=“https://login.weixin.qq.com/qrcode/$uuid“;我的$response=$ua-˃get;$ua-˃default_headers;如果{$r=$response-˃decoded_content;#orwheverprint“222222222222222”;print“222222”否则{die$response-˃status_line;}my=临时文件;binmode$fh;打印$fh$r;关闭$fh;打印“登录二维码已下载到本地[$filename]”#https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login? );/ g;如果{print“手机微信扫码成功,请单击手机微信上的[登录]按钮…”;my$show_tip=0;next;}Elsif{print“登录…”;foreach($r){if($_=~/window.edit_uri=“(.*?
<pre name="code" class="python">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
    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
";
            $Skey_x = uri_escape($Skey);
            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=-$now&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 "zzzzzzzzzzzz1111111111111111111111111
";
    print $res->content();            #获取的是响应正文
    $d = $res->content();

    #sleep (1000);
##导入 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};
    @xa = $m->{List};
    print "$m is $m
";
    my $var = Dumper($m);
    print $var;

    print "@xa is @xa
";
    my $var = Dumper(@xa);
    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------------------
";

}

sub get_synccheck {

    $url =
"https://webpush.weixin.qq.com/cgi-bin/mmwebwx-bin/synccheck?r=$now&skey=$Skey_x&sid=$wxsid&uin=$wxuin&deviceid=$DeviceID&synckey=$synckey&_=$now";
    print "$url is $url
";

    my $response = $ua->get($url);
    $ua->default_headers;

    if ( $response->is_success ) {
        print $response->decoded_content;
        $r = $response->decoded_content;
    }

##window.synccheck={retcode:"0",selector:"0"}
    if ( $r =~ /window.*selector:"(.*?)"}/ ) {

        $mss = $1;
        print "$mss is $1
";
    }

    if ( $mss != 0 ) {

        $sync_url =
"https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=$wxsid&skey=$Skey&lang=zh_CN&pass_ticket=$pass_ticket";

        my @query_string = (
            sid         => $wxsid,
            skey        => $Skey,
            r           => $now,
            pass_ticket => $pass_ticket
        );
        my $post = {
            BaseRequest => { Uin => $wxuin, Sid => $wxsid },
            SyncKey     => $m,
            rr          => $now
        };
        use JSON qw(encode_json);
        $json_string = encode_json($post);

        my $req = HTTP::Request->new(
            'POST' => $sync_url,
            [
                'lang'        => 'zh_CN',
                'pass_ticket' => "$pass_ticket",
                'sid'         => $wxsid,
                'skey'        => $Skey
            ]
        );
        $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 "-------------syncinfo-----------------
";

#print $res->status_line."
";
#print $res->as_string();#获取的是原始内容,包括响应头,响应正文
#print $res->content();#获取的是响应正文
        $d = $res->content();
        use JSON qw/encode_json decode_json/;
        $d       = encode_utf8($d);
        $d       = decode_json($d);
        $m       = $d->{SyncKey};
        $synckey = "";

        #$xa=$d->{SyncKey}->{List};
        $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 = uri_escape($synckey);

        };
		
		foreach $j ( @{ $d->{AddMsgList} } ) {
  print $j->{Content};
  print "
";
}

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

    }
}


sub get_event {

    use AnyEvent;
##定义watch
    my $t = AnyEvent->timer(
        after    => 0,
        interval => 5,
        cb       => &get_synccheck
    );
    ##不要再每秒打印时间
    ##undef $t;
    my $cv = AnyEvent->condvar;
    $cv->recv;
}

&get_ticket();
&get_init();
&get_friend();
&get_chatroom();
&get_event();
print "now is blocking
";

#&RUN();


免责声明:文章转载自《山寨版微信》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇记一次线上OOM问题分析与解决thinkphp里数据嵌套循环下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

小程序微信支付申请与配置完整版操作流程

小程序微信支付申请与配置完整版操作流程一、 申请小程序微信支付 微信支付申请分为两种情况: 情况一,申请新的微信支付商户号; 情况二,绑定已有微信支付商户号 注意:申请微信支付的小程序账户需要进行微信认证,注册主体为个人的小程序目前暂不支持微信认证,也就是注册主体为个人的小程序不支持申请微信支付。 (一) 情况一、申请新的微信支付商户号 申请新商户号...

Oracle EBS Form开发小技巧汇总

本文记录了一些在Form开发过程中积累下来的技巧: Form中提交并发请求 非数据库字段查询处理 控制Form为只查询 控制Item的属性 Trigger的执行层次 按钮处理逻辑 日历相关 1,Form中提交并发请求 在提交请求之前,首先需要验证块,如果某些必填项没有填的话当然不能提交请求。 [c-sharp]view plaincopyprint...

嵌入式web服务

:boa、thttpd、mini_httpd、shttpd、lighttpd、goaheand、appweb和apache等。 Boa 1.介绍 Boa诞生于1991年,作者Paul Philips。是开源的,应用很广泛,特别适合于嵌入式设备,网上流行程度很广。它的官方网站说boa是最受人喜爱的嵌入式web服务器。功能较为强大,支持认证,cgi等。B...

Python小项目四:实现简单的web服务器

https://blog.csdn.net/u010103202/article/details/74002538 本博客是整理在学习实验楼的课程过程中记录下的笔记形成的,参考:https://www.shiyanlou.com/courses/552。不同之处在于实验楼使用python2.7,而博主这里使用的是python3.6。在学习中也因为pytho...

微信小程序-获取当前城市位置

微信小程序-获取当前城市位置 , 在一些小程序,会根据不同的城市,展现不同的商品,和内容,这就需要获取位置,转换位城市来处理。     1, 获取当前地理位置,首先要拿到用户的授权wx.openSetting;        调起客户端小程序设置界面,返回用户设置的操作结果。设置界面只会出现小程序已经向用户请求过的权限 ,若没位置授权,则弹出。  2,微信...

nginx和fpm的进程数配置和502,504错误

 502 和 php-fpm.conf 1.php-cgi进程数不够用。php执行时间长,导致没有空闲进程处理新请求。 2.php-cgi进程死掉。php-fpm超时时间短,当前进程执行超时关闭连接。 实例: 1.request_terminate_timeout引起的资源问题 request_terminate_timeout默认值为 0 秒,也就是说,...