middleware('auth:api')->except('login','Ping','refreshByUser', 'register', 'shop', 'getConfig','version','buy','ClashConfig','getsysconfig'); auth()->shouldUse('api'); } public function Ping() { return response()->json(['ret' => 1], 200); } //生成配置 public function ClashConfig(Request $request){ $code = $request->input('code'); // 检查订阅码是否有效 $subscribe = UserSubscribe::whereCode($code)->first(); if (! $subscribe) { return response()->json(['ret' => 0, 'msg' => trans('error.subscribe.unknown')], 200); } if ($subscribe->status !== 1) { return response()->json(['ret' => 0, 'msg' => trans('error.subscribe.sub_baned')], 200); } // 检查用户是否有效 $user = $subscribe->user; if (!$user) { return response()->json(['ret' => 0, 'msg' => trans('error.subscribe.user')], 200); } if ($user->status === -1) { return response()->json(['ret' => 0, 'msg' => trans('error.subscribe.user_disable')], 200); } // 获取这个账号可用节点 $query = $user->nodes()->whereIsSubscribe(1); // if ($this->subType === 1) { // $query = $query->whereIn('type', [1, 4]); // } elseif ($this->subType) { // $query = $query->whereType($this->subType); // } $nodeList = $query->orderByDesc('sort')->orderBy('id')->get(); if (empty($nodeList)) { return $this->failed(trans('error.subscribe.none')); } $servers = []; foreach ($nodeList as $node) { $servers[] = $node->config($user); } $servers = Arr::shuffle($servers); return (new ClientController)->config("clash", $user, $servers); } //登陆 public function login(Request $request) { $validator = Validator::make($request->all(), [ 'email' => 'required|email', 'password' => 'required|string|min:6', ]); if ($validator->fails()) { return response()->json(['ret' => 0, 'msg' => $validator->errors()->all()], 200); } if ($token = auth()->attempt($validator->validated())) { return $this->createNewToken($request,$token); } return response()->json(['ret' => 0, 'msg' => "账号或密码错误"], 200); } protected function createNewToken($request,$token) { $user = auth()->user(); //判断到期 $expireTime = $user["expired_at"]; // if ($expireTime < date('Y-m-d H:i:s')){ // return response()->json(['ret' => 445, 'msg' => "用户到期,请即使续费"], 200); // } // $usedTraffic = $user->usedTraffic(); // if ($usedTraffic >= $user["transfer_enable"]){ // return response()->json(['ret' => 446, 'msg' => "流量已经用完,"], 200); // } $userinfo = $user->profile(); if (empty($userinfo)){ return response()->json(['ret' => 0, 'msg' => "错误"]); } $data = [ 'access_token' => $token, 'user' => $userinfo, 'tutorial' => 'https://ruanjian.xiazi.buzz/', 'swoftdownload' => 'https://app.xiazai3.xyz/', 'affurl' => 'https://user.viptwo.xyz/logintoreferral?email='.$request->input('email') . '&password='.$request->input('password'), 'user_login_url' => 'https://user.viptwo.xyz/logina?email='.$request->input('email') . '&password='.$request->input('password'), 'user_buy' => 'https://user.viptwo.xyz/logina?email='.$request->input('email') . '&password='.$request->input('password'), 'user_ticket' => 'https://user.viptwo.xyz/logintoticket?email='.$request->input('email') . '&password='.$request->input('password'), 'clash_config' => route('SProxy_config', ['code'=>$userinfo['code']]), 'subUrl' => sysConfig('subscribe_domain') . "/s/" . $userinfo['code'], 'subUrl2' => "https://naizi1124.xn--3iq226gfdb94q.com" . "/s/" . $userinfo['code'], ]; return response()->json(['ret' => 1, 'msg' => "请求成功",'data'=>$data], 200); } //正在获取系统配置 public function getsysconfig(Request $request){ //$url = "user.viptwo.xyz"; $url = "zf.payviptwo.top"; $tag = $request->input('email'); if (!isset($tag)){ $data = [ 'affurl' => 'https://user.vip666999.xyz/logintoreferral', //推广 'user_login_url' => 'https://'.$url.'/logina', //购买 和登陆 'user_login_url_ke' => 'https://'.$url.'/logina', //购买和登陆 'user_buy' => 'https://'.$url.'/logina', // 'user_ticket' => 'https://'.$url.'/logintoticket', 'user_reg' => 'https://'.$url.'/register', 'user_reset' => 'https://'.$url.'/reset', 'user_tutorial' => 'https://app.xiazai8.xyz/', //在线客服 'user_rofile' => 'https://'.$url.'/Loginprofile', 'user_download' => 'https://app.xiazai8.xyz/', 'tag' => 0, ]; return response()->json(['ret' => 1, 'msg' => "请求成功",'data'=>$data], 200); } else { $data = [ 'affurl' => 'https://user.vip666999.xyz/logintoreferral?email='.$request->input('email') . '&password='.$request->input('password'), 'affurl_ke' => 'https://user.vip666999.xyz/logintoreferral', 'user_login_url' => 'https://'.$url.'/logina?email='.$request->input('email') . '&password='.$request->input('password'), 'user_login_url_ke' => 'https://'.$url.'/logina', 'user_buy' => 'https://'.$url.'/logina?email='.$request->input('email') . '&password='.$request->input('password'), 'user_ticket' => 'https://'.$url.'/logintoticket?email='.$request->input('email') . '&password='.$request->input('password'), 'user_ticket_ke' => 'https://'.$url.'/logintoticket', 'user_reg' => 'https://'.$url.'/register', 'user_reset' => 'https://'.$url.'/reset', 'user_tutorial' => 'https://app.xiazai8.xyz/', 'user_rofile' => 'https://'.$url.'/Loginprofile', 'user_download' => 'https://app.xiazai8.xyz/', 'tag' => 1, ]; return response()->json(['ret' => 1, 'msg' => "请求成功",'data'=>$data], 200); } } //刷新token public function refresh() { $user = auth()->user(); $userinfo = $user->profile(); if (empty($userinfo)){ return response()->json(['ret' => 0, 'msg' => "错误"]); } $data = [ 'access_token' => auth()->refresh(), 'user' => $userinfo, 'affurl' => route('register', ['aff' => Auth::id()]), 'tutorial' => 'https://user.viptwo.xyz/', 'swoftdownload' => 'https://app.xiazai8.xyz/', 'clash_config' => route('SProxy_config', ['code'=>$userinfo['code']]), ]; return response()->json(['ret' => 1, 'msg' => "请求成功",'data'=>$data], 200); } public function refreshByUser(Request $request) { $email = $request->input("email"); $password = $request->input("password"); $userinfo = User::where('email','=',$email)->first(); if (empty($userinfo)){ return response()->json(['ret' => 0, 'msg' => "错误"]); } $users = [ 'email' => $email, 'password' =>$password ]; $token = auth()->attempt($users); $data = [ 'access_token' => $token, 'user' => $userinfo, 'affurl' => route('register', ['aff' => $userinfo["id"]]), 'tutorial' => 'https://user.viptwo.xyz/', 'swoftdownload' => 'https://app.xiazai3.xyz/', 'clash_config' => route('SProxy_config', ['code'=>$userinfo['code']]), ]; return response()->json(['ret' => 1, 'msg' => "请求成功",'data'=>$data], 200); } public function version(Request $request){ $tag = $request->input("tag"); $appversion = $request->input("appverion"); $version = AppUpdate::where('appname','=',$tag)->first(); if (empty($version)){ return response()->json(['ret' => 0, 'msg' => "获取版本失败"]); } if(version_compare($version["appversion"],$appversion,">")){ $version["versionupdate"] = 1; return response()->json(['ret' => 1, 'data' => $version], 200); } return response()->json(['ret' => 0, 'msg' => "没有新版本"]); } //用户验证 public function authUser(Request $request){ $user = auth()->user(); $userinfo = $user->profile(); $is_debug = $request->input('debug'); $query = $user->nodes()->with(['labels', 'level_table','onlineLogs']); $nodeList = $query->orderByDesc('sort')->orderBy('id')->get(); if ($is_debug == 1){ //return $nodeList[0]["status"] == 1; $firstnode = []; foreach ($nodeList as $node) { // 在线人数 $online_log = $node->onlineLogs()->where('log_time', '>=', strtotime('-1 minutes'))->latest('log_time')->first(); $node->online_users = $online_log->online_user ?? 0; if (strpos($node->country_code,'hk') !== false && $node->status == 1){ $firstnode[] = $node; } } if (empty($firstnode)) { // 查找其他国家的第一个 foreach ($nodeList as $node) { // 在线人数 $online_log = $node->onlineLogs()->where('log_time', '>=', strtotime('-1 minutes'))->latest('log_time')->first(); $node->online_users = $online_log->online_user ?? 0; if ( $node->status == 1){ $firstnode[] = $node; } } } //找到人数最小的 $min["key"] = ""; $min["value"] = 0; $keys = "online_users"; $midormax = $this->phpMaxMin($firstnode,$keys); $servers = []; foreach ($firstnode as $key => $v ){ if($key == $midormax["min"]["key"]) { $servers = $v->config($user); $servers[$keys] = $firstnode[$key][$keys]; } } return $servers; } if (empty($userinfo)){ return response()->json(['ret' => 0, 'msg' => "错误"]); } //判断到期 $expireTime = $user["expired_at"]; if ($expireTime < date('Y-m-d H:i:s')){ return response()->json(['ret' => 445, 'msg' => "用户到期,请续费"], 200); } $usedTraffic = $user->usedTraffic(); if ($usedTraffic >= $userinfo["transfer_enable"]){ return response()->json(['ret' => 446, 'msg' => "流量已经用完,请购买加油包"], 200); } if ($userinfo["enable"] == 0){ return response()->json(['ret' => 446, 'msg' => "账号禁用,请等待5分钟后请刷新或者重启软件"], 200); } //获取节点 $query = $user->nodes()->with(['labels', 'level_table','onlineLogs']); $nodeList = $query->orderByDesc('sort')->orderBy('id')->get(); $firstnode = []; foreach ($nodeList as $node) { // 在线人数 $online_log = $node->onlineLogs()->where('log_time', '>=', strtotime('-1 minutes'))->latest('log_time')->first(); $node->online_users = $online_log->online_user ?? 0; if (strpos($node->country_code,'hk') !== false && $node->status == 1){ $firstnode[] = $node; } } if (empty($firstnode)) { // 查找其他国家的第一个 foreach ($nodeList as $node) { // 在线人数 $online_log = $node->onlineLogs()->where('log_time', '>=', strtotime('-1 minutes'))->latest('log_time')->first(); $node->online_users = $online_log->online_user ?? 0; if ( $node->status == 1){ $firstnode[] = $node; } } } //找到人数最小的 $min["key"] = ""; $min["value"] = 0; $keys = "online_users"; $midormax = $this->phpMaxMin($firstnode,$keys); $servers = []; foreach ($firstnode as $key => $v ){ if($key == $midormax["min"]["key"]) { $servers = $v->config($user); $servers[$keys] = $firstnode[$key][$keys]; } } return response()->json(['ret' => 1, 'data' => $servers], 200); } //获取节点 public function nodeList(int $id = null) { $user = auth()->user(); $query = $user->nodes()->with(['labels', 'level_table','onlineLogs']); $nodeList = $query->where("type",'!=',2)->where("vless",'=',0)->orderByDesc('sort')->orderBy('id')->get(); //var_dump($nodes); die(); if (isset($id)) { $nodes = $user->nodes()->get(); $node = $nodes->find($id); if (empty($node)) { return response()->json([], 204); } return response()->json($node->config($user)); } $temp = array(); $servers = []; $firstnode = []; foreach ($nodeList as $node) { // 在线人数 $online_log = $node->onlineLogs()->where('log_time', '>=', strtotime('-5 minutes'))->latest('log_time')->first(); $node->online_users = $online_log->online_user ?? 0; $firstnode[] = $node; } foreach ($firstnode as $key => $val){ $servers[] = $val->config($user); $servers[$key]["ip"] = $firstnode[$key]["ip"]; $servers[$key]["online_users"] = $firstnode[$key]["online_users"]; $servers[$key]["country_code"] = $firstnode[$key]["country_code"]; } return response()->json(['ret' => 1, 'data' => $servers]); } public function phpMaxMin($arr = [],$keys = ''){ $max['key'] = ''; $max['value'] = ''; $min['key'] = ''; $min['value'] = ''; foreach ($arr as $key => $val){ if($max['key'] === ''){ $max['key'] = $key; $max['value'] = $val[$keys]; } if((int)$max['value'] < $val[$keys]){ $max['key'] = $key; $max['value'] = $val[$keys]; } if($min['key'] === ''){ $min['key'] = $key; $min['value'] = $val[$keys]; } if((int)$min['value'] > $val[$keys]){ $min['key'] = $key; $min['value'] = $val[$keys]; } } $array['max'] = $max; $array['min'] = $min; return $array; } }