您好,登錄后才能下訂單哦!
使用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怎么實現一個微信公眾號掃碼模擬登錄功能問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。