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


Posted in PHP onMay 30, 2019

本文实例讲述了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作的文本留言本的例子(二)
Oct 09 PHP
PHP 得到根目录的 __FILE__ 常量
Jul 23 PHP
PHP 设置MySQL连接字符集的方法
Jan 02 PHP
PHP中实现中文字符进制转换原理分析
Dec 06 PHP
PHP 面向对象详解
Sep 13 PHP
使用PHP破解防盗链图片的一个简单方法
Jun 07 PHP
thinkphp连贯操作实例分析
Nov 22 PHP
PHP限制HTML内容中图片必须是本站的方法
Jun 16 PHP
php mongodb操作类 带几个简单的例子
Aug 25 PHP
php获取网站根目录物理路径的几种方法(推荐)
Mar 04 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
Feb 06 PHP
laravel5.5添加echarts实现画图功能的方法
Oct 09 PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
May 30 #PHP
TP5(thinkPHP5框架)基于bootstrap实现的单图上传插件用法示例
May 29 #PHP
TP5(thinkPHP框架)实现后台清除缓存功能示例
May 29 #PHP
PHP微信网页授权的配置文件操作分析
May 29 #PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
May 29 #PHP
tp5(thinkPHP5框架)时间查询操作实例分析
May 29 #PHP
php fread函数使用方法总结
May 28 #PHP
You might like
PHP使用DirectoryIterator显示下拉文件列表的方法
2015/03/13 PHP
Yii2简单实现多语言配置的方法
2016/07/23 PHP
asp批量修改记录的代码
2008/06/25 Javascript
jQuery 使用个人心得
2009/02/26 Javascript
前端开发部分总结[兼容性、DOM操作、跨域等](持续更新)
2010/03/04 Javascript
jquery中eq和get的区别与使用方法
2011/04/14 Javascript
关于js datetime的那点事
2011/11/15 Javascript
js判断是否为ie的方法小结
2014/01/13 Javascript
js 采用delete实现继承示例代码
2014/05/20 Javascript
js简单网速测试方法完整实例
2015/12/15 Javascript
jQuery 遍历map()方法详解
2016/11/04 Javascript
nodejs基础知识
2017/02/03 NodeJs
vue.js数据绑定的方法(单向、双向和一次性绑定)
2017/07/13 Javascript
vue.js中父组件调用子组件的内部方法示例
2017/10/22 Javascript
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
Vue页面刷新记住页面状态的实现
2019/12/27 Javascript
[01:31:03]DOTA2完美盛典全回顾 见证十五项大奖花落谁家
2017/11/28 DOTA
Python实现PS滤镜中马赛克效果示例
2018/01/20 Python
python 每天如何定时启动爬虫任务(实现方法分享)
2018/05/21 Python
Python判断对象是否相等及eq函数的讲解
2019/02/25 Python
用python的turtle模块实现给女票画个小心心
2019/11/23 Python
Python爬虫之Selenium实现窗口截图
2020/12/04 Python
windows系统Tensorflow2.x简单安装记录(图文)
2021/01/18 Python
俄罗斯和世界各地的酒店预订:Hotels.com俄罗斯
2016/08/19 全球购物
纽约复古灵感的现代珠宝品牌:Lulu Frost
2018/03/03 全球购物
施华洛世奇韩国官网:SWAROVSKI韩国
2018/06/05 全球购物
全球立体声:World Wide Stereo
2018/09/29 全球购物
化学相关工作求职信
2013/10/02 职场文书
销售员个人求职的自我评价
2014/02/10 职场文书
养牛场项目建议书
2014/05/13 职场文书
学校安全生产承诺书
2014/05/23 职场文书
《周恩来的四个昼夜》观后思想汇报范文两篇
2014/09/10 职场文书
原告离婚代理词
2015/05/23 职场文书
优秀党员主要事迹范文
2015/11/05 职场文书
创业计划书之废品回收
2019/09/26 职场文书
初中生入团申请书范文(五篇)
2019/10/16 职场文书