最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP實(shí)現(xiàn)的微信公眾號(hào)掃碼模擬登錄功能示例

 更新時(shí)間:2019年05月30日 09:20:31   作者:Hubs''m  
這篇文章主要介紹了PHP實(shí)現(xiàn)的微信公眾號(hào)掃碼模擬登錄功能,涉及php針對(duì)微信公眾平臺(tái)接口的調(diào)用與交互相關(guān)操作技巧,需要的朋友可以參考下

本文實(shí)例講述了PHP實(shí)現(xiàn)的微信公眾號(hào)掃碼模擬登錄功能。分享給大家供大家參考,具體如下:

PHP微信公眾號(hào)掃碼模擬登錄功能

功能只是將:https://github.com/huanz/wechat-mp-hack 改成PHP實(shí)現(xiàn)罷了.
之前有個(gè)休閑豆每日晨報(bào)訂閱號(hào)每天定時(shí)群發(fā)消息,去年微信突然要求一定要掃碼授權(quán)才能登錄,FK,然后就放棄了,前幾天看到早有人使用程序掃碼登錄,獲取token,cookie自動(dòng)群發(fā)了,閑著也是閑著,就將js改成php實(shí)現(xiàn)了登錄功能.

主要流程如下

1,先訪問(wèn)https://mp.weixin.qq.com/ ,模擬登錄,進(jìn)入二維碼頁(yè)面
2,帶著返回的cookie下載二維碼.程序后臺(tái)一直while循環(huán),等待掃描消息.
3,打開(kāi)下載的二維碼,微信掃碼,登錄成功,獲取token和cookie,然后后面就可以自由發(fā)揮了.

供上代碼.

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("[微信調(diào)度:".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{
      //尼瑪,先要獲取首頁(yè)!!!
      $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("已經(jīng)掃碼");
      }else if($_status==2){
        $this->_log("管理員拒絕");
        break;
      }else if($_status==3){
        $this->_log("登錄超時(shí)");
        break;
      }else{
        if($_ask_api==$this->_apis["loginask"]){
          $this->_log("請(qǐng)打開(kāi)test.jpg,用微信掃碼");
        }else{
          $this->_log("等待確認(rèn)");
        }
      }
      sleep(2);
      $_index++;
    }
    /*if($_index>=60){
      $this->_log("U親,超時(shí)了");
      return;
    }*/
    $this->_log("開(kāi)始驗(yàn)證");
    $_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"];//跳轉(zhuǎn)路徑
    if(preg_match('/token=([\d]+)/i', $redirect_url,$match)){//獲取cookie
      $this->setToken($match[1]);
    }
    $this->_log("驗(yàn)證成功,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"];//跳轉(zhuǎn)路徑
    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); //設(shè)置HTTP頭字段的數(shù)組
    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
}

