网络编程
位置:首页>> 网络编程>> php编程>> PHP实现的微信公众号扫码模拟登录功能示例

PHP实现的微信公众号扫码模拟登录功能示例

作者:Hubs'm  发布时间:2023-11-22 18:13:08 

标签:PHP,微信公众号,扫码,模拟登录

本文实例讲述了PHP实现的微信公众号扫码模拟登录功能。分享给大家供大家参考,具体如下:

PHP微信公众号扫码模拟登录功能

功能只是将:https://github.com/huanz/wechat-mp-hack 改成PHP实现罢了.
之前有个休闲豆每日晨报订阅号每天定时群发消息,去年微信突然要求一定要扫码授权才能登录,FK,然后就放弃了,前几天看到早有人使用程序扫码登录,获取token,cookie自动群发了,闲着也是闲着,就将js改成php实现了登录功能.

主要流程如下

1,先访问https://mp.weixin.qq.com/ ,模拟登录,进入二维码页面
2,带着返回的cookie下载二维码.程序后台一直while循环,等待扫描消息.
3,打开下载的二维码,微信扫码,登录成功,获取token和cookie,然后后面就可以自由发挥了.

供上代码.


class WeiSendAuto
{
 //--------------------------------------------------------LOGIN START
 private $_apis = [
   "host"     => "https://mp.weixin.qq.com",
   "login"     => "https://mp.weixin.qq.com/cgi-bin/bizlogin?action=startlogin",
   "qrcode"    => "https://mp.weixin.qq.com/cgi-bin/loginqrcode?action=getqrcode¶m=4300",
   "loginqrcode"  => "https://mp.weixin.qq.com/cgi-bin/loginqrcode?action=ask&token=&lang=zh_CN&f=json&ajax=1",
   "loginask"   => "https://mp.weixin.qq.com/cgi-bin/loginqrcode?action=ask&token=&lang=zh_CN&f=json&ajax=1&random=",
   "loginauth"   => "https://mp.weixin.qq.com/cgi-bin/loginauth?action=ask&token=&lang=zh_CN&f=json&ajax=1",
   "bizlogin"   => "https://mp.weixin.qq.com/cgi-bin/bizlogin?action=login&lang=zh_CN"
 ];
 private $_redirect_url = "";
 private $_key      = "";
 private function _getCookieFile(){
   return WEI_UPLOAD_PATH."cookie_{$this->_key}.text";
 }
 private function _getSavePath(){
   return WEI_UPLOAD_PATH.$this->_qrcodeName();
 }
 private function _qrcodeName(){
   return "qrcode_{$this->_key}.png";
 }
 private function _log($msg){
   Log::record("[微信调度:".date("Y-m-d H:i:s")."] ======: {$msg}");
 }
 public function getToken(){
   return Utils::getCache("token_{$this->_key}");
 }
 public function setToken($token){
    Utils::setCache("token_{$this->_key}",$token);
 }
 public function init($options){
   if(!isset($options["key"])){
     die("Key is Null!");
   }
   $this->_key   =  $options["key"];
   if($this->getToken()){
     echo("HAS Token !");
     return;
   }else{
     //尼玛,先要获取首页!!!
     $this->fetch("https://mp.weixin.qq.com/","","text");
     $this->_log("start login!!");
     $this->start_login($options);
   }
 }
 private function start_login($options){
   $_res    = $this->_login($options["account"],$options["password"]);
   if(!$_res["status"]){
     $this->_log($_res["info"]);
     return;
   }
   //保存二维码
   $this->_saveQRcode();
   $_ask_api    =  $this->_apis["loginask"];
   $_input["refer"] =  $this->_redirect_url;
   $_index     =  1;
   while(true){
/*      if($_index>60){
       break;
     }*/
     $_res    =  $this->fetch($_ask_api.$this->getWxRandomNum(),$_input);
     $_status   =  $_res["status"];
     if($_status==1){
       if($_res["user_category"]==1){
         $_ask_api = $this->_apis["loginauth"];
       }else{
         $this->_log("Login success");
         break;
       }
     }else if($_status==4){
       $this->_log("已经扫码");
     }else if($_status==2){
       $this->_log("管理员拒绝");
       break;
     }else if($_status==3){
       $this->_log("登录超时");
       break;
     }else{
       if($_ask_api==$this->_apis["loginask"]){
         $this->_log("请打开test.jpg,用微信扫码");
       }else{
         $this->_log("等待确认");
       }
     }
     sleep(2);
     $_index++;
   }
   /*if($_index>=60){
     $this->_log("U亲,超时了");
     return;
   }*/
   $this->_log("开始验证");
   $_input["post"]   = ["lang"=>"zh_CN","f"=>"json","ajax"=>1,"random"=>$this->getWxRandomNum(),"token"=>""];
   $_input["refer"]   = $this->_redirect_url;
   $_res        = $this->fetch($this->_apis["bizlogin"],$_input);
   $this->_log(print_r($_res,true));
   if($_res["base_resp"]["ret"]!=0){
     $this->_log("error = ".$_res["base_resp"]["err_msg"]);
     return ;
   }
   $redirect_url    =  $_res["redirect_url"];//跳转路径
   if(preg_match('/token=([\d]+)/i', $redirect_url,$match)){//获取cookie
     $this->setToken($match[1]);
   }
   $this->_log("验证成功,token: ".$this->getToken());
 }
 //下载二维码
 private function _saveQRcode(){
   $_input["refer"] = $this->_redirect_url;
   $_res    = $this->fetch($this->_apis["qrcode"],$_input,"text");
   $fp     = fopen($this->_getSavePath(), "wb+") or die("open fails");
   fwrite($fp,$_res) or die("fwrite fails");
   fclose($fp);
 }
 private function _login($_username,$_password){
   $_input["post"] = array(
     'username'  => $_username,
     'pwd'    => md5($_password),
     'f'     => 'json',
     'imgcode'  => ""
   );
   $_input["refer"] = "https://mp.weixin.qq.com";
   $_res      = $this->fetch($this->_apis["login"],$_input);
   if($_res["base_resp"]["ret"]!==0){
     return Utils::error($_res["base_resp"]["err_msg"]);
   }
   $this->_redirect_url  =  "https://mp.weixin.qq.com".$_res["redirect_url"];//跳转路径
   return Utils::success("ok");
 }
 function getWxRandomNum(){
   return "0.".mt_rand(1000000000000000,9999999999999999);
 }
 /**
  * @param $url
  * @param null $_input
  * @param string $data_type
  * @return mixed
  * $_input= ["post"=>[],"refer"=>"",cookiefile='']
  */
 function fetch( $url, $_input=null, $data_type='json') {
   $ch = curl_init();
   $useragent = isset($_input['useragent']) ? $_input['useragent'] : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2';
   //curl_setopt( $ch, CURLOPT_HTTPHEADER, $this->_headers); //设置HTTP头字段的数组
   curl_setopt( $ch, CURLOPT_URL, $url );
   curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
   curl_setopt( $ch, CURLOPT_AUTOREFERER, true );
   curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
   curl_setopt( $ch, CURLOPT_POST, isset($_input['post']) );
   if( isset($_input['post']) )     curl_setopt( $ch, CURLOPT_POSTFIELDS, $_input['post'] );
   if( isset($_input['refer']) )    curl_setopt( $ch, CURLOPT_REFERER, $_input['refer'] );
   curl_setopt( $ch, CURLOPT_USERAGENT, $useragent );
   curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, ( isset($_input['timeout']) ? $_input['timeout'] : 5 ) );
   curl_setopt( $ch, CURLOPT_COOKIEJAR, ( isset($_input['cookiefile']) ? $_input['cookiefile'] : $this->_getCookieFile() ));
   curl_setopt( $ch, CURLOPT_COOKIEFILE, ( isset($_input['cookiefile']) ? $_input['cookiefile'] : $this->_getCookieFile() ));
   $result = curl_exec( $ch );
   curl_close( $ch );
   if ($data_type == 'json') {
     $result = json_decode($result,true);
   }
   return $result;
 }
 //--------------------------------------------------------LOGIN END
}

怎么调用?上码


$arr = array(
 'account'  => '***',
 'password' => '****',
 'key'    => "tmall",
);
$w       =  new WeiSendAuto();
$w->init($arr);
if(!$w->getToken()){
 die("NOT TOKEN!");
}

希望本文所述对大家PHP程序设计有所帮助。

来源:http://www.hihubs.com/article/275

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com