PHP实现的微信公众号扫码模拟登录功能示例
发布:smiling 来源: PHP粉丝网 添加日期:2021-11-24 11:06:45 浏览: 评论:0
这篇文章主要介绍了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!");
- }
Tags: PHP微信公众号扫码模拟登录
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)