加入收藏 | 设为首页 | 会员中心 | 我要投稿 张家口站长网 (https://www.0313zz.com.cn/)- 办公协同、操作系统、混合云网络、数据湖、视觉智能!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2022-07-14 11:03:09 所属栏目:PHP教程 来源:互联网
导读:这篇文章主要介绍了PHP实现的微信公众号扫码模拟登录功能,涉及php针对微信公众平台接口的调用与交互相关操作技巧,需要的朋友可以参考下。 本文实例讲述了PHP实现的微信公众号扫码模拟登录功能,分享给大家供大家参考,具体如下: PHP微信公众号扫码模拟登录
  这篇文章主要介绍了PHP实现的微信公众号扫码模拟登录功能,涉及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!");
  }

(编辑:张家口站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读