菜鸡源码,专注精品下载!
当前位置:首页 > 建站教程 > 建站知识

开发PHP实现绕过QQ微信开发平台的第四方扫码登录功能

发布时间:2024-01-05  栏目:建站知识   浏览:   分类:php教程 php代码

PHP绕过QQ微信开发平台第四方扫码登陆功能开发,可以通过以下步骤实现: 1. 获取用户扫描的二维码图片。 2. 解析二维码图片中的信息。 3. 根据解析出的信息生成登录凭证。 4. 将登录凭证发送到服务器端进行验证。 5. 服务器端验证登录凭证后,返回相应的结果给客户端。 6. 客户端根据服务器端返回的结果进行相应的操作。 需要注意的是,这种方法可能会违反相关平台的使用协议,因此在使用前请仔细阅读相关文档并确保遵守相关规定。

无法备案的网站就没办法使用QQ微信快捷登录了,所以在网上找了下第四方的QQ微信登录方法。这篇是吾爱大佬论坛分享的一篇,分享给大家。

目前也就整合了下QQ微信的扫码登陆,自己抓的QQ包以及整合了网上一些已经封装好了的代码。

QQ扫码登录

<?phpclassQQextendsCurl_Api{//获取登录验证码publicfunctionQRcode(){$url='https://ssl.ptlogin2.qq.com/ptqrshow?appid=549000912&e=2&l=M&s=4&d=72&v=4&t=0.5409099'.time().'&daid=5';$arr=$this->get_curl_split($url);preg_match('/qrsig=(.*?);/',$arr['header'],$match);if($qrsig=$match[1])returnarray('code'=>200,'qrsig'=>$qrsig,'data'=>base64_encode($arr['body']));elsereturnarray('code'=>400,'msg'=>'二维码获取失败');}publicfunctionListenQR($qrsig){$qrsig=$qrsig[0];if(empty($qrsig))returnarray('code'=>-1,'msg'=>'qrsig不能为空');$url='https://ssl.ptlogin2.qq.com/ptqrlogin?u1=https%3A%2F%2Fqzs.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&ptqrtoken='.$this->getqrtoken($qrsig).'&login_sig=&ptredirect=0&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=0-0-'.time().'0000&js_ver=10194&js_type=1&pt_uistyle=40&aid=549000912&daid=5&';$ret=$this->get_curl($url,0,$url,'qrsig='.$qrsig.';',1);if(preg_match("/ptuiCB('(.*?)')/",$ret,$arr)){$r=explode("','",str_replace("','","','",$arr[1]));if($r[0]==0){preg_match('/uin=(d+)&/',$ret,$uin);$uin=$uin[1];preg_match('/skey=@(.{9});/',$ret,$skey);preg_match('/superkey=(.*?);/',$ret,$superkey);$data=$this->get_curl($r[2],0,0,0,1);if($data){preg_match("/p_skey=(.*?);/",$data,$matchs);$pskey=$matchs[1];}if($pskey){if(isset($_GET['findpwd'])){$_SESSION['findpwd_qq']=$uin;}returnarray('code'=>200,'uin'=>$uin,'skey'=>'@'.$skey[1],'pskey'=>$pskey,'superkey'=>$superkey[1],'nick'=>$r[5]);}else{returnarray('code'=>201,'msg'=>'登录成功,获取相关信息失败!'.$r[2]);}}elseif($r[0]==65){returnarray('code'=>400,'msg'=>'二维码已失效。');}elseif($r[0]==66){returnarray('code'=>202,'msg'=>'二维码未失效。');}elseif($r[0]==67){returnarray('code'=>302,'msg'=>'正在验证二维码。');}else{returnarray('code'=>401,'msg'=>$r[4]);}}else{returnarray('code'=>403,'msg'=>$ret);}}privatefunctiongetqrtoken($qrsig){$len=strlen($qrsig);$hash=0;for($i=0;$i<$len;$i++){$hash+=(($hash<<5)&2147483647)+ord($qrsig[$i])&2147483647;$hash&=2147483647;}return$hash&2147483647;}}

微信扫码登录

<?phpclassWechatextendsCurl_Api{//获取验证码publicfunctionQRcode(){$url="https://login.weixin.qq.com/jslogin?appid=wx782c26e4c19acffb&fun=new&lang=zh_CN";$uuid=$this->get_curl($url);//var_dump($uuid);$uuid=substr($uuid,strpos($uuid,'"')+1,-2);$url="https://login.wx.qq.com/qrcode/{$uuid}?t=webwx";$qrcode=file_get_contents($url);$result=['code'=>200,'uuid'=>$uuid,'qrcode'=>base64_encode($qrcode)];return$result;}publicfunctionListenQR($uuid){$paras['ctime']=1000;$paras['rtime']=1000;$paras['refer']='https://wx2.qq.com/';$api='https://login.wx2.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid='.$uuid[0].'&tip=0';$body=$this->curl($api,$paras);preg_match('/(d){3}/',$body,$code);preg_match('/redirect_uri="(.*?)"/',$body,$url);if($code[0]=='200'){$body=$this->curl($url[1]);if(strpos($body,'1203')){$ret['code']=400;$ret['msg']="短时间内不能重复进行微信登陆";return$ret;}preg_match('/<wxuin>(d*?)</wxuin>/',$body,$wxuin);$ret['code']=200;$ret['data']['uin']=$wxuin[1];$ret['data']['type']='wx';$ret['msg']='登录成功';}else{$ret['code']=408;$ret['msg']='请使用手机微信扫码登录';}return$ret;}}

为了方便跳用,这里我又封装了一个类
动态传入QQ微信的类名字符串快速实例化

Tencent类

<?phpClassTencent{protected$path=__DIR__.'/';private$cl;/**动态传入QQ或WX字符串,自动转换对应的api类登录*/publicfunction__construct($type){//注册自动加载函数spl_autoload_register([$this,'Psr4Autoload']);//引入curl$this->cl=new$type();}publicfunctionPsr4Autoload($class){$class_file=$this->path.'/'.$class.'.php';if(file_exists($class_file)){include"$class_file";}else{die('类文件'.$class_file.'不存在');}}publicfunctionQRcode(){returncall_user_func([$this->cl,__FUNCTION__]);}publicfunctionListenQR(...$args){returncall_user_func([$this->cl,__FUNCTION__],$args);}publicfunction__call($name,$arguments){call_user_func_array([$this->cl,$name],(array)$arguments);}}

以及最后一个curl类:

<?phpclassCurl_Api{public$ua="Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/69.0.3497.100Safari/537.36";publicfunctionget_curl($url,$post=0,$referer=0,$cookie=0,$header=0,$ua=0,$nobaody=0){$ch=curl_init();curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);$httpheader[]="Accept:application/json";$httpheader[]="Accept-Encoding:gzip,deflate,sdch";$httpheader[]="Accept-Language:zh-CN,zh;q=0.8";$httpheader[]="Connection:keep-alive";curl_setopt($ch,CURLOPT_HTTPHEADER,$httpheader);if($post){curl_setopt($ch,CURLOPT_POST,1);curl_setopt($ch,CURLOPT_POSTFIELDS,$post);}if($header){curl_setopt($ch,CURLOPT_HEADER,TRUE);}if($cookie){curl_setopt($ch,CURLOPT_COOKIE,$cookie);}if($referer){curl_setopt($ch,CURLOPT_REFERER,$referer);}if($ua){curl_setopt($ch,CURLOPT_USERAGENT,$ua);}else{curl_setopt($ch,CURLOPT_USERAGENT,$this->ua);}if($nobaody){curl_setopt($ch,CURLOPT_NOBODY,1);}curl_setopt($ch,CURLOPT_TIMEOUT,10);curl_setopt($ch,CURLOPT_ENCODING,"gzip");curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);$ret=curl_exec($ch);curl_close($ch);return$ret;}functioncurl($url,$paras=array()){$ch=curl_init();curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);$httpheader[]="Accept:*/*";$httpheader[]="Accept-Encoding:gzip,deflate,sdch";$httpheader[]="Accept-Language:zh-CN,zh;q=0.8";$httpheader[]="Connection:close";curl_setopt($ch,CURLOPT_HTTPHEADER,$httpheader);if($paras['ctime']){//连接超时curl_setopt($ch,CURLOPT_CONNECTTIMEOUT_MS,$paras['ctime']);}if($paras['rtime']){//读取超时curl_setopt($ch,CURLOPT_TIMEOUT_MS,$paras['rtime']);}if($paras['post']){curl_setopt($ch,CURLOPT_POST,1);curl_setopt($ch,CURLOPT_POSTFIELDS,$paras['post']);}if($paras['header']){curl_setopt($ch,CURLOPT_HEADER,true);}if($paras['cookie']){curl_setopt($ch,CURLOPT_COOKIE,$paras['cookie']);}if($paras['refer']){if($paras['refer']==1){curl_setopt($ch,CURLOPT_REFERER,'http://m.qzone.com/infocenter?g_f=');}else{curl_setopt($ch,CURLOPT_REFERER,$paras['refer']);}}if($paras['ua']){curl_setopt($ch,CURLOPT_USERAGENT,$paras['ua']);}else{curl_setopt($ch,CURLOPT_USERAGENT,"Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/65.0.3325.181Safari/537.36");}if($paras['nobody']){curl_setopt($ch,CURLOPT_NOBODY,1);}curl_setopt($ch,CURLOPT_ENCODING,"gzip");curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);$ret=curl_exec($ch);curl_close($ch);return$ret;}publicfunctionget_curl_split($url){$ch=curl_init();curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);$httpheader[]="Accept:*/*";$httpheader[]="Accept-Encoding:gzip,deflate,sdch";$httpheader[]="Accept-Language:zh-CN,zh;q=0.8";$httpheader[]="Connection:keep-alive";curl_setopt($ch,CURLOPT_HTTPHEADER,$httpheader);curl_setopt($ch,CURLOPT_HEADER,TRUE);curl_setopt($ch,CURLOPT_USERAGENT,$this->ua);curl_setopt($ch,CURLOPT_TIMEOUT,10);curl_setopt($ch,CURLOPT_ENCODING,"gzip");curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);$ret=curl_exec($ch);$headerSize=curl_getinfo($ch,CURLINFO_HEADER_SIZE);$header=substr($ret,0,$headerSize);$body=substr($ret,$headerSize);$ret=array();$ret['header']=$header;$ret['body']=$body;curl_close($ch);return$ret;}}

大致调用的流程
1、保存四个类到文件里面
2、引入文件
3、单独写两个接口,一个生成qr码(base64),一个轮询二维码扫码状态
4、用户扫码成功后、会返回一个QQ号火微信唯一id
5、这里我只演示一个微信扫码登陆的例子
生成二维码并轮询检测二维码状态 login.php :

<?php//我这里只引入了一个文件的原因是因为Wechat和QQ类不用引入、只需要把Curl_Api请求类引入进来就好,但我Tencent类内已经引入了。所以这里我只需要引入一个文件就好include"Lib/Tencent/Tencent.php";$wx=newTencent("Wechat");$ret=$wx->QRcode();?><!--直接生成QR码、记得把uuid给带上--><imgid="wx"src="data:text/html;base64,<?=$ret['qrcode']?>"uuid="<?=$ret['uuid']?>"><scriptsrc="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script><script>//setTimeout(function(){//varuuid=document.getElementById('wx').getAttribute("uuid");//varurl="/ajax.php?uuid="+uuid;//console.log(url);//},1000);//每秒去查询一次二维码状态$(document).ready(function(){setInterval(function(){varuuid=document.getElementById('wx').getAttribute("uuid");varurl="/ajax.php?uuid="+uuid;$.ajax({type:"GET",url:url,success:function(data){if(data.code==200){alert("登陆成功,uin为:"+data.uid);}}});},1000);});</script>

AJAX.php :

<?phpinclude"Lib/Tencent/Tencent.php";$wx=newTencent("Wechat");//直接获取到uuid后,监听就好了$ret=$wx->ListenQR($_GET['uuid']);//var_dump($ret);echojson_encode($ret,true);exit;

这个例子是微信的,QQ同样的代码一样可以运行

数据库用户表多一个qq和wxuin字段、用于保存用户绑定的QQ和微信


相关文章

    无相关信息
评论
建站知识
建站知识
使用技巧
调试安装
运营推广