怎么調(diào)用?上碼

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

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP微信開(kāi)發(fā)技巧匯總》、《php curl用法總結(jié)》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》、《php字符串(string)用法總結(jié)》、《PHP中json格式數(shù)據(jù)操作技巧匯總》及《PHP針對(duì)XML文件操作技巧總結(jié)

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • PHP中overload與override的區(qū)別

    PHP中overload與override的區(qū)別

    本文主要介紹了PHP中overload與override的區(qū)別。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • thinkphp實(shí)現(xiàn)把數(shù)據(jù)庫(kù)中的列的值存到下拉框中的方法

    thinkphp實(shí)現(xiàn)把數(shù)據(jù)庫(kù)中的列的值存到下拉框中的方法

    本文主要介紹了thinkphp把數(shù)據(jù)庫(kù)中的列的值存到下拉框中的方法。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • php源碼分析之DZX1.5字符串截?cái)嗪瘮?shù)cutstr用法

    php源碼分析之DZX1.5字符串截?cái)嗪瘮?shù)cutstr用法

    這篇文章主要介紹了php源碼分析之DZX1.5字符串截?cái)嗪瘮?shù)cutstr用法,實(shí)例分析了DZX1.5中cutstr函數(shù)實(shí)現(xiàn)字符串截取的使用技巧,需要的朋友可以參考下
    2015-06-06
  • php使用include 和require引入文件的區(qū)別

    php使用include 和require引入文件的區(qū)別

    require()語(yǔ)句的性能與include()相類似,都是包括并運(yùn)行指定文件。不同之處在于:對(duì)include()語(yǔ)句來(lái)說(shuō),在執(zhí)行文件時(shí)每次都要進(jìn)行讀取和評(píng)估;而對(duì)于require()來(lái)說(shuō),文件只處理一次(實(shí)際上,文件內(nèi)容替換require()語(yǔ)句)。
    2017-02-02
  • php操作(刪除,提取,增加)zip文件方法詳解

    php操作(刪除,提取,增加)zip文件方法詳解

    本文給大家分享的是php操作zip文件的方法示例,包括了從zip壓縮文件中提取文件、從一個(gè)zip壓縮文件中刪除文件、添加一個(gè)文件到zip壓縮文件中,推薦給大家,有需要的小伙伴參考下。
    2015-03-03
  • php判斷目錄存在的簡(jiǎn)單方法

    php判斷目錄存在的簡(jiǎn)單方法

    在本篇文章里小編給大家分享了關(guān)于php判斷目錄是否存在的相關(guān)知識(shí)點(diǎn),有需要的朋友們參考學(xué)習(xí)下。
    2019-09-09
  • php 修改上傳文件大小限制實(shí)例詳解

    php 修改上傳文件大小限制實(shí)例詳解

    php默認(rèn)情況下,只允許上傳一定大小的文件,當(dāng)上傳文件大小超過(guò)這個(gè)值時(shí),將會(huì)出錯(cuò)。本文章將向大家講解php.ini中如何修改上傳文件大小限制。需要修改的設(shè)置有三個(gè)地方,請(qǐng)看下文
    2016-10-10
  • PHP 常見(jiàn)郁悶問(wèn)題答解

    PHP 常見(jiàn)郁悶問(wèn)題答解

    [綠色]PHP 常見(jiàn)郁悶問(wèn)題答解...
    2006-11-11
  • php中time()與$_SERVER[REQUEST_TIME]用法區(qū)別

    php中time()與$_SERVER[REQUEST_TIME]用法區(qū)別

    這篇文章主要介紹了php中time()與$_SERVER[REQUEST_TIME]用法區(qū)別,詳細(xì)分析了time()與$_SERVER[REQUEST_TIME]的用法,并以實(shí)例形式對(duì)比總結(jié)了二者在獲取當(dāng)前系統(tǒng)時(shí)間戳與請(qǐng)求時(shí)間戳的區(qū)別,需要的朋友可以參考下
    2014-11-11
  • php實(shí)現(xiàn)獲取近幾日、月時(shí)間示例

    php實(shí)現(xiàn)獲取近幾日、月時(shí)間示例

    這篇文章主要介紹了php實(shí)現(xiàn)獲取近幾日、月時(shí)間的方法,結(jié)合實(shí)例形式分析了PHP日期時(shí)間相關(guān)的date_default_timezone_set時(shí)區(qū)設(shè)置、date與mktime時(shí)間計(jì)算、轉(zhuǎn)換等操作技巧,需要的朋友可以參考下
    2019-07-07

最新評(píng)論

桦南县| 简阳市| 扬中市| 伊通| 洪洞县| 宁河县| 偃师市| 龙口市| 迭部县| 新田县| 垫江县| 高要市| 吕梁市| 东港市| 安仁县| 五家渠市| 万盛区| 铅山县| 界首市| 区。| 汽车| 龙胜| 景宁| 宣汉县| 辉县市| 大港区| 满城县| 弋阳县| 安新县| 桐乡市| 旬阳县| 阿荣旗| 巨野县| 台南市| 密云县| 沈丘县| 新津县| 峨眉山市| 铜鼓县| 衡阳市| 宾阳县|