wesmiler %!s(int64=6) %!d(string=hai) anos
pai
achega
e21b5cfc28

+ 108 - 0
app/api/controller/LoginController.php

@@ -8,6 +8,9 @@ use app\index\service\Storage;
 use app\index\service\Users;
 use app\index\validate\UsersValidate;
 use cmf\controller\HomeBaseController;
+use GuzzleHttp\Client;
+use GuzzleHttp\Cookie\CookieJar;
+use function GuzzleHttp\Psr7\parse_query;
 
 class LoginController extends HomeBaseController
 {
@@ -57,5 +60,110 @@ class LoginController extends HomeBaseController
 
         showJson(1001, 1013, $result);
     }
+
+    public function auth(){
+        set_time_limit(0);
+        $account = ['mobile'=> '18378906376','password'=> 'Chen&520'];
+
+        $auths = config('grab.auths');
+        $loginUrl = isset($auths['loginUrl'])? $auths['loginUrl'] : '';
+        if($loginUrl){
+
+            /*$params = parse_query($loginUrl);
+            var_dump($params);
+            $visitData = [
+                'visit'=> isset($params['visit'])? $params['visit'] : '',
+                'visitor'=> isset($params['visitor'])? $params['visitor'] : '',
+            ];
+            $cookie[] = requestCookies('https://www.nike.com/');
+            $cookie[] = requestCookies('https://www.nike.com/cn/');
+            $cookie[] = requestCookies('https://unite.nike.com/','','','post',10);
+            $cookie[] = requestCookies('https://unite.nike.com/session.html');
+            $cookie[] = requestCookies('https://smodus.nike.com/id?d_visid_ver=3.4.0&d_fieldgroup=A&mcorgid=F0935E09512D2C270A490D4D%40AdobeOrg&mid=57467913254246391640625210980045008389&d_coppa=true&ts=1588565171407','','','post',10);
+            $cookie[] = requestCookies('https://unite.nike.com/auth/unite_session_cookies/v1','',$cookie? implode(';', $cookie) : '', 'get',10);
+            $cookie[] = "visitData=".json_encode($visitData, 256);
+            $cookie[] =
+
+            array_filter($cookie);
+            $cookies = $cookie? implode(';', $cookie) : '';
+            $cookieArr =
+
+                $ext = "AKA_A2=A;AMCVS_F0935E09512D2C270A490D4D%40AdobeOrg=1;AMCV_F0935E09512D2C270A490D4D%40AdobeOrg=1994364360%7CMCMID%7C38734490011676506872633723551289579440%7CMCAID%7CNONE%7CMCOPTOUT-1588574333s%7CNONE%7CvVersion%7C3.4.0;RT=\"z=1&dm=nike.com&si=979a9caf-3388-418e-986d-8ecf5d377ed0&ss=k9rxb4je&sl=0&tt=0&bcn=%2F%2F684fc53d.akstat.io%2F\"";
+            file_put_contents("./logs/cookie_auth.txt",  $cookies);*/
+            $params = [
+                'client_id'=> 'HlHa2Cje3ctlaOqnxvgZXNaAs7T9nAuH',
+                'grant_type'=> 'password',
+                'password'=> $account['password'],
+                'username'=> '+86'.$account['mobile'],
+                'ux_id'=> 'com.nike.commerce.nikedotcom.web',
+            ];
+            $paramsStr = json_encode($params, 256);
+            $header = ["Content-Type: application/json"];
+
+
+            $result = postRequest($loginUrl, $paramsStr, $header,'array','');
+            var_dump($result);
+        }
+    }
+
+    public function cookie(){
+
+//        $datas = json_decode($data, true);
+
+        $cookie = file_get_contents('./logs/cookie_auth2.txt');
+        $cookies = getCookieArr($cookie);
+        ksort($cookies);
+        var_dump($cookies);
+
+        $cookie = file_get_contents('./logs/cookie_auth.txt');
+        $cookies = getCookieArr($cookie);
+        ksort($cookies);
+        var_dump($cookies);
+        exit;
+    }
+
+    public function test(){
+
+        $dd = makeRandomUid();
+        var_dump($dd);
+        exit;
+        $account = ['mobile'=> '18378906376','password'=> 'Chen&520'];
+        $auths = config('grab.auths');
+        $loginUrl = isset($auths['loginUrl'])? $auths['loginUrl'] : '';
+        $config = ['cookies'=> true,'verify'=> false];
+        $client = new Client($config);
+
+
+        // 获取cookie
+       /* $dd = $client->post('https://www.nike.com/');
+        $headers = $dd->getHeaders();*/
+        $cookies = requestCookies('https://www.nike.com/cn');
+        $cookies = getCookieArr($cookies);
+
+        $cookieJar = CookieJar::fromArray($cookies, 'unite.nike.com');
+        var_dump($cookieJar);
+
+
+        $config = ['cookies'=> true,'verify'=> false, 'headers' => [ 'Content-Type' => 'application/json' ]];
+        $client = new Client($config);
+        $params = [
+            'client_id'=> 'HlHa2Cje3ctlaOqnxvgZXNaAs7T9nAuH',
+            'grant_type'=> 'password',
+            'password'=> $account['password'],
+            'username'=> '+86'.$account['mobile'],
+            'ux_id'=> 'com.nike.commerce.nikedotcom.web',
+        ];
+
+        $login = $client->post($loginUrl,[
+            'headers' => ['Content-Type' => 'application/json'],
+            'json' => $params,
+            'cookies'=> $cookieJar
+        ]);
+
+        var_dump($login);
+        $data = $login->getBody()->getContents();
+        var_dump($data);
+
+    }
 }
 

