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相关内容感兴趣的读者可查看本站专题:《PHP微信开发技巧汇总》、《php curl用法总结》、《PHP网络编程技巧总结》、《php字符串(string)用法总结》、《PHP中json格式数据操作技巧汇总》及《PHP针对XML文件操作技巧总结》

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

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容