|
@@ -11,6 +11,7 @@ use App\Models\Order;
|
|
use App\Models\User;
|
|
use App\Models\User;
|
|
use App\Models\VerifyCode;
|
|
use App\Models\VerifyCode;
|
|
use App\Models\UserHourlyDataFlow;
|
|
use App\Models\UserHourlyDataFlow;
|
|
|
|
+use App\Models\UserDataFlowLog;
|
|
use Illuminate\Console\Command;
|
|
use Illuminate\Console\Command;
|
|
use Log;
|
|
use Log;
|
|
|
|
|
|
@@ -63,15 +64,17 @@ class AutoJob extends Command
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
|
|
- // 封禁1小时内流量异常账号
|
|
|
|
|
|
+ // 封禁最近1小时内流量异常账号(直接用UserDataFlowLog统计)
|
|
if (sysConfig('is_traffic_ban')) {
|
|
if (sysConfig('is_traffic_ban')) {
|
|
$trafficBanTime = sysConfig('traffic_ban_time');
|
|
$trafficBanTime = sysConfig('traffic_ban_time');
|
|
$trafficBanValue = sysConfig('traffic_ban_value') * GB;
|
|
$trafficBanValue = sysConfig('traffic_ban_value') * GB;
|
|
|
|
+ $oneHourAgo = time() - 3600;
|
|
|
|
|
|
- // 获取最近1小时流量异常的用户ID列表
|
|
|
|
- $abnormalUserIds = UserHourlyDataFlow::where('created_at', '>=', now()->subHour())
|
|
|
|
- ->where('total', '>', $trafficBanValue)
|
|
|
|
- ->distinct()
|
|
|
|
|
|
+ // 查询最近1小时内流量超限的用户ID
|
|
|
|
+ $abnormalUserIds = UserDataFlowLog::where('log_time', '>=', $oneHourAgo)
|
|
|
|
+ ->selectRaw('user_id, SUM(u + d) as total_traffic')
|
|
|
|
+ ->groupBy('user_id')
|
|
|
|
+ ->having('total_traffic', '>', $trafficBanValue)
|
|
->pluck('user_id')
|
|
->pluck('user_id')
|
|
->toArray();
|
|
->toArray();
|
|
|
|
|
|
@@ -81,38 +84,27 @@ class AutoJob extends Command
|
|
'user_ids' => $abnormalUserIds
|
|
'user_ids' => $abnormalUserIds
|
|
]);
|
|
]);
|
|
|
|
|
|
- // 直接查询这些异常用户并封禁
|
|
|
|
User::activeUser()
|
|
User::activeUser()
|
|
->whereIn('id', $abnormalUserIds)
|
|
->whereIn('id', $abnormalUserIds)
|
|
->whereBanTime(null)
|
|
->whereBanTime(null)
|
|
- ->chunk(100, function ($users) use ($trafficBanTime, $trafficBanValue) {
|
|
|
|
|
|
+ ->chunk(100, function ($users) use ($trafficBanTime, $trafficBanValue, $oneHourAgo) {
|
|
foreach ($users as $user) {
|
|
foreach ($users as $user) {
|
|
try {
|
|
try {
|
|
- \Log::warning('即将封禁流量异常用户', [
|
|
|
|
- 'user_id' => $user->id,
|
|
|
|
- 'email' => $user->email,
|
|
|
|
- 'before_enable' => $user->enable,
|
|
|
|
- 'before_ban_time' => $user->ban_time,
|
|
|
|
- 'traffic_ban_value' => $trafficBanValue
|
|
|
|
- ]);
|
|
|
|
|
|
+ // 重新统计该用户最近1小时的总流量
|
|
|
|
+ $total = UserDataFlowLog::where('user_id', $user->id)
|
|
|
|
+ ->where('log_time', '>=', $oneHourAgo)
|
|
|
|
+ ->sum(\DB::raw('u + d'));
|
|
|
|
+ $banValueStr = flowAutoShow($trafficBanValue);
|
|
|
|
+ $usedStr = flowAutoShow($total);
|
|
|
|
+
|
|
|
|
+ \Log::warning('⚠️ 用户流量异常封禁 | ID: '.$user->id.' | 邮箱: '.$user->email.' | 1小时内已用流量: '.$usedStr.',阈值: '.$banValueStr.'(已超限)');
|
|
|
|
|
|
$user->update([
|
|
$user->update([
|
|
'enable' => 0,
|
|
'enable' => 0,
|
|
'ban_time' => strtotime("+$trafficBanTime minutes")
|
|
'ban_time' => strtotime("+$trafficBanTime minutes")
|
|
]);
|
|
]);
|
|
-
|
|
|
|
$user->refresh();
|
|
$user->refresh();
|
|
- \Log::info('流量异常用户封禁完成', [
|
|
|
|
- 'user_id' => $user->id,
|
|
|
|
- 'after_enable' => $user->enable,
|
|
|
|
- 'after_ban_time' => $user->ban_time,
|
|
|
|
- 'ban_minutes' => $trafficBanTime
|
|
|
|
- ]);
|
|
|
|
- $total = $user->usedTraffic();
|
|
|
|
- $banValue = $trafficBanValue;
|
|
|
|
- $banValueStr = flowAutoShow($banValue);
|
|
|
|
- $usedStr = flowAutoShow($total);
|
|
|
|
- \Log::warning("⚠️ 用户流量异常封禁 | ID: {$user->id} | 邮箱: {$user->email} | 1小时内已用流量: {$usedStr},阈值: {$banValueStr}(已超限)");
|
|
|
|
|
|
+
|
|
Helpers::addUserBanLog($user->id, $trafficBanTime, '【临时封禁代理】-1小时内流量异常');
|
|
Helpers::addUserBanLog($user->id, $trafficBanTime, '【临时封禁代理】-1小时内流量异常');
|
|
} catch (\Exception $e) {
|
|
} catch (\Exception $e) {
|
|
\Log::error('封禁流量异常用户失败', [
|
|
\Log::error('封禁流量异常用户失败', [
|