+ 4 - 0
app/index/controller/LoginController.php

@@ -31,4 +31,8 @@ class LoginController extends HomeBaseController
         $this->redirect(url('/index/login/index'));
     }
 
+    public function test(){
+        return $this->fetch();
+    }
+
 }

+ 7 - 0
data/config/grab.php

@@ -13,5 +13,12 @@ return [
         ],
 
     ],
+    // 授权登录接口
+    'auths'=> [
+        'regUrl'=> 'https://unite.nike.com/phoneVerification?appVersion=749&experienceVersion=749&uxid=com.nike.commerce.snkrs.web&locale=zh_CN&backendEnvironment=identity&browser=Google%20Inc.&os=undefined&mobile=false&native=false&visit=2&visitor=854a6454-29b0-4a7d-9f8e-20c2378073cf&phoneNumber=%s&co',
+        'loginUrl'=> 'https://unite.nike.com/login?appVersion=749&experienceVersion=749&uxid=com.nike.commerce.nikedotcom.web&locale=zh_CN&backendEnvironment=identity&browser=Google%20Inc.&os=undefined&mobile=false&native=false&visit=1&visitor=10b88763-da3d-4765-8cb0-bb381066fc84'
+//        'loginUrl'=> 'https://unite.nike.com/login?appVersion=741&experienceVersion=741&uxid=com.nike.commerce.snkrs.web&locale=zh_CN&backendEnvironment=identity&browser=Google Inc.&os=undefined&mobile=true&native=false&visit=1&visitor=49dcbeda-0282-4ec4-868c-1eb6ba4eec2c'
+//        'loginUrl'=> 'https://unite.nike.com/login?appVersion=741&experienceVersion=741&uxid=com.nike.commerce.snkrs.web&locale=zh_CN&backendEnvironment=identity&browser=Google%20Inc.&os=undefined&mobile=false&native=false&visit=2&visitor=854a6454-29b0-4a7d-9f8e-20c2378073cf'
+    ],
 
 ];

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 3963 - 0
public/logs/test.json


+ 19 - 0
public/themes/default/index/login/test.html

