PHP实现QQ扫码登入,非开放平台

PHP实现QQ扫码登入,非开放平台

Anderyly
2019-04-18 / 3 评论 / 16 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年02月27日,已超过270天没有更新,若内容或图片失效,请留言反馈。

近期有个需求,需要做扫码登入,而又不想去开放平台申请,看了一下彩虹大神的提取qq的sid,提取了几个重要的方法

原理就是生成二维码后,前端设置定时器查看二维码状态,因为没有openid只能保存固定的值,那就是qq号了

    // 生成二维码
    public function getqrpic()
    {
        $url = 'https://ssl.ptlogin2.qq.com/ptqrshow?appid=1006102&e=2&l=M&s=4&d=72&v=4&t=0.5409099' . time() . 'daid=1&pt_3rd_aid=0';
        $arr = $this->get_curl($url, 0, 0, 0, 1, 0, 0, 1);
        preg_match('/qrsig=(.*?);/', $arr['header'], $match);
        if ($qrsig = $match[1]) {
            Json::msg(0, 'success', ['qrsig' => $qrsig, 'data' => base64_encode($arr['body'])]);
        } else {
            Json::msg(1, '二维码获取失败');
        }
    }
    
    // 获取二维码状态
    public function qqlogin()
    {
        error_reporting(0);
        if (input('?get.qrsig')) {
            $qrsig = input('get.qrsig');
        } else {
            Json::msg(400, 'qrsig不能为空');
        }
        $sig = '';
        $url = 'https://ssl.ptlogin2.qq.com/ptqrlogin?u1=https%3A%2F%2Fid.qq.com%2Findex.html&ptqrtoken=' . $this->getqrtoken($qrsig) . '&ptredirect=1&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=0-0-' . time() . '0000&js_ver=10291&js_type=1&login_sig=' . $sig . '&pt_uistyle=40&aid=1006102&daid=1&';
        $ret = $this->get_curl($url, 0, $url, 'qrsig=' . $qrsig . '; ', 1);
        preg_match("/ptuiCB\('(.*?)'\)/", $ret, $ts_arr);
        $r = @explode("','", str_replace("', '", "','", $ts_arr[1]));
        if ($r[0] == 65) {
            Json::msg(205, '二维码已失效');
        } elseif ($r[0] == 66) {
            Json::msg(202, '二维码未失效');
        } elseif ($r[0] == 67) {
            Json::msg(204, '正在验证二维码');
        } else {
            if (strpos($ret, '403')) Json::msg(306, $ret);
        }
        if (strlen($ret) > 1000) {
            $arr = explode(';', $ret);
            $data = substr($arr[17], strpos($arr[17], '=o') + 2, strlen($arr[17]));
            if (empty($data)) {
                Json::msg(400, '请切换二维码' . $ret);
            }
            $qq = ltrim($data, '0');
            // $qq是qq号,下面写你接下来需要处理的语句
        }
    }
    
    private function get_curl($url, $post = 0, $referer = 0, $cookie = 0, $header = 0, $ua = 0, $nobaody = 0, $split = 0)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        $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 ($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, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36');
        }
        if ($nobaody) {
            curl_setopt($ch, CURLOPT_NOBODY, 1);
        }
        curl_setopt($ch, CURLOPT_ENCODING, "gzip");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $ret = curl_exec($ch);
        if ($split) {
            $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;
    }

前端js

    getqrpic();
    function getqrpic() {
      var getvcurl = "qlogin/getqrpic/r/" + Math.random(1);
        $.get(getvcurl, function (res) {
              console.log(res.info.qrsig)
            if (res.status == 0) {
                $('#qrimg').attr('qrsig', res.info.qrsig);
                $('#qrimg').html('<img onclick="getqrpic()" src="data:image/png;base64,' + res.info.data + '" title="点击刷新">');
            } else {
                //alert(res.msg);
            }
        }, 'json');
    }
  
      $(document).ready(function(){
        interval1=setInterval(getMsg,2000);
    });
  
      function getMsg() {
          var qrsig=$('#qrimg').attr('qrsig');
        var getvcurl = "qlogin/qqlogin/qrsig/" + decodeURIComponent(qrsig) + '/r/' + Math.random(1);
        $.get(getvcurl, function (res) {
            if (res.status == 200) {
                // 这里写登入过后你执行的语句
            } else if (res.status == 205 || res.status == 306) {
                getqrpic();
            } else {
                
            }
        }, 'json');
    }

示例网站:http://www.chinawenshu.com

0

评论 (3)

取消
  1. 头像
    尹深
    Windows 10 · Google Chrome

    我可以请教一下你嘛

    回复
  2. 头像
    小卡
    Windows 10 · Google Chrome

    好像代码并不全哦 能否更新下?

    回复
    1. 头像
      云青 作者
      Windows 10 · Google Chrome
      @ 小卡

      有几个函数改下就行了

      回复