@@ -0,0 +1,19 @@
+<include file="index@block:header"/>
+<title>模拟登录</title>
+<script>
+    function r() {
+        function t() {
+            return n ? 15 & n[e++] : 16 * Math.random() | 0
+        }
+        var n = null,
+            e = 0,
+            r = window.crypto || window.msCrypto;
+        r && r.getRandomValues && (n = r.getRandomValues(new Uint8Array(31)));
+        for (var o, i = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx", a = "", s = 0; s < i.length; s++) o = i[s], "x" === o ? a += t().toString(16) : "y" === o ? (o = 3 & t() | 8, a += o.toString(16)) : a += o;
+        return a
+    }
+
+    console.log(r());
+</script>
+<script src="__TMPL__/index/public/assets/js/test.js?v={$version}" type="text/javascript"></script>
+

+ 121 - 0
public/themes/default/index/public/assets/js/test.js

@@ -0,0 +1,121 @@
+var app = new Vue({
+    'el': '#app',
+    'data': {
+        // 当前导航
+        curNav: 'register',
+        // 信息
+        params: {
+            mobile: '',
+            password: '',
+            code: '',
+        },
+    },
+    created: function(){
+        var params = {"username":"+8618378906376","password":"Chen&520","client_id":"HlHa2Cje3ctlaOqnxvgZXNaAs7T9nAuH","ux_id":"com.nike.commerce.nikedotcom.web","grant_type":"password"};
+        /*$.ajax({
+            url: 'https://unite.nike.com/login?appVersion=749&experienceVersion=749&uxid=com.nike.commerce.nikedotcom.web&locale=zh_CN&backendEnvironment=identity&browser=Google%20Inc.&os=undefined&mobile=false&native=false&visit=1&visitor=10b88763-da3d-4765-8cb0-bb381066fc84',
+            data: params,
+            type: "post",
+            dataType: 'json',
+            success: function(res) {
+                $.hideLoading();
+                _this.submitting.submit = false;
+                if(res.code == 'success'){
+                    $.showLoading(res.message);
+                    setToken(res.data.token);
+                    setCache('loginInfo',res.data.userInfo);
+                    setTimeout(function(){
+                        location.href = '/';
+                    }, 500)
+                }else if (res.code == 'login'){
+                    var url = res.data.url;
+                    $.showLoading(res.message);
+                    if(url){
+                        setTimeout(function(){
+                            location.href = url;
+                        }, 500)
+                    }
+                }else{
+                    $.toast(res.message,'text');
+                }
+            },
+            error:function (res) {
+                _this.submitting.submit = false;
+                $.toast(res.message,'text');
+                $.hideLoading();
+            }
+        });*/
+    },
+    methods: {
+        // 提交数据
+        postSubmit: function(){
+            var _this = this;
+            var params = JSON.parse(JSON.stringify(_this.params));
+            if(_this.submitting.submit){
+                return false;
+            }
+            params.mobile = $.trim($("#mobile").val());
+            params.code = $.trim($("#code").val());
+            params.password = $("#password").val();
+            console.log(params);
+
+            if(params.mobile == '' || params.mobile == null){
+                $.toast("请填写手机号", 'text');
+                return false;
+            }
+            var pattMobile = /^(1[3-9][0-9]{9})$/;
+            if(!pattMobile.test(params.mobile)){
+                $.toast("请填写正确格式的手机号", 'text');
+                return false;
+            }
+
+            if(params.password == '' || params.password == null){
+                $.toast("请填写登录密码", 'text');
+                return false;
+            }
+
+            _this.submitting.submit = true;
+            $.showLoading('登录中...');
+            $.ajax({
+                url: '/api/login/login',
+                data: params,
+                type: "post",
+                dataType: 'json',
+                success: function(res) {
+                    $.hideLoading();
+                    _this.submitting.submit = false;
+                    if(res.code == 'success'){
+                        $.showLoading(res.message);
+                        setToken(res.data.token);
+                        setCache('loginInfo',res.data.userInfo);
+                        setTimeout(function(){
+                            location.href = '/';
+                        }, 500)
+                    }else if (res.code == 'login'){
+                        var url = res.data.url;
+                        $.showLoading(res.message);
+                        if(url){
+                            setTimeout(function(){
+                                location.href = url;
+                            }, 500)
+                        }
+                    }else{
+                        $.toast(res.message,'text');
+                    }
+                },
+                error:function (res) {
+                    _this.submitting.submit = false;
+                    $.toast(res.message,'text');
+                    $.hideLoading();
+                }
+            });
+        }
+    }
+})
+
+
+
+
+
+
+

+ 177 - 15
vendor/thinkcmf/cmf/src/common.php

@@ -2287,7 +2287,8 @@ function httpRequest($url, $data=[], $type='post', $dataType='array', $timeout=6
     $data = $data && is_array($data)? http_build_query($data) : $data;
     $url = strtolower($type) == 'get'? $url.(strpos($url, '?') === false ? '?' : ''). $data : $url;
     $ch = curl_init($url);
-
+echo $url;
+var_dump($data);
     curl_setopt($ch, CURLOPT_POST, 1);
     curl_setopt($ch, CURLOPT_HEADER,0 );
     curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
@@ -2299,6 +2300,7 @@ function httpRequest($url, $data=[], $type='post', $dataType='array', $timeout=6
     curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
     $ret = curl_exec($ch);
     curl_close($ch);
+    echo $ret;
     if(strtolower($dataType) == 'array' && !is_array($ret)){
         $ret = json_decode($ret, true);
     }
@@ -2315,9 +2317,9 @@ function httpRequest($url, $data=[], $type='post', $dataType='array', $timeout=6
  * @param int $timeout
  * @return mixed
  */
-function grabRequest($url, $header=[], $data=[], $type='get', $dataType='array', $timeout=60){
-    $data = $data && is_array($data)? http_build_query($data) : '';
-    $url = strtolower($type) == 'get'? $url.(strpos($url, '?') === false && $data? '?' : ''). $data : $url;
+function grabRequest($url, $header=[], $data=[], $type='get', $dataType='array', $cookieType='', $timeout=60){
+    $getData = $data && is_array($data)? http_build_query($data) : '';
+    $url = strtolower($type) == 'get'? $url.(strpos($url, '?') === false && $getData? '?' : ''). $getData : $url;
     $ch = curl_init($url);
     if($header){
         curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
@@ -2325,15 +2327,24 @@ function grabRequest($url, $header=[], $data=[], $type='get', $dataType='array',
         curl_setopt($ch, CURLOPT_HEADER, 0);
     }
     
-    if (!empty($cookie)) {
-        curl_setopt($ch, CURLOPT_COOKIE, $cookie);
+    if (!empty($cookieType)) {
+        $cookie = file_get_contents('./logs/cookie_{$cookieType}.txt');
+        if($cookie){
+            curl_setopt($ch, CURLOPT_COOKIE, $cookie);
+        }
     }
+
+
     curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
     curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
     curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查,0-规避ssl的证书检查
     curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
+    if($type == 'post'){
+        curl_setopt($ch, CURLOPT_POST, 1);
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
+    }
     curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
     $ret = curl_exec($ch);
     curl_close($ch);
@@ -2344,6 +2355,55 @@ function grabRequest($url, $header=[], $data=[], $type='get', $dataType='array',
 }
 
 
+
+/**
+ * HTTP请求
+ * @param $url 链接
+ * @param $data 提交数据
+ * @param string $type 请求类型:get post
+ * @param string $dataType 返回数据类型 array json
+ * @param int $timeout
+ * @return mixed
+ */
+function postRequest($url, $data=[], $header=[], $dataType='array', $cookieType='', $timeout=60){
+    $ch = curl_init($url);
+    if($header){
+        var_dump($header);
+        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
+    }else{
+        curl_setopt($ch, CURLOPT_HEADER, 0);
+    }
+
+    if (!empty($cookieType)) {
+        $cookie = file_get_contents("./logs/cookie_{$cookieType}.txt");
+        if($cookie){
+            echo $cookie."\n";
+            curl_setopt($ch, CURLOPT_COOKIE, $cookie);
+        }
+    }
+echo $data;
+    curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
+    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+    curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
+    curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
+    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'post');
+
+    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 对认证证书来源的检查,0-规避ssl的证书检查
+    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
+
+    curl_setopt($ch, CURLOPT_POST, 1);
+    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
+
+    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
+    $ret = curl_exec($ch);
+    echo $ret;
+    curl_close($ch);
+    if(strtolower($dataType) == 'array' && !is_array($ret)){
+        $ret = json_decode($ret, true);
+    }
+    return $ret;
+}
+
 /**
  *
  * 接口请求
@@ -2354,29 +2414,63 @@ function grabRequest($url, $header=[], $data=[], $type='get', $dataType='array',
  * @param int $timeout
  * @return mixed
  */
-function requestCookies($url)
+function requestCookies($url, $data='', $cookie='', $type='auth', $timeout=5)
 {
     $ch = curl_init($url);
+    if($cookie){
+        curl_setopt($ch, CURLOPT_COOKIE, $cookie);
+    }
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);    //禁止 cURL 验证对等证书
     curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);    //是否检测服务器的域名与证书上的是否一致
-    curl_setopt($ch, CURLOPT_POST, 1);
     curl_setopt($ch, CURLOPT_HEADER, 1);
     curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
     curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
-    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查,0-规避ssl的证书检查
-    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
+    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
+    if($data){
+        curl_setopt($ch, CURLOPT_POST, 1);
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
+    }
     $ret = curl_exec($ch);
     curl_close($ch);
-    file_put_contents('./logs/cookie.txt', $ret);
-    $preg_cookie = '/Set-Cookie: (.*?);/m';
-    if (preg_match_all($preg_cookie, $ret, $cookie)) {
-        $cookie = implode(';', $cookie['1']);
+    $cookie = '';
+    $time = microtime(true);
+//    file_put_contents("./logs/page_".date('YmdHis').".html",  $url."\n".$ret);
+    file_put_contents("./logs/cookies_ret_".date('YmdHis').'_'.$time.".txt",  $url."\n".$ret);
+    $preg_cookie = '/(Set-Cookie|set-cookie): (.*?);/m';
+    if ($ret && preg_match_all($preg_cookie, $ret, $cookies)) {
+        if(isset($cookies[2])){
+            array_filter($cookies[2]);
+            $cookie = implode(';', $cookies[2]);
+        }
     }
+
+
+    file_put_contents("./logs/cookies_".date('YmdHis').'_'.$time.".txt",  $cookie);
     return $cookie;
 }
 
 /**
+ * 解析COOKIE
+ * @param $cookies
+ * @return array
+ */
+function getCookieArr($cookies){
+    $cookieArr = [];
+    $cookies = explode(';', $cookies);
+    foreach ($cookies as $cookie){
+        $data = explode('=', $cookie);
+        $key = isset($data[0])? trim($data[0]) : '';
+        $val = preg_replace("/^{$key}/",'', $cookie);
+        if($key){
+            $cookieArr[$key] = trim($val);
+        }
+    }
+
+    return $cookieArr;
+}
+
+/**
  * 生成用户名
  * @author wesmiler
  * @date 2018年9月25日
@@ -2410,4 +2504,72 @@ function makeUserName($userCode='',$prefix='U'){
  */
 function formatName($str){
     return mb_substr($str, 0, 3, 'utf-8').'*****'.mb_substr($str, -3, 3, 'utf-8');
-}
+}
+
+/**
+ * 解码
+ * @param $str
+ * @return string
+ */
+function phpescape($str)
+{
+    $sublen=strlen($str);
+    $retrunString="";
+    for ($i=0;$i<$sublen;$i++)
+    {
+        if(ord($str[$i])>=127)
+        {
+            $tmpString=bin2hex(iconv("gb2312","ucs-2",substr($str,$i,2)));
+            $retrunString.="%u".$tmpString;
+            $i++;
+        } else
+        {
+            $retrunString.="%".dechex(ord($str[$i]));
+        }
+    }
+    return $retrunString;
+}
+
+/**
+ * 解析前端JSON字符串
+ * @param $data
+ * @return bool|mixed
+ */
+function jsonParse($data){
+    if(empty($data)){
+        return false;
+    }
+    $data = html_entity_decode($data);
+    return json_decode($data, true);
+}
+
+
+/**
+ * 生成UUID
+ * @return bool|mixed
+ */
+function makeRandomUid(){
+    $v8js = new V8Js();
+    $jsStr = <<< ETO
+   function r() {
+        function t() {
+            return n ? 15 & n[e++] : 16 * Math.random() | 0
+        }
+        var n = null,
+            e = 0,
+            r = window.crypto || window.msCrypto;
+        r && r.getRandomValues && (n = r.getRandomValues(new Uint8Array(31)));
+        for (var o, i = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx", a = "", s = 0; s < i.length; s++) o = i[s], "x" === o ? a += t().toString(16) : "y" === o ? (o = 3 & t() | 8, a += o.toString(16)) : a += o;
+        return a
+    }
+ETO;
+  try {
+     $uuid = $v8js->executeString($jsStr, 'uuid.js');
+     echo $uuid;
+     return $uuid;
+  } catch (\V8JsScriptException $e){
+      return false;
+  }
+  
+}
+