Browse Source

merge GeekQu_Repo

GeekQu 5 years ago
parent
commit
f2a8403c63
100 changed files with 13171 additions and 2725 deletions
  1. 1 0
      app/container.php
  2. 1 0
      app/middleware.php
  3. 1 0
      app/predefine.php
  4. 314 249
      app/routes.php
  5. 3 1
      composer.json
  6. 366 163
      config/.config.example.php
  7. 402 0
      config/appprofile.example.php
  8. 3 0
      public/index.php
  9. 3 0
      resources/clients/v2rayn-win/使用注意.txt
  10. 0 590
      resources/conf/clash.tpl
  11. 1116 0
      resources/conf/clash/default.tpl
  12. 1209 0
      resources/conf/quantumult/quantumult.tpl
  13. 1169 0
      resources/conf/surfboard/default.tpl
  14. 1185 0
      resources/conf/surge/default.tpl
  15. 1185 0
      resources/conf/surge2/default.tpl
  16. 1 1
      resources/views/material/admin/announcement/create.tpl
  17. 119 0
      resources/views/material/admin/config/edit.tpl
  18. 41 0
      resources/views/material/admin/config/telegram/index.tpl
  19. 113 0
      resources/views/material/admin/config/user/register.tpl
  20. 42 0
      resources/views/material/admin/detect/ban.tpl
  21. 8 0
      resources/views/material/admin/main.tpl
  22. 8 2
      resources/views/material/admin/node/create.tpl
  23. 8 2
      resources/views/material/admin/node/edit.tpl
  24. 41 0
      resources/views/material/admin/subscribe.tpl
  25. 198 0
      resources/views/material/admin/user/bought.tpl
  26. 41 0
      resources/views/material/admin/user/code.tpl
  27. 41 0
      resources/views/material/admin/user/detect.tpl
  28. 39 0
      resources/views/material/admin/user/edit.tpl
  29. 26 1
      resources/views/material/admin/user/index.tpl
  30. 41 0
      resources/views/material/admin/user/login.tpl
  31. 41 0
      resources/views/material/admin/user/sublog.tpl
  32. 41 0
      resources/views/material/admin/user/traffic.tpl
  33. 61 0
      resources/views/material/doc/index.tpl
  34. 4 1
      resources/views/material/indexold.tpl
  35. 1 1
      resources/views/material/staff.tpl
  36. 12 0
      resources/views/material/user/bitpayx.tpl
  37. 23 0
      resources/views/material/user/detect_index.tpl
  38. 52 26
      resources/views/material/user/edit.tpl
  39. 686 236
      resources/views/material/user/index.tpl
  40. 7 1
      resources/views/material/user/main.tpl
  41. 126 68
      resources/views/material/user/node.tpl
  42. 0 40
      resources/views/material/user/nodeinfo.tpl
  43. 41 0
      resources/views/material/user/profile.tpl
  44. 62 0
      resources/views/material/user/subscribe_log.tpl
  45. 19 0
      sql/detect_ban_log.sql
  46. 14 0
      sql/gconfig.sql
  47. 80 1
      sql/glzjin_all.sql
  48. 14 0
      sql/telegram_tasks.sql
  49. 14 0
      sql/user_subscribe_log.sql
  50. 15 6
      src/Command/DailyMail.php
  51. 0 1
      src/Command/ExtMail.php
  52. 0 1
      src/Command/FinanceMail.php
  53. 260 87
      src/Command/Job.php
  54. 232 0
      src/Command/PortAutoChange.php
  55. 0 2
      src/Command/SyncRadius.php
  56. 4 1
      src/Command/Update.php
  57. 84 54
      src/Command/XCat.php
  58. 9 6
      src/Controllers/Admin/AnnController.php
  59. 10 7
      src/Controllers/Admin/AutoController.php
  60. 12 9
      src/Controllers/Admin/CodeController.php
  61. 65 0
      src/Controllers/Admin/DetectBanLogController.php
  62. 13 9
      src/Controllers/Admin/DetectController.php
  63. 198 0
      src/Controllers/Admin/GConfigController.php
  64. 26 18
      src/Controllers/Admin/IpController.php
  65. 53 19
      src/Controllers/Admin/NodeController.php
  66. 23 19
      src/Controllers/Admin/RelayController.php
  67. 13 10
      src/Controllers/Admin/ShopController.php
  68. 65 0
      src/Controllers/Admin/SubscribeLogController.php
  69. 30 31
      src/Controllers/Admin/TicketController.php
  70. 234 174
      src/Controllers/Admin/UserController.php
  71. 174 0
      src/Controllers/Admin/UserLog/BoughtLogController.php
  72. 92 0
      src/Controllers/Admin/UserLog/CodeLogController.php
  73. 94 0
      src/Controllers/Admin/UserLog/DetectLogController.php
  74. 85 0
      src/Controllers/Admin/UserLog/LoginLogController.php
  75. 87 0
      src/Controllers/Admin/UserLog/SubLogController.php
  76. 87 0
      src/Controllers/Admin/UserLog/TrafficLogController.php
  77. 41 31
      src/Controllers/AdminController.php
  78. 69 65
      src/Controllers/AuthController.php
  79. 4 2
      src/Controllers/BaseController.php
  80. 455 0
      src/Controllers/ConfController.php
  81. 160 7
      src/Controllers/HomeController.php
  82. 805 363
      src/Controllers/LinkController.php
  83. 9 7
      src/Controllers/Mod_Mu/FuncController.php
  84. 13 4
      src/Controllers/Mod_Mu/NodeController.php
  85. 60 35
      src/Controllers/Mod_Mu/UserController.php
  86. 20 14
      src/Controllers/PasswordController.php
  87. 23 61
      src/Controllers/RelayController.php
  88. 1 1
      src/Controllers/ResController.php
  89. 231 218
      src/Controllers/UserController.php
  90. 69 57
      src/Controllers/VueController.php
  91. 25 9
      src/Middleware/Mod_Mu.php
  92. 0 1
      src/Models/Auto.php
  93. 0 1
      src/Models/BlockIp.php
  94. 56 0
      src/Models/Bought.php
  95. 0 1
      src/Models/Code.php
  96. 9 0
      src/Models/DetectBanLog.php
  97. 108 0
      src/Models/GConfig.php
  98. 24 8
      src/Models/Node.php
  99. 1 1
      src/Models/Relay.php
  100. 0 2
      src/Models/Shop.php

+ 1 - 0
app/container.php

@@ -1,4 +1,5 @@
 <?php
 <?php
+
 declare(strict_types=1);
 declare(strict_types=1);
 
 
 use Slim\Container;
 use Slim\Container;

+ 1 - 0
app/middleware.php

@@ -1,4 +1,5 @@
 <?php
 <?php
+
 declare(strict_types=1);
 declare(strict_types=1);
 
 
 use Slim\App;
 use Slim\App;

+ 1 - 0
app/predefine.php

@@ -1,4 +1,5 @@
 <?php
 <?php
+
 declare(strict_types=1);
 declare(strict_types=1);
 /**
 /**
  * To define global variable
  * To define global variable

+ 314 - 249
app/routes.php

@@ -1,337 +1,402 @@
 <?php
 <?php
+
 declare(strict_types=1);
 declare(strict_types=1);
 
 
 use Slim\App as SlimApp;
 use Slim\App as SlimApp;
-use App\Middleware\Auth;
-use App\Middleware\Guest;
-use App\Middleware\Admin;
-use App\Middleware\Mod_Mu;
+use App\Middleware\{Auth, Guest, Admin, Mod_Mu};
 
 
 return function (SlimApp $app) {
 return function (SlimApp $app) {
     // Home
     // Home
-    $app->post('/spay_back', App\Services\Payment::class . ':notify');
-    $app->get('/spay_back', App\Services\Payment::class . ':notify');
-    $app->get('/', App\Controllers\HomeController::class . ':index');
-    $app->get('/indexold', App\Controllers\HomeController::class . ':indexold');
-    $app->get('/404', App\Controllers\HomeController::class . ':page404');
-    $app->get('/405', App\Controllers\HomeController::class . ':page405');
-    $app->get('/500', App\Controllers\HomeController::class . ':page500');
-    $app->post('/notify', App\Controllers\HomeController::class . ':notify');
-    $app->get('/tos', App\Controllers\HomeController::class . ':tos');
-    $app->get('/staff', App\Controllers\HomeController::class . ':staff');
-    $app->post('/telegram_callback', App\Controllers\HomeController::class . ':telegram');
-    $app->post('/tomato_back/{type}', App\Services\Payment::class . ':notify');
-    $app->get('/tomato_back/{type}', App\Services\Payment::class . ':notify');
+    $app->get('/',          App\Controllers\HomeController::class . ':index');
+    $app->get('/404',       App\Controllers\HomeController::class . ':page404');
+    $app->get('/405',       App\Controllers\HomeController::class . ':page405');
+    $app->get('/500',       App\Controllers\HomeController::class . ':page500');
+    $app->get('/tos',       App\Controllers\HomeController::class . ':tos');
+    $app->get('/staff',     App\Controllers\HomeController::class . ':staff');
+    $app->get('/indexold',  App\Controllers\HomeController::class . ':indexold');
+
+    // other
+    $app->get('/spay_back',             App\Services\Payment::class . ':notify');
+    $app->post('/spay_back',            App\Services\Payment::class . ':notify');
+    $app->get('/tomato_back/{type}',    App\Services\Payment::class . ':notify');
+    $app->post('/tomato_back/{type}',   App\Services\Payment::class . ':notify');
+    $app->post('/notify',               App\Controllers\HomeController::class . ':notify');
+
+    // Telegram
+    $app->post('/telegram_callback',    App\Controllers\HomeController::class . ':telegram');
 
 
     // User Center
     // User Center
     $app->group('/user', function () {
     $app->group('/user', function () {
-        $this->get('', App\Controllers\UserController::class . ':index');
-        $this->get('/', App\Controllers\UserController::class . ':index');
-        $this->post('/checkin', App\Controllers\UserController::class . ':doCheckin');
-        $this->get('/node', App\Controllers\UserController::class . ':node');
-        $this->get('/tutorial', App\Controllers\UserController::class . ':tutorial');
-        $this->get('/announcement', App\Controllers\UserController::class . ':announcement');
-        $this->get('/donate', App\Controllers\UserController::class . ':donate');
-        $this->get('/lookingglass', App\Controllers\UserController::class . ':lookingglass');
-        $this->get('/node/{id}', App\Controllers\UserController::class . ':nodeInfo');
-        $this->get('/node/{id}/ajax', App\Controllers\UserController::class . ':nodeAjax');
-        $this->get('/profile', App\Controllers\UserController::class . ':profile');
-        $this->get('/invite', App\Controllers\UserController::class . ':invite');
-
-        $this->get('/detect', App\Controllers\UserController::class . ':detect_index');
-        $this->get('/detect/log', App\Controllers\UserController::class . ':detect_log');
-
-        $this->get('/disable', App\Controllers\UserController::class . ':disable');
-
-        $this->get('/shop', App\Controllers\UserController::class . ':shop');
-        $this->post('/coupon_check', App\Controllers\UserController::class . ':CouponCheck');
-        $this->post('/buy', App\Controllers\UserController::class . ':buy');
+        $this->get('',                          App\Controllers\UserController::class . ':index');
+        $this->get('/',                         App\Controllers\UserController::class . ':index');
+        $this->post('/checkin',                 App\Controllers\UserController::class . ':doCheckin');
+        $this->get('/node',                     App\Controllers\UserController::class . ':node');
+        $this->get('/tutorial',                 App\Controllers\UserController::class . ':tutorial');
+        $this->get('/announcement',             App\Controllers\UserController::class . ':announcement');
+        $this->get('/donate',                   App\Controllers\UserController::class . ':donate');
+        $this->get('/lookingglass',             App\Controllers\UserController::class . ':lookingglass');
+        $this->get('/node/{id}',                App\Controllers\UserController::class . ':nodeInfo');
+        $this->get('/node/{id}/ajax',           App\Controllers\UserController::class . ':nodeAjax');
+        $this->get('/profile',                  App\Controllers\UserController::class . ':profile');
+        $this->get('/invite',                   App\Controllers\UserController::class . ':invite');
+
+        $this->get('/detect',                   App\Controllers\UserController::class . ':detect_index');
+        $this->get('/detect/log',               App\Controllers\UserController::class . ':detect_log');
+
+        $this->get('/disable',                  App\Controllers\UserController::class . ':disable');
+
+        $this->get('/shop',                     App\Controllers\UserController::class . ':shop');
+        $this->post('/coupon_check',            App\Controllers\UserController::class . ':CouponCheck');
+        $this->post('/buy',                     App\Controllers\UserController::class . ':buy');
 
 
         // Relay Mange
         // Relay Mange
-        $this->get('/relay', App\Controllers\RelayController::class . ':index');
-        $this->get('/relay/create', App\Controllers\RelayController::class . ':create');
-        $this->post('/relay', App\Controllers\RelayController::class . ':add');
-        $this->get('/relay/{id}/edit', App\Controllers\RelayController::class . ':edit');
-        $this->put('/relay/{id}', App\Controllers\RelayController::class . ':update');
-        $this->delete('/relay', App\Controllers\RelayController::class . ':delete');
-
-        $this->get('/ticket', App\Controllers\UserController::class . ':ticket');
-        $this->get('/ticket/create', App\Controllers\UserController::class . ':ticket_create');
-        $this->post('/ticket', App\Controllers\UserController::class . ':ticket_add');
-        $this->get('/ticket/{id}/view', App\Controllers\UserController::class . ':ticket_view');
-        $this->put('/ticket/{id}', App\Controllers\UserController::class . ':ticket_update');
-
-        $this->post('/buy_invite', App\Controllers\UserController::class . ':buyInvite');
-        $this->post('/custom_invite', App\Controllers\UserController::class . ':customInvite');
-        $this->get('/edit', App\Controllers\UserController::class . ':edit');
-        $this->post('/password', App\Controllers\UserController::class . ':updatePassword');
-        $this->post('/wechat', App\Controllers\UserController::class . ':updateWechat');
-        $this->post('/ssr', App\Controllers\UserController::class . ':updateSSR');
-        $this->post('/theme', App\Controllers\UserController::class . ':updateTheme');
-        $this->post('/mail', App\Controllers\UserController::class . ':updateMail');
-        $this->post('/sspwd', App\Controllers\UserController::class . ':updateSsPwd');
-        $this->post('/method', App\Controllers\UserController::class . ':updateMethod');
-        $this->post('/hide', App\Controllers\UserController::class . ':updateHide');
-        $this->get('/sys', App\Controllers\UserController::class . ':sys');
-        $this->get('/trafficlog', App\Controllers\UserController::class . ':trafficLog');
-        $this->get('/kill', App\Controllers\UserController::class . ':kill');
-        $this->post('/kill', App\Controllers\UserController::class . ':handleKill');
-        $this->get('/logout', App\Controllers\UserController::class . ':logout');
-        $this->get('/backtoadmin', App\Controllers\UserController::class . ':backtoadmin');
-        $this->get('/code', App\Controllers\UserController::class . ':code');
-        $this->get('/alipay', App\Controllers\UserController::class . ':alipay');
-        $this->post('/code/f2fpay', App\Services\Payment::class . ':purchase');
-        $this->get('/code/codepay', App\Services\Payment::class . ':purchase');
-        $this->get('/code_check', App\Controllers\UserController::class . ':code_check');
-        $this->post('/code', App\Controllers\UserController::class . ':codepost');
-        $this->post('/gacheck', App\Controllers\UserController::class . ':GaCheck');
-        $this->post('/gaset', App\Controllers\UserController::class . ':GaSet');
-        $this->get('/gareset', App\Controllers\UserController::class . ':GaReset');
-        $this->get('/telegram_reset', App\Controllers\UserController::class . ':telegram_reset');
-        $this->post('/resetport', App\Controllers\UserController::class . ':ResetPort');
-        $this->post('/specifyport', App\Controllers\UserController::class . ':SpecifyPort');
-        $this->post('/pacset', App\Controllers\UserController::class . ':PacSet');
-        $this->post('/unblock', App\Controllers\UserController::class . ':Unblock');
-        $this->get('/bought', App\Controllers\UserController::class . ':bought');
-        $this->delete('/bought', App\Controllers\UserController::class . ':deleteBoughtGet');
-
-        $this->get('/url_reset', App\Controllers\UserController::class . ':resetURL');
-
-        $this->get('/inviteurl_reset', App\Controllers\UserController::class . ':resetInviteURL');
+        $this->get('/relay',                    App\Controllers\RelayController::class . ':index');
+        $this->get('/relay/create',             App\Controllers\RelayController::class . ':create');
+        $this->post('/relay',                   App\Controllers\RelayController::class . ':add');
+        $this->get('/relay/{id}/edit',          App\Controllers\RelayController::class . ':edit');
+        $this->put('/relay/{id}',               App\Controllers\RelayController::class . ':update');
+        $this->delete('/relay',                 App\Controllers\RelayController::class . ':delete');
+
+        $this->get('/ticket',                   App\Controllers\UserController::class . ':ticket');
+        $this->get('/ticket/create',            App\Controllers\UserController::class . ':ticket_create');
+        $this->post('/ticket',                  App\Controllers\UserController::class . ':ticket_add');
+        $this->get('/ticket/{id}/view',         App\Controllers\UserController::class . ':ticket_view');
+        $this->put('/ticket/{id}',              App\Controllers\UserController::class . ':ticket_update');
+
+        $this->post('/buy_invite',              App\Controllers\UserController::class . ':buyInvite');
+        $this->post('/custom_invite',           App\Controllers\UserController::class . ':customInvite');
+        $this->get('/edit',                     App\Controllers\UserController::class . ':edit');
+        $this->post('/password',                App\Controllers\UserController::class . ':updatePassword');
+        $this->post('/wechat',                  App\Controllers\UserController::class . ':updateWechat');
+        $this->post('/ssr',                     App\Controllers\UserController::class . ':updateSSR');
+        $this->post('/theme',                   App\Controllers\UserController::class . ':updateTheme');
+        $this->post('/mail',                    App\Controllers\UserController::class . ':updateMail');
+        $this->post('/sspwd',                   App\Controllers\UserController::class . ':updateSsPwd');
+        $this->post('/method',                  App\Controllers\UserController::class . ':updateMethod');
+        $this->post('/hide',                    App\Controllers\UserController::class . ':updateHide');
+        $this->get('/sys',                      App\Controllers\UserController::class . ':sys');
+        $this->get('/trafficlog',               App\Controllers\UserController::class . ':trafficLog');
+        $this->get('/kill',                     App\Controllers\UserController::class . ':kill');
+        $this->post('/kill',                    App\Controllers\UserController::class . ':handleKill');
+        $this->get('/logout',                   App\Controllers\UserController::class . ':logout');
+        $this->get('/backtoadmin',              App\Controllers\UserController::class . ':backtoadmin');
+        $this->get('/code',                     App\Controllers\UserController::class . ':code');
+        $this->get('/alipay',                   App\Controllers\UserController::class . ':alipay');
+
+        $this->get('/code_check',               App\Controllers\UserController::class . ':code_check');
+        $this->post('/code',                    App\Controllers\UserController::class . ':codepost');
+        $this->post('/gacheck',                 App\Controllers\UserController::class . ':GaCheck');
+        $this->post('/gaset',                   App\Controllers\UserController::class . ':GaSet');
+        $this->get('/gareset',                  App\Controllers\UserController::class . ':GaReset');
+        $this->get('/telegram_reset',           App\Controllers\UserController::class . ':telegram_reset');
+        $this->post('/resetport',               App\Controllers\UserController::class . ':ResetPort');
+        $this->post('/specifyport',             App\Controllers\UserController::class . ':SpecifyPort');
+        $this->post('/pacset',                  App\Controllers\UserController::class . ':PacSet');
+        $this->post('/unblock',                 App\Controllers\UserController::class . ':Unblock');
+        $this->get('/bought',                   App\Controllers\UserController::class . ':bought');
+        $this->delete('/bought',                App\Controllers\UserController::class . ':deleteBoughtGet');
+        $this->get('/url_reset',                App\Controllers\UserController::class . ':resetURL');
+        $this->get('/inviteurl_reset',          App\Controllers\UserController::class . ':resetInviteURL');
+
+        // 订阅记录
+        $this->get('/subscribe_log',            App\Controllers\UserController::class . ':subscribe_log');
+
+        // getUserAllURL
+        $this->get('/getUserAllURL',            App\Controllers\UserController::class . ':getUserAllURL');
+
+        // getPcClient
+        $this->get('/getPcClient',              App\Controllers\UserController::class . ':getPcClient');
+
+        $this->post('/code/f2fpay',             App\Services\Payment::class . ':purchase');
+        $this->get('/code/codepay',             App\Services\Payment::class . ':purchase');
 
 
         //Reconstructed Payment System
         //Reconstructed Payment System
-        $this->post('/payment/purchase', App\Services\Payment::class . ':purchase');
-        $this->get('/payment/return', App\Services\Payment::class . ':returnHTML');
+        $this->post('/payment/purchase',        App\Services\Payment::class . ':purchase');
+        $this->get('/payment/return',           App\Services\Payment::class . ':returnHTML');
 
 
         // Crypto Payment - BTC, ETH, EOS, BCH, LTC etch
         // Crypto Payment - BTC, ETH, EOS, BCH, LTC etch
         $this->post('/payment/bitpay/purchase', App\Services\BitPayment::class . ':purchase');
         $this->post('/payment/bitpay/purchase', App\Services\BitPayment::class . ':purchase');
-        $this->get('/payment/bitpay/return', App\Services\BitPayment::class . ':returnHTML');
-
-        // getPcClient
-        $this->get('/getPcClient', App\Controllers\UserController::class . ':getPcClient');
+        $this->get('/payment/bitpay/return',    App\Services\BitPayment::class . ':returnHTML');
     })->add(new Auth());
     })->add(new Auth());
 
 
     $app->group('/payment', function () {
     $app->group('/payment', function () {
-        $this->get('/notify', App\Services\Payment::class . ':notify');
-        $this->post('/notify', App\Services\Payment::class . ':notify');
-        $this->post('/notify/{type}', App\Services\Payment::class . ':notify');
-        $this->post('/status', App\Services\Payment::class . ':getStatus');
+        $this->get('/notify',           App\Services\Payment::class . ':notify');
+        $this->post('/notify',          App\Services\Payment::class . ':notify');
+        $this->post('/notify/{type}',   App\Services\Payment::class . ':notify');
+        $this->post('/status',          App\Services\Payment::class . ':getStatus');
 
 
-        $this->post('/bitpay/notify', App\Services\BitPayment::class . ':notify');
-        $this->post('/bitpay/status', App\Services\BitPayment::class . ':getStatus');
+        $this->post('/bitpay/notify',   App\Services\BitPayment::class . ':notify');
+        $this->post('/bitpay/status',   App\Services\BitPayment::class . ':getStatus');
     });
     });
 
 
     // Auth
     // Auth
     $app->group('/auth', function () {
     $app->group('/auth', function () {
-        $this->get('/login', App\Controllers\AuthController::class . ':login');
-        $this->post('/qrcode_check', App\Controllers\AuthController::class . ':qrcode_check');
-        $this->post('/login', App\Controllers\AuthController::class . ':loginHandle');
-        $this->post('/qrcode_login', App\Controllers\AuthController::class . ':qrcode_loginHandle');
-        $this->get('/register', App\Controllers\AuthController::class . ':register');
-        $this->post('/register', App\Controllers\AuthController::class . ':registerHandle');
-        $this->post('/send', App\Controllers\AuthController::class . ':sendVerify');
-        $this->get('/logout', App\Controllers\AuthController::class . ':logout');
-        $this->get('/telegram_oauth', App\Controllers\AuthController::class . ':telegram_oauth');
+        $this->get('/login',            App\Controllers\AuthController::class . ':login');
+        $this->post('/qrcode_check',    App\Controllers\AuthController::class . ':qrcode_check');
+        $this->post('/login',           App\Controllers\AuthController::class . ':loginHandle');
+        $this->post('/qrcode_login',    App\Controllers\AuthController::class . ':qrcode_loginHandle');
+        $this->get('/register',         App\Controllers\AuthController::class . ':register');
+        $this->post('/register',        App\Controllers\AuthController::class . ':registerHandle');
+        $this->post('/send',            App\Controllers\AuthController::class . ':sendVerify');
+        $this->get('/logout',           App\Controllers\AuthController::class . ':logout');
+        $this->get('/telegram_oauth',   App\Controllers\AuthController::class . ':telegram_oauth');
         $this->get('/login_getCaptcha', App\Controllers\AuthController::class . ':getCaptcha');
         $this->get('/login_getCaptcha', App\Controllers\AuthController::class . ':getCaptcha');
     })->add(new Guest());
     })->add(new Guest());
 
 
     // Password
     // Password
     $app->group('/password', function () {
     $app->group('/password', function () {
-        $this->get('/reset', App\Controllers\PasswordController::class . ':reset');
-        $this->post('/reset', App\Controllers\PasswordController::class . ':handleReset');
-        $this->get('/token/{token}', App\Controllers\PasswordController::class . ':token');
-        $this->post('/token/{token}', App\Controllers\PasswordController::class . ':handleToken');
+        $this->get('/reset',            App\Controllers\PasswordController::class . ':reset');
+        $this->post('/reset',           App\Controllers\PasswordController::class . ':handleReset');
+        $this->get('/token/{token}',    App\Controllers\PasswordController::class . ':token');
+        $this->post('/token/{token}',   App\Controllers\PasswordController::class . ':handleToken');
     })->add(new Guest());
     })->add(new Guest());
 
 
     // Admin
     // Admin
     $app->group('/admin', function () {
     $app->group('/admin', function () {
-        $this->get('', App\Controllers\AdminController::class . ':index');
-        $this->get('/', App\Controllers\AdminController::class . ':index');
+        $this->get('',                          App\Controllers\AdminController::class . ':index');
+        $this->get('/',                         App\Controllers\AdminController::class . ':index');
 
 
-        $this->get('/trafficlog', App\Controllers\AdminController::class . ':trafficLog');
-        $this->post('/trafficlog/ajax', App\Controllers\AdminController::class . ':ajax_trafficLog');
+        $this->get('/trafficlog',               App\Controllers\AdminController::class . ':trafficLog');
+        $this->post('/trafficlog/ajax',         App\Controllers\AdminController::class . ':ajax_trafficLog');
         // Node Mange
         // Node Mange
-        $this->get('/node', App\Controllers\Admin\NodeController::class . ':index');
+        $this->get('/node',                     App\Controllers\Admin\NodeController::class . ':index');
 
 
-        $this->get('/node/create', App\Controllers\Admin\NodeController::class . ':create');
-        $this->post('/node', App\Controllers\Admin\NodeController::class . ':add');
-        $this->get('/node/{id}/edit', App\Controllers\Admin\NodeController::class . ':edit');
-        $this->put('/node/{id}', App\Controllers\Admin\NodeController::class . ':update');
-        $this->delete('/node', App\Controllers\Admin\NodeController::class . ':delete');
-        $this->post('/node/ajax', App\Controllers\Admin\NodeController::class . ':ajax');
+        $this->get('/node/create',              App\Controllers\Admin\NodeController::class . ':create');
+        $this->post('/node',                    App\Controllers\Admin\NodeController::class . ':add');
+        $this->get('/node/{id}/edit',           App\Controllers\Admin\NodeController::class . ':edit');
+        $this->put('/node/{id}',                App\Controllers\Admin\NodeController::class . ':update');
+        $this->delete('/node',                  App\Controllers\Admin\NodeController::class . ':delete');
+        $this->post('/node/ajax',               App\Controllers\Admin\NodeController::class . ':ajax');
 
 
 
 
-        $this->get('/ticket', App\Controllers\Admin\TicketController::class . ':index');
-        $this->get('/ticket/{id}/view', App\Controllers\Admin\TicketController::class . ':show');
-        $this->put('/ticket/{id}', App\Controllers\Admin\TicketController::class . ':update');
-        $this->post('/ticket/ajax', App\Controllers\Admin\TicketController::class . ':ajax');
+        $this->get('/ticket',                   App\Controllers\Admin\TicketController::class . ':index');
+        $this->get('/ticket/{id}/view',         App\Controllers\Admin\TicketController::class . ':show');
+        $this->put('/ticket/{id}',              App\Controllers\Admin\TicketController::class . ':update');
+        $this->post('/ticket/ajax',             App\Controllers\Admin\TicketController::class . ':ajax');
 
 
         // Relay Mange
         // Relay Mange
-        $this->get('/relay', App\Controllers\Admin\RelayController::class . ':index');
-        $this->get('/relay/create', App\Controllers\Admin\RelayController::class . ':create');
-        $this->post('/relay', App\Controllers\Admin\RelayController::class . ':add');
-        $this->get('/relay/{id}/edit', App\Controllers\Admin\RelayController::class . ':edit');
-        $this->put('/relay/{id}', App\Controllers\Admin\RelayController::class . ':update');
-        $this->delete('/relay', App\Controllers\Admin\RelayController::class . ':delete');
-        $this->get('/relay/path_search/{id}', App\Controllers\Admin\RelayController::class . ':path_search');
-        $this->post('/relay/ajax', App\Controllers\Admin\RelayController::class . ':ajax_relay');
+        $this->get('/relay',                    App\Controllers\Admin\RelayController::class . ':index');
+        $this->get('/relay/create',             App\Controllers\Admin\RelayController::class . ':create');
+        $this->post('/relay',                   App\Controllers\Admin\RelayController::class . ':add');
+        $this->get('/relay/{id}/edit',          App\Controllers\Admin\RelayController::class . ':edit');
+        $this->put('/relay/{id}',               App\Controllers\Admin\RelayController::class . ':update');
+        $this->delete('/relay',                 App\Controllers\Admin\RelayController::class . ':delete');
+        $this->get('/relay/path_search/{id}',   App\Controllers\Admin\RelayController::class . ':path_search');
+        $this->post('/relay/ajax',              App\Controllers\Admin\RelayController::class . ':ajax_relay');
 
 
         // Shop Mange
         // Shop Mange
-        $this->get('/shop', App\Controllers\Admin\ShopController::class . ':index');
-        $this->post('/shop/ajax', App\Controllers\Admin\ShopController::class . ':ajax_shop');
+        $this->get('/shop',                     App\Controllers\Admin\ShopController::class . ':index');
+        $this->post('/shop/ajax',               App\Controllers\Admin\ShopController::class . ':ajax_shop');
 
 
-        $this->get('/bought', App\Controllers\Admin\ShopController::class . ':bought');
-        $this->delete('/bought', App\Controllers\Admin\ShopController::class . ':deleteBoughtGet');
-        $this->post('/bought/ajax', App\Controllers\Admin\ShopController::class . ':ajax_bought');
+        $this->get('/bought',                   App\Controllers\Admin\ShopController::class . ':bought');
+        $this->delete('/bought',                App\Controllers\Admin\ShopController::class . ':deleteBoughtGet');
+        $this->post('/bought/ajax',             App\Controllers\Admin\ShopController::class . ':ajax_bought');
 
 
-        $this->get('/shop/create', App\Controllers\Admin\ShopController::class . ':create');
-        $this->post('/shop', App\Controllers\Admin\ShopController::class . ':add');
-        $this->get('/shop/{id}/edit', App\Controllers\Admin\ShopController::class . ':edit');
-        $this->put('/shop/{id}', App\Controllers\Admin\ShopController::class . ':update');
-        $this->delete('/shop', App\Controllers\Admin\ShopController::class . ':deleteGet');
+        $this->get('/shop/create',              App\Controllers\Admin\ShopController::class . ':create');
+        $this->post('/shop',                    App\Controllers\Admin\ShopController::class . ':add');
+        $this->get('/shop/{id}/edit',           App\Controllers\Admin\ShopController::class . ':edit');
+        $this->put('/shop/{id}',                App\Controllers\Admin\ShopController::class . ':update');
+        $this->delete('/shop',                  App\Controllers\Admin\ShopController::class . ':deleteGet');
 
 
         // Ann Mange
         // Ann Mange
-        $this->get('/announcement', App\Controllers\Admin\AnnController::class . ':index');
-        $this->get('/announcement/create', App\Controllers\Admin\AnnController::class . ':create');
-        $this->post('/announcement', App\Controllers\Admin\AnnController::class . ':add');
-        $this->get('/announcement/{id}/edit', App\Controllers\Admin\AnnController::class . ':edit');
-        $this->put('/announcement/{id}', App\Controllers\Admin\AnnController::class . ':update');
-        $this->delete('/announcement', App\Controllers\Admin\AnnController::class . ':delete');
-        $this->post('/announcement/ajax', App\Controllers\Admin\AnnController::class . ':ajax');
+        $this->get('/announcement',             App\Controllers\Admin\AnnController::class . ':index');
+        $this->get('/announcement/create',      App\Controllers\Admin\AnnController::class . ':create');
+        $this->post('/announcement',            App\Controllers\Admin\AnnController::class . ':add');
+        $this->get('/announcement/{id}/edit',   App\Controllers\Admin\AnnController::class . ':edit');
+        $this->put('/announcement/{id}',        App\Controllers\Admin\AnnController::class . ':update');
+        $this->delete('/announcement',          App\Controllers\Admin\AnnController::class . ':delete');
+        $this->post('/announcement/ajax',       App\Controllers\Admin\AnnController::class . ':ajax');
 
 
         // Detect Mange
         // Detect Mange
-        $this->get('/detect', App\Controllers\Admin\DetectController::class . ':index');
-        $this->get('/detect/create', App\Controllers\Admin\DetectController::class . ':create');
-        $this->post('/detect', App\Controllers\Admin\DetectController::class . ':add');
-        $this->get('/detect/{id}/edit', App\Controllers\Admin\DetectController::class . ':edit');
-        $this->put('/detect/{id}', App\Controllers\Admin\DetectController::class . ':update');
-        $this->delete('/detect', App\Controllers\Admin\DetectController::class . ':delete');
-        $this->get('/detect/log', App\Controllers\Admin\DetectController::class . ':log');
-        $this->post('/detect/ajax', App\Controllers\Admin\DetectController::class . ':ajax_rule');
-        $this->post('/detect/log/ajax', App\Controllers\Admin\DetectController::class . ':ajax_log');
-
-        $this->get('/auto', App\Controllers\Admin\AutoController::class . ':index');
-        $this->get('/auto/create', App\Controllers\Admin\AutoController::class . ':create');
-        $this->post('/auto', App\Controllers\Admin\AutoController::class . ':add');
-        $this->delete('/auto', App\Controllers\Admin\AutoController::class . ':delete');
-        $this->post('/auto/ajax', App\Controllers\Admin\AutoController::class . ':ajax');
+        $this->get('/detect',                   App\Controllers\Admin\DetectController::class . ':index');
+        $this->get('/detect/create',            App\Controllers\Admin\DetectController::class . ':create');
+        $this->post('/detect',                  App\Controllers\Admin\DetectController::class . ':add');
+        $this->get('/detect/{id}/edit',         App\Controllers\Admin\DetectController::class . ':edit');
+        $this->put('/detect/{id}',              App\Controllers\Admin\DetectController::class . ':update');
+        $this->delete('/detect',                App\Controllers\Admin\DetectController::class . ':delete');
+        $this->get('/detect/log',               App\Controllers\Admin\DetectController::class . ':log');
+        $this->post('/detect/ajax',             App\Controllers\Admin\DetectController::class . ':ajax_rule');
+        $this->post('/detect/log/ajax',         App\Controllers\Admin\DetectController::class . ':ajax_log');
+
+        $this->get('/auto',                     App\Controllers\Admin\AutoController::class . ':index');
+        $this->get('/auto/create',              App\Controllers\Admin\AutoController::class . ':create');
+        $this->post('/auto',                    App\Controllers\Admin\AutoController::class . ':add');
+        $this->delete('/auto',                  App\Controllers\Admin\AutoController::class . ':delete');
+        $this->post('/auto/ajax',               App\Controllers\Admin\AutoController::class . ':ajax');
 
 
         // IP Mange
         // IP Mange
-        $this->get('/block', App\Controllers\Admin\IpController::class . ':block');
-        $this->get('/unblock', App\Controllers\Admin\IpController::class . ':unblock');
-        $this->post('/unblock', App\Controllers\Admin\IpController::class . ':doUnblock');
-        $this->get('/login', App\Controllers\Admin\IpController::class . ':index');
-        $this->get('/alive', App\Controllers\Admin\IpController::class . ':alive');
-        $this->post('/block/ajax', App\Controllers\Admin\IpController::class . ':ajax_block');
-        $this->post('/unblock/ajax', App\Controllers\Admin\IpController::class . ':ajax_unblock');
-        $this->post('/login/ajax', App\Controllers\Admin\IpController::class . ':ajax_login');
-        $this->post('/alive/ajax', App\Controllers\Admin\IpController::class . ':ajax_alive');
+        $this->get('/block',                    App\Controllers\Admin\IpController::class . ':block');
+        $this->get('/unblock',                  App\Controllers\Admin\IpController::class . ':unblock');
+        $this->post('/unblock',                 App\Controllers\Admin\IpController::class . ':doUnblock');
+        $this->get('/login',                    App\Controllers\Admin\IpController::class . ':index');
+        $this->get('/alive',                    App\Controllers\Admin\IpController::class . ':alive');
+        $this->post('/block/ajax',              App\Controllers\Admin\IpController::class . ':ajax_block');
+        $this->post('/unblock/ajax',            App\Controllers\Admin\IpController::class . ':ajax_unblock');
+        $this->post('/login/ajax',              App\Controllers\Admin\IpController::class . ':ajax_login');
+        $this->post('/alive/ajax',              App\Controllers\Admin\IpController::class . ':ajax_alive');
 
 
         // Code Mange
         // Code Mange
-        $this->get('/code', App\Controllers\Admin\CodeController::class . ':index');
-        $this->get('/code/create', App\Controllers\Admin\CodeController::class . ':create');
-        $this->post('/code', App\Controllers\Admin\CodeController::class . ':add');
-        $this->get('/donate/create', App\Controllers\Admin\CodeController::class . ':donate_create');
-        $this->post('/donate', App\Controllers\Admin\CodeController::class . ':donate_add');
-        $this->post('/code/ajax', App\Controllers\Admin\CodeController::class . ':ajax_code');
+        $this->get('/code',                     App\Controllers\Admin\CodeController::class . ':index');
+        $this->get('/code/create',              App\Controllers\Admin\CodeController::class . ':create');
+        $this->post('/code',                    App\Controllers\Admin\CodeController::class . ':add');
+        $this->get('/donate/create',            App\Controllers\Admin\CodeController::class . ':donate_create');
+        $this->post('/donate',                  App\Controllers\Admin\CodeController::class . ':donate_add');
+        $this->post('/code/ajax',               App\Controllers\Admin\CodeController::class . ':ajax_code');
 
 
         // User Mange
         // User Mange
-        $this->get('/user', App\Controllers\Admin\UserController::class . ':index');
-        $this->get('/user/{id}/edit', App\Controllers\Admin\UserController::class . ':edit');
-        $this->put('/user/{id}', App\Controllers\Admin\UserController::class . ':update');
-        $this->delete('/user', App\Controllers\Admin\UserController::class . ':delete');
-        $this->post('/user/changetouser', App\Controllers\Admin\UserController::class . ':changetouser');
-        $this->post('/user/ajax', App\Controllers\Admin\UserController::class . ':ajax');
-        $this->post('/user/create', App\Controllers\Admin\UserController::class . ':createNewUser');
-        $this->post('/user/buy', App\Controllers\Admin\UserController::class . ':buy');
-
-
-        $this->get('/coupon', App\Controllers\AdminController::class . ':coupon');
-        $this->post('/coupon', App\Controllers\AdminController::class . ':addCoupon');
-        $this->post('/coupon/ajax', App\Controllers\AdminController::class . ':ajax_coupon');
-
-        $this->get('/profile', App\Controllers\AdminController::class . ':profile');
-        $this->get('/invite', App\Controllers\AdminController::class . ':invite');
-        $this->post('/invite', App\Controllers\AdminController::class . ':addInvite');
-        $this->post('/chginvite', App\Controllers\AdminController::class . ':chgInvite');
-        $this->get('/sys', App\Controllers\AdminController::class . ':sys');
-        $this->get('/logout', App\Controllers\AdminController::class . ':logout');
-        $this->post('/payback/ajax', App\Controllers\AdminController::class . ':ajax_payback');
+        $this->get('/user',                     App\Controllers\Admin\UserController::class . ':index');
+        $this->get('/user/{id}/edit',           App\Controllers\Admin\UserController::class . ':edit');
+        $this->put('/user/{id}',                App\Controllers\Admin\UserController::class . ':update');
+        $this->delete('/user',                  App\Controllers\Admin\UserController::class . ':delete');
+        $this->post('/user/changetouser',       App\Controllers\Admin\UserController::class . ':changetouser');
+        $this->post('/user/ajax',               App\Controllers\Admin\UserController::class . ':ajax');
+        $this->post('/user/create',             App\Controllers\Admin\UserController::class . ':createNewUser');
+        $this->post('/user/buy',                App\Controllers\Admin\UserController::class . ':buy');
+
+
+        $this->get('/coupon',                   App\Controllers\AdminController::class . ':coupon');
+        $this->post('/coupon',                  App\Controllers\AdminController::class . ':addCoupon');
+        $this->post('/coupon/ajax',             App\Controllers\AdminController::class . ':ajax_coupon');
+
+        $this->get('/profile',                  App\Controllers\AdminController::class . ':profile');
+        $this->get('/invite',                   App\Controllers\AdminController::class . ':invite');
+        $this->post('/invite',                  App\Controllers\AdminController::class . ':addInvite');
+        $this->post('/chginvite',               App\Controllers\AdminController::class . ':chgInvite');
+        $this->get('/sys',                      App\Controllers\AdminController::class . ':sys');
+        $this->get('/logout',                   App\Controllers\AdminController::class . ':logout');
+        $this->post('/payback/ajax',            App\Controllers\AdminController::class . ':ajax_payback');
+
+        // Subscribe Log Mange
+        $this->get('/subscribe',                App\Controllers\Admin\SubscribeLogController::class . ':index');
+        $this->post('/subscribe/ajax',          App\Controllers\Admin\SubscribeLogController::class . ':ajax_subscribe_log');
+
+        // Detect Ban Mange
+        $this->get('/detect/ban',               App\Controllers\Admin\DetectBanLogController::class . ':index');
+        $this->post('/detect/ban/ajax',         App\Controllers\Admin\DetectBanLogController::class . ':ajax_log');
+
+        // 指定用户购买记录以及添加套餐
+        $this->get('/user/{id}/bought',         App\Controllers\Admin\UserLog\BoughtLogController::class . ':bought');
+        $this->post('/user/{id}/bought/ajax',   App\Controllers\Admin\UserLog\BoughtLogController::class . ':bought_ajax');
+        $this->delete('/user/bought',           App\Controllers\Admin\UserLog\BoughtLogController::class . ':bought_delete');
+        $this->post('/user/{id}/bought/buy',    App\Controllers\Admin\UserLog\BoughtLogController::class . ':bought_add');
+
+        // 指定用户充值记录
+        $this->get('/user/{id}/code',           App\Controllers\Admin\UserLog\CodeLogController::class . ':index');
+        $this->post('/user/{id}/code/ajax',     App\Controllers\Admin\UserLog\CodeLogController::class . ':ajax');
+
+        // 指定用户订阅记录
+        $this->get('/user/{id}/sublog',         App\Controllers\Admin\UserLog\SubLogController::class . ':index');
+        $this->post('/user/{id}/sublog/ajax',   App\Controllers\Admin\UserLog\SubLogController::class . ':ajax');
+
+        // 指定用户审计记录
+        $this->get('/user/{id}/detect',         App\Controllers\Admin\UserLog\DetectLogController::class . ':index');
+        $this->post('/user/{id}/detect/ajax',   App\Controllers\Admin\UserLog\DetectLogController::class . ':ajax');
+
+        // 指定用户流量记录
+        $this->get('/user/{id}/traffic',        App\Controllers\Admin\UserLog\TrafficLogController::class . ':index');
+        $this->post('/user/{id}/traffic/ajax',  App\Controllers\Admin\UserLog\TrafficLogController::class . ':ajax');
+
+        // 指定用户登录记录
+        $this->get('/user/{id}/login',          App\Controllers\Admin\UserLog\LoginLogController::class . ':index');
+        $this->post('/user/{id}/login/ajax',    App\Controllers\Admin\UserLog\LoginLogController::class . ':ajax');
+
+        // Config Mange
+        $this->group('/config', function () {
+            $this->put('/update/{key}',       App\Controllers\Admin\GConfigController::class . ':update');
+            $this->get('/update/{key}/edit',  App\Controllers\Admin\GConfigController::class . ':edit');
+
+            $this->get('/telegram',             App\Controllers\Admin\GConfigController::class . ':telegram');
+            $this->post('/telegram/ajax',       App\Controllers\Admin\GConfigController::class . ':telegram_ajax');
+
+            $this->get('/register',             App\Controllers\Admin\GConfigController::class . ':register');
+            $this->post('/register/ajax',       App\Controllers\Admin\GConfigController::class . ':register_ajax');
+        });
     })->add(new Admin());
     })->add(new Admin());
 
 
     // mu
     // mu
     $app->group('/mod_mu', function () {
     $app->group('/mod_mu', function () {
-        $this->get('/nodes/{id}/info', App\Controllers\Mod_Mu\NodeController::class . ':get_info');
-        $this->get('/users', App\Controllers\Mod_Mu\UserController::class . ':index');
-        $this->post('/users/traffic', App\Controllers\Mod_Mu\UserController::class . ':addTraffic');
-        $this->post('/users/aliveip', App\Controllers\Mod_Mu\UserController::class . ':addAliveIp');
-        $this->post('/users/detectlog', App\Controllers\Mod_Mu\UserController::class . ':addDetectLog');
-        $this->post('/nodes/{id}/info', App\Controllers\Mod_Mu\NodeController::class . ':info');
-
-        $this->get('/nodes', App\Controllers\Mod_Mu\NodeController::class . ':get_all_info');
-        $this->post('/nodes/config', App\Controllers\Mod_Mu\NodeController::class . ':getConfig');
-
-        $this->get('/func/detect_rules', App\Controllers\Mod_Mu\FuncController::class . ':get_detect_logs');
-        $this->get('/func/relay_rules', App\Controllers\Mod_Mu\FuncController::class . ':get_relay_rules');
-        $this->post('/func/block_ip', App\Controllers\Mod_Mu\FuncController::class . ':addBlockIp');
-        $this->get('/func/block_ip', App\Controllers\Mod_Mu\FuncController::class . ':get_blockip');
-        $this->get('/func/unblock_ip', App\Controllers\Mod_Mu\FuncController::class . ':get_unblockip');
-        $this->post('/func/speedtest', App\Controllers\Mod_Mu\FuncController::class . ':addSpeedtest');
-        $this->get('/func/autoexec', App\Controllers\Mod_Mu\FuncController::class . ':get_autoexec');
-        $this->post('/func/autoexec', App\Controllers\Mod_Mu\FuncController::class . ':addAutoexec');
-
-        $this->get('/func/ping', App\Controllers\Mod_Mu\FuncController::class . ':ping');
+        $this->get('/nodes/{id}/info',      App\Controllers\Mod_Mu\NodeController::class . ':get_info');
+        $this->get('/users',                App\Controllers\Mod_Mu\UserController::class . ':index');
+        $this->post('/users/traffic',       App\Controllers\Mod_Mu\UserController::class . ':addTraffic');
+        $this->post('/users/aliveip',       App\Controllers\Mod_Mu\UserController::class . ':addAliveIp');
+        $this->post('/users/detectlog',     App\Controllers\Mod_Mu\UserController::class . ':addDetectLog');
+        $this->post('/nodes/{id}/info',     App\Controllers\Mod_Mu\NodeController::class . ':info');
+
+        $this->get('/nodes',                App\Controllers\Mod_Mu\NodeController::class . ':get_all_info');
+        $this->post('/nodes/config',        App\Controllers\Mod_Mu\NodeController::class . ':getConfig');
+
+        $this->get('/func/detect_rules',    App\Controllers\Mod_Mu\FuncController::class . ':get_detect_logs');
+        $this->get('/func/relay_rules',     App\Controllers\Mod_Mu\FuncController::class . ':get_relay_rules');
+        $this->post('/func/block_ip',       App\Controllers\Mod_Mu\FuncController::class . ':addBlockIp');
+        $this->get('/func/block_ip',        App\Controllers\Mod_Mu\FuncController::class . ':get_blockip');
+        $this->get('/func/unblock_ip',      App\Controllers\Mod_Mu\FuncController::class . ':get_unblockip');
+        $this->post('/func/speedtest',      App\Controllers\Mod_Mu\FuncController::class . ':addSpeedtest');
+        $this->get('/func/autoexec',        App\Controllers\Mod_Mu\FuncController::class . ':get_autoexec');
+        $this->post('/func/autoexec',       App\Controllers\Mod_Mu\FuncController::class . ':addAutoexec');
+
+        $this->get('/func/ping',            App\Controllers\Mod_Mu\FuncController::class . ':ping');
         //============================================
         //============================================
     })->add(new Mod_Mu());
     })->add(new Mod_Mu());
 
 
     // res
     // res
     $app->group('/res', function () {
     $app->group('/res', function () {
-        $this->get('/captcha/{id}', App\Controllers\ResController::class . ':captcha');
+        $this->get('/captcha/{id}',     App\Controllers\ResController::class . ':captcha');
     });
     });
 
 
-
     $app->group('/link', function () {
     $app->group('/link', function () {
-        $this->get('/{token}', App\Controllers\LinkController::class . ':GetContent');
+        $this->get('/{token}',          App\Controllers\LinkController::class . ':GetContent');
     });
     });
 
 
     $app->group('/user', function () {
     $app->group('/user', function () {
-        $this->post('/doiam', App\Services\Payment::class . ':purchase');
+        $this->post('/doiam',           App\Services\Payment::class . ':purchase');
     })->add(new Auth());
     })->add(new Auth());
+
     $app->group('/doiam', function () {
     $app->group('/doiam', function () {
         $this->post('/callback/{type}', App\Services\Payment::class . ':notify');
         $this->post('/callback/{type}', App\Services\Payment::class . ':notify');
-        $this->get('/return/alipay', App\Services\Payment::class . ':returnHTML');
-        $this->post('/status', App\Services\Payment::class . ':getStatus');
+        $this->get('/return/alipay',    App\Services\Payment::class . ':returnHTML');
+        $this->post('/status',          App\Services\Payment::class . ':getStatus');
     });
     });
 
 
     // Vue
     // Vue
-
-    $app->get('/logout', App\Controllers\VueController::class . ':vuelogout');
-    $app->get('/globalconfig', App\Controllers\VueController::class . ':getGlobalConfig');
-    $app->get('/getuserinfo', App\Controllers\VueController::class . ':getUserInfo');
-    $app->post('/getuserinviteinfo', App\Controllers\VueController::class . ':getUserInviteInfo');
-    $app->get('/getusershops', App\Controllers\VueController::class . ':getUserShops');
-    $app->get('/getallresourse', App\Controllers\VueController::class . ':getAllResourse');
-    $app->get('/getnewsubtoken', App\Controllers\VueController::class . ':getNewSubToken');
-    $app->get('/getnewinvotecode', App\Controllers\VueController::class . ':getNewInviteCode');
-    $app->get('/gettransfer', App\Controllers\VueController::class . ':getTransfer');
-    $app->get('/getCaptcha', App\Controllers\VueController::class . ':getCaptcha');
-    $app->post('/getChargeLog', App\Controllers\VueController::class . ':getChargeLog');
-    $app->get('/getnodelist', App\Controllers\VueController::class . ':getNodeList');
-    $app->get('/nodeinfo/{id}', App\Controllers\VueController::class . ':getNodeInfo');
+    $app->get('/logout',                App\Controllers\VueController::class . ':vuelogout');
+    $app->get('/globalconfig',          App\Controllers\VueController::class . ':getGlobalConfig');
+    $app->get('/getuserinfo',           App\Controllers\VueController::class . ':getUserInfo');
+    $app->post('/getuserinviteinfo',    App\Controllers\VueController::class . ':getUserInviteInfo');
+    $app->get('/getusershops',          App\Controllers\VueController::class . ':getUserShops');
+    $app->get('/getallresourse',        App\Controllers\VueController::class . ':getAllResourse');
+    $app->get('/getnewsubtoken',        App\Controllers\VueController::class . ':getNewSubToken');
+    $app->get('/getnewinvotecode',      App\Controllers\VueController::class . ':getNewInviteCode');
+    $app->get('/gettransfer',           App\Controllers\VueController::class . ':getTransfer');
+    $app->get('/getCaptcha',            App\Controllers\VueController::class . ':getCaptcha');
+    $app->post('/getChargeLog',         App\Controllers\VueController::class . ':getChargeLog');
+    $app->get('/getnodelist',           App\Controllers\VueController::class . ':getNodeList');
+    $app->get('/nodeinfo/{id}',         App\Controllers\VueController::class . ':getNodeInfo');
 
 
     /**
     /**
      * chenPay
      * chenPay
      */
      */
     $app->group('/user', function () {
     $app->group('/user', function () {
-        $this->get('/chenPay', App\Services\Payment::class . ':purchase');
-        $this->get('/orderDelete', App\Controllers\UserController::class . ':orderDelete');
+        $this->get('/chenPay',      App\Services\Payment::class . ':purchase');
+        $this->get('/orderDelete',  App\Controllers\UserController::class . ':orderDelete');
     })->add(new Auth());
     })->add(new Auth());
     $app->group('/chenPay', function () {
     $app->group('/chenPay', function () {
-        $this->get('/status', App\Services\Payment::class . ':getStatus');
+        $this->get('/status',       App\Services\Payment::class . ':getStatus');
     });
     });
     $app->group('/admin', function () {
     $app->group('/admin', function () {
-        $this->get('/editConfig', App\Controllers\AdminController::class . ':editConfig');
-        $this->post('/saveConfig', App\Controllers\AdminController::class . ':saveConfig');
+        $this->get('/editConfig',   App\Controllers\AdminController::class . ':editConfig');
+        $this->post('/saveConfig',  App\Controllers\AdminController::class . ':saveConfig');
     })->add(new Admin());
     })->add(new Admin());
     // chenPay end
     // chenPay end
+
+    //doc
+    $app->group('/doc', function () {
+        $this->get('',      App\Controllers\HomeController::class . ':getDocCenter');
+        $this->get('/',     App\Controllers\HomeController::class . ':getDocCenter');
+    });
+    $app->get('/sublink',   App\Controllers\HomeController::class . ':getSubLink');
+    //doc end
+
+    $app->group('/getClient', function () {
+        $this->get('/{token}', App\Controllers\UserController::class . ':getClientfromToken');
+    });
 };
 };

+ 3 - 1
composer.json

@@ -21,7 +21,9 @@
         "chen-see/chen-pay": "^1.0@dev",
         "chen-see/chen-pay": "^1.0@dev",
         "league/omnipay": "^3",
         "league/omnipay": "^3",
         "lokielse/omnipay-alipay": "*",
         "lokielse/omnipay-alipay": "*",
-        "khanamiryan/qrcode-detector-decoder": "*"
+        "khanamiryan/qrcode-detector-decoder": "*",
+        "symfony/yaml": "^4.4@dev",
+        "irazasyed/telegram-bot-sdk": "^2.0"
     },
     },
     "autoload": {
     "autoload": {
         "psr-4": {
         "psr-4": {

+ 366 - 163
config/.config.example.php

@@ -15,25 +15,30 @@ $_ENV['version'] = 1;    //仅当涉及【需要修改config以外的文件】
 
 
 
 
 //基本设置--------------------------------------------------------------------------------------------
 //基本设置--------------------------------------------------------------------------------------------
-$_ENV['key']     = '1145141919810';                //!!! 瞎 jb 修改此key为随机字符串确保网站安全 !!!
-$_ENV['debug']   = false;                          //正式环境请确保为 false
-$_ENV['appName'] = 'sspanel';                      //站点名称
-$_ENV['baseUrl'] = 'http://url.com';               //站点地址
-$_ENV['subUrl']  = $_ENV['baseUrl'] . '/link/';    //订阅地址,如需和站点名称相同,请不要修改
-$_ENV['muKey']   = 'default_mu_key';               //用于校验魔改后端请求,可以随意修改,但请保持前后端一致,否则节点不能工作!
+$_ENV['key']        = '1145141919810';                //!!! 瞎 jb 修改此key为随机字符串确保网站安全 !!!
+$_ENV['debug']      = false;                          //正式环境请确保为 false
+$_ENV['appName']    = 'sspanel';                      //站点名称
+$_ENV['baseUrl']    = 'http://url.com';               //站点地址
+$_ENV['muKey']      = 'default_mu_key';               //用于校验魔改后端请求,可以随意修改,但请保持前后端一致,否则节点不能工作!
+
+// 主站是否提供 WEBAPI
+// - 如果您全部节点使用数据库连接,则保持为 false
+// - 如果您拥有独立的 Webapi 站点或 Seed 等,则保持为 false
+// - 如果您不使用数据库连接并且无独立 Webapi 站点或 Seed 等,请更改为 true
+$_ENV['Webapi']     = false;
 
 
 
 
 //数据库设置--------------------------------------------------------------------------------------------
 //数据库设置--------------------------------------------------------------------------------------------
-$_ENV['db_driver']   = 'mysql';             //数据库程序
+$_ENV['db_driver']    = 'mysql';             //数据库程序
 // 数据库网络地址(在本机上推荐用 Unix Socket, 与下面二选一, 不用则留空)
 // 数据库网络地址(在本机上推荐用 Unix Socket, 与下面二选一, 不用则留空)
 // 例: localhost(可解析主机名), 127.0.0.1(IP 地址), 127.0.0.1:4406(含端口)
 // 例: localhost(可解析主机名), 127.0.0.1(IP 地址), 127.0.0.1:4406(含端口)
-$_ENV['db_host']     = '';
+$_ENV['db_host']      = '';
 // 数据库 Unix Socket 地址(优先级高于网络地址, 与上面二选一, 不用则留空)
 // 数据库 Unix Socket 地址(优先级高于网络地址, 与上面二选一, 不用则留空)
 // 例: /var/run/mysqld/mysqld.sock(绝对地址)
 // 例: /var/run/mysqld/mysqld.sock(绝对地址)
-$_ENV['db_socket']   = '';
-$_ENV['db_database'] = 'sspanel';           //数据库名
-$_ENV['db_username'] = 'root';              //数据库用户名
-$_ENV['db_password'] = 'sspanel';           //用户名对应的密码
+$_ENV['db_socket']    = '';
+$_ENV['db_database']  = 'sspanel';           //数据库名
+$_ENV['db_username']  = 'root';              //数据库用户名
+$_ENV['db_password']  = 'sspanel';           //用户名对应的密码
 #高级
 #高级
 $_ENV['db_charset']   = 'utf8';
 $_ENV['db_charset']   = 'utf8';
 $_ENV['db_collation'] = 'utf8_general_ci';
 $_ENV['db_collation'] = 'utf8_general_ci';
@@ -65,120 +70,228 @@ $_ENV['sendgrid_name']   = '';       //发件人名称
 
 
 
 
 //备份设置--------------------------------------------------------------------------------------------
 //备份设置--------------------------------------------------------------------------------------------
-$_ENV['auto_backup_email']  = '';       //接收备份的邮箱
-$_ENV['auto_backup_passwd'] = '';       //备份的压缩密码
-$_ENV['backup_notify']      = false;    //备份通知到TG群中
+$_ENV['auto_backup_email']  = '';                               //接收备份的邮箱
+$_ENV['auto_backup_passwd'] = '';                               //备份的压缩密码
+$_ENV['backup_notify']      = false;                            //备份通知到TG群中
 
 
 
 
 //用户注册设置-----------------------------------------------------------------------------------------
 //用户注册设置-----------------------------------------------------------------------------------------
-$_ENV['register_mode'] = 'open';                //注册模式。close:关闭,open:开放,invite:仅限邀请码
+$_ENV['register_mode']             = 'open';                    //注册模式。close:关闭,open:开放,invite:仅限邀请码
 
 
-$_ENV['user_expire_in_default']    = 3650;      //用户账户过期时间,在注册时设置(天)
-$_ENV['user_class_expire_default'] = 24;        //用户等级过期时间,在注册时设置(小时)
+$_ENV['user_expire_in_default']    = 3650;                      //用户账户过期时间,在注册时设置(天)
+$_ENV['user_class_expire_default'] = 24;                        //用户等级过期时间,在注册时设置(小时)
 
 
-$_ENV['defaultTraffic']           = 1;          //用户初始流量 单位GB
-$_ENV['user_class_default']       = 0;          //用户注册等级,在注册时设置
-$_ENV['user_conn']                = 0;          //用户注册客户端数量限制,0为不限制
-$_ENV['user_speedlimit']          = 0;          //用户注册速度默认限制,0为不限制
-$_ENV['reg_auto_reset_day']       = 0;          //注册时的流量重置日,0为不重置
-$_ENV['reg_auto_reset_bandwidth'] = 0;          //需要重置的流量,0为不重置
-$_ENV['ramdom_group']             = 0;          //注册时随机分组,注册时随机分配到的分组,多个分组请用英文半角逗号分隔
+$_ENV['defaultTraffic']            = 1;                         //用户初始流量 单位GB
+$_ENV['user_class_default']        = 0;                         //用户注册等级,在注册时设置
+$_ENV['user_conn']                 = 0;                         //用户注册客户端数量限制,0为不限制
+$_ENV['user_speedlimit']           = 0;                         //用户注册速度默认限制,0为不限制
+$_ENV['reg_auto_reset_day']        = 0;                         //注册时的流量重置日,0为不重置
+$_ENV['reg_auto_reset_bandwidth']  = 0;                         //需要重置的流量,0为不重置
+$_ENV['ramdom_group']              = '0';                       //注册时随机分组,注册时随机分配到的分组,多个分组请用英文半角逗号分隔
 
 
-$_ENV['reg_method']         = 'chacha20-ietf';          //注册时默认加密方式
-$_ENV['reg_protocol']       = 'auth_aes128_sha1';       //注册时默认协议
-$_ENV['reg_protocol_param'] = '';                       //注册时默认协议参数
-$_ENV['reg_obfs']           = 'http_simple';            //注册时默认混淆方式
-$_ENV['reg_obfs_param']     = '';                       //注册时默认混淆参数 设置单端口后 这边必须配置!填写www.jd.hk就行
+$_ENV['reg_method']                = 'chacha20-ietf';           //注册时默认加密方式
+$_ENV['reg_protocol']              = 'auth_aes128_sha1';        //注册时默认协议
+$_ENV['reg_protocol_param']        = '';                        //注册时默认协议参数
+$_ENV['reg_obfs']                  = 'http_simple';             //注册时默认混淆方式
+$_ENV['reg_obfs_param']            = '';                        //注册时默认混淆参数 设置单端口后 这边必须配置!填写www.jd.hk就行
 
 
-$_ENV['reg_forbidden_ip']   = '127.0.0.0/8,::1/128';    //注册时默认禁止访问IP列表,半角英文逗号分割
-$_ENV['min_port']           = 10000;                    //用户端口池最小值
-$_ENV['max_port']           = 65535;                    //用户端口池最大值
-$_ENV['reg_forbidden_port'] = '';                       //注册时默认禁止访问端口列表,半角英文逗号分割,支持端口段
+$_ENV['reg_forbidden_ip']          = '127.0.0.0/8,::1/128';     //注册时默认禁止访问IP列表,半角英文逗号分割
+$_ENV['min_port']                  = 10000;                     //用户端口池最小值
+$_ENV['max_port']                  = 65535;                     //用户端口池最大值
+$_ENV['reg_forbidden_port']        = '';                        //注册时默认禁止访问端口列表,半角英文逗号分割,支持端口段
 
 
-$_ENV['mu_suffix'] = 'microsoft.com';           //单端口多用户混淆参数后缀,可以随意修改,但请保持前后端一致
-$_ENV['mu_regex']  = '%5m%id.%suffix';          //单端口多用户混淆参数表达式,%5m代表取用户特征 md5 的前五位,%id 代表用户id, %suffix 代表上面这个后缀。
+$_ENV['mu_suffix']                 = 'microsoft.com';           //单端口多用户混淆参数后缀,可以随意修改,但请保持前后端一致
+$_ENV['mu_regex']                  = '%5m%id.%suffix';          //单端口多用户混淆参数表达式,%5m代表取用户特征 md5 的前五位,%id 代表用户id, %suffix 代表上面这个后缀。
 
 
 #邀请链接
 #邀请链接
-$_ENV['inviteNum']           = 10;          //注册后的邀请链接可用次数
-$_ENV['invite_get_money']    = 1;           //新用户通过私人邀请链接注册时,获得奖励金额(作为初始资金)
-$_ENV['invite_price']        = -1;          //用户购买邀请码所需要的价格,价格小于0时视为不开放购买
-$_ENV['custom_invite_price'] = -1;          //用户定制邀请码所需要的价格,价格小于0时视为不开放购买
+$_ENV['inviteNum']                 = 10;                        //注册后的邀请链接可用次数
+$_ENV['invite_get_money']          = 1;                         //新用户通过私人邀请链接注册时,获得奖励金额(作为初始资金)
+$_ENV['invite_price']              = -1;                        //用户购买邀请码所需要的价格,价格小于0时视为不开放购买
+$_ENV['custom_invite_price']       = -1;                        //用户定制邀请码所需要的价格,价格小于0时视为不开放购买
 
 
 #邮箱验证
 #邮箱验证
-$_ENV['enable_email_verify']  = false;       //是否启用注册邮箱验证码
-$_ENV['email_verify_ttl']     = 3600;        //邮箱验证码有效期
-$_ENV['email_verify_iplimit'] = 10;          //验证码有效期内,单IP可请求验证码次数
+$_ENV['enable_email_verify']       = false;                     //是否启用注册邮箱验证码
+$_ENV['email_verify_ttl']          = 3600;                      //邮箱验证码有效期
+$_ENV['email_verify_iplimit']      = 10;                        //验证码有效期内,单IP可请求验证码次数
 
 
 
 
 //已注册用户设置---------------------------------------------------------------------------------------
 //已注册用户设置---------------------------------------------------------------------------------------
 #基础
 #基础
-$_ENV['checkinMin'] = 1;            //用户签到最少流量 单位MB
-$_ENV['checkinMax'] = 50;           //用户签到最多流量
+$_ENV['checkinMin']                 = 1;            //用户签到最少流量 单位MB
+$_ENV['checkinMax']                 = 50;           //用户签到最多流量
 
 
-$_ENV['auto_clean_uncheck_days'] = -1;      //自动清理多少天没签到的0级用户,小于等于0时关闭
-$_ENV['auto_clean_unused_days']  = -1;      //自动清理多少天没使用的0级用户,小于等于0时关闭
-$_ENV['auto_clean_min_money']    = 1;       //余额低于多少的0级用户可以被清理
+$_ENV['auto_clean_uncheck_days']    = -1;           //自动清理多少天没签到的0级用户,小于等于0时关闭
+$_ENV['auto_clean_unused_days']     = -1;           //自动清理多少天没使用的0级用户,小于等于0时关闭
+$_ENV['auto_clean_min_money']       = 1;            //余额低于多少的0级用户可以被清理
 
 
-$_ENV['code_payback'] = 20;                 //充值返利百分比
-$_ENV['invite_gift']  = 2;                  //邀请新用户获得流量奖励,单位G
+$_ENV['code_payback']               = 20;           //充值返利百分比
+$_ENV['invite_gift']                = 2;            //邀请新用户获得流量奖励,单位G
 
 
-$_ENV['enable_bought_reset']  = true;       //购买时是否重置流量
-$_ENV['enable_bought_extend'] = true;       //购买时是否延长等级期限(同等级配套)
+$_ENV['enable_bought_reset']        = true;         //购买时是否重置流量
+$_ENV['enable_bought_extend']       = true;         //购买时是否延长等级期限(同等级配套)
 
 
-$_ENV['port_price']         = -1;           //用户随机重置端口所需要的价格,价格小于0时视为不开放购买
-$_ENV['port_price_specify'] = -1;           //用户指明钦定端口所需要的价格,价格小于0时视为不开放购买
+$_ENV['port_price']                 = -1;           //用户随机重置端口所需要的价格,价格小于0时视为不开放购买
+$_ENV['port_price_specify']         = -1;           //用户指明钦定端口所需要的价格,价格小于0时视为不开放购买
 
 
 #高级
 #高级
-$_ENV['class_expire_reset_traffic'] = 0;    //等级到期时重置为的流量值,单位GB,小于0时不重置
-$_ENV['account_expire_delete_days'] = -1;   //账户到期几天之后会删除账户,小于0时不删除
+$_ENV['class_expire_reset_traffic'] = 0;            //等级到期时重置为的流量值,单位GB,小于0时不重置
+$_ENV['account_expire_delete_days'] = -1;           //账户到期几天之后会删除账户,小于0时不删除
 
 
-$_ENV['enable_kill'] = true;                //是否允许用户注销账户
+$_ENV['enable_kill']                = true;         //是否允许用户注销账户
 
 
 #用户流量余量不足邮件提醒
 #用户流量余量不足邮件提醒
-$_ENV['notify_limit_mode']  = true;         //false为关闭,per为按照百分比提醒,mb为按照固定剩余流量提醒
-$_ENV['notify_limit_value'] = 20;           //当上一项为per时,此处填写百分比;当上一项为mb时,此处填写流量
+$_ENV['notify_limit_mode']          = true;         //false为关闭,per为按照百分比提醒,mb为按照固定剩余流量提醒
+$_ENV['notify_limit_value']         = 20;           //当上一项为per时,此处填写百分比;当上一项为mb时,此处填写流量
 
 
 
 
 //订阅设置---------------------------------------------------------------------------------------
 //订阅设置---------------------------------------------------------------------------------------
-$_ENV['mergeSub'] = true;                //合并订阅设置 可选项 false / true
-
-$_ENV['subscribe_client'] = true;        //下载协议客户端时附带节点和订阅信息
+$_ENV['Subscribe']                  = true;                         //本站是否提供订阅功能
+
+$_ENV['subUrl']                     = $_ENV['baseUrl'] . '/link/';  //订阅地址,如需和站点名称相同,请不要修改
+$_ENV['mergeSub']                   = true;                         //合并订阅设置 可选项 false / true
+$_ENV['add_emoji_to_node_name']     = false;                        //为部分订阅中默认添加 emoji
+$_ENV['enable_sub_extend']          = true;                         // 是否开启订阅中默认显示流量剩余以及账户到期时间以及 sub_message 中的信息
+
+// 订阅中的营销信息
+// 使用数组形式,将会添加在订阅列表的顶端
+// 可用于为用户推送最新地址等信息,尽可能简短且数量不宜太多
+$_ENV['sub_message']                = [];
+
+$_ENV['disable_sub_mu_port']        = false;                        // 将订阅中单端口的信息去除
+
+$_ENV['subscribeLog']               = false;			            //是否记录用户订阅日志
+$_ENV['subscribeLog_show']          = true;                         //是否允许用户查看订阅记录
+$_ENV['subscribeLog_keep_days']     = 7;		                    //订阅记录保留天数
+
+$_ENV['mu_port_migration']          = false;                        //为后端直接下发偏移后的端口
+$_ENV['add_emoji_to_node_name']     = false;                        //为部分订阅中默认添加 emoji
+$_ENV['add_appName_to_ss_uri']      = true;                         //为 SS 节点名称中添加站点名
+
+$_ENV['subscribe_client']           = true;                         //下载协议客户端时附带节点和订阅信息
+$_ENV['subscribe_client_url']       = '';                           //使用独立的服务器提供附带节点和订阅信息的协议客户端下载,为空表示不使用
+
+$_ENV['Clash_DefaultProfiles']      = 'default';                    //Clash 默认配置方案
+$_ENV['Surge_DefaultProfiles']      = 'default';                    //Surge 默认配置方案
+$_ENV['Surge2_DefaultProfiles']     = 'default';                    //Surge2 默认配置方案
+$_ENV['Surfboard_DefaultProfiles']  = 'default';                    //Surfboard 默认配置方案
+
+
+//审计自动封禁设置--------------------------------------------------------------------------------------------
+$_ENV['enable_auto_detect_ban']      = false;       // 审计自动封禁开关
+$_ENV['auto_detect_ban_numProcess']  = 300;         // 单次计划任务中审计记录的处理数量
+$_ENV['auto_detect_ban_allow_admin'] = true;        // 管理员不受审计限制
+$_ENV['auto_detect_ban_allow_users'] = [];          // 审计封禁的例外用户 ID
+
+// 审计封禁判断类型:
+//   - 1 = 仁慈模式,每触碰多少次封禁一次
+//   - 2 = 疯狂模式,累计触碰次数按阶梯进行不同时长的封禁
+$_ENV['auto_detect_ban_type']        = 1;
+
+$_ENV['auto_detect_ban_number']      = 30;             // 仁慈模式每次执行封禁所需的触发次数
+$_ENV['auto_detect_ban_time']        = 60;             // 仁慈模式每次封禁的时长 (分钟)
+
+// 疯狂模式阶梯
+// key 为触发次数
+//   - type:可选 time 按时间 或 kill 删号
+//   - time:时间,单位分钟
+$_ENV['auto_detect_ban'] = [
+    100 => [
+        'type' => 'time',
+        'time' => 120
+    ],
+    300 => [
+        'type' => 'time',
+        'time' => 720
+    ],
+    600 => [
+        'type' => 'time',
+        'time' => 4320
+    ],
+    1000 => [
+        'type' => 'kill',
+        'time' => 0
+    ]
+];
 
 
 
 
 //Bot 设置--------------------------------------------------------------------------------------------
 //Bot 设置--------------------------------------------------------------------------------------------
-#通用
-$_ENV['finance_public']         = true;     //财务报告是否向群公开
-$_ENV['enable_welcome_message'] = true;     //机器人发送欢迎消息
-
-#Telegram
-$_ENV['enable_telegram']        = false;        //是否开启Telegram bot
-$_ENV['telegram_token']         = '';           //Telegram bot,bot 的 token ,跟 father bot 申请
-$_ENV['telegram_chatid']        = '';           //Telegram bot,群组会话 ID,把机器人拉进群里之后跟他 /ping 一下即可得到
-$_ENV['telegram_bot']           = '_bot';       //Telegram 机器人账号
-$_ENV['telegram_group_quiet']   = false;        //Telegram 机器人在群组中不回应
-$_ENV['telegram_request_token'] = '';           //Telegram 机器人请求Key,随意设置,由大小写英文和数字组成,更新这个参数之后请 php xcat setTelegram
-
-$_ENV['enable_tuling']    = false;              //是否开启图灵机器人
-$_ENV['tuling_apikey']    = '';                 //图灵机器人API Key
-$_ENV['tuling_apisecert'] = '';                 //图灵机器人密钥
+# Telegram BOT
+$_ENV['enable_telegram']                    = false;        //是否开启Telegram bot
+
+$_ENV['use_new_telegram_bot']               = true;         //是否使用新的 Telegram Bot
+$_ENV['telegram_token']                     = '';           //Telegram bot,bot 的 token ,跟 father bot 申请
+$_ENV['telegram_chatid']                    = '';           //Telegram bot,群组会话 ID,把机器人拉进群里之后跟他 /ping 一下即可得到
+$_ENV['telegram_bot']                       = '_bot';       //Telegram 机器人账号
+$_ENV['telegram_group_quiet']               = false;        //Telegram 机器人在群组中不回应
+$_ENV['telegram_request_token']             = '';           //Telegram 机器人请求Key,随意设置,由大小写英文和数字组成,更新这个参数之后请 php xcat setTelegram
+
+# 通用
+$_ENV['finance_public']                     = true;         //财务报告是否向群公开
+$_ENV['enable_welcome_message']             = true;         //机器人发送欢迎消息
+
+# 图灵
+$_ENV['enable_tuling']                      = false;         //是否开启图灵机器人
+$_ENV['tuling_apikey']                      = '';            //图灵机器人API Key
+$_ENV['tuling_apisecert']                   = '';            //图灵机器人密钥
+
+# Telegram BOT 其他选项
+$_ENV['allow_to_join_new_groups']           = true;         //允许 Bot 加入下方配置之外的群组
+$_ENV['group_id_allowed_to_join']           = [];           //允许加入的群组 ID,格式为 PHP 数组
+$_ENV['telegram_admins']                    = [];           //额外的 Telegram 管理员 ID,格式为 PHP 数组
+$_ENV['enable_not_admin_reply']             = true;         //非管理员操作管理员功能是否回复
+$_ENV['not_admin_reply_msg']                = '!';          //非管理员操作管理员功能的回复内容
+$_ENV['no_user_found']                      = '!';          //管理员操作时,找不到用户的回复
+$_ENV['no_search_value_provided']           = '!';          //管理员操作时,没有提供用户搜索值的回复
+$_ENV['data_method_not_found']              = '!';          //管理员操作时,修改数据的字段没有找到的回复
+$_ENV['delete_message_time']                = 180;          //在以下时间后删除用户命令触发的 bot 回复,单位:秒,删除时间可能会因为定时任务而有差异,为 0 代表不开启此功能
+$_ENV['delete_admin_message_time']          = 86400;        //在以下时间后删除管理命令触发的 bot 回复,单位:秒,删除时间可能会因为定时任务而有差异,为 0 代表不开启此功能
+$_ENV['enable_delete_user_cmd']             = false;        //自动删除群组中用户发送的命令,使用 delete_message_time 配置的时间,删除时间可能会因为定时任务而有差异
+$_ENV['help_any_command']                   = false;        //允许任意未知的命令触发 /help 的回复
+
+$_ENV['remark_user_search_email']           = ['邮箱'];                     //用户搜索字段 email 的别名,可多个,格式为 PHP 数组
+$_ENV['remark_user_search_port']            = ['端口'];                     //用户搜索字段 port 的别名,可多个,格式为 PHP 数组
+
+$_ENV['remark_user_option_is_admin']        = ['管理员'];                   //用户搜索字段 is_admin 的别名,可多个,格式为 PHP 数组
+$_ENV['remark_user_option_enable']          = ['用户启用'];                  //用户搜索字段 enable 的别名,可多个,格式为 PHP 数组
+$_ENV['remark_user_option_money']           = ['金钱', '余额'];             //用户搜索字段 money 的别名,可多个,格式为 PHP 数组
+$_ENV['remark_user_option_port']            = ['端口'];                     //用户搜索字段 port 的别名,可多个,格式为 PHP 数组
+$_ENV['remark_user_option_transfer_enable'] = ['流量'];                     //用户搜索字段 transfer_enable 的别名,可多个,格式为 PHP 数组
+$_ENV['remark_user_option_passwd']          = ['连接密码'];                 //用户搜索字段 passwd 的别名,可多个,格式为 PHP 数组
+$_ENV['remark_user_option_method']          = ['加密'];                     //用户搜索字段 method 的别名,可多个,格式为 PHP 数组
+$_ENV['remark_user_option_protocol']        = ['协议'];                     //用户搜索字段 protocol 的别名,可多个,格式为 PHP 数组
+$_ENV['remark_user_option_protocol_param']  = ['协参', '协议参数'];         //用户搜索字段 protocol_param 的别名,可多个,格式为 PHP 数组
+$_ENV['remark_user_option_obfs']            = ['混淆'];                     //用户搜索字段 obfs 的别名,可多个,格式为 PHP 数组
+$_ENV['remark_user_option_obfs_param']      = ['混参', '混淆参数'];         //用户搜索字段 obfs_param 的别名,可多个,格式为 PHP 数组
+$_ENV['remark_user_option_invite_num']      = ['邀请数量'];                 //用户搜索字段 invite_num 的别名,可多个,格式为 PHP 数组
+$_ENV['remark_user_option_node_group']      = ['用户组', '用户分组'];       //用户搜索字段 node_group 的别名,可多个,格式为 PHP 数组
+$_ENV['remark_user_option_class']           = ['等级'];                     //用户搜索字段 class 的别名,可多个,格式为 PHP 数组
+$_ENV['remark_user_option_class_expire']    = ['等级过期时间'];             //用户搜索字段 class_expire 的别名,可多个,格式为 PHP 数组
+$_ENV['remark_user_option_expire_in']       = ['账号过期时间'];             //用户搜索字段 expire_in 的别名,可多个,格式为 PHP 数组
+$_ENV['remark_user_option_node_speedlimit'] = ['限速'];                    //用户搜索字段 node_speedlimit 的别名,可多个,格式为 PHP 数组
+$_ENV['remark_user_option_node_connector']  = ['连接数', '客户端'];         //用户搜索字段 node_connector 的别名,可多个,格式为 PHP 数组
+
+$_ENV['enable_user_email_group_show']       = false;                      //开启在群组搜寻用户信息时显示用户完整邮箱,关闭则会对邮箱中间内容打码,如 g****@gmail.com
+$_ENV['user_not_bind_reply']                = '您未绑定本站账号,您可以进入网站的 **资料编辑**,在右下方绑定您的账号.';                      //未绑定账户的回复
+$_ENV['telegram_general_pricing']           = '产品介绍.';                  //面向游客的产品介绍
+$_ENV['telegram_general_terms']             = '服务条款.';                  //面向游客的服务条款
 
 
 
 
 //沟通设置--------------------------------------------------------------------------------------------
 //沟通设置--------------------------------------------------------------------------------------------
 #客服系统设置,注册地址 https://www.mylivechat.com
 #客服系统设置,注册地址 https://www.mylivechat.com
-$_ENV['enable_mylivechat'] = false;   //是否开启客服系统
-$_ENV['mylivechat_id']     = '';      //客服系统ID
+$_ENV['enable_mylivechat']    = false;   //是否开启客服系统
+$_ENV['mylivechat_id']        = '';      //客服系统ID
 
 
 # PushBear  基于微信模板的向关注了二维码的用户以微信方式推送消息 https://pushbear.ftqq.com/,目前仅用户推送新公告
 # PushBear  基于微信模板的向关注了二维码的用户以微信方式推送消息 https://pushbear.ftqq.com/,目前仅用户推送新公告
-$_ENV['usePushBear']      = false;
-$_ENV['PushBear_sendkey'] = '';       //请填写您在PushBear获取的sendkey,请仔细检查勿粘贴错
+$_ENV['usePushBear']          = false;
+$_ENV['PushBear_sendkey']     = '';       //请填写您在PushBear获取的sendkey,请仔细检查勿粘贴错
 
 
 #工单系统设置
 #工单系统设置
-$_ENV['enable_ticket'] = true;        //是否开启工单系统
-$_ENV['mail_ticket']   = true;        //是否开启工单邮件提醒
+$_ENV['enable_ticket']        = true;        //是否开启工单系统
+$_ENV['mail_ticket']          = true;        //是否开启工单邮件提醒
 
 
 # Server酱  用户提交新工单或者回复工单时用微信提醒机场主 http://sc.ftqq.com/
 # Server酱  用户提交新工单或者回复工单时用微信提醒机场主 http://sc.ftqq.com/
-$_ENV['useScFtqq']    = false;        //是否开启工单Server酱提醒
-$_ENV['ScFtqq_SCKEY'] = '';           //请填写您在Server酱获取的SCKEY  请仔细检查勿粘贴错
+$_ENV['useScFtqq']            = false;        //是否开启工单Server酱提醒
+$_ENV['ScFtqq_SCKEY']         = '';           //请填写您在Server酱获取的SCKEY  请仔细检查勿粘贴错
 
 
 #管理员联系方式设置
 #管理员联系方式设置
 $_ENV['enable_admin_contact'] = false;                  //是否开启管理员联系方式
 $_ENV['enable_admin_contact'] = false;                  //是否开启管理员联系方式
@@ -188,13 +301,13 @@ $_ENV['admin_contact3']       = '微信~123456';         //没有格式要求
 
 
 
 
 //验证码设置------------------------------------------------------------------------------------------
 //验证码设置------------------------------------------------------------------------------------------
-$_ENV['captcha_provider'] = 'recaptcha';        //取值 recaptcha | geetest(极验)
+$_ENV['captcha_provider']       = 'recaptcha';        //取值 recaptcha | geetest(极验)
 
 
-$_ENV['recaptcha_sitekey'] = '';
-$_ENV['recaptcha_secret']  = '';
+$_ENV['recaptcha_sitekey']      = '';
+$_ENV['recaptcha_secret']       = '';
 
 
-$_ENV['geetest_id']  = '';
-$_ENV['geetest_key'] = '';
+$_ENV['geetest_id']             = '';
+$_ENV['geetest_key']            = '';
 
 
 $_ENV['enable_reg_captcha']     = false;        //启用注册验证码
 $_ENV['enable_reg_captcha']     = false;        //启用注册验证码
 $_ENV['enable_login_captcha']   = false;        //启用登录验证码
 $_ENV['enable_login_captcha']   = false;        //启用登录验证码
@@ -203,16 +316,16 @@ $_ENV['enable_checkin_captcha'] = false;        //启用签到验证码
 
 
 //支付系统设置----------------------------------------------------------------------------------------
 //支付系统设置----------------------------------------------------------------------------------------
 #取值 none | codepay | f2fpay | chenAlipay | paymentwall | spay |tomatopay | payjs | yftpay
 #取值 none | codepay | f2fpay | chenAlipay | paymentwall | spay |tomatopay | payjs | yftpay
-$_ENV['payment_system'] = 'none';
+$_ENV['payment_system']       = 'none';
 
 
 #yft支付设置
 #yft支付设置
-$_ENV['yft_secret']    = '';
-$_ENV['yft_accesskey'] = '';
+$_ENV['yft_secret']           = '';
+$_ENV['yft_accesskey']        = '';
 
 
 #codepay码支付
 #codepay码支付
 #wiki地址:https://goo.gl/dRwRDi  http://t.cn/RnsWjtB
 #wiki地址:https://goo.gl/dRwRDi  http://t.cn/RnsWjtB
-$_ENV['codepay_id']  = '';          //码支付ID
-$_ENV['codepay_key'] = '';          //码支付通信密钥
+$_ENV['codepay_id']           = '';          //码支付ID
+$_ENV['codepay_key']          = '';          //码支付通信密钥
 
 
 #alipay,f2fpay
 #alipay,f2fpay
 $_ENV['f2fpay_app_id']        = '';
 $_ENV['f2fpay_app_id']        = '';
@@ -222,71 +335,158 @@ $_ENV['merchant_private_key'] = '';
 $_ENV['f2fNotifyUrl']         = null;           //自定义当面付回调地址
 $_ENV['f2fNotifyUrl']         = null;           //自定义当面付回调地址
 
 
 #PaymentWall
 #PaymentWall
-$_ENV['pmw_publickey']  = '';
-$_ENV['pmw_privatekey'] = '';
-$_ENV['pmw_widget']     = 'm2_1';
-$_ENV['pmw_height']     = '350px';
+$_ENV['pmw_publickey']        = '';
+$_ENV['pmw_privatekey']       = '';
+$_ENV['pmw_widget']           = 'm2_1';
+$_ENV['pmw_height']           = '350px';
 
 
 #alipay,spay
 #alipay,spay
-$_ENV['alipay_id']  = '';
-$_ENV['alipay_key'] = '';
-$_ENV['amount']     = [2, 23, 233, 2333, 23333];        //充值金额选项设定
+$_ENV['alipay_id']            = '';
+$_ENV['alipay_key']           = '';
+$_ENV['amount']               = [2, 23, 233, 2333, 23333];        //充值金额选项设定
 
 
 #alipay,zfbjk.com
 #alipay,zfbjk.com
-$_ENV['zfbjk_pid']       = '';
-$_ENV['zfbjk_key']       = '';
-$_ENV['zfbjk_qrcodeurl'] = '';
+$_ENV['zfbjk_pid']            = '';
+$_ENV['zfbjk_key']            = '';
+$_ENV['zfbjk_qrcodeurl']      = '';
 
 
 # BitPay 数字货币支付(USDT、比特币、以太坊、EOS等) 商户后台获取授权码 https://merchants.mugglepay.com/
 # BitPay 数字货币支付(USDT、比特币、以太坊、EOS等) 商户后台获取授权码 https://merchants.mugglepay.com/
 #   注册即可使用USDT收款,无需任何费用
 #   注册即可使用USDT收款,无需任何费用
 #   客服和技术 24x7 在线支持: https://t.me/joinchat/GLKSKhUnE4GvEAPgqtChAQ
 #   客服和技术 24x7 在线支持: https://t.me/joinchat/GLKSKhUnE4GvEAPgqtChAQ
-$_ENV['bitpay_secret'] = '';
+$_ENV['bitpay_secret']        = '';
 
 
 #PayJs
 #PayJs
-$_ENV['payjs_mchid'] = '';
-$_ENV['payjs_key']   = '';
+$_ENV['payjs_mchid']          = '';
+$_ENV['payjs_key']            = '';
 
 
 #tomatopay番茄云支付
 #tomatopay番茄云支付
 #使用教程:https://swapidc.fanqieui.com/?t/329.html  tg群 https://t.me/fanqiepay
 #使用教程:https://swapidc.fanqieui.com/?t/329.html  tg群 https://t.me/fanqiepay
 $_ENV['tomatopay'] = [
 $_ENV['tomatopay'] = [
     'wxpay'  => [
     'wxpay'  => [
-        'mchid'   => '',    // 商户号
-        'account' => '',    //您在番茄云支付的登录邮箱
-        'token'   => ''     // 安全验证码
+        'mchid'               => '',    // 商户号
+        'account'             => '',    //您在番茄云支付的登录邮箱
+        'token'               => ''     // 安全验证码
     ],
     ],
     'alipay' => [
     'alipay' => [
-        'mchid'   => '',    // 商户号
-        'account' => '',    //您在番茄云支付的登录邮箱
-        'token'   => ''     // 安全验证码
+        'mchid'               => '',    // 商户号
+        'account'             => '',    //您在番茄云支付的登录邮箱
+        'token'               => ''     // 安全验证码
     ],
     ],
 ];
 ];
 
 
 
 
 //其他面板显示设置------------------------------------------------------------------------------------------
 //其他面板显示设置------------------------------------------------------------------------------------------
+$_ENV['old_index_DESC']       = '<p>够了,我无法忍受你的行为,现在你将成为我们中的一员</p>';	    //旧版本首页的文字讯息
+
+#用户文档
+$_ENV['use_this_doc']         = false;	    //使用此文档
+$_ENV['enable_documents']     = false;	    //是否允许未登陆用户查看文档中心
+$_ENV['documents_name']       = $_ENV['appName'] . ' 文档中心';	    //文档中心名称
+$_ENV['remote_documents']     = true;	    //是否从远程加载文档中心,否的话请执行 php xcat initdocuments
+$_ENV['documents_source']     = 'https://raw.githubusercontent.com/GeekQu/PANEL_DOC/master/SSPanel';	    //远程文档加载地址
+
 #后台商品列表 销量统计
 #后台商品列表 销量统计
-$_ENV['sales_period'] = 30;             //统计指定周期内的销量,值为【expire/任意大于0的整数】
+$_ENV['sales_period']         = 30;             //统计指定周期内的销量,值为【expire/任意大于0的整数】
 
 
 #国旗
 #国旗
-$_ENV['enable_flag'] = true;            //启用该项之前务必先仔细阅读教程
-$_ENV['flag_regex']  = '/.*?(?=\s)/';   //从站点全名中匹配【国家/地区】的正则表达式(php版)
+$_ENV['enable_flag']          = true;            //启用该项之前务必先仔细阅读教程
+$_ENV['flag_regex']           = '/.*?(?=\s)/';   //从站点全名中匹配【国家/地区】的正则表达式(php版)
 
 
 #捐赠
 #捐赠
-$_ENV['enable_donate'] = true;          //是否显示用户捐赠(所有收入将被公开)
+$_ENV['enable_donate']        = true;          //是否显示用户捐赠(所有收入将被公开)
 
 
 #iOS账户显示
 #iOS账户显示
-$_ENV['display_ios_class'] = -1;        //至少等级为多少的用户可以看见,小于0时关闭此功能
-$_ENV['display_ios_topup'] = 0;         //满足等级要求后,累计充值高于多少的用户可以看见
-$_ENV['ios_account']       = '';        //iOS账户
-$_ENV['ios_password']      = '';        //iOS密码
+$_ENV['display_ios_class']    = -1;        //至少等级为多少的用户可以看见,小于0时关闭此功能
+$_ENV['display_ios_topup']    = 0;         //满足等级要求后,累计充值高于多少的用户可以看见
+$_ENV['ios_account']          = '';        //iOS账户
+$_ENV['ios_password']         = '';        //iOS密码
+
+#用户中心首页添加其他客户端的支持,可配合 subconverter 等 Api
+$_ENV['userCenterClient']     = [
+    'iOS'     => [
+        [
+            'name'           => 'Loon',
+            'support'        => 'SS/SSR/VMess',
+            'download_urls'  => [
+                [
+                    'name' => '本站下载',
+                    'url'  => 'https://google.com',
+                ],
+                [
+                    'name' => '官方下载',
+                    'url'  => 'https://baidu.com',
+                ]
+            ],
+            'tutorial_url'   => '/doc/#/iOS/Loon',
+            'description'    => '其他说明.',
+            'subscribe_urls' => [
+                [
+                    'name' => 'SS 订阅',
+                    'type' => 'href',
+                    'url'  => '%userUrl%?sub=2',
+                ],
+                [
+                    'name' => 'SSR 订阅',
+                    'type' => 'href',
+                    'url'  => '%userUrl%?sub=1',
+                ],
+                [
+                    'name' => 'V2Ray 订阅',
+                    'type' => 'copy',
+                    'url'  => '%userUrl%?sub=3',
+                ]
+            ]
+        ]
+    ],
+    'macOS'   => [],
+    'Linux'   => [],
+    'Router'  => [],
+    'Android' => [],
+    'Windows' => [
+        [
+            'name'           => 'Netch',
+            'support'        => 'SS/SSR/VMess',
+            'download_urls'  => [
+                [
+                    'name' => '官方下载',
+                    'url'  => 'https://github.com/NetchX/Netch/releases',
+                ]
+            ],
+            'tutorial_url'   => '/doc/#/Windows/Netch',
+            'description'    => '其他说明.',
+            'subscribe_urls' => [
+                [
+                    'name' => 'SS 订阅',
+                    'type' => 'href',
+                    'url'  => '%userUrl%?sub=2',
+                ],
+                [
+                    'name' => 'SSR 订阅',
+                    'type' => 'href',
+                    'url'  => '%userUrl%?sub=1',
+                ],
+                [
+                    'name' => 'V2Ray 订阅',
+                    'type' => 'copy',
+                    'url'  => '%userUrl%?sub=3',
+                ]
+            ]
+        ]
+    ]
+];
+
+
+//新旧首页设置--------------------------------------------------------------------------------------------
+$_ENV['newIndex'] = true;	//使用新的 Node.js 开发的首页请填写 true,其他值为使用先前的首页,如您使用其他主题请保持 true
 
 
 
 
 //节点检测-----------------------------------------------------------------------------------------------
 //节点检测-----------------------------------------------------------------------------------------------
 #GFW检测,请通过crontab进行【开启/关闭】
 #GFW检测,请通过crontab进行【开启/关闭】
-$_ENV['detect_gfw_interval'] = 3600;                                                //检测间隔,单位:秒,低于推荐值会爆炸
-$_ENV['detect_gfw_port']     = 22;                                                  //所有节点服务器都打开的TCP端口,常用的为22(SSH端口)
-$_ENV['detect_gfw_url']      = 'https://cn-qz-tcping.torch.njs.app/{ip}/{port}';    //检测节点是否被gfw墙了的API的URL
-$_ENV['detect_gfw_judge']    = '$json_tcping[\'status\']=="true"';                  //判断是否被墙的依据,json_tcping为上方URL返回的json数组
-$_ENV['detect_gfw_count']    = '3';                                                 //尝试次数
+$_ENV['detect_gfw_interval']             = 3600;                                                //检测间隔,单位:秒,低于推荐值会爆炸
+$_ENV['detect_gfw_port']                 = 22;                                                  //所有节点服务器都打开的TCP端口,常用的为22(SSH端口)
+$_ENV['detect_gfw_url']                  = 'https://cn-qz-tcping.torch.njs.app/{ip}/{port}';    //检测节点是否被gfw墙了的API的URL
+$_ENV['detect_gfw_judge']                = '$json_tcping[\'status\']=="true"';                  //判断是否被墙的依据,json_tcping为上方URL返回的json数组
+$_ENV['detect_gfw_count']                = '3';                                                 //尝试次数
 
 
 #离线检测
 #离线检测
 $_ENV['enable_detect_offline']           = true;
 $_ENV['enable_detect_offline']           = true;
@@ -303,58 +503,61 @@ $_ENV['v2ray_level']    = 0;
 
 
 //以下所有均为高级设置(一般用不上,不用改---------------------------------------------------------------------
 //以下所有均为高级设置(一般用不上,不用改---------------------------------------------------------------------
 #杂项
 #杂项
-$_ENV['authDriver']    = 'cookie';            //不能更改此项
-$_ENV['pwdMethod']     = 'md5';               //密码加密 可选 md5, sha256, bcrypt, argon2i, argon2id(argon2i需要至少php7.2)
-$_ENV['salt']          = '';                  //推荐配合 md5/sha256, bcrypt/argon2i/argon2id 会忽略此项
-$_ENV['sessionDriver'] = 'cookie';            //可选: cookie,redis
-$_ENV['cacheDriver']   = 'cookie';            //可选: cookie,redis
-$_ENV['tokenDriver']   = 'db';                //可选: db,redis
+$_ENV['authDriver']             = 'cookie';            //不能更改此项
+$_ENV['pwdMethod']              = 'md5';               //密码加密 可选 md5, sha256, bcrypt, argon2i, argon2id(argon2i需要至少php7.2)
+$_ENV['salt']                   = '';                  //推荐配合 md5/sha256, bcrypt/argon2i/argon2id 会忽略此项
+$_ENV['sessionDriver']          = 'cookie';            //可选: cookie,redis
+$_ENV['cacheDriver']            = 'cookie';            //可选: cookie,redis
+$_ENV['tokenDriver']            = 'db';                //可选: db,redis
+
+$_ENV['enable_login_bind_ip']   = true;        //是否将登陆线程和IP绑定
+$_ENV['rememberMeDuration']     = 7;           //登录时记住账号时长天数
+$_ENV['Speedtest_duration']     = 6;           //显示多长时间的测速记录
 
 
-$_ENV['enable_login_bind_ip'] = true;        //是否将登陆线程和IP绑定
-$_ENV['rememberMeDuration']   = 7;           //登录时记住账号时长天数
-$_ENV['Speedtest_duration']   = 6;           //显示多长时间的测速记录
+$_ENV['login_warn']             = true;                  //异地登陆提示
+$_ENV['timeZone']               = 'PRC';                 //PRC 天朝时间  UTC 格林时间
+$_ENV['theme']                  = 'material';            //默认主题
+$_ENV['jump_delay']             = 1200;                  //跳转延时,单位ms,不建议太长
 
 
-$_ENV['login_warn'] = true;                  //异地登陆提示
-$_ENV['timeZone']   = 'PRC';                 //PRC 天朝时间  UTC 格林时间
-$_ENV['theme']      = 'material';            //默认主题
-$_ENV['jump_delay'] = 1200;                  //跳转延时,单位ms,不建议太长
+$_ENV['pacp_offset']            = -20000;              //VPN 端口偏移
+$_ENV['pacpp_offset']           = -20000;
 
 
-$_ENV['pacp_offset']  = -20000;              //VPN 端口偏移
-$_ENV['pacpp_offset'] = -20000;
+$_ENV['checkNodeIp']            = true;                 //是否webapi验证节点ip
+$_ENV['muKeyList']              = [];                   //多 key 列表
 
 
-$_ENV['muKeyList'] = [];                     //多 key 列表
+$_ENV['money_from_admin']       = false;            //是否开启管理员修改用户余额时创建充值记录
 
 
 #aws
 #aws
-$_ENV['aws_access_key_id']     = '';
-$_ENV['aws_secret_access_key'] = '';
+$_ENV['aws_access_key_id']      = '';
+$_ENV['aws_secret_access_key']  = '';
 
 
 #redis
 #redis
-$_ENV['redis_scheme']   = 'tcp';
-$_ENV['redis_host']     = '127.0.0.1';
-$_ENV['redis_port']     = 6379;
-$_ENV['redis_database'] = '';
-$_ENV['redis_password'] = '';
+$_ENV['redis_scheme']           = 'tcp';
+$_ENV['redis_host']             = '127.0.0.1';
+$_ENV['redis_port']             = 6379;
+$_ENV['redis_database']         = '';
+$_ENV['redis_password']         = '';
 
 
 #Radius设置
 #Radius设置
-$_ENV['enable_radius']      = false;            //是否开启Radius
-$_ENV['radius_db_host']     = '';               //以下4项为Radius数据库设置
-$_ENV['radius_db_database'] = '';
-$_ENV['radius_db_user']     = '';
-$_ENV['radius_db_password'] = '';
-$_ENV['radius_secret']      = '';               //Radius连接密钥
+$_ENV['enable_radius']          = false;            //是否开启Radius
+$_ENV['radius_db_host']         = '';               //以下4项为Radius数据库设置
+$_ENV['radius_db_database']     = '';
+$_ENV['radius_db_user']         = '';
+$_ENV['radius_db_password']     = '';
+$_ENV['radius_secret']          = '';               //Radius连接密钥
 
 
 #Cloudflare
 #Cloudflare
-$_ENV['cloudflare_enable'] = false;         //是否开启 Cloudflare 解析
-$_ENV['cloudflare_email']  = '';            //Cloudflare 邮箱地址
-$_ENV['cloudflare_key']    = '';            //Cloudflare API Key
-$_ENV['cloudflare_name']   = '';            //域名
+$_ENV['cloudflare_enable']      = false;         //是否开启 Cloudflare 解析
+$_ENV['cloudflare_email']       = '';            //Cloudflare 邮箱地址
+$_ENV['cloudflare_key']         = '';            //Cloudflare API Key
+$_ENV['cloudflare_name']        = '';            //域名
 
 
 #不安全中转模式,这个开启之后使用除了 auth_aes128_md5 或者 auth_aes128_sha1 以外的协议地用户也可以设置和使用中转
 #不安全中转模式,这个开启之后使用除了 auth_aes128_md5 或者 auth_aes128_sha1 以外的协议地用户也可以设置和使用中转
-$_ENV['relay_insecure_mode'] = false;       //强烈推荐不开启
+$_ENV['relay_insecure_mode']    = false;       //强烈推荐不开启
 
 
 #是否夹带统计代码,自己在 resources/views/{主题名} 下创建一个 analytics.tpl ,如果有必要就用 literal 界定符
 #是否夹带统计代码,自己在 resources/views/{主题名} 下创建一个 analytics.tpl ,如果有必要就用 literal 界定符
-$_ENV['enable_analytics_code'] = true;
-$_ENV['sspanelAnalysis']       = true;
+$_ENV['enable_analytics_code']  = true;
+$_ENV['sspanelAnalysis']        = true;
 
 
 #在套了CDN之后获取用户真实ip,如果您不知道这是什么,请不要乱动
 #在套了CDN之后获取用户真实ip,如果您不知道这是什么,请不要乱动
 $_ENV['cdn_forwarded_ip'] = array('HTTP_X_FORWARDED_FOR', 'HTTP_ALI_CDN_REAL_IP', 'X-Real-IP', 'True-Client-Ip');
 $_ENV['cdn_forwarded_ip'] = array('HTTP_X_FORWARDED_FOR', 'HTTP_ALI_CDN_REAL_IP', 'X-Real-IP', 'True-Client-Ip');

+ 402 - 0
config/appprofile.example.php

@@ -0,0 +1,402 @@
+<?php
+
+/**
+ * default 为默认配置,你可以添加其他配置,但必须保证默认配置存在
+ *
+ * Checks 填写为没有直接在规则文件中使用的并且使用了筛选规则且组内或可能无节点的策略组名
+ *  - 例如使用 regex 分类国家分组,未匹配时组内无节点,此类需要填入 Checks 中以保证配置文件无误
+ *
+ * Surge 以及 Surfboard 的 General 中,布尔值请填写为字符串
+ *
+ * Surge 以及 Surfboard 的 Proxy 中,请填写为该应用的格式
+ * Clash 的 Proxy 中,请填写为数组
+ */
+
+/**
+ * Surge 配置文件定义
+ */
+$_ENV['Surge_Profiles'] = [
+    'default' => [
+        'Checks' => [],
+        'General' => [
+            'loglevel'                    => 'notify',
+            'dns-server'                  => 'system, 117.50.10.10, 119.29.29.29, 223.6.6.6',
+            'skip-proxy'                  => '127.0.0.1, 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12, 100.64.0.0/10, 17.0.0.0/8, localhost, *.local, *.crashlytics.com',
+            'external-controller-access'  => '[email protected]:8233',
+            'allow-wifi-access'           => 'true',
+            'enhanced-mode-by-rule'       => 'false',
+            'exclude-simple-hostnames'    => 'true',
+            'show-error-page-for-reject'  => 'true',
+            'ipv6'                        => 'true',
+            'replica'                     => 'false',
+            'http-listen'                 => '0.0.0.0:8234',
+            'socks5-listen'               => '0.0.0.0:8235',
+            'wifi-access-http-port'       => 6152,
+            'wifi-access-socks5-port'     => 6153,
+            'internet-test-url'           => 'http://baidu.com',
+            'proxy-test-url'              => 'http://www.qualcomm.cn/generate_204',
+            'test-timeout'                => 3
+        ],
+        'Proxy' => [
+            '🚀直接连接 = direct'
+        ],
+        'ProxyGroup' => [
+            [
+                'name' => '🔰国外流量',
+                'type' => 'select',
+                'content' => [
+                    'regex' => '(.*)',
+                    'right-proxies' => [
+                        '🚀直接连接'
+                    ],
+                ]
+            ],
+            [
+                'name' => '⚓️其他流量',
+                'type' => 'select',
+                'content' => [
+                    'left-proxies' => [
+                        '🔰国外流量',
+                        '🚀直接连接'
+                    ]
+                ]
+            ],
+            [
+                'name' => '✈️Telegram',
+                'type' => 'select',
+                'content' => [
+                    'left-proxies' => [
+                        '🔰国外流量'
+                    ],
+                    'regex' => '(.*)',
+                ]
+            ],
+            [
+                'name' => '🎬Youtube',
+                'type' => 'select',
+                'content' => [
+                    'left-proxies' => [
+                        '🔰国外流量'
+                    ],
+                    'regex' => '(.*)',
+                ]
+            ],
+            [
+                'name' => '🎬Netflix',
+                'type' => 'select',
+                'content' => [
+                    'left-proxies' => [
+                        '🔰国外流量'
+                    ],
+                    'regex' => '(.*)',
+                ]
+            ],
+            [
+                'name' => '🎬国外媒体',
+                'type' => 'select',
+                'content' => [
+                    'left-proxies' => [
+                        '🔰国外流量'
+                    ],
+                    'regex' => '(.*)',
+                ]
+            ],
+            [
+                'name' => '🍎苹果服务',
+                'type' => 'select',
+                'content' => [
+                    'left-proxies' => [
+                        '🚀直接连接',
+                        '🔰国外流量'
+                    ]
+                ]
+            ]
+        ],
+        'Rule' => [
+            'source' => 'surge/default.tpl'
+        ]
+    ]
+];
+
+/**
+ * Surge 2.x 版本的配置文件定义
+ */
+$_ENV['Surge2_Profiles'] = [
+    'default' => [
+        'Checks' => [],
+        'General' => [
+            'loglevel'                   => 'notify',
+            'ipv6'                       => 'true',
+            'replica'                    => 'false',
+            'dns-server'                 => 'system, 119.29.29.29, 223.5.5.5',
+            'skip-proxy'                 => '127.0.0.1, 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12, 100.64.0.0/10, 17.0.0.0/8, localhost, *.local, *.crashlytics.com',
+            'bypass-system'              => 'true',
+            'allow-wifi-access'          => 'true',
+            'external-controller-access' => '[email protected]:8233'
+        ],
+        'Proxy' => [
+            '🚀直接连接 = direct'
+        ],
+        'ProxyGroup' => [
+            [
+                'name' => '🔰国外流量',
+                'type' => 'select',
+                'content' => [
+                    'regex' => '(.*)',
+                    'right-proxies' => [
+                        '🚀直接连接'
+                    ],
+                ]
+            ],
+            [
+                'name' => '⚓️其他流量',
+                'type' => 'select',
+                'content' => [
+                    'left-proxies' => [
+                        '🔰国外流量',
+                        '🚀直接连接'
+                    ]
+                ]
+            ],
+            [
+                'name' => '✈️Telegram',
+                'type' => 'select',
+                'content' => [
+                    'left-proxies' => [
+                        '🔰国外流量'
+                    ],
+                    'regex' => '(.*)',
+                ]
+            ],
+            [
+                'name' => '🎬Youtube',
+                'type' => 'select',
+                'content' => [
+                    'left-proxies' => [
+                        '🔰国外流量'
+                    ],
+                    'regex' => '(.*)',
+                ]
+            ],
+            [
+                'name' => '🎬Netflix',
+                'type' => 'select',
+                'content' => [
+                    'left-proxies' => [
+                        '🔰国外流量'
+                    ],
+                    'regex' => '(.*)',
+                ]
+            ],
+            [
+                'name' => '🎬国外媒体',
+                'type' => 'select',
+                'content' => [
+                    'left-proxies' => [
+                        '🔰国外流量'
+                    ],
+                    'regex' => '(.*)',
+                ]
+            ],
+            [
+                'name' => '🍎苹果服务',
+                'type' => 'select',
+                'content' => [
+                    'left-proxies' => [
+                        '🚀直接连接',
+                        '🔰国外流量'
+                    ]
+                ]
+            ]
+        ],
+        'Rule' => [
+            'source' => 'surge2/default.tpl'
+        ]
+    ]
+];
+
+/**
+ * Clash 配置文件定义
+ */
+$_ENV['Clash_Profiles'] = [
+    'default' => [
+        'Checks' => [],
+        'General' => [
+            'port'                => 7890,
+            'socks-port'          => 7891,
+            'redir-port'          => 7892,
+            'allow-lan'           => false,
+            'mode'                => 'Rule',
+            'log-level'           => 'silent',
+            'external-controller' => '0.0.0.0:9090',
+            'secret'              => ''
+        ],
+        'Proxy' => [],
+        'ProxyGroup' => [
+            [
+                'name' => '🔰国外流量',
+                'type' => 'select',
+                'content' => [
+                    'regex' => '(.*)',
+                    'right-proxies' => [
+                        '🚀直接连接'
+                    ],
+                ]
+            ],
+            [
+                'name' => '⚓️其他流量',
+                'type' => 'select',
+                'content' => [
+                    'left-proxies' => [
+                        '🔰国外流量',
+                        '🚀直接连接'
+                    ]
+                ]
+            ],
+            [
+                'name' => '✈️Telegram',
+                'type' => 'select',
+                'content' => [
+                    'left-proxies' => [
+                        '🔰国外流量'
+                    ],
+                    'regex' => '(.*)',
+                ]
+            ],
+            [
+                'name' => '🎬Youtube',
+                'type' => 'select',
+                'content' => [
+                    'left-proxies' => [
+                        '🔰国外流量'
+                    ],
+                    'regex' => '(.*)',
+                ]
+            ],
+            [
+                'name' => '🎬Netflix',
+                'type' => 'select',
+                'content' => [
+                    'left-proxies' => [
+                        '🔰国外流量'
+                    ],
+                    'regex' => '(.*)',
+                ]
+            ],
+            [
+                'name' => '🎬国外媒体',
+                'type' => 'select',
+                'content' => [
+                    'left-proxies' => [
+                        '🔰国外流量'
+                    ],
+                    'regex' => '(.*)',
+                ]
+            ],
+            [
+                'name' => '🍎苹果服务',
+                'type' => 'select',
+                'content' => [
+                    'left-proxies' => [
+                        '🚀直接连接',
+                        '🔰国外流量'
+                    ]
+                ]
+            ],
+            [
+                'name' => '🚀直接连接',
+                'type' => 'select',
+                'content' => [
+                    'left-proxies' => [
+                        'DIRECT'
+                    ]
+                ]
+            ]
+        ],
+        'Rule' => [
+            'source' => 'clash/default.tpl'
+        ]
+    ]
+];
+
+/**
+ * Surfboard 配置文件定义
+ */
+$_ENV['Surfboard_Profiles'] = [
+    'default' => [
+        'Checks' => [],
+        'General' => [
+            'loglevel'   => 'notify',
+            'dns-server' => 'system, 119.29.29.29, 223.5.5.5',
+            'skip-proxy' => '127.0.0.1, 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12, 100.64.0.0/10, 17.0.0.0/8, localhost, *.local, *.crashlytics.com',
+        ],
+        'Proxy' => [
+            '🚀直接连接 = direct'
+        ],
+        'ProxyGroup' => [
+            [
+                'name' => '🔰国外流量',
+                'type' => 'select',
+                'content' => [
+                    'regex' => '(.*)',
+                    'right-proxies' => [
+                        '🚀直接连接'
+                    ],
+                ]
+            ],
+            [
+                'name' => '⚓️其他流量',
+                'type' => 'select',
+                'content' => [
+                    'left-proxies' => [
+                        '🔰国外流量',
+                        '🚀直接连接'
+                    ]
+                ]
+            ],
+            [
+                'name' => '✈️Telegram',
+                'type' => 'select',
+                'content' => [
+                    'left-proxies' => [
+                        '🔰国外流量'
+                    ],
+                    'regex' => '(.*)',
+                ]
+            ],
+            [
+                'name' => '🎬Youtube',
+                'type' => 'select',
+                'content' => [
+                    'left-proxies' => [
+                        '🔰国外流量'
+                    ],
+                    'regex' => '(.*)',
+                ]
+            ],
+            [
+                'name' => '🎬Netflix',
+                'type' => 'select',
+                'content' => [
+                    'left-proxies' => [
+                        '🔰国外流量'
+                    ],
+                    'regex' => '(.*)',
+                ]
+            ],
+            [
+                'name' => '🎬国外媒体',
+                'type' => 'select',
+                'content' => [
+                    'left-proxies' => [
+                        '🔰国外流量'
+                    ],
+                    'regex' => '(.*)',
+                ]
+            ]
+        ],
+        'Rule' => [
+            'source' => 'surfboard/default.tpl'
+        ]
+    ]
+];

+ 3 - 0
public/index.php

@@ -1,4 +1,5 @@
 <?php
 <?php
+
 declare(strict_types=1);
 declare(strict_types=1);
 /**
 /**
  * SSPanel-Uim Public Entrance File
  * SSPanel-Uim Public Entrance File
@@ -9,10 +10,12 @@ declare(strict_types=1);
 
 
 require __DIR__ . '/../vendor/autoload.php';
 require __DIR__ . '/../vendor/autoload.php';
 require __DIR__ . '/../config/.config.php';
 require __DIR__ . '/../config/.config.php';
+require __DIR__ . '/../config/appprofile.php';
 require __DIR__ . '/../app/predefine.php';
 require __DIR__ . '/../app/predefine.php';
 
 
 // TODO: legacy boot function
 // TODO: legacy boot function
 use App\Services\Boot;
 use App\Services\Boot;
+
 Boot::setTime();
 Boot::setTime();
 Boot::bootDb();
 Boot::bootDb();
 
 

+ 3 - 0
resources/clients/v2rayn-win/使用注意.txt

@@ -0,0 +1,3 @@
+尊敬的用户您好:
+
+    如您在使用上遇到问题,请注意在我们的网站上查询相关的教程或联系我们。

+ 0 - 590
resources/conf/clash.tpl

@@ -1,590 +0,0 @@
-#---------------------------------------------------#
-## 最后更新时间:{date("Y-m-d h:i:s")}
-#---------------------------------------------------#
-
-# HTTP 代理端口
-port: 7890
-
-# SOCKS5 代理端口
-socks-port: 7891
-
-# Linux 和 macOS 的 redir 代理端口
-redir-port: 7892
-
-# 允许局域网的连接
-allow-lan: true
-
-# 规则模式:Rule(规则) / Global(全局代理)/ Direct(全局直连)
-mode: Rule
-
-# 设置日志输出级别 (默认级别:silent,即不输出任何内容,以避免因日志内容过大而导致程序内存溢出)。
-# 5 个级别:silent / info / warning / error / debug。级别越高日志输出量越大,越倾向于调试,若需要请自行开启。
-log-level: silent
-
-# Clash 的 RESTful API
-external-controller: '0.0.0.0:9090'
-
-# RESTful API 的口令
-secret: ''
-
-# 您可以将静态网页资源(如 clash-dashboard)放置在一个目录中,clash 将会服务于 `RESTful API/ui`
-# 参数应填写配置目录的相对路径或绝对路径。
-# external-ui: folder
-
-Proxy:
-{foreach $confs as $conf}
-    - {json_encode($conf,320)}
-{/foreach}
-
-Proxy Group:
-- { name: "Auto", type: fallback, proxies: {json_encode($proxies,320)}, url: "http://www.gstatic.com/generate_204", interval: 300 }
-{$tmp[] = "Auto"}
-{assign 'proxies' $tmp|array_merge:$proxies}
-- { name: "Proxy", type: select, proxies: {json_encode($proxies,320)} }
-- { name: "Domestic", type: select, proxies: ["DIRECT","Proxy"] }
-{$China_media=["Domestic","Proxy"]}
-- { name: "China_media", type: select, proxies: {json_encode($China_media,320)} }
-- { name: "Global_media", type: select, proxies: ["Proxy"]}
-- { name: "Others", type: select, proxies: ["Proxy","Domestic"]}
-
-Rule:
-- DOMAIN,gs.apple.com,Proxy
-- DOMAIN-SUFFIX,mzstatic.com,Domestic
-- DOMAIN-SUFFIX,akadns.net,Domestic
-- DOMAIN-SUFFIX,aaplimg.com,Domestic
-- DOMAIN-SUFFIX,cdn-apple.com,Domestic
-
-- DOMAIN,itunes.apple.com, Domestic
-- DOMAIN,beta.itunes.apple.com, Domestic
-- DOMAIN-SUFFIX,apple.com, Domestic
-- DOMAIN-SUFFIX,icloud.com,Domestic
-- DOMAIN-SUFFIX,icloud-content.com,Domestic
-- DOMAIN,e.crashlytics.com,REJECT
-
-- DOMAIN-KEYWORD,bilibili,China_media
-- DOMAIN-SUFFIX,acgvideo.com,China_media
-- DOMAIN-SUFFIX,hdslb.com,China_media
-
-- DOMAIN-KEYWORD,qiyi,China_media
-- DOMAIN-SUFFIX,qy.net,China_media
-- IP-CIDR,101.227.0.0/16,China_media
-- IP-CIDR,101.224.0.0/13,China_media
-- IP-CIDR,119.176.0.0/12,China_media
-
-- DOMAIN-SUFFIX,api.mob.app.letv.com,China_media
-
-- DOMAIN-KEYWORD,nowtv100,China_media
-- DOMAIN-KEYWORD,rthklive,China_media
-- DOMAIN-SUFFIX,mytvsuper.com,China_media
-- DOMAIN-SUFFIX,tvb.com,China_media
-
-- DOMAIN-SUFFIX,music.126.net,China_media
-- DOMAIN-SUFFIX,music.163.com,China_media
-
-- DOMAIN-SUFFIX,vv.video.qq.com,China_media
-
-- IP-CIDR,106.11.0.0/16,China_media
-
-
-- DOMAIN-SUFFIX,edgedatg.com,Global_media
-- DOMAIN-SUFFIX,go.com,Global_media
-
-- DOMAIN,linear-abematv.akamaized.net,Global_media
-- DOMAIN-SUFFIX,abema.io,Global_media
-- DOMAIN-SUFFIX,abema.tv,Global_media
-- DOMAIN-SUFFIX,akamaized.net,Global_media
-- DOMAIN-SUFFIX,ameba.jp,Global_media
-- DOMAIN-SUFFIX,hayabusa.io,Global_media
-
-- DOMAIN-SUFFIX,amazonaws.com,Global_media
-
-- DOMAIN-SUFFIX,bahamut.com.tw,Global_media
-- DOMAIN-SUFFIX,gamer.com.tw,Global_media
-- DOMAIN-SUFFIX,hinet.net,Global_media
-
-- DOMAIN-KEYWORD,bbcfmt,Global_media
-- DOMAIN-KEYWORD,co.uk,Global_media
-- DOMAIN-KEYWORD,uk-live,Global_media
-- DOMAIN-SUFFIX,bbc.co,Global_media
-- DOMAIN-SUFFIX,bbc.co.uk,Global_media
-- DOMAIN-SUFFIX,bbc.com,Global_media
-- DOMAIN-SUFFIX,bbci.co,Global_media
-- DOMAIN-SUFFIX,bbci.co.uk,Global_media
-
-- DOMAIN-SUFFIX,chocotv.com.tw,Global_media
-
-- DOMAIN-KEYWORD,epicgames,Global_media
-- DOMAIN-SUFFIX,helpshift.com,Global_media
-
-- DOMAIN-KEYWORD,foxplus,Global_media
-- DOMAIN-SUFFIX,config.fox.com,Global_media
-- DOMAIN-SUFFIX,emome.net,Global_media
-- DOMAIN-SUFFIX,fox.com,Global_media
-- DOMAIN-SUFFIX,foxdcg.com,Global_media
-- DOMAIN-SUFFIX,foxnow.com,Global_media
-- DOMAIN-SUFFIX,foxplus.com,Global_media
-- DOMAIN-SUFFIX,foxplay.com,Global_media
-- DOMAIN-SUFFIX,ipinfo.io,Global_media
-- DOMAIN-SUFFIX,mstage.io,Global_media
-- DOMAIN-SUFFIX,now.com,Global_media
-- DOMAIN-SUFFIX,theplatform.com,Global_media
-
-- DOMAIN-SUFFIX,hbo.com,Global_media
-- DOMAIN-SUFFIX,hbogo.com,Global_media
-
-- DOMAIN-SUFFIX,hbogoasia.hk,Global_media
-
-- DOMAIN-SUFFIX,happyon.jp,Global_media
-- DOMAIN-SUFFIX,hulu.com,Global_media
-- DOMAIN-SUFFIX,huluim.com,Global_media
-
-- DOMAIN-SUFFIX,imkan.tv,Global_media
-
-- DOMAIN-SUFFIX,joox.com,Global_media
-
-- DOMAIN-SUFFIX,netflix.com,Global_media
-- DOMAIN-SUFFIX,netflix.net,Global_media
-- DOMAIN-SUFFIX,nflxext.com,Global_media
-- DOMAIN-SUFFIX,nflximg.com,Global_media
-- DOMAIN-SUFFIX,nflximg.net,Global_media
-- DOMAIN-SUFFIX,nflxso.net,Global_media
-- DOMAIN-SUFFIX,nflxvideo.net,Global_media
-
-- DOMAIN-KEYWORD,spotify,Global_media
-- DOMAIN-SUFFIX,scdn.co,Global_media
-- DOMAIN-SUFFIX,spoti.fi,Global_media
-
-- DOMAIN-SUFFIX,viu.tv,Global_media
-
-- DOMAIN-KEYWORD,youtube,Global_media
-- DOMAIN-SUFFIX,googlevideo.com,Global_media
-- DOMAIN-SUFFIX,gvt2.com,Global_media
-- DOMAIN-SUFFIX,youtu.be,Global_media
-
-
-- DOMAIN-SUFFIX,cn,Domestic
-
-- DOMAIN-SUFFIX,126.com,Domestic
-- DOMAIN-SUFFIX,126.net,Domestic
-- DOMAIN-SUFFIX,127.net,Domestic
-- DOMAIN-SUFFIX,163.com,Domestic
-- DOMAIN-SUFFIX,360buyimg.com,Domestic
-- DOMAIN-SUFFIX,36kr.com,Domestic
-- DOMAIN-SUFFIX,acfun.tv,Domestic
-- DOMAIN-SUFFIX,air-matters.com,Domestic
-- DOMAIN-SUFFIX,aixifan.com,Domestic
-- DOMAIN-SUFFIX,akamaized.net,Domestic
-- DOMAIN-KEYWORD,alicdn,Domestic
-- DOMAIN-KEYWORD,alipay,Domestic
-- DOMAIN-KEYWORD,taobao,Domestic
-- DOMAIN-SUFFIX,amap.com,Domestic
-- DOMAIN-SUFFIX,autonavi.com,Domestic
-- DOMAIN-KEYWORD,baidu,Domestic
-- DOMAIN-SUFFIX,bdimg.com,Domestic
-- DOMAIN-SUFFIX,bdstatic.com,Domestic
-- DOMAIN-SUFFIX,bilibili.com,Domestic
-- DOMAIN-SUFFIX,caiyunapp.com,Domestic
-- DOMAIN-SUFFIX,clouddn.com,Domestic
-- DOMAIN-SUFFIX,cnbeta.com,Domestic
-- DOMAIN-SUFFIX,cnbetacdn.com,Domestic
-- DOMAIN-SUFFIX,cootekservice.com,Domestic
-- DOMAIN-SUFFIX,csdn.net,Domestic
-- DOMAIN-SUFFIX,ctrip.com,Domestic
-- DOMAIN-SUFFIX,dgtle.com,Domestic
-- DOMAIN-SUFFIX,dianping.com,Domestic
-- DOMAIN-SUFFIX,douban.com,Domestic
-- DOMAIN-SUFFIX,doubanio.com,Domestic
-- DOMAIN-SUFFIX,duokan.com,Domestic
-- DOMAIN-SUFFIX,easou.com,Domestic
-- DOMAIN-SUFFIX,ele.me,Domestic
-- DOMAIN-SUFFIX,feng.com,Domestic
-- DOMAIN-SUFFIX,fir.im,Domestic
-- DOMAIN-SUFFIX,frdic.com,Domestic
-- DOMAIN-SUFFIX,g-cores.com,Domestic
-- DOMAIN-SUFFIX,godic.net,Domestic
-- DOMAIN-SUFFIX,gtimg.com,Domestic
-- DOMAIN,cdn.hockeyapp.net,Domestic
-- DOMAIN-SUFFIX,hongxiu.com,Domestic
-- DOMAIN-SUFFIX,hxcdn.net,Domestic
-- DOMAIN-SUFFIX,iciba.com,Domestic
-- DOMAIN-SUFFIX,ifeng.com,Domestic
-- DOMAIN-SUFFIX,ifengimg.com,Domestic
-- DOMAIN-SUFFIX,ipip.net,Domestic
-- DOMAIN-SUFFIX,iqiyi.com,Domestic
-- DOMAIN-SUFFIX,jd.com,Domestic
-- DOMAIN-SUFFIX,jianshu.com,Domestic
-- DOMAIN-SUFFIX,knewone.com,Domestic
-- DOMAIN-SUFFIX,le.com,Domestic
-- DOMAIN-SUFFIX,lecloud.com,Domestic
-- DOMAIN-SUFFIX,lemicp.com,Domestic
-- DOMAIN-SUFFIX,luoo.net,Domestic
-- DOMAIN-SUFFIX,meituan.com,Domestic
-- DOMAIN-SUFFIX,meituan.net,Domestic
-- DOMAIN-SUFFIX,mi.com,Domestic
-- DOMAIN-SUFFIX,miaopai.com,Domestic
-- DOMAIN-SUFFIX,microsoft.com,Domestic
-- DOMAIN-SUFFIX,microsoftonline.com,Domestic
-- DOMAIN-SUFFIX,miui.com,Domestic
-- DOMAIN-SUFFIX,miwifi.com,Domestic
-- DOMAIN-SUFFIX,mob.com,Domestic
-- DOMAIN-SUFFIX,netease.com,Domestic
-- DOMAIN-KEYWORD,officecdn,Domestic
-- DOMAIN-SUFFIX,oschina.net,Domestic
-- DOMAIN-SUFFIX,ppsimg.com,Domestic
-- DOMAIN-SUFFIX,pstatp.com,Domestic
-- DOMAIN-SUFFIX,qcloud.com,Domestic
-- DOMAIN-SUFFIX,qdaily.com,Domestic
-- DOMAIN-SUFFIX,qdmm.com,Domestic
-- DOMAIN-SUFFIX,qhimg.com,Domestic
-- DOMAIN-SUFFIX,qidian.com,Domestic
-- DOMAIN-SUFFIX,qihucdn.com,Domestic
-- DOMAIN-SUFFIX,qiniu.com,Domestic
-- DOMAIN-SUFFIX,qiniucdn.com,Domestic
-- DOMAIN-SUFFIX,qiyipic.com,Domestic
-- DOMAIN-SUFFIX,qq.com,Domestic
-- DOMAIN-SUFFIX,qqurl.com,Domestic
-- DOMAIN-SUFFIX,rarbg.to,Domestic
-- DOMAIN-SUFFIX,rr.tv,Domestic
-- DOMAIN-SUFFIX,ruguoapp.com,Domestic
-- DOMAIN-SUFFIX,segmentfault.com,Domestic
-- DOMAIN-SUFFIX,sinaapp.com,Domestic
-- DOMAIN-SUFFIX,sogou.com,Domestic
-- DOMAIN-SUFFIX,sogoucdn.com,Domestic
-- DOMAIN-SUFFIX,sohu.com,Domestic
-- DOMAIN-SUFFIX,soku.com,Domestic
-- DOMAIN-SUFFIX,speedtest.net,Domestic
-- DOMAIN-SUFFIX,sspai.com,Domestic
-- DOMAIN-SUFFIX,suning.com,Domestic
-- DOMAIN-SUFFIX,taobao.com,Domestic
-- DOMAIN-SUFFIX,tenpay.com,Domestic
-- DOMAIN-SUFFIX,tmall.com,Domestic
-- DOMAIN-SUFFIX,tudou.com,Domestic
-- DOMAIN-SUFFIX,umetrip.com,Domestic
-- DOMAIN-SUFFIX,upaiyun.com,Domestic
-- DOMAIN-SUFFIX,upyun.com,Domestic
-- DOMAIN-SUFFIX,v2ex.com,Domestic
-- DOMAIN-SUFFIX,veryzhun.com,Domestic
-- DOMAIN-SUFFIX,weather.com,Domestic
-- DOMAIN-SUFFIX,weibo.com,Domestic
-- DOMAIN-SUFFIX,xiami.com,Domestic
-- DOMAIN-SUFFIX,xiami.net,Domestic
-- DOMAIN-SUFFIX,xiaomicp.com,Domestic
-- DOMAIN-SUFFIX,ximalaya.com,Domestic
-- DOMAIN-SUFFIX,xmcdn.com,Domestic
-- DOMAIN-SUFFIX,xunlei.com,Domestic
-- DOMAIN-SUFFIX,yhd.com,Domestic
-- DOMAIN-SUFFIX,yihaodianimg.com,Domestic
-- DOMAIN-SUFFIX,yinxiang.com,Domestic
-- DOMAIN-SUFFIX,ykimg.com,Domestic
-- DOMAIN-SUFFIX,youdao.com,Domestic
-- DOMAIN-SUFFIX,youku.com,Domestic
-- DOMAIN-SUFFIX,zealer.com,Domestic
-- DOMAIN-SUFFIX,zhihu.com,Domestic
-- DOMAIN-SUFFIX,zhimg.com,Domestic
-
-- DOMAIN-KEYWORD,amazon,Proxy
-- DOMAIN-KEYWORD,google,Proxy
-- DOMAIN-KEYWORD,gmail,Proxy
-- DOMAIN-KEYWORD,youtube,Proxy
-- DOMAIN-KEYWORD,facebook,Proxy
-- DOMAIN-SUFFIX,fb.me,Proxy
-- DOMAIN-SUFFIX,fbcdn.net,Proxy
-- DOMAIN-KEYWORD,twitter,Proxy
-- DOMAIN-KEYWORD,instagram,Proxy
-- DOMAIN-KEYWORD,dropbox,Proxy
-- DOMAIN-SUFFIX,twimg.com,Proxy
-- DOMAIN-KEYWORD,blogspot,Proxy
-- DOMAIN-SUFFIX,youtu.be,Proxy
-- DOMAIN-KEYWORD,whatsapp,Proxy
-
-- DOMAIN-SUFFIX,9to5mac.com,Proxy
-- DOMAIN-SUFFIX,abpchina.org,Proxy
-- DOMAIN-SUFFIX,adblockplus.org,Proxy
-- DOMAIN-SUFFIX,adobe.com,Proxy
-- DOMAIN-SUFFIX,alfredapp.com,Proxy
-- DOMAIN-SUFFIX,amplitude.com,Proxy
-- DOMAIN-SUFFIX,ampproject.org,Proxy
-- DOMAIN-SUFFIX,android.com,Proxy
-- DOMAIN-SUFFIX,angularjs.org,Proxy
-- DOMAIN-SUFFIX,aolcdn.com,Proxy
-- DOMAIN-SUFFIX,apkpure.com,Proxy
-- DOMAIN-SUFFIX,appledaily.com,Proxy
-- DOMAIN-SUFFIX,appshopper.com,Proxy
-- DOMAIN-SUFFIX,appspot.com,Proxy
-- DOMAIN-SUFFIX,arcgis.com,Proxy
-- DOMAIN-SUFFIX,archive.org,Proxy
-- DOMAIN-SUFFIX,armorgames.com,Proxy
-- DOMAIN-SUFFIX,aspnetcdn.com,Proxy
-- DOMAIN-SUFFIX,att.com,Proxy
-- DOMAIN-SUFFIX,awsstatic.com,Proxy
-- DOMAIN-SUFFIX,azureedge.net,Proxy
-- DOMAIN-SUFFIX,azurewebsites.net,Proxy
-- DOMAIN-SUFFIX,bing.com,Proxy
-- DOMAIN-SUFFIX,bintray.com,Proxy
-- DOMAIN-SUFFIX,bit.com,Proxy
-- DOMAIN-SUFFIX,bit.ly,Proxy
-- DOMAIN-SUFFIX,bitbucket.org,Proxy
-- DOMAIN-SUFFIX,bjango.com,Proxy
-- DOMAIN-SUFFIX,bkrtx.com,Proxy
-- DOMAIN-SUFFIX,blog.com,Proxy
-- DOMAIN-SUFFIX,blogcdn.com,Proxy
-- DOMAIN-SUFFIX,blogger.com,Proxy
-- DOMAIN-SUFFIX,blogsmithmedia.com,Proxy
-- DOMAIN-SUFFIX,blogspot.com,Proxy
-- DOMAIN-SUFFIX,blogspot.hk,Proxy
-- DOMAIN-SUFFIX,bloomberg.com,Proxy
-- DOMAIN-SUFFIX,box.com,Proxy
-- DOMAIN-SUFFIX,box.net,Proxy
-- DOMAIN-SUFFIX,cachefly.net,Proxy
-- DOMAIN-SUFFIX,chromium.org,Proxy
-- DOMAIN-SUFFIX,cl.ly,Proxy
-- DOMAIN-SUFFIX,cloudflare.com,Proxy
-- DOMAIN-SUFFIX,cloudfront.net,Proxy
-- DOMAIN-SUFFIX,cloudmagic.com,Proxy
-- DOMAIN-SUFFIX,cmail19.com,Proxy
-- DOMAIN-SUFFIX,cnet.com,Proxy
-- DOMAIN-SUFFIX,cocoapods.org,Proxy
-- DOMAIN-SUFFIX,comodoca.com,Proxy
-- DOMAIN-SUFFIX,content.office.net,Proxy
-- DOMAIN-SUFFIX,crashlytics.com,Proxy
-- DOMAIN-SUFFIX,culturedcode.com,Proxy
-- DOMAIN-SUFFIX,d.pr,Proxy
-- DOMAIN-SUFFIX,danilo.to,Proxy
-- DOMAIN-SUFFIX,dayone.me,Proxy
-- DOMAIN-SUFFIX,db.tt,Proxy
-- DOMAIN-SUFFIX,deskconnect.com,Proxy
-- DOMAIN-SUFFIX,digicert.com,Proxy
-- DOMAIN-SUFFIX,disq.us,Proxy
-- DOMAIN-SUFFIX,disqus.com,Proxy
-- DOMAIN-SUFFIX,disquscdn.com,Proxy
-- DOMAIN-SUFFIX,dlercloud.com,Proxy
-- DOMAIN-SUFFIX,dnsimple.com,Proxy
-- DOMAIN-SUFFIX,docker.com,Proxy
-- DOMAIN-SUFFIX,dribbble.com,Proxy
-- DOMAIN-SUFFIX,droplr.com,Proxy
-- DOMAIN-SUFFIX,duckduckgo.com,Proxy
-- DOMAIN-SUFFIX,dueapp.com,Proxy
-- DOMAIN-SUFFIX,dytt8.net,Proxy
-- DOMAIN-SUFFIX,edgecastcdn.net,Proxy
-- DOMAIN-SUFFIX,edgekey.net,Proxy
-- DOMAIN-SUFFIX,edgesuite.net,Proxy
-- DOMAIN-SUFFIX,engadget.com,Proxy
-- DOMAIN-SUFFIX,entrust.net,Proxy
-- DOMAIN-SUFFIX,eurekavpt.com,Proxy
-- DOMAIN-SUFFIX,evernote.com,Proxy
-- DOMAIN-SUFFIX,fabric.io,Proxy
-- DOMAIN-SUFFIX,fast.com,Proxy
-- DOMAIN-SUFFIX,fastly.net,Proxy
-- DOMAIN-SUFFIX,fc2.com,Proxy
-- DOMAIN-SUFFIX,feedburner.com,Proxy
-- DOMAIN-SUFFIX,feedly.com,Proxy
-- DOMAIN-SUFFIX,feedsportal.com,Proxy
-- DOMAIN-SUFFIX,fiftythree.com,Proxy
-- DOMAIN-SUFFIX,firebaseio.com,Proxy
-- DOMAIN-SUFFIX,flexibits.com,Proxy
-- DOMAIN-SUFFIX,flickr.com,Proxy
-- DOMAIN-SUFFIX,flipboard.com,Proxy
-- DOMAIN-SUFFIX,g.co,Proxy
-- DOMAIN-SUFFIX,gabia.net,Proxy
-- DOMAIN-SUFFIX,geni.us,Proxy
-- DOMAIN-SUFFIX,gfx.ms,Proxy
-- DOMAIN-SUFFIX,ggpht.com,Proxy
-- DOMAIN-SUFFIX,ghostnoteapp.com,Proxy
-- DOMAIN-SUFFIX,git.io,Proxy
-- DOMAIN-KEYWORD,github,Proxy
-- DOMAIN-SUFFIX,globalsign.com,Proxy
-- DOMAIN-SUFFIX,gmodules.com,Proxy
-- DOMAIN-SUFFIX,godaddy.com,Proxy
-- DOMAIN-SUFFIX,golang.org,Proxy
-- DOMAIN-SUFFIX,gongm.in,Proxy
-- DOMAIN-SUFFIX,goo.gl,Proxy
-- DOMAIN-SUFFIX,goodreaders.com,Proxy
-- DOMAIN-SUFFIX,goodreads.com,Proxy
-- DOMAIN-SUFFIX,gravatar.com,Proxy
-- DOMAIN-SUFFIX,gstatic.com,Proxy
-- DOMAIN-SUFFIX,gvt0.com,Proxy
-- DOMAIN-SUFFIX,hockeyapp.net,Proxy
-- DOMAIN-SUFFIX,hotmail.com,Proxy
-- DOMAIN-SUFFIX,icons8.com,Proxy
-- DOMAIN-SUFFIX,ift.tt,Proxy
-- DOMAIN-SUFFIX,ifttt.com,Proxy
-- DOMAIN-SUFFIX,iherb.com,Proxy
-- DOMAIN-SUFFIX,imageshack.us,Proxy
-- DOMAIN-SUFFIX,img.ly,Proxy
-- DOMAIN-SUFFIX,imgur.com,Proxy
-- DOMAIN-SUFFIX,imore.com,Proxy
-- DOMAIN-SUFFIX,instapaper.com,Proxy
-- DOMAIN-SUFFIX,ipn.li,Proxy
-- DOMAIN-SUFFIX,is.gd,Proxy
-- DOMAIN-SUFFIX,issuu.com,Proxy
-- DOMAIN-SUFFIX,itgonglun.com,Proxy
-- DOMAIN-SUFFIX,itun.es,Proxy
-- DOMAIN-SUFFIX,ixquick.com,Proxy
-- DOMAIN-SUFFIX,j.mp,Proxy
-- DOMAIN-SUFFIX,js.revsci.net,Proxy
-- DOMAIN-SUFFIX,jshint.com,Proxy
-- DOMAIN-SUFFIX,jtvnw.net,Proxy
-- DOMAIN-SUFFIX,justgetflux.com,Proxy
-- DOMAIN-SUFFIX,kat.cr,Proxy
-- DOMAIN-SUFFIX,klip.me,Proxy
-- DOMAIN-SUFFIX,libsyn.com,Proxy
-- DOMAIN-SUFFIX,licdn.com,Proxy
-- DOMAIN-SUFFIX,linkedin.com,Proxy
-- DOMAIN-SUFFIX,linode.com,Proxy
-- DOMAIN-SUFFIX,lithium.com,Proxy
-- DOMAIN-SUFFIX,littlehj.com,Proxy
-- DOMAIN-SUFFIX,live.com,Proxy
-- DOMAIN-SUFFIX,live.net,Proxy
-- DOMAIN-SUFFIX,livefilestore.com,Proxy
-- DOMAIN-SUFFIX,llnwd.net,Proxy
-- DOMAIN-SUFFIX,macid.co,Proxy
-- DOMAIN-SUFFIX,macromedia.com,Proxy
-- DOMAIN-SUFFIX,macrumors.com,Proxy
-- DOMAIN-SUFFIX,mashable.com,Proxy
-- DOMAIN-SUFFIX,mathjax.org,Proxy
-- DOMAIN-SUFFIX,medium.com,Proxy
-- DOMAIN-SUFFIX,mega.co.nz,Proxy
-- DOMAIN-SUFFIX,mega.nz,Proxy
-- DOMAIN-SUFFIX,megaupload.com,Proxy
-- DOMAIN-SUFFIX,microsofttranslator.com,Proxy
-- DOMAIN-SUFFIX,mindnode.com,Proxy
-- DOMAIN-SUFFIX,mobile01.com,Proxy
-- DOMAIN-SUFFIX,modmyi.com,Proxy
-- DOMAIN-SUFFIX,msedge.net,Proxy
-- DOMAIN-SUFFIX,myfontastic.com,Proxy
-- DOMAIN-SUFFIX,name.com,Proxy
-- DOMAIN-SUFFIX,nextmedia.com,Proxy
-- DOMAIN-SUFFIX,nsstatic.net,Proxy
-- DOMAIN-SUFFIX,nssurge.com,Proxy
-- DOMAIN-SUFFIX,nyt.com,Proxy
-- DOMAIN-SUFFIX,nytimes.com,Proxy
-- DOMAIN-SUFFIX,office365.com,Proxy
-- DOMAIN-SUFFIX,omnigroup.com,Proxy
-- DOMAIN-SUFFIX,onedrive.com,Proxy
-- DOMAIN-SUFFIX,onenote.com,Proxy
-- DOMAIN-SUFFIX,ooyala.com,Proxy
-- DOMAIN-SUFFIX,openvpn.net,Proxy
-- DOMAIN-SUFFIX,openwrt.org,Proxy
-- DOMAIN-SUFFIX,orkut.com,Proxy
-- DOMAIN-SUFFIX,osxdaily.com,Proxy
-- DOMAIN-SUFFIX,outlook.com,Proxy
-- DOMAIN-SUFFIX,ow.ly,Proxy
-- DOMAIN-SUFFIX,paddleapi.com,Proxy
-- DOMAIN-SUFFIX,parallels.com,Proxy
-- DOMAIN-SUFFIX,parse.com,Proxy
-- DOMAIN-SUFFIX,pdfexpert.com,Proxy
-- DOMAIN-SUFFIX,periscope.tv,Proxy
-- DOMAIN-SUFFIX,pinboard.in,Proxy
-- DOMAIN-SUFFIX,pinterest.com,Proxy
-- DOMAIN-SUFFIX,pixelmator.com,Proxy
-- DOMAIN-SUFFIX,pixiv.net,Proxy
-- DOMAIN-SUFFIX,playpcesor.com,Proxy
-- DOMAIN-SUFFIX,playstation.com,Proxy
-- DOMAIN-SUFFIX,playstation.com.hk,Proxy
-- DOMAIN-SUFFIX,playstation.net,Proxy
-- DOMAIN-SUFFIX,playstationnetwork.com,Proxy
-- DOMAIN-SUFFIX,pushwoosh.com,Proxy
-- DOMAIN-SUFFIX,rime.im,Proxy
-- DOMAIN-SUFFIX,servebom.com,Proxy
-- DOMAIN-SUFFIX,sfx.ms,Proxy
-- DOMAIN-SUFFIX,shadowsocks.org,Proxy
-- DOMAIN-SUFFIX,sharethis.com,Proxy
-- DOMAIN-SUFFIX,shazam.com,Proxy
-- DOMAIN-SUFFIX,skype.com,Proxy
-- DOMAIN-SUFFIX,smartdnsProxy.com,Proxy
-- DOMAIN-SUFFIX,smartmailcloud.com,Proxy
-- DOMAIN-SUFFIX,sndcdn.com,Proxy
-- DOMAIN-SUFFIX,sony.com,Proxy
-- DOMAIN-SUFFIX,soundcloud.com,Proxy
-- DOMAIN-SUFFIX,sourceforge.net,Proxy
-- DOMAIN-SUFFIX,spotify.com,Proxy
-- DOMAIN-SUFFIX,squarespace.com,Proxy
-- DOMAIN-SUFFIX,sstatic.net,Proxy
-- DOMAIN-SUFFIX,st.luluku.pw,Proxy
-- DOMAIN-SUFFIX,stackoverflow.com,Proxy
-- DOMAIN-SUFFIX,startpage.com,Proxy
-- DOMAIN-SUFFIX,staticflickr.com,Proxy
-- DOMAIN-SUFFIX,steamcommunity.com,Proxy
-- DOMAIN-SUFFIX,symauth.com,Proxy
-- DOMAIN-SUFFIX,symcb.com,Proxy
-- DOMAIN-SUFFIX,symcd.com,Proxy
-- DOMAIN-SUFFIX,tapbots.com,Proxy
-- DOMAIN-SUFFIX,tapbots.net,Proxy
-- DOMAIN-SUFFIX,tdesktop.com,Proxy
-- DOMAIN-SUFFIX,techcrunch.com,Proxy
-- DOMAIN-SUFFIX,techsmith.com,Proxy
-- DOMAIN-SUFFIX,thepiratebay.org,Proxy
-- DOMAIN-SUFFIX,theverge.com,Proxy
-- DOMAIN-SUFFIX,time.com,Proxy
-- DOMAIN-SUFFIX,timeinc.net,Proxy
-- DOMAIN-SUFFIX,tiny.cc,Proxy
-- DOMAIN-SUFFIX,tinypic.com,Proxy
-- DOMAIN-SUFFIX,tmblr.co,Proxy
-- DOMAIN-SUFFIX,todoist.com,Proxy
-- DOMAIN-SUFFIX,trello.com,Proxy
-- DOMAIN-SUFFIX,trustasiassl.com,Proxy
-- DOMAIN-SUFFIX,tumblr.co,Proxy
-- DOMAIN-SUFFIX,tumblr.com,Proxy
-- DOMAIN-SUFFIX,tweetdeck.com,Proxy
-- DOMAIN-SUFFIX,tweetmarker.net,Proxy
-- DOMAIN-SUFFIX,twitch.tv,Proxy
-- DOMAIN-SUFFIX,txmblr.com,Proxy
-- DOMAIN-SUFFIX,typekit.net,Proxy
-- DOMAIN-SUFFIX,ubertags.com,Proxy
-- DOMAIN-SUFFIX,ublock.org,Proxy
-- DOMAIN-SUFFIX,ubnt.com,Proxy
-- DOMAIN-SUFFIX,ulyssesapp.com,Proxy
-- DOMAIN-SUFFIX,urchin.com,Proxy
-- DOMAIN-SUFFIX,usertrust.com,Proxy
-- DOMAIN-SUFFIX,v.gd,Proxy
-- DOMAIN-SUFFIX,vimeo.com,Proxy
-- DOMAIN-SUFFIX,vimeocdn.com,Proxy
-- DOMAIN-SUFFIX,vine.co,Proxy
-- DOMAIN-SUFFIX,vivaldi.com,Proxy
-- DOMAIN-SUFFIX,vox-cdn.com,Proxy
-- DOMAIN-SUFFIX,vsco.co,Proxy
-- DOMAIN-SUFFIX,vultr.com,Proxy
-- DOMAIN-SUFFIX,w.org,Proxy
-- DOMAIN-SUFFIX,w3schools.com,Proxy
-- DOMAIN-SUFFIX,webtype.com,Proxy
-- DOMAIN-SUFFIX,wikiwand.com,Proxy
-- DOMAIN-SUFFIX,wikileaks.org,Proxy
-- DOMAIN-SUFFIX,wikimedia.org,Proxy
-- DOMAIN-SUFFIX,wikipedia.com,Proxy
-- DOMAIN-SUFFIX,wikipedia.org,Proxy
-- DOMAIN-SUFFIX,windows.com,Proxy
-- DOMAIN-SUFFIX,windows.net,Proxy
-- DOMAIN-SUFFIX,wire.com,Proxy
-- DOMAIN-SUFFIX,wordpress.com,Proxy
-- DOMAIN-SUFFIX,workflowy.com,Proxy
-- DOMAIN-SUFFIX,wp.com,Proxy
-- DOMAIN-SUFFIX,wsj.com,Proxy
-- DOMAIN-SUFFIX,wsj.net,Proxy
-- DOMAIN-SUFFIX,xda-developers.com,Proxy
-- DOMAIN-SUFFIX,xeeno.com,Proxy
-- DOMAIN-SUFFIX,xiti.com,Proxy
-- DOMAIN-SUFFIX,yahoo.com,Proxy
-- DOMAIN-SUFFIX,yimg.com,Proxy
-- DOMAIN-SUFFIX,ying.com,Proxy
-- DOMAIN-SUFFIX,yoyo.org,Proxy
-- DOMAIN-SUFFIX,ytimg.com,Proxy
-
-- DOMAIN-SUFFIX,telegra.ph,Proxy
-- DOMAIN-SUFFIX,telegram.org,Proxy
-- IP-CIDR,91.108.56.0/22,Proxy
-- IP-CIDR,91.108.4.0/22,Proxy
-- IP-CIDR,91.108.8.0/22,Proxy
-- IP-CIDR,109.239.140.0/24,Proxy
-- IP-CIDR,149.154.160.0/20,Proxy
-- IP-CIDR,149.154.164.0/22,Proxy
-
-- DOMAIN-SUFFIX,local,DIRECT
-- IP-CIDR,127.0.0.0/8,DIRECT
-- IP-CIDR,172.16.0.0/12,DIRECT
-- IP-CIDR,192.168.0.0/16,DIRECT
-- IP-CIDR,10.0.0.0/8,DIRECT
-- IP-CIDR,17.0.0.0/8,DIRECT
-- IP-CIDR,100.64.0.0/10,DIRECT
-
-- GEOIP,CN,Domestic
-- MATCH,Others

+ 1116 - 0
resources/conf/clash/default.tpl

@@ -0,0 +1,1116 @@
+  - DOMAIN-SUFFIX,smtp,DIRECT
+  - DOMAIN-KEYWORD,aria2,DIRECT
+
+  - DOMAIN-SUFFIX,ampproject.org,🔰国外流量
+  - DOMAIN-SUFFIX,appspot.com,🔰国外流量
+  - DOMAIN-SUFFIX,blogger.com,🔰国外流量
+  - DOMAIN-SUFFIX,getoutline.org,🔰国外流量
+  - DOMAIN-SUFFIX,gvt0.com,🔰国外流量
+  - DOMAIN-SUFFIX,gvt1.com,🔰国外流量
+  - DOMAIN-SUFFIX,gvt3.com,🔰国外流量
+  - DOMAIN-SUFFIX,xn--ngstr-lra8j.com,🔰国外流量
+  - DOMAIN-KEYWORD,google,🔰国外流量
+  - DOMAIN-KEYWORD,blogspot,🔰国外流量
+  - DOMAIN-SUFFIX,onedrive.live.com,🔰国外流量
+  - DOMAIN-SUFFIX,xboxlive.com,🔰国外流量
+  - DOMAIN-SUFFIX,cdninstagram.com,🔰国外流量
+  - DOMAIN-SUFFIX,fb.com,🔰国外流量
+  - DOMAIN-SUFFIX,fb.me,🔰国外流量
+  - DOMAIN-SUFFIX,fbaddins.com,🔰国外流量
+  - DOMAIN-SUFFIX,fbcdn.net,🔰国外流量
+  - DOMAIN-SUFFIX,fbsbx.com,🔰国外流量
+  - DOMAIN-SUFFIX,fbworkmail.com,🔰国外流量
+  - DOMAIN-SUFFIX,instagram.com,🔰国外流量
+  - DOMAIN-SUFFIX,m.me,🔰国外流量
+  - DOMAIN-SUFFIX,messenger.com,🔰国外流量
+  - DOMAIN-SUFFIX,oculus.com,🔰国外流量
+  - DOMAIN-SUFFIX,oculuscdn.com,🔰国外流量
+  - DOMAIN-SUFFIX,rocksdb.org,🔰国外流量
+  - DOMAIN-SUFFIX,whatsapp.com,🔰国外流量
+  - DOMAIN-SUFFIX,whatsapp.net,🔰国外流量
+  - DOMAIN-KEYWORD,facebook,🔰国外流量
+  - IP-CIDR,3.123.36.126/32,🔰国外流量,no-resolve
+  - IP-CIDR,35.157.215.84/32,🔰国外流量,no-resolve
+  - IP-CIDR,35.157.217.255/32,🔰国外流量,no-resolve
+  - IP-CIDR,52.58.209.134/32,🔰国外流量,no-resolve
+  - IP-CIDR,54.93.124.31/32,🔰国外流量,no-resolve
+  - IP-CIDR,54.162.243.80/32,🔰国外流量,no-resolve
+  - IP-CIDR,54.173.34.141/32,🔰国外流量,no-resolve
+  - IP-CIDR,54.235.23.242/32,🔰国外流量,no-resolve
+  - IP-CIDR,169.45.248.118/32,🔰国外流量,no-resolve
+  - DOMAIN-SUFFIX,pscp.tv,🔰国外流量
+  - DOMAIN-SUFFIX,periscope.tv,🔰国外流量
+  - DOMAIN-SUFFIX,t.co,🔰国外流量
+  - DOMAIN-SUFFIX,twimg.co,🔰国外流量
+  - DOMAIN-SUFFIX,twimg.com,🔰国外流量
+  - DOMAIN-SUFFIX,twitpic.com,🔰国外流量
+  - DOMAIN-SUFFIX,vine.co,🔰国外流量
+  - DOMAIN-KEYWORD,twitter,🔰国外流量
+  - DOMAIN-SUFFIX,t.me,🔰国外流量
+  - DOMAIN-SUFFIX,tdesktop.com,🔰国外流量
+  - DOMAIN-SUFFIX,telegra.ph,🔰国外流量
+  - DOMAIN-SUFFIX,telegram.me,🔰国外流量
+  - DOMAIN-SUFFIX,telegram.org,🔰国外流量
+  - IP-CIDR,91.108.4.0/22,🔰国外流量,no-resolve
+  - IP-CIDR,91.108.8.0/22,🔰国外流量,no-resolve
+  - IP-CIDR,91.108.12.0/22,🔰国外流量,no-resolve
+  - IP-CIDR,91.108.16.0/22,🔰国外流量,no-resolve
+  - IP-CIDR,91.108.56.0/22,🔰国外流量,no-resolve
+  - IP-CIDR,149.154.160.0/20,🔰国外流量,no-resolve
+  - IP-CIDR6,2001:b28:f23d::/48,🔰国外流量,no-resolve
+  - IP-CIDR6,2001:b28:f23f::/48,🔰国外流量,no-resolve
+  - IP-CIDR6,2001:67c:4e8::/48,🔰国外流量,no-resolve
+  - DOMAIN-SUFFIX,line.me,🔰国外流量
+  - DOMAIN-SUFFIX,line-apps.com,🔰国外流量
+  - DOMAIN-SUFFIX,line-scdn.net,🔰国外流量
+  - DOMAIN-SUFFIX,naver.jp,🔰国外流量
+  - IP-CIDR,103.2.30.0/23,🔰国外流量,no-resolve
+  - IP-CIDR,125.209.208.0/20,🔰国外流量,no-resolve
+  - IP-CIDR,147.92.128.0/17,🔰国外流量,no-resolve
+  - IP-CIDR,203.104.144.0/21,🔰国外流量,no-resolve
+  - DOMAIN-SUFFIX,4shared.com,🔰国外流量
+  - DOMAIN-SUFFIX,520cc.cc,🔰国外流量
+  - DOMAIN-SUFFIX,881903.com,🔰国外流量
+  - DOMAIN-SUFFIX,9cache.com,🔰国外流量
+  - DOMAIN-SUFFIX,9gag.com,🔰国外流量
+  - DOMAIN-SUFFIX,abc.com,🔰国外流量
+  - DOMAIN-SUFFIX,abc.net.au,🔰国外流量
+  - DOMAIN-SUFFIX,abebooks.com,🔰国外流量
+  - DOMAIN-SUFFIX,amazon.co.jp,🔰国外流量
+  - DOMAIN-SUFFIX,apigee.com,🔰国外流量
+  - DOMAIN-SUFFIX,apk-dl.com,🔰国外流量
+  - DOMAIN-SUFFIX,apkfind.com,🔰国外流量
+  - DOMAIN-SUFFIX,apkmirror.com,🔰国外流量
+  - DOMAIN-SUFFIX,apkmonk.com,🔰国外流量
+  - DOMAIN-SUFFIX,apkpure.com,🔰国外流量
+  - DOMAIN-SUFFIX,aptoide.com,🔰国外流量
+  - DOMAIN-SUFFIX,archive.is,🔰国外流量
+  - DOMAIN-SUFFIX,archive.org,🔰国外流量
+  - DOMAIN-SUFFIX,arte.tv,🔰国外流量
+  - DOMAIN-SUFFIX,artstation.com,🔰国外流量
+  - DOMAIN-SUFFIX,arukas.io,🔰国外流量
+  - DOMAIN-SUFFIX,ask.com,🔰国外流量
+  - DOMAIN-SUFFIX,avg.com,🔰国外流量
+  - DOMAIN-SUFFIX,avgle.com,🔰国外流量
+  - DOMAIN-SUFFIX,badoo.com,🔰国外流量
+  - DOMAIN-SUFFIX,bandwagonhost.com,🔰国外流量
+  - DOMAIN-SUFFIX,bbc.com,🔰国外流量
+  - DOMAIN-SUFFIX,behance.net,🔰国外流量
+  - DOMAIN-SUFFIX,bibox.com,🔰国外流量
+  - DOMAIN-SUFFIX,biggo.com.tw,🔰国外流量
+  - DOMAIN-SUFFIX,binance.com,🔰国外流量
+  - DOMAIN-SUFFIX,bitcointalk.org,🔰国外流量
+  - DOMAIN-SUFFIX,bitfinex.com,🔰国外流量
+  - DOMAIN-SUFFIX,bitmex.com,🔰国外流量
+  - DOMAIN-SUFFIX,bit-z.com,🔰国外流量
+  - DOMAIN-SUFFIX,bloglovin.com,🔰国外流量
+  - DOMAIN-SUFFIX,bloomberg.cn,🔰国外流量
+  - DOMAIN-SUFFIX,bloomberg.com,🔰国外流量
+  - DOMAIN-SUFFIX,blubrry.com,🔰国外流量
+  - DOMAIN-SUFFIX,book.com.tw,🔰国外流量
+  - DOMAIN-SUFFIX,booklive.jp,🔰国外流量
+  - DOMAIN-SUFFIX,books.com.tw,🔰国外流量
+  - DOMAIN-SUFFIX,boslife.net,🔰国外流量
+  - DOMAIN-SUFFIX,box.com,🔰国外流量
+  - DOMAIN-SUFFIX,businessinsider.com,🔰国外流量
+  - DOMAIN-SUFFIX,bwh1.net,🔰国外流量
+  - DOMAIN-SUFFIX,castbox.fm,🔰国外流量
+  - DOMAIN-SUFFIX,cbc.ca,🔰国外流量
+  - DOMAIN-SUFFIX,cdw.com,🔰国外流量
+  - DOMAIN-SUFFIX,change.org,🔰国外流量
+  - DOMAIN-SUFFIX,channelnewsasia.com,🔰国外流量
+  - DOMAIN-SUFFIX,ck101.com,🔰国外流量
+  - DOMAIN-SUFFIX,clarionproject.org,🔰国外流量
+  - DOMAIN-SUFFIX,clyp.it,🔰国外流量
+  - DOMAIN-SUFFIX,cna.com.tw,🔰国外流量
+  - DOMAIN-SUFFIX,comparitech.com,🔰国外流量
+  - DOMAIN-SUFFIX,conoha.jp,🔰国外流量
+  - DOMAIN-SUFFIX,crucial.com,🔰国外流量
+  - DOMAIN-SUFFIX,cts.com.tw,🔰国外流量
+  - DOMAIN-SUFFIX,cw.com.tw,🔰国外流量
+  - DOMAIN-SUFFIX,cyberctm.com,🔰国外流量
+  - DOMAIN-SUFFIX,dailymotion.com,🔰国外流量
+  - DOMAIN-SUFFIX,dailyview.tw,🔰国外流量
+  - DOMAIN-SUFFIX,daum.net,🔰国外流量
+  - DOMAIN-SUFFIX,daumcdn.net,🔰国外流量
+  - DOMAIN-SUFFIX,dcard.tw,🔰国外流量
+  - DOMAIN-SUFFIX,deepdiscount.com,🔰国外流量
+  - DOMAIN-SUFFIX,depositphotos.com,🔰国外流量
+  - DOMAIN-SUFFIX,deviantart.com,🔰国外流量
+  - DOMAIN-SUFFIX,disconnect.me,🔰国外流量
+  - DOMAIN-SUFFIX,discordapp.com,🔰国外流量
+  - DOMAIN-SUFFIX,discordapp.net,🔰国外流量
+  - DOMAIN-SUFFIX,disqus.com,🔰国外流量
+  - DOMAIN-SUFFIX,dlercloud.com,🔰国外流量
+  - DOMAIN-SUFFIX,dns2go.com,🔰国外流量
+  - DOMAIN-SUFFIX,dowjones.com,🔰国外流量
+  - DOMAIN-SUFFIX,dropbox.com,🔰国外流量
+  - DOMAIN-SUFFIX,dropboxusercontent.com,🔰国外流量
+  - DOMAIN-SUFFIX,duckduckgo.com,🔰国外流量
+  - DOMAIN-SUFFIX,dw.com,🔰国外流量
+  - DOMAIN-SUFFIX,dynu.com,🔰国外流量
+  - DOMAIN-SUFFIX,earthcam.com,🔰国外流量
+  - DOMAIN-SUFFIX,ebookservice.tw,🔰国外流量
+  - DOMAIN-SUFFIX,economist.com,🔰国外流量
+  - DOMAIN-SUFFIX,edgecastcdn.net,🔰国外流量
+  - DOMAIN-SUFFIX,edu,🔰国外流量
+  - DOMAIN-SUFFIX,elpais.com,🔰国外流量
+  - DOMAIN-SUFFIX,enanyang.my,🔰国外流量
+  - DOMAIN-SUFFIX,encyclopedia.com,🔰国外流量
+  - DOMAIN-SUFFIX,esoir.be,🔰国外流量
+  - DOMAIN-SUFFIX,etherscan.io,🔰国外流量
+  - DOMAIN-SUFFIX,euronews.com,🔰国外流量
+  - DOMAIN-SUFFIX,evozi.com,🔰国外流量
+  - DOMAIN-SUFFIX,feedly.com,🔰国外流量
+  - DOMAIN-SUFFIX,firech.at,🔰国外流量
+  - DOMAIN-SUFFIX,flickr.com,🔰国外流量
+  - DOMAIN-SUFFIX,flitto.com,🔰国外流量
+  - DOMAIN-SUFFIX,foreignpolicy.com,🔰国外流量
+  - DOMAIN-SUFFIX,freebrowser.org,🔰国外流量
+  - DOMAIN-SUFFIX,freewechat.com,🔰国外流量
+  - DOMAIN-SUFFIX,freeweibo.com,🔰国外流量
+  - DOMAIN-SUFFIX,friday.tw,🔰国外流量
+  - DOMAIN-SUFFIX,ftchinese.com,🔰国外流量
+  - DOMAIN-SUFFIX,ftimg.net,🔰国外流量
+  - DOMAIN-SUFFIX,gate.io,🔰国外流量
+  - DOMAIN-SUFFIX,getlantern.org,🔰国外流量
+  - DOMAIN-SUFFIX,getsync.com,🔰国外流量
+  - DOMAIN-SUFFIX,globalvoices.org,🔰国外流量
+  - DOMAIN-SUFFIX,goo.ne.jp,🔰国外流量
+  - DOMAIN-SUFFIX,goodreads.com,🔰国外流量
+  - DOMAIN-SUFFIX,gov,🔰国外流量
+  - DOMAIN-SUFFIX,gov.tw,🔰国外流量
+  - DOMAIN-SUFFIX,greatfire.org,🔰国外流量
+  - DOMAIN-SUFFIX,gumroad.com,🔰国外流量
+  - DOMAIN-SUFFIX,hbg.com,🔰国外流量
+  - DOMAIN-SUFFIX,heroku.com,🔰国外流量
+  - DOMAIN-SUFFIX,hightail.com,🔰国外流量
+  - DOMAIN-SUFFIX,hk01.com,🔰国外流量
+  - DOMAIN-SUFFIX,hkbf.org,🔰国外流量
+  - DOMAIN-SUFFIX,hkbookcity.com,🔰国外流量
+  - DOMAIN-SUFFIX,hkej.com,🔰国外流量
+  - DOMAIN-SUFFIX,hket.com,🔰国外流量
+  - DOMAIN-SUFFIX,hkgolden.com,🔰国外流量
+  - DOMAIN-SUFFIX,hootsuite.com,🔰国外流量
+  - DOMAIN-SUFFIX,hudson.org,🔰国外流量
+  - DOMAIN-SUFFIX,hyread.com.tw,🔰国外流量
+  - DOMAIN-SUFFIX,ibtimes.com,🔰国外流量
+  - DOMAIN-SUFFIX,i-cable.com,🔰国外流量
+  - DOMAIN-SUFFIX,icij.org,🔰国外流量
+  - DOMAIN-SUFFIX,icoco.com,🔰国外流量
+  - DOMAIN-SUFFIX,imgur.com,🔰国外流量
+  - DOMAIN-SUFFIX,initiummall.com,🔰国外流量
+  - DOMAIN-SUFFIX,insecam.org,🔰国外流量
+  - DOMAIN-SUFFIX,ipfs.io,🔰国外流量
+  - DOMAIN-SUFFIX,issuu.com,🔰国外流量
+  - DOMAIN-SUFFIX,istockphoto.com,🔰国外流量
+  - DOMAIN-SUFFIX,japantimes.co.jp,🔰国外流量
+  - DOMAIN-SUFFIX,jiji.com,🔰国外流量
+  - DOMAIN-SUFFIX,jinx.com,🔰国外流量
+  - DOMAIN-SUFFIX,jkforum.net,🔰国外流量
+  - DOMAIN-SUFFIX,joinmastodon.org,🔰国外流量
+  - DOMAIN-SUFFIX,justmysocks.net,🔰国外流量
+  - DOMAIN-SUFFIX,justpaste.it,🔰国外流量
+  - DOMAIN-SUFFIX,kakao.com,🔰国外流量
+  - DOMAIN-SUFFIX,kakaocorp.com,🔰国外流量
+  - DOMAIN-SUFFIX,kik.com,🔰国外流量
+  - DOMAIN-SUFFIX,kobo.com,🔰国外流量
+  - DOMAIN-SUFFIX,kobobooks.com,🔰国外流量
+  - DOMAIN-SUFFIX,kodingen.com,🔰国外流量
+  - DOMAIN-SUFFIX,lemonde.fr,🔰国外流量
+  - DOMAIN-SUFFIX,lepoint.fr,🔰国外流量
+  - DOMAIN-SUFFIX,lihkg.com,🔰国外流量
+  - DOMAIN-SUFFIX,listennotes.com,🔰国外流量
+  - DOMAIN-SUFFIX,livestream.com,🔰国外流量
+  - DOMAIN-SUFFIX,logmein.com,🔰国外流量
+  - DOMAIN-SUFFIX,mail.ru,🔰国外流量
+  - DOMAIN-SUFFIX,mailchimp.com,🔰国外流量
+  - DOMAIN-SUFFIX,marc.info,🔰国外流量
+  - DOMAIN-SUFFIX,matters.news,🔰国外流量
+  - DOMAIN-SUFFIX,maying.co,🔰国外流量
+  - DOMAIN-SUFFIX,medium.com,🔰国外流量
+  - DOMAIN-SUFFIX,mega.nz,🔰国外流量
+  - DOMAIN-SUFFIX,mil,🔰国外流量
+  - DOMAIN-SUFFIX,mingpao.com,🔰国外流量
+  - DOMAIN-SUFFIX,mobile01.com,🔰国外流量
+  - DOMAIN-SUFFIX,myspace.com,🔰国外流量
+  - DOMAIN-SUFFIX,myspacecdn.com,🔰国外流量
+  - DOMAIN-SUFFIX,nanyang.com,🔰国外流量
+  - DOMAIN-SUFFIX,naver.com,🔰国外流量
+  - DOMAIN-SUFFIX,neowin.net,🔰国外流量
+  - DOMAIN-SUFFIX,newstapa.org,🔰国外流量
+  - DOMAIN-SUFFIX,nexitally.com,🔰国外流量
+  - DOMAIN-SUFFIX,nhk.or.jp,🔰国外流量
+  - DOMAIN-SUFFIX,nicovideo.jp,🔰国外流量
+  - DOMAIN-SUFFIX,nii.ac.jp,🔰国外流量
+  - DOMAIN-SUFFIX,nikkei.com,🔰国外流量
+  - DOMAIN-SUFFIX,nofile.io,🔰国外流量
+  - DOMAIN-SUFFIX,now.com,🔰国外流量
+  - DOMAIN-SUFFIX,nrk.no,🔰国外流量
+  - DOMAIN-SUFFIX,nyt.com,🔰国外流量
+  - DOMAIN-SUFFIX,nytchina.com,🔰国外流量
+  - DOMAIN-SUFFIX,nytcn.me,🔰国外流量
+  - DOMAIN-SUFFIX,nytco.com,🔰国外流量
+  - DOMAIN-SUFFIX,nytimes.com,🔰国外流量
+  - DOMAIN-SUFFIX,nytimg.com,🔰国外流量
+  - DOMAIN-SUFFIX,nytlog.com,🔰国外流量
+  - DOMAIN-SUFFIX,nytstyle.com,🔰国外流量
+  - DOMAIN-SUFFIX,ok.ru,🔰国外流量
+  - DOMAIN-SUFFIX,okex.com,🔰国外流量
+  - DOMAIN-SUFFIX,on.cc,🔰国外流量
+  - DOMAIN-SUFFIX,orientaldaily.com.my,🔰国外流量
+  - DOMAIN-SUFFIX,overcast.fm,🔰国外流量
+  - DOMAIN-SUFFIX,paltalk.com,🔰国外流量
+  - DOMAIN-SUFFIX,pao-pao.net,🔰国外流量
+  - DOMAIN-SUFFIX,parsevideo.com,🔰国外流量
+  - DOMAIN-SUFFIX,pbxes.com,🔰国外流量
+  - DOMAIN-SUFFIX,pcdvd.com.tw,🔰国外流量
+  - DOMAIN-SUFFIX,pchome.com.tw,🔰国外流量
+  - DOMAIN-SUFFIX,pcloud.com,🔰国外流量
+  - DOMAIN-SUFFIX,picacomic.com,🔰国外流量
+  - DOMAIN-SUFFIX,pinimg.com,🔰国外流量
+  - DOMAIN-SUFFIX,pixiv.net,🔰国外流量
+  - DOMAIN-SUFFIX,player.fm,🔰国外流量
+  - DOMAIN-SUFFIX,plurk.com,🔰国外流量
+  - DOMAIN-SUFFIX,po18.tw,🔰国外流量
+  - DOMAIN-SUFFIX,potato.im,🔰国外流量
+  - DOMAIN-SUFFIX,potatso.com,🔰国外流量
+  - DOMAIN-SUFFIX,prism-break.org,🔰国外流量
+  - DOMAIN-SUFFIX,proxifier.com,🔰国外流量
+  - DOMAIN-SUFFIX,pt.im,🔰国外流量
+  - DOMAIN-SUFFIX,pts.org.tw,🔰国外流量
+  - DOMAIN-SUFFIX,pubu.com.tw,🔰国外流量
+  - DOMAIN-SUFFIX,pubu.tw,🔰国外流量
+  - DOMAIN-SUFFIX,pureapk.com,🔰国外流量
+  - DOMAIN-SUFFIX,quora.com,🔰国外流量
+  - DOMAIN-SUFFIX,quoracdn.net,🔰国外流量
+  - DOMAIN-SUFFIX,rakuten.co.jp,🔰国外流量
+  - DOMAIN-SUFFIX,readingtimes.com.tw,🔰国外流量
+  - DOMAIN-SUFFIX,readmoo.com,🔰国外流量
+  - DOMAIN-SUFFIX,redbubble.com,🔰国外流量
+  - DOMAIN-SUFFIX,reddit.com,🔰国外流量
+  - DOMAIN-SUFFIX,redditmedia.com,🔰国外流量
+  - DOMAIN-SUFFIX,resilio.com,🔰国外流量
+  - DOMAIN-SUFFIX,reuters.com,🔰国外流量
+  - DOMAIN-SUFFIX,reutersmedia.net,🔰国外流量
+  - DOMAIN-SUFFIX,rfi.fr,🔰国外流量
+  - DOMAIN-SUFFIX,rixcloud.com,🔰国外流量
+  - DOMAIN-SUFFIX,roadshow.hk,🔰国外流量
+  - DOMAIN-SUFFIX,scmp.com,🔰国外流量
+  - DOMAIN-SUFFIX,scribd.com,🔰国外流量
+  - DOMAIN-SUFFIX,seatguru.com,🔰国外流量
+  - DOMAIN-SUFFIX,shadowsocks.org,🔰国外流量
+  - DOMAIN-SUFFIX,shopee.tw,🔰国外流量
+  - DOMAIN-SUFFIX,slideshare.net,🔰国外流量
+  - DOMAIN-SUFFIX,softfamous.com,🔰国外流量
+  - DOMAIN-SUFFIX,soundcloud.com,🔰国外流量
+  - DOMAIN-SUFFIX,ssrcloud.org,🔰国外流量
+  - DOMAIN-SUFFIX,startpage.com,🔰国外流量
+  - DOMAIN-SUFFIX,steamcommunity.com,🔰国外流量
+  - DOMAIN-SUFFIX,steemit.com,🔰国外流量
+  - DOMAIN-SUFFIX,steemitwallet.com,🔰国外流量
+  - DOMAIN-SUFFIX,t66y.com,🔰国外流量
+  - DOMAIN-SUFFIX,tapatalk.com,🔰国外流量
+  - DOMAIN-SUFFIX,teco-hk.org,🔰国外流量
+  - DOMAIN-SUFFIX,teco-mo.org,🔰国外流量
+  - DOMAIN-SUFFIX,teddysun.com,🔰国外流量
+  - DOMAIN-SUFFIX,textnow.me,🔰国外流量
+  - DOMAIN-SUFFIX,theguardian.com,🔰国外流量
+  - DOMAIN-SUFFIX,theinitium.com,🔰国外流量
+  - DOMAIN-SUFFIX,thetvdb.com,🔰国外流量
+  - DOMAIN-SUFFIX,tineye.com,🔰国外流量
+  - DOMAIN-SUFFIX,torproject.org,🔰国外流量
+  - DOMAIN-SUFFIX,tumblr.com,🔰国外流量
+  - DOMAIN-SUFFIX,turbobit.net,🔰国外流量
+  - DOMAIN-SUFFIX,tutanota.com,🔰国外流量
+  - DOMAIN-SUFFIX,tvboxnow.com,🔰国外流量
+  - DOMAIN-SUFFIX,udn.com,🔰国外流量
+  - DOMAIN-SUFFIX,unseen.is,🔰国外流量
+  - DOMAIN-SUFFIX,upmedia.mg,🔰国外流量
+  - DOMAIN-SUFFIX,uptodown.com,🔰国外流量
+  - DOMAIN-SUFFIX,urbandictionary.com,🔰国外流量
+  - DOMAIN-SUFFIX,ustream.tv,🔰国外流量
+  - DOMAIN-SUFFIX,uwants.com,🔰国外流量
+  - DOMAIN-SUFFIX,v2ray.com,🔰国外流量
+  - DOMAIN-SUFFIX,viber.com,🔰国外流量
+  - DOMAIN-SUFFIX,videopress.com,🔰国外流量
+  - DOMAIN-SUFFIX,vimeo.com,🔰国外流量
+  - DOMAIN-SUFFIX,voachinese.com,🔰国外流量
+  - DOMAIN-SUFFIX,voanews.com,🔰国外流量
+  - DOMAIN-SUFFIX,voxer.com,🔰国外流量
+  - DOMAIN-SUFFIX,vzw.com,🔰国外流量
+  - DOMAIN-SUFFIX,w3schools.com,🔰国外流量
+  - DOMAIN-SUFFIX,washingtonpost.com,🔰国外流量
+  - DOMAIN-SUFFIX,wattpad.com,🔰国外流量
+  - DOMAIN-SUFFIX,whoer.net,🔰国外流量
+  - DOMAIN-SUFFIX,wikimapia.org,🔰国外流量
+  - DOMAIN-SUFFIX,wikipedia.org,🔰国外流量
+  - DOMAIN-SUFFIX,wikiquote.org,🔰国外流量
+  - DOMAIN-SUFFIX,wikiwand.com,🔰国外流量
+  - DOMAIN-SUFFIX,winudf.com,🔰国外流量
+  - DOMAIN-SUFFIX,wire.com,🔰国外流量
+  - DOMAIN-SUFFIX,wordpress.com,🔰国外流量
+  - DOMAIN-SUFFIX,workflow.is,🔰国外流量
+  - DOMAIN-SUFFIX,worldcat.org,🔰国外流量
+  - DOMAIN-SUFFIX,wsj.com,🔰国外流量
+  - DOMAIN-SUFFIX,wsj.net,🔰国外流量
+  - DOMAIN-SUFFIX,xhamster.com,🔰国外流量
+  - DOMAIN-SUFFIX,xn--90wwvt03e.com,🔰国外流量
+  - DOMAIN-SUFFIX,xn--i2ru8q2qg.com,🔰国外流量
+  - DOMAIN-SUFFIX,xnxx.com,🔰国外流量
+  - DOMAIN-SUFFIX,xvideos.com,🔰国外流量
+  - DOMAIN-SUFFIX,yahoo.com,🔰国外流量
+  - DOMAIN-SUFFIX,yandex.ru,🔰国外流量
+  - DOMAIN-SUFFIX,ycombinator.com,🔰国外流量
+  - DOMAIN-SUFFIX,yesasia.com,🔰国外流量
+  - DOMAIN-SUFFIX,yes-news.com,🔰国外流量
+  - DOMAIN-SUFFIX,yomiuri.co.jp,🔰国外流量
+  - DOMAIN-SUFFIX,you-get.org,🔰国外流量
+  - DOMAIN-SUFFIX,zaobao.com,🔰国外流量
+  - DOMAIN-SUFFIX,zb.com,🔰国外流量
+  - DOMAIN-SUFFIX,zello.com,🔰国外流量
+  - DOMAIN-SUFFIX,zeronet.io,🔰国外流量
+  - DOMAIN-SUFFIX,zoom.us,🔰国外流量
+  - DOMAIN-KEYWORD,github,🔰国外流量
+  - DOMAIN-KEYWORD,jav,🔰国外流量
+  - DOMAIN-KEYWORD,pinterest,🔰国外流量
+  - DOMAIN-KEYWORD,porn,🔰国外流量
+  - DOMAIN-KEYWORD,wikileaks,🔰国外流量
+  - DOMAIN-SUFFIX,apartmentratings.com,🔰国外流量
+  - DOMAIN-SUFFIX,apartments.com,🔰国外流量
+  - DOMAIN-SUFFIX,bankmobilevibe.com,🔰国外流量
+  - DOMAIN-SUFFIX,bing.com,🔰国外流量
+  - DOMAIN-SUFFIX,booktopia.com.au,🔰国外流量
+  - DOMAIN-SUFFIX,cccat.io,🔰国外流量
+  - DOMAIN-SUFFIX,centauro.com.br,🔰国外流量
+  - DOMAIN-SUFFIX,clearsurance.com,🔰国外流量
+  - DOMAIN-SUFFIX,costco.com,🔰国外流量
+  - DOMAIN-SUFFIX,crackle.com,🔰国外流量
+  - DOMAIN-SUFFIX,depositphotos.cn,🔰国外流量
+  - DOMAIN-SUFFIX,dish.com,🔰国外流量
+  - DOMAIN-SUFFIX,dmm.co.jp,🔰国外流量
+  - DOMAIN-SUFFIX,dmm.com,🔰国外流量
+  - DOMAIN-SUFFIX,dnvod.tv,🔰国外流量
+  - DOMAIN-SUFFIX,esurance.com,🔰国外流量
+  - DOMAIN-SUFFIX,extmatrix.com,🔰国外流量
+  - DOMAIN-SUFFIX,fastpic.ru,🔰国外流量
+  - DOMAIN-SUFFIX,flipboard.com,🔰国外流量
+  - DOMAIN-SUFFIX,fnac.be,🔰国外流量
+  - DOMAIN-SUFFIX,fnac.com,🔰国外流量
+  - DOMAIN-SUFFIX,funkyimg.com,🔰国外流量
+  - DOMAIN-SUFFIX,fxnetworks.com,🔰国外流量
+  - DOMAIN-SUFFIX,gettyimages.com,🔰国外流量
+  - DOMAIN-SUFFIX,go.com,🔰国外流量
+  - DOMAIN-SUFFIX,here.com,🔰国外流量
+  - DOMAIN-SUFFIX,jcpenney.com,🔰国外流量
+  - DOMAIN-SUFFIX,jiehua.tv,🔰国外流量
+  - DOMAIN-SUFFIX,mailfence.com,🔰国外流量
+  - DOMAIN-SUFFIX,nationwide.com,🔰国外流量
+  - DOMAIN-SUFFIX,nbc.com,🔰国外流量
+  - DOMAIN-SUFFIX,nexon.com,🔰国外流量
+  - DOMAIN-SUFFIX,nordstrom.com,🔰国外流量
+  - DOMAIN-SUFFIX,nordstromimage.com,🔰国外流量
+  - DOMAIN-SUFFIX,nordstromrack.com,🔰国外流量
+  - DOMAIN-SUFFIX,superpages.com,🔰国外流量
+  - DOMAIN-SUFFIX,target.com,🔰国外流量
+  - DOMAIN-SUFFIX,thinkgeek.com,🔰国外流量
+  - DOMAIN-SUFFIX,tracfone.com,🔰国外流量
+  - DOMAIN-SUFFIX,unity3d.com,🔰国外流量
+  - DOMAIN-SUFFIX,uploader.jp,🔰国外流量
+  - DOMAIN-SUFFIX,vevo.com,🔰国外流量
+  - DOMAIN-SUFFIX,viu.tv,🔰国外流量
+  - DOMAIN-SUFFIX,vk.com,🔰国外流量
+  - DOMAIN-SUFFIX,vsco.co,🔰国外流量
+  - DOMAIN-SUFFIX,xfinity.com,🔰国外流量
+  - DOMAIN-SUFFIX,zattoo.com,🔰国外流量
+  - DOMAIN,testflight.apple.com,🔰国外流量
+  - DOMAIN-SUFFIX,appsto.re,🔰国外流量
+  - DOMAIN,books.itunes.apple.com,🔰国外流量
+  - DOMAIN,hls.itunes.apple.com,🔰国外流量
+  - DOMAIN,apps.apple.com,🔰国外流量
+  - DOMAIN,itunes.apple.com,🔰国外流量
+  - DOMAIN,api-glb-sea.smoot.apple.com,🔰国外流量
+  - DOMAIN,lookup-api.apple.com,🔰国外流量
+  - DOMAIN-SUFFIX,abc.xyz,🔰国外流量
+  - DOMAIN-SUFFIX,android.com,🔰国外流量
+  - DOMAIN-SUFFIX,androidify.com,🔰国外流量
+  - DOMAIN-SUFFIX,dialogflow.com,🔰国外流量
+  - DOMAIN-SUFFIX,autodraw.com,🔰国外流量
+  - DOMAIN-SUFFIX,capitalg.com,🔰国外流量
+  - DOMAIN-SUFFIX,certificate-transparency.org,🔰国外流量
+  - DOMAIN-SUFFIX,chrome.com,🔰国外流量
+  - DOMAIN-SUFFIX,chromeexperiments.com,🔰国外流量
+  - DOMAIN-SUFFIX,chromestatus.com,🔰国外流量
+  - DOMAIN-SUFFIX,chromium.org,🔰国外流量
+  - DOMAIN-SUFFIX,creativelab5.com,🔰国外流量
+  - DOMAIN-SUFFIX,debug.com,🔰国外流量
+  - DOMAIN-SUFFIX,deepmind.com,🔰国外流量
+  - DOMAIN-SUFFIX,firebaseio.com,🔰国外流量
+  - DOMAIN-SUFFIX,getmdl.io,🔰国外流量
+  - DOMAIN-SUFFIX,ggpht.com,🔰国外流量
+  - DOMAIN-SUFFIX,gmail.com,🔰国外流量
+  - DOMAIN-SUFFIX,gmodules.com,🔰国外流量
+  - DOMAIN-SUFFIX,godoc.org,🔰国外流量
+  - DOMAIN-SUFFIX,golang.org,🔰国外流量
+  - DOMAIN-SUFFIX,gstatic.com,🔰国外流量
+  - DOMAIN-SUFFIX,gv.com,🔰国外流量
+  - DOMAIN-SUFFIX,gwtproject.org,🔰国外流量
+  - DOMAIN-SUFFIX,itasoftware.com,🔰国外流量
+  - DOMAIN-SUFFIX,madewithcode.com,🔰国外流量
+  - DOMAIN-SUFFIX,material.io,🔰国外流量
+  - DOMAIN-SUFFIX,polymer-project.org,🔰国外流量
+  - DOMAIN-SUFFIX,admin.recaptcha.net,🔰国外流量
+  - DOMAIN-SUFFIX,recaptcha.net,🔰国外流量
+  - DOMAIN-SUFFIX,shattered.io,🔰国外流量
+  - DOMAIN-SUFFIX,synergyse.com,🔰国外流量
+  - DOMAIN-SUFFIX,tensorflow.org,🔰国外流量
+  - DOMAIN-SUFFIX,tfhub.dev,🔰国外流量
+  - DOMAIN-SUFFIX,tiltbrush.com,🔰国外流量
+  - DOMAIN-SUFFIX,waveprotocol.org,🔰国外流量
+  - DOMAIN-SUFFIX,waymo.com,🔰国外流量
+  - DOMAIN-SUFFIX,webmproject.org,🔰国外流量
+  - DOMAIN-SUFFIX,webrtc.org,🔰国外流量
+  - DOMAIN-SUFFIX,whatbrowser.org,🔰国外流量
+  - DOMAIN-SUFFIX,widevine.com,🔰国外流量
+  - DOMAIN-SUFFIX,x.company,🔰国外流量
+  - DOMAIN-SUFFIX,youtu.be,🔰国外流量
+  - DOMAIN-SUFFIX,yt.be,🔰国外流量
+  - DOMAIN-SUFFIX,ytimg.com,🔰国外流量
+  - DOMAIN-SUFFIX,1drv.com,🔰国外流量
+  - DOMAIN-SUFFIX,1drv.ms,🔰国外流量
+  - DOMAIN-SUFFIX,blob.core.windows.net,🔰国外流量
+  - DOMAIN-SUFFIX,livefilestore.com,🔰国外流量
+  - DOMAIN-SUFFIX,onedrive.com,🔰国外流量
+  - DOMAIN-SUFFIX,storage.live.com,🔰国外流量
+  - DOMAIN-SUFFIX,storage.msn.com,🔰国外流量
+  - DOMAIN,oneclient.sfx.ms,🔰国外流量
+  - DOMAIN-SUFFIX,0rz.tw,🔰国外流量
+  - DOMAIN-SUFFIX,4bluestones.biz,🔰国外流量
+  - DOMAIN-SUFFIX,9bis.net,🔰国外流量
+  - DOMAIN-SUFFIX,allconnected.co,🔰国外流量
+  - DOMAIN-SUFFIX,aol.com,🔰国外流量
+  - DOMAIN-SUFFIX,bcc.com.tw,🔰国外流量
+  - DOMAIN-SUFFIX,bit.ly,🔰国外流量
+  - DOMAIN-SUFFIX,bitshare.com,🔰国外流量
+  - DOMAIN-SUFFIX,blog.jp,🔰国外流量
+  - DOMAIN-SUFFIX,blogimg.jp,🔰国外流量
+  - DOMAIN-SUFFIX,blogtd.org,🔰国外流量
+  - DOMAIN-SUFFIX,broadcast.co.nz,🔰国外流量
+  - DOMAIN-SUFFIX,camfrog.com,🔰国外流量
+  - DOMAIN-SUFFIX,cfos.de,🔰国外流量
+  - DOMAIN-SUFFIX,citypopulation.de,🔰国外流量
+  - DOMAIN-SUFFIX,cloudfront.net,🔰国外流量
+  - DOMAIN-SUFFIX,ctitv.com.tw,🔰国外流量
+  - DOMAIN-SUFFIX,cuhk.edu.hk,🔰国外流量
+  - DOMAIN-SUFFIX,cusu.hk,🔰国外流量
+  - DOMAIN-SUFFIX,discord.gg,🔰国外流量
+  - DOMAIN-SUFFIX,discuss.com.hk,🔰国外流量
+  - DOMAIN-SUFFIX,dropboxapi.com,🔰国外流量
+  - DOMAIN-SUFFIX,duolingo.cn,🔰国外流量
+  - DOMAIN-SUFFIX,edditstatic.com,🔰国外流量
+  - DOMAIN-SUFFIX,flickriver.com,🔰国外流量
+  - DOMAIN-SUFFIX,focustaiwan.tw,🔰国外流量
+  - DOMAIN-SUFFIX,free.fr,🔰国外流量
+  - DOMAIN-SUFFIX,gigacircle.com,🔰国外流量
+  - DOMAIN-SUFFIX,hk-pub.com,🔰国外流量
+  - DOMAIN-SUFFIX,hosting.co.uk,🔰国外流量
+  - DOMAIN-SUFFIX,hwcdn.net,🔰国外流量
+  - DOMAIN-SUFFIX,ifixit.com,🔰国外流量
+  - DOMAIN-SUFFIX,iphone4hongkong.com,🔰国外流量
+  - DOMAIN-SUFFIX,iphonetaiwan.org,🔰国外流量
+  - DOMAIN-SUFFIX,iptvbin.com,🔰国外流量
+  - DOMAIN-SUFFIX,linksalpha.com,🔰国外流量
+  - DOMAIN-SUFFIX,manyvids.com,🔰国外流量
+  - DOMAIN-SUFFIX,myactimes.com,🔰国外流量
+  - DOMAIN-SUFFIX,newsblur.com,🔰国外流量
+  - DOMAIN-SUFFIX,now.im,🔰国外流量
+  - DOMAIN-SUFFIX,nowe.com,🔰国外流量
+  - DOMAIN-SUFFIX,redditlist.com,🔰国外流量
+  - DOMAIN-SUFFIX,s3.amazonaws.com,🔰国外流量
+  - DOMAIN-SUFFIX,signal.org,🔰国外流量
+  - DOMAIN-SUFFIX,smartmailcloud.com,🔰国外流量
+  - DOMAIN-SUFFIX,sparknotes.com,🔰国外流量
+  - DOMAIN-SUFFIX,streetvoice.com,🔰国外流量
+  - DOMAIN-SUFFIX,supertop.co,🔰国外流量
+  - DOMAIN-SUFFIX,tv.com,🔰国外流量
+  - DOMAIN-SUFFIX,typepad.com,🔰国外流量
+  - DOMAIN-SUFFIX,udnbkk.com,🔰国外流量
+  - DOMAIN-SUFFIX,urbanairship.com,🔰国外流量
+  - DOMAIN-SUFFIX,whispersystems.org,🔰国外流量
+  - DOMAIN-SUFFIX,wikia.com,🔰国外流量
+  - DOMAIN-SUFFIX,wn.com,🔰国外流量
+  - DOMAIN-SUFFIX,wolframalpha.com,🔰国外流量
+  - DOMAIN-SUFFIX,x-art.com,🔰国外流量
+  - DOMAIN-SUFFIX,yimg.com,🔰国外流量
+  - DOMAIN,api.steampowered.com,🔰国外流量
+  - DOMAIN,store.steampowered.com,🔰国外流量
+
+  - DOMAIN-SUFFIX,aaplimg.com,🍎苹果服务
+  - DOMAIN-SUFFIX,apple.co,🍎苹果服务
+  - DOMAIN-SUFFIX,apple.com,🍎苹果服务
+  - DOMAIN-SUFFIX,apple-cloudkit.com,🍎苹果服务
+  - DOMAIN-SUFFIX,appstore.com,🍎苹果服务
+  - DOMAIN-SUFFIX,cdn-apple.com,🍎苹果服务
+  - DOMAIN-SUFFIX,crashlytics.com,🍎苹果服务
+  - DOMAIN-SUFFIX,icloud.com,🍎苹果服务
+  - DOMAIN-SUFFIX,icloud-content.com,🍎苹果服务
+  - DOMAIN-SUFFIX,me.com,🍎苹果服务
+  - DOMAIN-SUFFIX,mzstatic.com,🍎苹果服务
+  - DOMAIN,www-cdn.icloud.com.akadns.net,🍎苹果服务
+
+  - DOMAIN-SUFFIX,t.me,✈️Telegram
+  - DOMAIN-SUFFIX,tdesktop.com,✈️Telegram
+  - DOMAIN-SUFFIX,telegra.ph,✈️Telegram
+  - DOMAIN-SUFFIX,telegram.me,✈️Telegram
+  - DOMAIN-SUFFIX,telegram.org,✈️Telegram
+  - IP-CIDR,91.108.4.0/22,✈️Telegram,no-resolve
+  - IP-CIDR,91.108.8.0/22,✈️Telegram,no-resolve
+  - IP-CIDR,91.108.12.0/22,✈️Telegram,no-resolve
+  - IP-CIDR,91.108.16.0/22,✈️Telegram,no-resolve
+  - IP-CIDR,91.108.56.0/22,✈️Telegram,no-resolve
+  - IP-CIDR,149.154.160.0/20,✈️Telegram,no-resolve
+  - IP-CIDR6,2001:b28:f23d::/48,✈️Telegram,no-resolve
+  - IP-CIDR6,2001:b28:f23f::/48,✈️Telegram,no-resolve
+  - IP-CIDR6,2001:67c:4e8::/48,✈️Telegram,no-resolve
+
+  - DOMAIN-SUFFIX,googlevideo.com,🎬Youtube
+  - DOMAIN-SUFFIX,youtube.com,🎬Youtube
+  - DOMAIN,youtubei.googleapis.com,🎬Youtube
+
+  - DOMAIN-SUFFIX,netflix.com,🎬Netflix
+  - DOMAIN-SUFFIX,netflix.net,🎬Netflix
+  - DOMAIN-SUFFIX,nflxext.com,🎬Netflix
+  - DOMAIN-SUFFIX,nflximg.com,🎬Netflix
+  - DOMAIN-SUFFIX,nflximg.net,🎬Netflix
+  - DOMAIN-SUFFIX,nflxso.net,🎬Netflix
+  - DOMAIN-SUFFIX,nflxvideo.net,🎬Netflix
+  - DOMAIN-SUFFIX,netflixdnstest0.com,🎬Netflix
+  - DOMAIN-SUFFIX,netflixdnstest1.com,🎬Netflix
+  - DOMAIN-SUFFIX,netflixdnstest2.com,🎬Netflix
+  - DOMAIN-SUFFIX,netflixdnstest3.com,🎬Netflix
+  - DOMAIN-SUFFIX,netflixdnstest4.com,🎬Netflix
+  - DOMAIN-SUFFIX,netflixdnstest5.com,🎬Netflix
+  - DOMAIN-SUFFIX,netflixdnstest6.com,🎬Netflix
+  - DOMAIN-SUFFIX,netflixdnstest7.com,🎬Netflix
+  - DOMAIN-SUFFIX,netflixdnstest8.com,🎬Netflix
+  - DOMAIN-SUFFIX,netflixdnstest9.com,🎬Netflix
+  - IP-CIDR,23.246.0.0/18,🎬Netflix,no-resolve
+  - IP-CIDR,37.77.184.0/21,🎬Netflix,no-resolve
+  - IP-CIDR,45.57.0.0/17,🎬Netflix,no-resolve
+  - IP-CIDR,64.120.128.0/17,🎬Netflix,no-resolve
+  - IP-CIDR,66.197.128.0/17,🎬Netflix,no-resolve
+  - IP-CIDR,108.175.32.0/20,🎬Netflix,no-resolve
+  - IP-CIDR,192.173.64.0/18,🎬Netflix,no-resolve
+  - IP-CIDR,198.38.96.0/19,🎬Netflix,no-resolve
+  - IP-CIDR,198.45.48.0/20,🎬Netflix,no-resolve
+
+  - DOMAIN-SUFFIX,deezer.com,🎬国外媒体
+  - DOMAIN-SUFFIX,dzcdn.net,🎬国外媒体
+  - DOMAIN-SUFFIX,kkbox.com,🎬国外媒体
+  - DOMAIN-SUFFIX,kkbox.com.tw,🎬国外媒体
+  - DOMAIN-SUFFIX,kfs.io,🎬国外媒体
+  - DOMAIN-SUFFIX,joox.com,🎬国外媒体
+  - DOMAIN-SUFFIX,pandora.com,🎬国外媒体
+  - DOMAIN-SUFFIX,p-cdn.us,🎬国外媒体
+  - DOMAIN-SUFFIX,sndcdn.com,🎬国外媒体
+  - DOMAIN-SUFFIX,soundcloud.com,🎬国外媒体
+  - DOMAIN-SUFFIX,pscdn.co,🎬国外媒体
+  - DOMAIN-SUFFIX,scdn.co,🎬国外媒体
+  - DOMAIN-SUFFIX,spotify.com,🎬国外媒体
+  - DOMAIN-SUFFIX,spoti.fi,🎬国外媒体
+  - DOMAIN-KEYWORD,spotify.com,🎬国外媒体
+  - DOMAIN-KEYWORD,-spotify-com,🎬国外媒体
+  - DOMAIN-SUFFIX,tidal.com,🎬国外媒体
+  - DOMAIN-SUFFIX,c4assets.com,🎬国外媒体
+  - DOMAIN-SUFFIX,channel4.com,🎬国外媒体
+  - DOMAIN-SUFFIX,abema.io,🎬国外媒体
+  - DOMAIN-SUFFIX,ameba.jp,🎬国外媒体
+  - DOMAIN-SUFFIX,abema.tv,🎬国外媒体
+  - DOMAIN-SUFFIX,hayabusa.io,🎬国外媒体
+  - DOMAIN,abematv.akamaized.net,🎬国外媒体
+  - DOMAIN,ds-linear-abematv.akamaized.net,🎬国外媒体
+  - DOMAIN,ds-vod-abematv.akamaized.net,🎬国外媒体
+  - DOMAIN,linear-abematv.akamaized.net,🎬国外媒体
+  - DOMAIN-SUFFIX,aiv-cdn.net,🎬国外媒体
+  - DOMAIN-SUFFIX,aiv-delivery.net,🎬国外媒体
+  - DOMAIN-SUFFIX,amazonvideo.com,🎬国外媒体
+  - DOMAIN-SUFFIX,primevideo.com,🎬国外媒体
+  - DOMAIN,avodmp4s3ww-a.akamaihd.net,🎬国外媒体
+  - DOMAIN,d25xi40x97liuc.cloudfront.net,🎬国外媒体
+  - DOMAIN,dmqdd6hw24ucf.cloudfront.net,🎬国外媒体
+  - DOMAIN,d22qjgkvxw22r6.cloudfront.net,🎬国外媒体
+  - DOMAIN,d1v5ir2lpwr8os.cloudfront.net,🎬国外媒体
+  - DOMAIN-KEYWORD,avoddashs,🎬国外媒体
+  - DOMAIN-SUFFIX,bahamut.com.tw,🎬国外媒体
+  - DOMAIN-SUFFIX,gamer.com.tw,🎬国外媒体
+  - DOMAIN,gamer-cds.cdn.hinet.net,🎬国外媒体
+  - DOMAIN,gamer2-cds.cdn.hinet.net,🎬国外媒体
+  - DOMAIN-SUFFIX,bbc.co.uk,🎬国外媒体
+  - DOMAIN-SUFFIX,bbci.co.uk,🎬国外媒体
+  - DOMAIN-KEYWORD,bbcfmt,🎬国外媒体
+  - DOMAIN-KEYWORD,uk-live,🎬国外媒体
+  - DOMAIN-SUFFIX,dazn.com,🎬国外媒体
+  - DOMAIN-SUFFIX,dazn-api.com,🎬国外媒体
+  - DOMAIN,d151l6v8er5bdm.cloudfront.net,🎬国外媒体
+  - DOMAIN-KEYWORD,voddazn,🎬国外媒体
+  - DOMAIN-SUFFIX,bamgrid.com,🎬国外媒体
+  - DOMAIN-SUFFIX,disney-plus.net,🎬国外媒体
+  - DOMAIN-SUFFIX,disneyplus.com,🎬国外媒体
+  - DOMAIN-SUFFIX,dssott.com,🎬国外媒体
+  - DOMAIN,cdn.registerdisney.go.com,🎬国外媒体
+  - DOMAIN-SUFFIX,encoretvb.com,🎬国外媒体
+  - DOMAIN,edge.api.brightcove.com,🎬国外媒体
+  - DOMAIN,bcbolt446c5271-a.akamaihd.net,🎬国外媒体
+  - DOMAIN-SUFFIX,fox.com,🎬国外媒体
+  - DOMAIN-SUFFIX,foxdcg.com,🎬国外媒体
+  - DOMAIN-SUFFIX,theplatform.com,🎬国外媒体
+  - DOMAIN-SUFFIX,uplynk.com,🎬国外媒体
+  - DOMAIN-SUFFIX,hbo.com,🎬国外媒体
+  - DOMAIN-SUFFIX,hbogo.com,🎬国外媒体
+  - DOMAIN-SUFFIX,hbonow.com,🎬国外媒体
+  - DOMAIN-SUFFIX,hbogoasia.com,🎬国外媒体
+  - DOMAIN-SUFFIX,hbogoasia.hk,🎬国外媒体
+  - DOMAIN,bcbolthboa-a.akamaihd.net,🎬国外媒体
+  - DOMAIN,players.brightcove.net,🎬国外媒体
+  - DOMAIN,s3-ap-southeast-1.amazonaws.com,🎬国外媒体
+  - DOMAIN,dai3fd1oh325y.cloudfront.net,🎬国外媒体
+  - DOMAIN,44wilhpljf.execute-api.ap-southeast-1.amazonaws.com,🎬国外媒体
+  - DOMAIN,hboasia1-i.akamaihd.net,🎬国外媒体
+  - DOMAIN,hboasia2-i.akamaihd.net,🎬国外媒体
+  - DOMAIN,hboasia3-i.akamaihd.net,🎬国外媒体
+  - DOMAIN,hboasia4-i.akamaihd.net,🎬国外媒体
+  - DOMAIN,hboasia5-i.akamaihd.net,🎬国外媒体
+  - DOMAIN,cf-images.ap-southeast-1.prod.boltdns.net,🎬国外媒体
+  - DOMAIN-SUFFIX,5itv.tv,🎬国外媒体
+  - DOMAIN-SUFFIX,ocnttv.com,🎬国外媒体
+  - DOMAIN-SUFFIX,hulu.com,🎬国外媒体
+  - DOMAIN-SUFFIX,huluim.com,🎬国外媒体
+  - DOMAIN-SUFFIX,hulustream.com,🎬国外媒体
+  - DOMAIN-SUFFIX,happyon.jp,🎬国外媒体
+  - DOMAIN-SUFFIX,hulu.jp,🎬国外媒体
+  - DOMAIN-SUFFIX,itv.com,🎬国外媒体
+  - DOMAIN-SUFFIX,itvstatic.com,🎬国外媒体
+  - DOMAIN,itvpnpmobile-a.akamaihd.net,🎬国外媒体
+  - DOMAIN-SUFFIX,kktv.com.tw,🎬国外媒体
+  - DOMAIN-SUFFIX,kktv.me,🎬国外媒体
+  - DOMAIN,kktv-theater.kk.stream,🎬国外媒体
+  - DOMAIN-SUFFIX,linetv.tw,🎬国外媒体
+  - DOMAIN,d3c7rimkq79yfu.cloudfront.net,🎬国外媒体
+  - DOMAIN-SUFFIX,litv.tv,🎬国外媒体
+  - DOMAIN,litvfreemobile-hichannel.cdn.hinet.net,🎬国外媒体
+  - DOMAIN-SUFFIX,channel5.com,🎬国外媒体
+  - DOMAIN-SUFFIX,my5.tv,🎬国外媒体
+  - DOMAIN,d349g9zuie06uo.cloudfront.net,🎬国外媒体
+  - DOMAIN-SUFFIX,mytvsuper.com,🎬国外媒体
+  - DOMAIN-SUFFIX,tvb.com,🎬国外媒体
+  - DOMAIN-SUFFIX,netflix.com,🎬国外媒体
+  - DOMAIN-SUFFIX,netflix.net,🎬国外媒体
+  - DOMAIN-SUFFIX,nflxext.com,🎬国外媒体
+  - DOMAIN-SUFFIX,nflximg.com,🎬国外媒体
+  - DOMAIN-SUFFIX,nflximg.net,🎬国外媒体
+  - DOMAIN-SUFFIX,nflxso.net,🎬国外媒体
+  - DOMAIN-SUFFIX,nflxvideo.net,🎬国外媒体
+  - DOMAIN-SUFFIX,netflixdnstest0.com,🎬国外媒体
+  - DOMAIN-SUFFIX,netflixdnstest1.com,🎬国外媒体
+  - DOMAIN-SUFFIX,netflixdnstest2.com,🎬国外媒体
+  - DOMAIN-SUFFIX,netflixdnstest3.com,🎬国外媒体
+  - DOMAIN-SUFFIX,netflixdnstest4.com,🎬国外媒体
+  - DOMAIN-SUFFIX,netflixdnstest5.com,🎬国外媒体
+  - DOMAIN-SUFFIX,netflixdnstest6.com,🎬国外媒体
+  - DOMAIN-SUFFIX,netflixdnstest7.com,🎬国外媒体
+  - DOMAIN-SUFFIX,netflixdnstest8.com,🎬国外媒体
+  - DOMAIN-SUFFIX,netflixdnstest9.com,🎬国外媒体
+  - IP-CIDR,23.246.0.0/18,🎬国外媒体,no-resolve
+  - IP-CIDR,37.77.184.0/21,🎬国外媒体,no-resolve
+  - IP-CIDR,45.57.0.0/17,🎬国外媒体,no-resolve
+  - IP-CIDR,64.120.128.0/17,🎬国外媒体,no-resolve
+  - IP-CIDR,66.197.128.0/17,🎬国外媒体,no-resolve
+  - IP-CIDR,108.175.32.0/20,🎬国外媒体,no-resolve
+  - IP-CIDR,192.173.64.0/18,🎬国外媒体,no-resolve
+  - IP-CIDR,198.38.96.0/19,🎬国外媒体,no-resolve
+  - IP-CIDR,198.45.48.0/20,🎬国外媒体,no-resolve
+  - DOMAIN-SUFFIX,dmc.nico,🎬国外媒体
+  - DOMAIN-SUFFIX,nicovideo.jp,🎬国外媒体
+  - DOMAIN-SUFFIX,nimg.jp,🎬国外媒体
+  - DOMAIN-SUFFIX,socdm.com,🎬国外媒体
+  - DOMAIN-SUFFIX,pbs.org,🎬国外媒体
+  - DOMAIN-SUFFIX,phncdn.com,🎬国外媒体
+  - DOMAIN-SUFFIX,pornhub.com,🎬国外媒体
+  - DOMAIN-SUFFIX,pornhubpremium.com,🎬国外媒体
+  - DOMAIN-SUFFIX,skyking.com.tw,🎬国外媒体
+  - DOMAIN,hamifans.emome.net,🎬国外媒体
+  - DOMAIN-SUFFIX,twitch.tv,🎬国外媒体
+  - DOMAIN-SUFFIX,twitchcdn.net,🎬国外媒体
+  - DOMAIN-SUFFIX,ttvnw.net,🎬国外媒体
+  - DOMAIN-SUFFIX,jtvnw.net,🎬国外媒体
+  - DOMAIN-SUFFIX,viu.com,🎬国外媒体
+  - DOMAIN-SUFFIX,viu.tv,🎬国外媒体
+  - DOMAIN,api.viu.now.com,🎬国外媒体
+  - DOMAIN,d1k2us671qcoau.cloudfront.net,🎬国外媒体
+  - DOMAIN,d2anahhhmp1ffz.cloudfront.net,🎬国外媒体
+  - DOMAIN,dfp6rglgjqszk.cloudfront.net,🎬国外媒体
+  - DOMAIN-SUFFIX,googlevideo.com,🎬国外媒体
+  - DOMAIN-SUFFIX,youtube.com,🎬国外媒体
+  - DOMAIN,youtubei.googleapis.com,🎬国外媒体
+
+  - DOMAIN-SUFFIX,local,DIRECT
+  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
+  - IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
+  - IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
+  - IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
+  - IP-CIDR,100.64.0.0/10,DIRECT,no-resolve
+  - IP-CIDR6,::1/128,DIRECT,no-resolve
+  - IP-CIDR6,fc00::/7,DIRECT,no-resolve
+  - IP-CIDR6,fe80::/10,DIRECT,no-resolve
+  - IP-CIDR6,fd00::/8,DIRECT,no-resolve
+  - DOMAIN,app.adjust.com,DIRECT
+  - DOMAIN-SUFFIX,googletraveladservices.com,DIRECT
+  - DOMAIN,dl.google.com,DIRECT
+  - DOMAIN,mtalk.google.com,DIRECT
+  - DOMAIN,livew.l.qq.com,DIRECT
+  - DOMAIN,vd.l.qq.com,DIRECT
+  - DOMAIN,analytics.strava.com,DIRECT
+  - DOMAIN,msg.umeng.com,DIRECT
+  - DOMAIN,msg.umengcloud.com,DIRECT
+  - DOMAIN-SUFFIX,qhres.com,DIRECT
+  - DOMAIN-SUFFIX,qhimg.com,DIRECT
+  - DOMAIN-SUFFIX,akadns.net,DIRECT
+  - DOMAIN-SUFFIX,alibaba.com,DIRECT
+  - DOMAIN-SUFFIX,alicdn.com,DIRECT
+  - DOMAIN-SUFFIX,alikunlun.com,DIRECT
+  - DOMAIN-SUFFIX,alipay.com,DIRECT
+  - DOMAIN-SUFFIX,amap.com,DIRECT
+  - DOMAIN-SUFFIX,autonavi.com,DIRECT
+  - DOMAIN-SUFFIX,dingtalk.com,DIRECT
+  - DOMAIN-SUFFIX,mxhichina.com,DIRECT
+  - DOMAIN-SUFFIX,soku.com,DIRECT
+  - DOMAIN-SUFFIX,taobao.com,DIRECT
+  - DOMAIN-SUFFIX,tmall.com,DIRECT
+  - DOMAIN-SUFFIX,tmall.hk,DIRECT
+  - DOMAIN-SUFFIX,ykimg.com,DIRECT
+  - DOMAIN-SUFFIX,youku.com,DIRECT
+  - DOMAIN-SUFFIX,xiami.com,DIRECT
+  - DOMAIN-SUFFIX,xiami.net,DIRECT
+  - DOMAIN-SUFFIX,aaplimg.com,DIRECT
+  - DOMAIN-SUFFIX,apple.co,DIRECT
+  - DOMAIN-SUFFIX,apple.com,DIRECT
+  - DOMAIN-SUFFIX,apple-cloudkit.com,DIRECT
+  - DOMAIN-SUFFIX,appstore.com,DIRECT
+  - DOMAIN-SUFFIX,cdn-apple.com,DIRECT
+  - DOMAIN-SUFFIX,crashlytics.com,DIRECT
+  - DOMAIN-SUFFIX,icloud.com,DIRECT
+  - DOMAIN-SUFFIX,icloud-content.com,DIRECT
+  - DOMAIN-SUFFIX,me.com,DIRECT
+  - DOMAIN-SUFFIX,mzstatic.com,DIRECT
+  - DOMAIN,www-cdn.icloud.com.akadns.net,DIRECT
+  - DOMAIN-SUFFIX,baidu.com,DIRECT
+  - DOMAIN-SUFFIX,baidubcr.com,DIRECT
+  - DOMAIN-SUFFIX,bdstatic.com,DIRECT
+  - DOMAIN-SUFFIX,yunjiasu-cdn.net,DIRECT
+  - DOMAIN-SUFFIX,acgvideo.com,DIRECT
+  - DOMAIN-SUFFIX,biliapi.com,DIRECT
+  - DOMAIN-SUFFIX,biliapi.net,DIRECT
+  - DOMAIN-SUFFIX,bilibili.com,DIRECT
+  - DOMAIN-SUFFIX,bilibili.tv,DIRECT
+  - DOMAIN-SUFFIX,hdslb.com,DIRECT
+  - DOMAIN-SUFFIX,blizzard.com,DIRECT
+  - DOMAIN-SUFFIX,battle.net,DIRECT
+  - DOMAIN,blzddist1-a.akamaihd.net,DIRECT
+  - DOMAIN-SUFFIX,feiliao.com,DIRECT
+  - DOMAIN-SUFFIX,pstatp.com,DIRECT
+  - DOMAIN-SUFFIX,snssdk.com,DIRECT
+  - DOMAIN-SUFFIX,iesdouyin.com,DIRECT
+  - DOMAIN-SUFFIX,toutiao.com,DIRECT
+  - DOMAIN-SUFFIX,cctv.com,DIRECT
+  - DOMAIN-SUFFIX,cctvpic.com,DIRECT
+  - DOMAIN-SUFFIX,livechina.com,DIRECT
+  - DOMAIN-SUFFIX,didialift.com,DIRECT
+  - DOMAIN-SUFFIX,didiglobal.com,DIRECT
+  - DOMAIN-SUFFIX,udache.com,DIRECT
+  - DOMAIN-SUFFIX,343480.com,DIRECT
+  - DOMAIN-SUFFIX,baduziyuan.com,DIRECT
+  - DOMAIN-SUFFIX,com-hs-hkdy.com,DIRECT
+  - DOMAIN-SUFFIX,czybjz.com,DIRECT
+  - DOMAIN-SUFFIX,dandanzan.com,DIRECT
+  - DOMAIN-SUFFIX,fjhps.com,DIRECT
+  - DOMAIN-SUFFIX,kuyunbo.club,DIRECT
+  - DOMAIN-SUFFIX,21cn.com,DIRECT
+  - DOMAIN-SUFFIX,hitv.com,DIRECT
+  - DOMAIN-SUFFIX,mgtv.com,DIRECT
+  - DOMAIN-SUFFIX,iqiyi.com,DIRECT
+  - DOMAIN-SUFFIX,iqiyipic.com,DIRECT
+  - DOMAIN-SUFFIX,71.am.com,DIRECT
+  - DOMAIN-SUFFIX,jd.com,DIRECT
+  - DOMAIN-SUFFIX,jd.hk,DIRECT
+  - DOMAIN-SUFFIX,jdpay.com,DIRECT
+  - DOMAIN-SUFFIX,360buyimg.com,DIRECT
+  - DOMAIN-SUFFIX,iciba.com,DIRECT
+  - DOMAIN-SUFFIX,ksosoft.com,DIRECT
+  - DOMAIN-SUFFIX,meitu.com,DIRECT
+  - DOMAIN-SUFFIX,meitudata.com,DIRECT
+  - DOMAIN-SUFFIX,meitustat.com,DIRECT
+  - DOMAIN-SUFFIX,meipai.com,DIRECT
+  - DOMAIN-SUFFIX,duokan.com,DIRECT
+  - DOMAIN-SUFFIX,mi-img.com,DIRECT
+  - DOMAIN-SUFFIX,miui.com,DIRECT
+  - DOMAIN-SUFFIX,miwifi.com,DIRECT
+  - DOMAIN-SUFFIX,xiaomi.com,DIRECT
+  - DOMAIN-SUFFIX,microsoft.com,DIRECT
+  - DOMAIN-SUFFIX,msecnd.net,DIRECT
+  - DOMAIN-SUFFIX,office365.com,DIRECT
+  - DOMAIN-SUFFIX,outlook.com,DIRECT
+  - DOMAIN-SUFFIX,s-microsoft.com,DIRECT
+  - DOMAIN-SUFFIX,visualstudio.com,DIRECT
+  - DOMAIN-SUFFIX,windows.com,DIRECT
+  - DOMAIN-SUFFIX,windowsupdate.com,DIRECT
+  - DOMAIN,officecdn-microsoft-com.akamaized.net,DIRECT
+  - DOMAIN-SUFFIX,163.com,DIRECT
+  - DOMAIN-SUFFIX,126.net,DIRECT
+  - DOMAIN-SUFFIX,127.net,DIRECT
+  - DOMAIN-SUFFIX,163yun.com,DIRECT
+  - DOMAIN-SUFFIX,lofter.com,DIRECT
+  - DOMAIN-SUFFIX,netease.com,DIRECT
+  - DOMAIN-SUFFIX,ydstatic.com,DIRECT
+  - DOMAIN-SUFFIX,sina.com,DIRECT
+  - DOMAIN-SUFFIX,weibo.com,DIRECT
+  - DOMAIN-SUFFIX,weibocdn.com,DIRECT
+  - DOMAIN-SUFFIX,sohu.com,DIRECT
+  - DOMAIN-SUFFIX,sohucs.com,DIRECT
+  - DOMAIN-SUFFIX,sohu-inc.com,DIRECT
+  - DOMAIN-SUFFIX,v-56.com,DIRECT
+  - DOMAIN-SUFFIX,sogo.com,DIRECT
+  - DOMAIN-SUFFIX,sogou.com,DIRECT
+  - DOMAIN-SUFFIX,sogoucdn.com,DIRECT
+  - DOMAIN-SUFFIX,steampowered.com,DIRECT
+  - DOMAIN-SUFFIX,steam-chat.com,DIRECT
+  - DOMAIN-SUFFIX,steamgames.com,DIRECT
+  - DOMAIN-SUFFIX,steamusercontent.com,DIRECT
+  - DOMAIN-SUFFIX,steamcontent.com,DIRECT
+  - DOMAIN-SUFFIX,steamstatic.com,DIRECT
+  - DOMAIN-SUFFIX,steamcdn-a.akamaihd.net,DIRECT
+  - DOMAIN-SUFFIX,steamstat.us,DIRECT
+  - DOMAIN-SUFFIX,gtimg.com,DIRECT
+  - DOMAIN-SUFFIX,idqqimg.com,DIRECT
+  - DOMAIN-SUFFIX,igamecj.com,DIRECT
+  - DOMAIN-SUFFIX,myapp.com,DIRECT
+  - DOMAIN-SUFFIX,myqcloud.com,DIRECT
+  - DOMAIN-SUFFIX,qq.com,DIRECT
+  - DOMAIN-SUFFIX,tencent.com,DIRECT
+  - DOMAIN-SUFFIX,tencent-cloud.net,DIRECT
+  - DOMAIN-SUFFIX,jstucdn.com,DIRECT
+  - DOMAIN-SUFFIX,zimuzu.io,DIRECT
+  - DOMAIN-SUFFIX,zimuzu.tv,DIRECT
+  - DOMAIN-SUFFIX,zmz2019.com,DIRECT
+  - DOMAIN-SUFFIX,zmzapi.com,DIRECT
+  - DOMAIN-SUFFIX,zmzapi.net,DIRECT
+  - DOMAIN-SUFFIX,zmzfile.com,DIRECT
+  - DOMAIN-SUFFIX,ccgslb.com,DIRECT
+  - DOMAIN-SUFFIX,ccgslb.net,DIRECT
+  - DOMAIN-SUFFIX,chinanetcenter.com,DIRECT
+  - DOMAIN-SUFFIX,meixincdn.com,DIRECT
+  - DOMAIN-SUFFIX,ourdvs.com,DIRECT
+  - DOMAIN-SUFFIX,staticdn.net,DIRECT
+  - DOMAIN-SUFFIX,wangsu.com,DIRECT
+  - DOMAIN-SUFFIX,ipip.net,DIRECT
+  - DOMAIN-SUFFIX,ip.la,DIRECT
+  - DOMAIN-SUFFIX,ip-cdn.com,DIRECT
+  - DOMAIN-SUFFIX,ipv6-test.com,DIRECT
+  - DOMAIN-SUFFIX,test-ipv6.com,DIRECT
+  - DOMAIN-SUFFIX,whatismyip.com,DIRECT
+  - DOMAIN-SUFFIX,netspeedtestmaster.com,DIRECT
+  - DOMAIN,speedtest.macpaw.com,DIRECT
+  - DOMAIN-SUFFIX,awesome-hd.me,DIRECT
+  - DOMAIN-SUFFIX,broadcasthe.net,DIRECT
+  - DOMAIN-SUFFIX,chdbits.co,DIRECT
+  - DOMAIN-SUFFIX,classix-unlimited.co.uk,DIRECT
+  - DOMAIN-SUFFIX,empornium.me,DIRECT
+  - DOMAIN-SUFFIX,gazellegames.net,DIRECT
+  - DOMAIN-SUFFIX,hdchina.org,DIRECT
+  - DOMAIN-SUFFIX,hdsky.me,DIRECT
+  - DOMAIN-SUFFIX,icetorrent.org,DIRECT
+  - DOMAIN-SUFFIX,jpopsuki.eu,DIRECT
+  - DOMAIN-SUFFIX,keepfrds.com,DIRECT
+  - DOMAIN-SUFFIX,madsrevolution.net,DIRECT
+  - DOMAIN-SUFFIX,m-team.cc,DIRECT
+  - DOMAIN-SUFFIX,nanyangpt.com,DIRECT
+  - DOMAIN-SUFFIX,ncore.cc,DIRECT
+  - DOMAIN-SUFFIX,open.cd,DIRECT
+  - DOMAIN-SUFFIX,ourbits.club,DIRECT
+  - DOMAIN-SUFFIX,passthepopcorn.me,DIRECT
+  - DOMAIN-SUFFIX,privatehd.to,DIRECT
+  - DOMAIN-SUFFIX,redacted.ch,DIRECT
+  - DOMAIN-SUFFIX,springsunday.net,DIRECT
+  - DOMAIN-SUFFIX,tjupt.org,DIRECT
+  - DOMAIN-SUFFIX,totheglory.im,DIRECT
+  - DOMAIN-SUFFIX,acm.org,DIRECT
+  - DOMAIN-SUFFIX,acs.org,DIRECT
+  - DOMAIN-SUFFIX,aip.org,DIRECT
+  - DOMAIN-SUFFIX,ams.org,DIRECT
+  - DOMAIN-SUFFIX,annualreviews.org,DIRECT
+  - DOMAIN-SUFFIX,aps.org,DIRECT
+  - DOMAIN-SUFFIX,ascelibrary.org,DIRECT
+  - DOMAIN-SUFFIX,asm.org,DIRECT
+  - DOMAIN-SUFFIX,asme.org,DIRECT
+  - DOMAIN-SUFFIX,astm.org,DIRECT
+  - DOMAIN-SUFFIX,bmj.com,DIRECT
+  - DOMAIN-SUFFIX,cambridge.org,DIRECT
+  - DOMAIN-SUFFIX,cas.org,DIRECT
+  - DOMAIN-SUFFIX,clarivate.com,DIRECT
+  - DOMAIN-SUFFIX,ebscohost.com,DIRECT
+  - DOMAIN-SUFFIX,emerald.com,DIRECT
+  - DOMAIN-SUFFIX,engineeringvillage.com,DIRECT
+  - DOMAIN-SUFFIX,icevirtuallibrary.com,DIRECT
+  - DOMAIN-SUFFIX,ieee.org,DIRECT
+  - DOMAIN-SUFFIX,imf.org,DIRECT
+  - DOMAIN-SUFFIX,iop.org,DIRECT
+  - DOMAIN-SUFFIX,jamanetwork.com,DIRECT
+  - DOMAIN-SUFFIX,jhu.edu,DIRECT
+  - DOMAIN-SUFFIX,jstor.org,DIRECT
+  - DOMAIN-SUFFIX,karger.com,DIRECT
+  - DOMAIN-SUFFIX,libguides.com,DIRECT
+  - DOMAIN-SUFFIX,madsrevolution.net,DIRECT
+  - DOMAIN-SUFFIX,mpg.de,DIRECT
+  - DOMAIN-SUFFIX,myilibrary.com,DIRECT
+  - DOMAIN-SUFFIX,nature.com,DIRECT
+  - DOMAIN-SUFFIX,oecd-ilibrary.org,DIRECT
+  - DOMAIN-SUFFIX,osapublishing.org,DIRECT
+  - DOMAIN-SUFFIX,oup.com,DIRECT
+  - DOMAIN-SUFFIX,ovid.com,DIRECT
+  - DOMAIN-SUFFIX,oxfordartonline.com,DIRECT
+  - DOMAIN-SUFFIX,oxfordbibliographies.com,DIRECT
+  - DOMAIN-SUFFIX,oxfordmusiconline.com,DIRECT
+  - DOMAIN-SUFFIX,pnas.org,DIRECT
+  - DOMAIN-SUFFIX,proquest.com,DIRECT
+  - DOMAIN-SUFFIX,rsc.org,DIRECT
+  - DOMAIN-SUFFIX,sagepub.com,DIRECT
+  - DOMAIN-SUFFIX,sciencedirect.com,DIRECT
+  - DOMAIN-SUFFIX,sciencemag.org,DIRECT
+  - DOMAIN-SUFFIX,scopus.com,DIRECT
+  - DOMAIN-SUFFIX,siam.org,DIRECT
+  - DOMAIN-SUFFIX,spiedigitallibrary.org,DIRECT
+  - DOMAIN-SUFFIX,springer.com,DIRECT
+  - DOMAIN-SUFFIX,springerlink.com,DIRECT
+  - DOMAIN-SUFFIX,tandfonline.com,DIRECT
+  - DOMAIN-SUFFIX,un.org,DIRECT
+  - DOMAIN-SUFFIX,uni-bielefeld.de,DIRECT
+  - DOMAIN-SUFFIX,webofknowledge.com,DIRECT
+  - DOMAIN-SUFFIX,westlaw.com,DIRECT
+  - DOMAIN-SUFFIX,wiley.com,DIRECT
+  - DOMAIN-SUFFIX,worldbank.org,DIRECT
+  - DOMAIN-SUFFIX,worldscientific.com,DIRECT
+  - DOMAIN-SUFFIX,cn,DIRECT
+  - DOMAIN-SUFFIX,360in.com,DIRECT
+  - DOMAIN-SUFFIX,51ym.me,DIRECT
+  - DOMAIN-SUFFIX,8686c.com,DIRECT
+  - DOMAIN-SUFFIX,abchina.com,DIRECT
+  - DOMAIN-SUFFIX,accuweather.com,DIRECT
+  - DOMAIN-SUFFIX,aicoinstorge.com,DIRECT
+  - DOMAIN-SUFFIX,air-matters.com,DIRECT
+  - DOMAIN-SUFFIX,air-matters.io,DIRECT
+  - DOMAIN-SUFFIX,aixifan.com,DIRECT
+  - DOMAIN-SUFFIX,amd.com,DIRECT
+  - DOMAIN-SUFFIX,b612.net,DIRECT
+  - DOMAIN-SUFFIX,bdatu.com,DIRECT
+  - DOMAIN-SUFFIX,beitaichufang.com,DIRECT
+  - DOMAIN-SUFFIX,bjango.com,DIRECT
+  - DOMAIN-SUFFIX,booking.com,DIRECT
+  - DOMAIN-SUFFIX,bstatic.com,DIRECT
+  - DOMAIN-SUFFIX,cailianpress.com,DIRECT
+  - DOMAIN-SUFFIX,camera360.com,DIRECT
+  - DOMAIN-SUFFIX,chinaso.com,DIRECT
+  - DOMAIN-SUFFIX,chua.pro,DIRECT
+  - DOMAIN-SUFFIX,chuimg.com,DIRECT
+  - DOMAIN-SUFFIX,chunyu.mobi,DIRECT
+  - DOMAIN-SUFFIX,chushou.tv,DIRECT
+  - DOMAIN-SUFFIX,cmbchina.com,DIRECT
+  - DOMAIN-SUFFIX,cmbimg.com,DIRECT
+  - DOMAIN-SUFFIX,ctrip.com,DIRECT
+  - DOMAIN-SUFFIX,dfcfw.com,DIRECT
+  - DOMAIN-SUFFIX,docschina.org,DIRECT
+  - DOMAIN-SUFFIX,douban.com,DIRECT
+  - DOMAIN-SUFFIX,doubanio.com,DIRECT
+  - DOMAIN-SUFFIX,douyu.com,DIRECT
+  - DOMAIN-SUFFIX,dxycdn.com,DIRECT
+  - DOMAIN-SUFFIX,dytt8.net,DIRECT
+  - DOMAIN-SUFFIX,eastmoney.com,DIRECT
+  - DOMAIN-SUFFIX,eudic.net,DIRECT
+  - DOMAIN-SUFFIX,feng.com,DIRECT
+  - DOMAIN-SUFFIX,fengkongcloud.com,DIRECT
+  - DOMAIN-SUFFIX,frdic.com,DIRECT
+  - DOMAIN-SUFFIX,futu5.com,DIRECT
+  - DOMAIN-SUFFIX,futunn.com,DIRECT
+  - DOMAIN-SUFFIX,gandi.net,DIRECT
+  - DOMAIN-SUFFIX,geilicdn.com,DIRECT
+  - DOMAIN-SUFFIX,getpricetag.com,DIRECT
+  - DOMAIN-SUFFIX,gifshow.com,DIRECT
+  - DOMAIN-SUFFIX,godic.net,DIRECT
+  - DOMAIN-SUFFIX,hicloud.com,DIRECT
+  - DOMAIN-SUFFIX,hongxiu.com,DIRECT
+  - DOMAIN-SUFFIX,hostbuf.com,DIRECT
+  - DOMAIN-SUFFIX,huxiucdn.com,DIRECT
+  - DOMAIN-SUFFIX,huya.com,DIRECT
+  - DOMAIN-SUFFIX,infinitynewtab.com,DIRECT
+  - DOMAIN-SUFFIX,ithome.com,DIRECT
+  - DOMAIN-SUFFIX,java.com,DIRECT
+  - DOMAIN-SUFFIX,jidian.im,DIRECT
+  - DOMAIN-SUFFIX,kaiyanapp.com,DIRECT
+  - DOMAIN-SUFFIX,kaspersky-labs.com,DIRECT
+  - DOMAIN-SUFFIX,keepcdn.com,DIRECT
+  - DOMAIN-SUFFIX,kkmh.com,DIRECT
+  - DOMAIN-SUFFIX,licdn.com,DIRECT
+  - DOMAIN-SUFFIX,linkedin.com,DIRECT
+  - DOMAIN-SUFFIX,loli.net,DIRECT
+  - DOMAIN-SUFFIX,luojilab.com,DIRECT
+  - DOMAIN-SUFFIX,maoyan.com,DIRECT
+  - DOMAIN-SUFFIX,maoyun.tv,DIRECT
+  - DOMAIN-SUFFIX,meituan.com,DIRECT
+  - DOMAIN-SUFFIX,meituan.net,DIRECT
+  - DOMAIN-SUFFIX,mobike.com,DIRECT
+  - DOMAIN-SUFFIX,moke.com,DIRECT
+  - DOMAIN-SUFFIX,mubu.com,DIRECT
+  - DOMAIN-SUFFIX,myzaker.com,DIRECT
+  - DOMAIN-SUFFIX,nim-lang-cn.org,DIRECT
+  - DOMAIN-SUFFIX,nvidia.com,DIRECT
+  - DOMAIN-SUFFIX,oracle.com,DIRECT
+  - DOMAIN-SUFFIX,paypal.com,DIRECT
+  - DOMAIN-SUFFIX,paypalobjects.com,DIRECT
+  - DOMAIN-SUFFIX,qdaily.com,DIRECT
+  - DOMAIN-SUFFIX,qidian.com,DIRECT
+  - DOMAIN-SUFFIX,qyer.com,DIRECT
+  - DOMAIN-SUFFIX,qyerstatic.com,DIRECT
+  - DOMAIN-SUFFIX,raychase.net,DIRECT
+  - DOMAIN-SUFFIX,ronghub.com,DIRECT
+  - DOMAIN-SUFFIX,ruguoapp.com,DIRECT
+  - DOMAIN-SUFFIX,s-reader.com,DIRECT
+  - DOMAIN-SUFFIX,sankuai.com,DIRECT
+  - DOMAIN-SUFFIX,scomper.me,DIRECT
+  - DOMAIN-SUFFIX,seafile.com,DIRECT
+  - DOMAIN-SUFFIX,sm.ms,DIRECT
+  - DOMAIN-SUFFIX,smzdm.com,DIRECT
+  - DOMAIN-SUFFIX,snapdrop.net,DIRECT
+  - DOMAIN-SUFFIX,snwx.com,DIRECT
+  - DOMAIN-SUFFIX,sspai.com,DIRECT
+  - DOMAIN-SUFFIX,takungpao.com,DIRECT
+  - DOMAIN-SUFFIX,teamviewer.com,DIRECT
+  - DOMAIN-SUFFIX,tianyancha.com,DIRECT
+  - DOMAIN-SUFFIX,udacity.com,DIRECT
+  - DOMAIN-SUFFIX,uning.com,DIRECT
+  - DOMAIN-SUFFIX,vmware.com,DIRECT
+  - DOMAIN-SUFFIX,weather.com,DIRECT
+  - DOMAIN-SUFFIX,weico.cc,DIRECT
+  - DOMAIN-SUFFIX,weidian.com,DIRECT
+  - DOMAIN-SUFFIX,xiachufang.com,DIRECT
+  - DOMAIN-SUFFIX,ximalaya.com,DIRECT
+  - DOMAIN-SUFFIX,xinhuanet.com,DIRECT
+  - DOMAIN-SUFFIX,xmcdn.com,DIRECT
+  - DOMAIN-SUFFIX,yangkeduo.com,DIRECT
+  - DOMAIN-SUFFIX,zhangzishi.cc,DIRECT
+  - DOMAIN-SUFFIX,zhihu.com,DIRECT
+  - DOMAIN-SUFFIX,zhimg.com,DIRECT
+  - DOMAIN-SUFFIX,zhuihd.com,DIRECT
+  - DOMAIN,download.jetbrains.com,DIRECT
+  - DOMAIN,images-cn.ssl-images-amazon.com,DIRECT
+  - IP-CIDR,119.28.28.28/32,DIRECT,no-resolve
+  - GEOIP,CN,DIRECT
+
+  - MATCH,⚓️其他流量

+ 1209 - 0
resources/conf/quantumult/quantumult.tpl

@@ -0,0 +1,1209 @@
+[SERVER]
+{$All_Proxy}
+
+[POLICY]
+{$ProxyGroups['proxy_group']}
+{$ProxyGroups['domestic_group']}
+{$ProxyGroups['others_group']}
+{$ProxyGroups['apple_group']}
+{$ProxyGroups['auto_group']}
+{$ProxyGroups['direct_group']}
+
+[Rule]
+# Apple
+URL-REGEX,*apple.com/cn,🍎 Only
+
+PROCESS-NAME,storedownloadd,🍎 Only
+
+USER-AGENT,%E5%9C%B0%E5%9B%BE*,🍎 Only
+USER-AGENT,%E8%AE%BE%E7%BD%AE*,🍎 Only
+USER-AGENT,*com.apple.mobileme.fmip1,🍎 Only
+USER-AGENT,*WeatherFoundation*,🍎 Only
+USER-AGENT,*AssistantServices*,🍎 Only
+USER-AGENT,MobileAsset*,🍎 Only
+USER-AGENT,Siri*,🍎 Only
+
+USER-AGENT,cloudd*,🍎 Only
+USER-AGENT,com.apple.appstored*,🍎 Only
+USER-AGENT,com.apple.geod*,🍎 Only
+USER-AGENT,com.apple.Maps,🍎 Only
+USER-AGENT,FindMyFriends*,🍎 Only
+USER-AGENT,FindMyiPhone*,🍎 Only
+USER-AGENT,FMDClient*,🍎 Only
+USER-AGENT,FMFD*,🍎 Only
+USER-AGENT,fmflocatord*,🍎 Only
+USER-AGENT,geod*,🍎 Only
+USER-AGENT,locationd*,🍎 Only
+USER-AGENT,Maps*,🍎 Only
+
+DOMAIN,guzzoni.apple.com,🍎 Only
+DOMAIN-SUFFIX,aaplimg.com,🍎 Only
+DOMAIN-SUFFIX,apple.co,🍎 Only
+DOMAIN-SUFFIX,apple.com,🍎 Only
+DOMAIN-SUFFIX,apple-cloudkit.com,🍎 Only
+DOMAIN-SUFFIX,cdn-apple.com,🍎 Only
+DOMAIN-SUFFIX,icloud.com,🍎 Only
+DOMAIN-SUFFIX,icloud-content.com,🍎 Only
+DOMAIN-SUFFIX,itunes.apple.com,🍎 Only
+DOMAIN-SUFFIX,itunes.com,🍎 Only
+DOMAIN-SUFFIX,lookup-api.apple.com,🍎 Only
+DOMAIN-SUFFIX,me.com,🍎 Only
+DOMAIN-SUFFIX,mzstatic.com,🍎 Only
+
+# PROXY
+
+// Client
+PROCESS-NAME,Backup and Sync,🍃 Proxy
+PROCESS-NAME,Day One,🍃 Proxy
+PROCESS-NAME,Dropbox,🍃 Proxy
+PROCESS-NAME,LINE,🍃 Proxy
+PROCESS-NAME,node-webkit,🍃 Proxy
+PROCESS-NAME,Resilio Sync,🍃 Proxy
+PROCESS-NAME,Spotify,🍃 Proxy
+PROCESS-NAME,Tweetbot,🍃 Proxy
+PROCESS-NAME,Twitter,🍃 Proxy
+PROCESS-NAME,Twitterrific,🍃 Proxy
+PROCESS-NAME,viu,🍃 Proxy
+
+// UA
+USER-AGENT,%E7%BA%BD%E7%BA%A6%E6%97%B6%E6%8A%A5*,🍃 Proxy
+USER-AGENT,AwemeI18n*,🍃 Proxy
+USER-AGENT,Coinbase*,🍃 Proxy
+USER-AGENT,Instagram*,🍃 Proxy
+USER-AGENT,Resilio Sync*,🍃 Proxy
+USER-AGENT,SoundCloud*,🍃 Proxy
+USER-AGENT,viu*,🍃 Proxy
+USER-AGENT,WeMusic*,🍃 Proxy
+
+// BBC
+USER-AGENT,BBCiPlayer*,🍃 Proxy
+DOMAIN-KEYWORD,co.uk,🍃 Proxy
+DOMAIN-KEYWORD,uk-live,🍃 Proxy
+DOMAIN-SUFFIX,bbc.co,🍃 Proxy
+DOMAIN-SUFFIX,bbc.com,🍃 Proxy
+
+// CHOCO TV
+USER-AGENT,TwDramas,🍃 Proxy
+DOMAIN-SUFFIX,chocotv.com.tw,🍃 Proxy
+
+// Epicgames
+DOMAIN-KEYWORD,epicgames,🍃 Proxy
+DOMAIN-SUFFIX,helpshift.com,🍃 Proxy
+
+// Hulu
+DOMAIN-SUFFIX,hulu.com,🍃 Proxy
+
+// Line
+DOMAIN-SUFFIX,lin.ee,🍃 Proxy
+DOMAIN-SUFFIX,line.me,🍃 Proxy
+DOMAIN-SUFFIX,line.naver.jp,🍃 Proxy
+DOMAIN-SUFFIX,line-apps.com,🍃 Proxy
+DOMAIN-SUFFIX,line-cdn.net,🍃 Proxy
+DOMAIN-SUFFIX,line-scdn.net,🍃 Proxy
+DOMAIN-SUFFIX,nhncorp.jp,🍃 Proxy
+
+// MytvSUPER
+DOMAIN-KEYWORD,nowtv100,🍃 Proxy
+DOMAIN-KEYWORD,rthklive,🍃 Proxy
+DOMAIN-SUFFIX,mytvsuper.com,🍃 Proxy
+DOMAIN-SUFFIX,tvb.com,🍃 Proxy
+
+// Microsoft
+USER-AGENT,OneDrive*,🍃 Proxy
+
+DOMAIN-KEYWORD,microsoft,🍃 Proxy
+DOMAIN-SUFFIX,hotmail.com,🍃 Proxy
+DOMAIN-SUFFIX,live.com,🍃 Proxy
+DOMAIN-SUFFIX,live.net,🍃 Proxy
+DOMAIN-SUFFIX,msn.com,🍃 Proxy
+DOMAIN-SUFFIX,office.com,🍃 Proxy
+DOMAIN-SUFFIX,office.net,🍃 Proxy
+DOMAIN-SUFFIX,outlook.com,🍃 Proxy
+
+// Netflix
+DOMAIN-SUFFIX,netflix.com,🍃 Proxy
+DOMAIN-SUFFIX,netflix.net,🍃 Proxy
+DOMAIN-SUFFIX,nflxext.com,🍃 Proxy
+DOMAIN-SUFFIX,nflximg.com,🍃 Proxy
+DOMAIN-SUFFIX,nflximg.net,🍃 Proxy
+DOMAIN-SUFFIX,nflxvideo.net,🍃 Proxy
+
+// Spark
+DOMAIN-SUFFIX,api.amplitude.com,🍃 Proxy
+DOMAIN-SUFFIX,app.smartmailcloud.com,🍃 Proxy
+DOMAIN-SUFFIX,gate.hockeyapp.net,🍃 Proxy
+DOMAIN-SUFFIX,smartmailcloud.com,🍃 Proxy
+
+// Steam
+DOMAIN-SUFFIX,fanatical.com,🍃 Proxy
+DOMAIN-SUFFIX,humblebundle.com,🍃 Proxy
+DOMAIN-SUFFIX,steamcommunity.com,🍃 Proxy
+DOMAIN-SUFFIX,steampowered.com,🍃 Proxy
+DOMAIN-SUFFIX,steamstatic.com,🍃 Proxy
+
+// WeMusic
+DOMAIN-KEYWORD,joox,🍃 Proxy
+
+// Top blocked sites
+DOMAIN-SUFFIX,2o7.net,🍃 Proxy
+DOMAIN-SUFFIX,4everProxy.com,🍃 Proxy
+DOMAIN-SUFFIX,4shared.com,🍃 Proxy
+DOMAIN-SUFFIX,4sqi.net,🍃 Proxy
+DOMAIN-SUFFIX,9to5mac.com,🍃 Proxy
+DOMAIN-SUFFIX,abpchina.org,🍃 Proxy
+DOMAIN-SUFFIX,accountkit.com,🍃 Proxy
+DOMAIN-SUFFIX,adblockplus.org,🍃 Proxy
+DOMAIN-SUFFIX,adobe.com,🍃 Proxy
+DOMAIN-SUFFIX,adobedtm.com,🍃 Proxy
+DOMAIN-SUFFIX,aerisapi.com,🍃 Proxy
+DOMAIN-SUFFIX,akamaihd.net,🍃 Proxy
+DOMAIN-SUFFIX,alibaba.com,🍃 Proxy
+DOMAIN-SUFFIX,alibabacloud.com,🍃 Proxy
+DOMAIN-SUFFIX,alfredapp.com,🍃 Proxy
+DOMAIN-SUFFIX,allconnected.co,🍃 Proxy
+DOMAIN-SUFFIX,amazon.com,🍃 Proxy
+DOMAIN-SUFFIX,amazonaws.com,🍃 Proxy
+DOMAIN-SUFFIX,ampproject.com,🍃 Proxy
+DOMAIN-SUFFIX,ampproject.net,🍃 Proxy
+DOMAIN-SUFFIX,ampproject.org,🍃 Proxy
+DOMAIN-SUFFIX,ancsconf.org,🍃 Proxy
+DOMAIN-SUFFIX,android.com,🍃 Proxy
+DOMAIN-SUFFIX,androidify.com,🍃 Proxy
+DOMAIN-SUFFIX,android-x86.org,🍃 Proxy
+DOMAIN-SUFFIX,angularjs.org,🍃 Proxy
+DOMAIN-SUFFIX,anthonycalzadilla.com,🍃 Proxy
+DOMAIN-SUFFIX,aol.com,🍃 Proxy
+DOMAIN-SUFFIX,aolcdn.com,🍃 Proxy
+DOMAIN-SUFFIX,api.mixpanel.com,🍃 Proxy
+DOMAIN-SUFFIX,api.tiktokv.com,🍃 Proxy
+DOMAIN-SUFFIX,api.urbandictionary.com,🍃 Proxy
+DOMAIN-SUFFIX,apigee.com,🍃 Proxy
+DOMAIN-SUFFIX,apk-dl.com,🍃 Proxy
+DOMAIN-SUFFIX,apkpure.com,🍃 Proxy
+DOMAIN-SUFFIX,appdownloader.net,🍃 Proxy
+DOMAIN-SUFFIX,apple-dns.net,🍃 Proxy
+DOMAIN-SUFFIX,app-measurement.com,🍃 Proxy
+DOMAIN-SUFFIX,appshopper.com,🍃 Proxy
+DOMAIN-SUFFIX,arcgis.com,🍃 Proxy
+DOMAIN-SUFFIX,archive.is,🍃 Proxy
+DOMAIN-SUFFIX,archive.org,🍃 Proxy
+DOMAIN-SUFFIX,archives.gov,🍃 Proxy
+DOMAIN-SUFFIX,armorgames.com,🍃 Proxy
+DOMAIN-SUFFIX,aspnetcdn.com,🍃 Proxy
+DOMAIN-SUFFIX,async.be,🍃 Proxy
+DOMAIN-SUFFIX,att.com,🍃 Proxy
+DOMAIN-SUFFIX,avgle.com,🍃 Proxy
+DOMAIN-SUFFIX,awsstatic.com,🍃 Proxy
+DOMAIN-SUFFIX,azureedge.net,🍃 Proxy
+DOMAIN-SUFFIX,azurewebsites.net,🍃 Proxy
+DOMAIN-SUFFIX,badoo.com,🍃 Proxy
+DOMAIN-SUFFIX,bandisoft.com,🍃 Proxy
+DOMAIN-SUFFIX,bbtoystore.com,🍃 Proxy
+DOMAIN-SUFFIX,betvictor.com,🍃 Proxy
+DOMAIN-SUFFIX,bigsound.org,🍃 Proxy
+DOMAIN-SUFFIX,bing.com,🍃 Proxy
+DOMAIN-SUFFIX,bing.net,🍃 Proxy
+DOMAIN-SUFFIX,bintray.com,🍃 Proxy
+DOMAIN-SUFFIX,bit.com,🍃 Proxy
+DOMAIN-SUFFIX,bit.do,🍃 Proxy
+DOMAIN-SUFFIX,bit.ly,🍃 Proxy
+DOMAIN-SUFFIX,bitbucket.org,🍃 Proxy
+DOMAIN-SUFFIX,bitcointalk.org,🍃 Proxy
+DOMAIN-SUFFIX,bitshare.com,🍃 Proxy
+DOMAIN-SUFFIX,bkrtx.com,🍃 Proxy
+DOMAIN-SUFFIX,blizzard.com,🍃 Proxy
+DOMAIN-SUFFIX,blog.com,🍃 Proxy
+DOMAIN-SUFFIX,blogcdn.com,🍃 Proxy
+DOMAIN-SUFFIX,blogger.com,🍃 Proxy
+DOMAIN-SUFFIX,bloglovin.com,🍃 Proxy
+DOMAIN-SUFFIX,blogsmithmedia.com,🍃 Proxy
+DOMAIN-SUFFIX,blogspot.hk,🍃 Proxy
+DOMAIN-SUFFIX,bloomberg.cn,🍃 Proxy
+DOMAIN-SUFFIX,bloomberg.com,🍃 Proxy
+DOMAIN-SUFFIX,books.com.tw,🍃 Proxy
+DOMAIN-SUFFIX,boomtrain.com,🍃 Proxy
+DOMAIN-SUFFIX,box.com,🍃 Proxy
+DOMAIN-SUFFIX,box.net,🍃 Proxy
+DOMAIN-SUFFIX,boxun.com,🍃 Proxy
+DOMAIN-SUFFIX,cachefly.net,🍃 Proxy
+DOMAIN-SUFFIX,cbc.ca,🍃 Proxy
+DOMAIN-SUFFIX,cdn.segment.com,🍃 Proxy
+DOMAIN-SUFFIX,cdnst.net,🍃 Proxy
+DOMAIN-SUFFIX,celestrak.com,🍃 Proxy
+DOMAIN-SUFFIX,census.gov,🍃 Proxy
+DOMAIN-SUFFIX,certificate-transparency.org,🍃 Proxy
+DOMAIN-SUFFIX,chinatimes.com,🍃 Proxy
+DOMAIN-SUFFIX,chrome.com,🍃 Proxy
+DOMAIN-SUFFIX,chromecast.com,🍃 Proxy
+DOMAIN-SUFFIX,chromercise.com,🍃 Proxy
+DOMAIN-SUFFIX,chromestatus.com,🍃 Proxy
+DOMAIN-SUFFIX,chromium.org,🍃 Proxy
+DOMAIN-SUFFIX,cl.ly,🍃 Proxy
+DOMAIN-SUFFIX,cloudflare.com,🍃 Proxy
+DOMAIN-SUFFIX,cloudfront.net,🍃 Proxy
+DOMAIN-SUFFIX,cloudgarage.jp,🍃 Proxy
+DOMAIN-SUFFIX,cloudmagic.com,🍃 Proxy
+DOMAIN-SUFFIX,cmail19.com,🍃 Proxy
+DOMAIN-SUFFIX,cnet.com,🍃 Proxy
+DOMAIN-SUFFIX,cnn.com,🍃 Proxy
+DOMAIN-SUFFIX,cocoapods.org,🍃 Proxy
+DOMAIN-SUFFIX,comodoca.com,🍃 Proxy
+DOMAIN-SUFFIX,content.office.net,🍃 Proxy
+DOMAIN-SUFFIX,culturedcode.com ,🍃 Proxy
+DOMAIN-SUFFIX,cygames.jp ,🍃 Proxy
+DOMAIN-SUFFIX,d.pr,🍃 Proxy
+DOMAIN-SUFFIX,danilo.to,🍃 Proxy
+DOMAIN-SUFFIX,daolan.net,🍃 Proxy
+DOMAIN-SUFFIX,data-vocabulary.org,🍃 Proxy
+DOMAIN-SUFFIX,dayone.me,🍃 Proxy
+DOMAIN-SUFFIX,db.tt,🍃 Proxy
+DOMAIN-SUFFIX,dcmilitary.com,🍃 Proxy
+DOMAIN-SUFFIX,deja.com,🍃 Proxy
+DOMAIN-SUFFIX,demdex.net,🍃 Proxy
+DOMAIN-SUFFIX,deskconnect.com,🍃 Proxy
+DOMAIN-SUFFIX,digisfera.com,🍃 Proxy
+DOMAIN-SUFFIX,digitaltrends.com,🍃 Proxy
+DOMAIN-SUFFIX,disconnect.me,🍃 Proxy
+DOMAIN-SUFFIX,disq.us,🍃 Proxy
+DOMAIN-SUFFIX,disqus.com,🍃 Proxy
+DOMAIN-SUFFIX,disquscdn.com,🍃 Proxy
+DOMAIN-SUFFIX,dmm.co.jp,🍃 Proxy
+DOMAIN-SUFFIX,dnsimple.com,🍃 Proxy
+DOMAIN-SUFFIX,docker.com,🍃 Proxy
+DOMAIN-SUFFIX,doub.io,🍃 Proxy
+DOMAIN-SUFFIX,dribbble.com,🍃 Proxy
+DOMAIN-SUFFIX,droplr.com,🍃 Proxy
+DOMAIN-SUFFIX,duckduckgo.com,🍃 Proxy
+DOMAIN-SUFFIX,dueapp.com,🍃 Proxy
+DOMAIN-SUFFIX,dw.com,🍃 Proxy
+DOMAIN-SUFFIX,easybib.com,🍃 Proxy
+DOMAIN-SUFFIX,economist.com,🍃 Proxy
+DOMAIN-SUFFIX,edgecastcdn.net,🍃 Proxy
+DOMAIN-SUFFIX,edgekey.net,🍃 Proxy
+DOMAIN-SUFFIX,edgesuite.net,🍃 Proxy
+DOMAIN-SUFFIX,engadget.com,🍃 Proxy
+DOMAIN-SUFFIX,entrust.net,🍃 Proxy
+DOMAIN-SUFFIX,eurekavpt.com,🍃 Proxy
+DOMAIN-SUFFIX,evernote.com,🍃 Proxy
+DOMAIN-SUFFIX,extmatrix.com,🍃 Proxy
+DOMAIN-SUFFIX,eyny.com,🍃 Proxy
+DOMAIN-SUFFIX,fabric.io,🍃 Proxy
+DOMAIN-SUFFIX,fast.com,🍃 Proxy
+DOMAIN-SUFFIX,fastly.net,🍃 Proxy
+DOMAIN-SUFFIX,fastmail.com,🍃 Proxy
+DOMAIN-SUFFIX,fc2.com,🍃 Proxy
+DOMAIN-SUFFIX,feedburner.com,🍃 Proxy
+DOMAIN-SUFFIX,feedly.com,🍃 Proxy
+DOMAIN-SUFFIX,feedsportal.com,🍃 Proxy
+DOMAIN-SUFFIX,fiftythree.com,🍃 Proxy
+DOMAIN-SUFFIX,firebaseio.com,🍃 Proxy
+DOMAIN-SUFFIX,flexibits.com,🍃 Proxy
+DOMAIN-SUFFIX,flickr.com,🍃 Proxy
+DOMAIN-SUFFIX,flipboard.com,🍃 Proxy
+DOMAIN-SUFFIX,flipkart.com,🍃 Proxy
+DOMAIN-SUFFIX,flitto.com,🍃 Proxy
+DOMAIN-SUFFIX,flurry.com,🍃 Proxy
+DOMAIN-SUFFIX,freeopenProxy.com,🍃 Proxy
+DOMAIN-SUFFIX,fullstory.com,🍃 Proxy
+DOMAIN-SUFFIX,fzlm.net,🍃 Proxy
+DOMAIN-SUFFIX,g.co,🍃 Proxy
+DOMAIN-SUFFIX,gabia.net,🍃 Proxy
+DOMAIN-SUFFIX,garena.com,🍃 Proxy
+DOMAIN-SUFFIX,gameloft.com,🍃 Proxy
+DOMAIN-SUFFIX,geni.us,🍃 Proxy
+DOMAIN-SUFFIX,get.how,🍃 Proxy
+DOMAIN-SUFFIX,getcloudapp.com,🍃 Proxy
+DOMAIN-SUFFIX,getfoxyProxy.org,🍃 Proxy
+DOMAIN-SUFFIX,getlantern.org,🍃 Proxy
+DOMAIN-SUFFIX,getmdl.io,🍃 Proxy
+DOMAIN-SUFFIX,getpricetag.com,🍃 Proxy
+DOMAIN-SUFFIX,gfw.press,🍃 Proxy
+DOMAIN-SUFFIX,gfx.ms,🍃 Proxy
+DOMAIN-SUFFIX,ggpht.com,🍃 Proxy
+DOMAIN-SUFFIX,ghostnoteapp.com,🍃 Proxy
+DOMAIN-SUFFIX,git.io,🍃 Proxy
+DOMAIN-SUFFIX,gitbook.com,🍃 Proxy
+DOMAIN-SUFFIX,globalsign.com,🍃 Proxy
+DOMAIN-SUFFIX,gmocloud.com,🍃 Proxy
+DOMAIN-SUFFIX,gmodules.com,🍃 Proxy
+DOMAIN-SUFFIX,go.com,🍃 Proxy
+DOMAIN-SUFFIX,go.jp,🍃 Proxy
+DOMAIN-SUFFIX,godaddy.com,🍃 Proxy
+DOMAIN-SUFFIX,golang.org,🍃 Proxy
+DOMAIN-SUFFIX,gongm.in,🍃 Proxy
+DOMAIN-SUFFIX,goo.gl,🍃 Proxy
+DOMAIN-SUFFIX,goodreaders.com,🍃 Proxy
+DOMAIN-SUFFIX,goodreads.com,🍃 Proxy
+DOMAIN-SUFFIX,gravatar.com,🍃 Proxy
+DOMAIN-SUFFIX,gstatic.cn,🍃 Proxy
+DOMAIN-SUFFIX,gstatic.com,🍃 Proxy
+DOMAIN-SUFFIX,gunsamerica.com,🍃 Proxy
+DOMAIN-SUFFIX,gvt0.com,🍃 Proxy
+DOMAIN-SUFFIX,gvt1.com,🍃 Proxy
+DOMAIN-SUFFIX,helpshift.com,🍃 Proxy
+DOMAIN-SUFFIX,hinet.net,🍃 Proxy
+DOMAIN-SUFFIX,hockeyapp.net,🍃 Proxy
+DOMAIN-SUFFIX,homedepot.com,🍃 Proxy
+DOMAIN-SUFFIX,hootsuite.com,🍃 Proxy
+DOMAIN-SUFFIX,howtoforge.com,🍃 Proxy
+DOMAIN-SUFFIX,iam.soy,🍃 Proxy
+DOMAIN-SUFFIX,icoco.com,🍃 Proxy
+DOMAIN-SUFFIX,icons8.com,🍃 Proxy
+DOMAIN-SUFFIX,ift.tt,🍃 Proxy
+DOMAIN-SUFFIX,ifttt.com,🍃 Proxy
+DOMAIN-SUFFIX,imageshack.us,🍃 Proxy
+DOMAIN-SUFFIX,img.ly,🍃 Proxy
+DOMAIN-SUFFIX,imgur.com,🍃 Proxy
+DOMAIN-SUFFIX,imore.com,🍃 Proxy
+DOMAIN-SUFFIX,ingress.com ,🍃 Proxy
+DOMAIN-SUFFIX,insder.co,🍃 Proxy
+DOMAIN-SUFFIX,instapaper.com,🍃 Proxy
+DOMAIN-SUFFIX,instructables.com,🍃 Proxy
+DOMAIN-SUFFIX,io.io,🍃 Proxy
+DOMAIN-SUFFIX,ip.sb,🍃 Proxy
+DOMAIN-SUFFIX,ipaddress.com,🍃 Proxy
+DOMAIN-SUFFIX,ipn.li,🍃 Proxy
+DOMAIN-SUFFIX,is.gd,🍃 Proxy
+DOMAIN-SUFFIX,ishowsapp.com,🍃 Proxy
+DOMAIN-SUFFIX,issuu.com,🍃 Proxy
+DOMAIN-SUFFIX,itgonglun.com,🍃 Proxy
+DOMAIN-SUFFIX,itun.es,🍃 Proxy
+DOMAIN-SUFFIX,ixquick.com,🍃 Proxy
+DOMAIN-SUFFIX,j.mp,🍃 Proxy
+DOMAIN-SUFFIX,javbus.com,🍃 Proxy
+DOMAIN-SUFFIX,js.revsci.net,🍃 Proxy
+DOMAIN-SUFFIX,jshint.com,🍃 Proxy
+DOMAIN-SUFFIX,jtvnw.net,🍃 Proxy
+DOMAIN-SUFFIX,justgetflux.com,🍃 Proxy
+DOMAIN-SUFFIX,kakao.co.kr,🍃 Proxy
+DOMAIN-SUFFIX,kakao.com,🍃 Proxy
+DOMAIN-SUFFIX,kakaocdn.net,🍃 Proxy
+DOMAIN-SUFFIX,kat.cr,🍃 Proxy
+DOMAIN-SUFFIX,kenengba.com,🍃 Proxy
+DOMAIN-SUFFIX,kik.com,🍃 Proxy
+DOMAIN-SUFFIX,klip.me,🍃 Proxy
+DOMAIN-SUFFIX,leancloud.com,🍃 Proxy
+DOMAIN-SUFFIX,leetcode.com,🍃 Proxy
+DOMAIN-SUFFIX,lhie1.com,🍃 Proxy
+DOMAIN-SUFFIX,libsyn.com,🍃 Proxy
+DOMAIN-SUFFIX,licdn.com,🍃 Proxy
+DOMAIN-SUFFIX,lightboxcdn.com,🍃 Proxy
+DOMAIN-SUFFIX,like.com,🍃 Proxy
+DOMAIN-SUFFIX,linkedin.com,🍃 Proxy
+DOMAIN-SUFFIX,linode.com,🍃 Proxy
+DOMAIN-SUFFIX,lithium.com,🍃 Proxy
+DOMAIN-SUFFIX,littlehj.com,🍃 Proxy
+DOMAIN-SUFFIX,livefilestore.com,🍃 Proxy
+DOMAIN-SUFFIX,llnwd.net,🍃 Proxy
+DOMAIN-SUFFIX,localnetwork.uop,🍃 Proxy
+DOMAIN-SUFFIX,logmein.com,🍃 Proxy
+DOMAIN-SUFFIX,macid.co,🍃 Proxy
+DOMAIN-SUFFIX,macromedia.com,🍃 Proxy
+DOMAIN-SUFFIX,macrumors.com,🍃 Proxy
+DOMAIN-SUFFIX,manhuaren.com,🍃 Proxy
+DOMAIN-SUFFIX,marketwatch.com,🍃 Proxy
+DOMAIN-SUFFIX,mashable.com,🍃 Proxy
+DOMAIN-SUFFIX,mathjax.org,🍃 Proxy
+DOMAIN-SUFFIX,medium.com,🍃 Proxy
+DOMAIN-SUFFIX,mega.co.nz,🍃 Proxy
+DOMAIN-SUFFIX,mega.nz,🍃 Proxy
+DOMAIN-SUFFIX,megaupload.com,🍃 Proxy
+DOMAIN-SUFFIX,microsofttranslator.com,🍃 Proxy
+DOMAIN-SUFFIX,mindnode.com,🍃 Proxy
+DOMAIN-SUFFIX,mlssoccer.com,🍃 Proxy
+DOMAIN-SUFFIX,mobile01.com,🍃 Proxy
+DOMAIN-SUFFIX,modmyi.com,🍃 Proxy
+DOMAIN-SUFFIX,moves-export.com,🍃 Proxy
+DOMAIN-SUFFIX,mp3buscador.com,🍃 Proxy
+DOMAIN-SUFFIX,msedge.net,🍃 Proxy
+DOMAIN-SUFFIX,mycnnews.com,🍃 Proxy
+DOMAIN-SUFFIX,myfontastic.com,🍃 Proxy
+DOMAIN-SUFFIX,name.com,🍃 Proxy
+DOMAIN-SUFFIX,nasa.gov,🍃 Proxy
+DOMAIN-SUFFIX,ndr.de,🍃 Proxy
+DOMAIN-SUFFIX,netdna-cdn.com,🍃 Proxy
+DOMAIN-SUFFIX,newipnow.com,🍃 Proxy
+DOMAIN-SUFFIX,nextmedia.com,🍃 Proxy
+DOMAIN-SUFFIX,nih.gov,🍃 Proxy
+DOMAIN-SUFFIX,nintendo.com,🍃 Proxy
+DOMAIN-SUFFIX,nintendo.net,🍃 Proxy
+DOMAIN-SUFFIX,notion.so,🍃 Proxy
+DOMAIN-SUFFIX,novafile.com,🍃 Proxy
+DOMAIN-SUFFIX,nrk.no,🍃 Proxy
+DOMAIN-SUFFIX,nsstatic.net,🍃 Proxy
+DOMAIN-SUFFIX,nssurge.com,🍃 Proxy
+DOMAIN-SUFFIX,nyt.com,🍃 Proxy
+DOMAIN-SUFFIX,nytimes.com,🍃 Proxy
+DOMAIN-SUFFIX,nytimg.com,🍃 Proxy
+DOMAIN-SUFFIX,nytstyle.com,🍃 Proxy
+DOMAIN-SUFFIX,office365.com,🍃 Proxy
+DOMAIN-SUFFIX,omnigroup.com,🍃 Proxy
+DOMAIN-SUFFIX,onedrive.com,🍃 Proxy
+DOMAIN-SUFFIX,onedrive.live.com,🍃 Proxy
+DOMAIN-SUFFIX,onenote.com,🍃 Proxy
+DOMAIN-SUFFIX,ooyala.com,🍃 Proxy
+DOMAIN-SUFFIX,openvpn.net,🍃 Proxy
+DOMAIN-SUFFIX,openwrt.org,🍃 Proxy
+DOMAIN-SUFFIX,optimizely.com,🍃 Proxy
+DOMAIN-SUFFIX,orkut.com,🍃 Proxy
+DOMAIN-SUFFIX,osha.gov,🍃 Proxy
+DOMAIN-SUFFIX,osxdaily.com,🍃 Proxy
+DOMAIN-SUFFIX,ow.ly,🍃 Proxy
+DOMAIN-SUFFIX,paddle.com,🍃 Proxy
+DOMAIN-SUFFIX,paddleapi.com,🍃 Proxy
+DOMAIN-SUFFIX,pandora.com,🍃 Proxy
+DOMAIN-SUFFIX,panoramio.com,🍃 Proxy
+DOMAIN-SUFFIX,parallels.com,🍃 Proxy
+DOMAIN-SUFFIX,parse.com,🍃 Proxy
+DOMAIN-SUFFIX,pdfexpert.com,🍃 Proxy
+DOMAIN-SUFFIX,periscope.tv,🍃 Proxy
+DOMAIN-SUFFIX,piaotian.net,🍃 Proxy
+DOMAIN-SUFFIX,picacomic.com,🍃 Proxy
+DOMAIN-SUFFIX,picasaweb.com,🍃 Proxy
+DOMAIN-SUFFIX,pinboard.in,🍃 Proxy
+DOMAIN-SUFFIX,ping.pe,🍃 Proxy
+DOMAIN-SUFFIX,pinterest.com,🍃 Proxy
+DOMAIN-SUFFIX,pixelmator.com,🍃 Proxy
+DOMAIN-SUFFIX,pixiv.net,🍃 Proxy
+DOMAIN-SUFFIX,pixnet.net,🍃 Proxy
+DOMAIN-SUFFIX,playpcesor.com,🍃 Proxy
+DOMAIN-SUFFIX,playstation.com,🍃 Proxy
+DOMAIN-SUFFIX,playstation.com.hk,🍃 Proxy
+DOMAIN-SUFFIX,playstation.net,🍃 Proxy
+DOMAIN-SUFFIX,playstationnetwork.com,🍃 Proxy
+DOMAIN-SUFFIX,pokemon.com,🍃 Proxy
+DOMAIN-SUFFIX,polymer-project.org,🍃 Proxy
+DOMAIN-SUFFIX,popo.tw,🍃 Proxy
+DOMAIN-SUFFIX,potato.im,🍃 Proxy
+DOMAIN-SUFFIX,prfct.co,🍃 Proxy
+DOMAIN-SUFFIX,proxfree.com,🍃 Proxy
+DOMAIN-SUFFIX,psiphon3.com,🍃 Proxy
+DOMAIN-SUFFIX,ptt.cc,🍃 Proxy
+DOMAIN-SUFFIX,pubu.com.tw,🍃 Proxy
+DOMAIN-SUFFIX,puffinbrowser.com,🍃 Proxy
+DOMAIN-SUFFIX,pushbullet.com,🍃 Proxy
+DOMAIN-SUFFIX,pushwoosh.com,🍃 Proxy
+DOMAIN-SUFFIX,pximg.net,🍃 Proxy
+DOMAIN-SUFFIX,quora.com,🍃 Proxy
+DOMAIN-SUFFIX,quoracdn.net,🍃 Proxy
+DOMAIN-SUFFIX,readingtimes.com.tw,🍃 Proxy
+DOMAIN-SUFFIX,readmoo.com,🍃 Proxy
+DOMAIN-SUFFIX,recaptcha.net,🍃 Proxy
+DOMAIN-SUFFIX,reddit.com,🍃 Proxy
+DOMAIN-SUFFIX,redditmedia.com,🍃 Proxy
+DOMAIN-SUFFIX,reuters.com,🍃 Proxy
+DOMAIN-SUFFIX,rfi.fr,🍃 Proxy
+DOMAIN-SUFFIX,rileyguide.com,🍃 Proxy
+DOMAIN-SUFFIX,rime.im,🍃 Proxy
+DOMAIN-SUFFIX,rsf.org,🍃 Proxy
+DOMAIN-SUFFIX,sciencedaily.com,🍃 Proxy
+DOMAIN-SUFFIX,sciencemag.org,🍃 Proxy
+DOMAIN-SUFFIX,scribd.com,🍃 Proxy
+DOMAIN-SUFFIX,search.com,🍃 Proxy
+DOMAIN-SUFFIX,servebom.com,🍃 Proxy
+DOMAIN-SUFFIX,sfx.ms,🍃 Proxy
+DOMAIN-SUFFIX,shadowsocks.org,🍃 Proxy
+DOMAIN-SUFFIX,shadowverse.jp,🍃 Proxy
+DOMAIN-SUFFIX,sharethis.com,🍃 Proxy
+DOMAIN-SUFFIX,shazam.com,🍃 Proxy
+DOMAIN-SUFFIX,shutterstock.com,🍃 Proxy
+DOMAIN-SUFFIX,sidelinesnews.com,🍃 Proxy
+DOMAIN-SUFFIX,simp.ly,🍃 Proxy
+DOMAIN-SUFFIX,simplenote.com,🍃 Proxy
+DOMAIN-SUFFIX,sketchappsources.com,🍃 Proxy
+DOMAIN-SUFFIX,skype.com,🍃 Proxy
+DOMAIN-SUFFIX,slack.com,🍃 Proxy
+DOMAIN-SUFFIX,slack-edge.com,🍃 Proxy
+DOMAIN-SUFFIX,slack-msgs.com,🍃 Proxy
+DOMAIN-SUFFIX,slideshare.net,🍃 Proxy
+DOMAIN-SUFFIX,smartdnsproxy.com,🍃 Proxy
+DOMAIN-SUFFIX,smh.com.au,🍃 Proxy
+DOMAIN-SUFFIX,snapchat.com,🍃 Proxy
+DOMAIN-SUFFIX,sndcdn.com,🍃 Proxy
+DOMAIN-SUFFIX,sockslist.net,🍃 Proxy
+DOMAIN-SUFFIX,sony.com,🍃 Proxy
+DOMAIN-SUFFIX,sony.com.hk,🍃 Proxy
+DOMAIN-SUFFIX,sonyentertainmentnetwork.com,🍃 Proxy
+DOMAIN-SUFFIX,soundcloud.com,🍃 Proxy
+DOMAIN-SUFFIX,sourceforge.net,🍃 Proxy
+DOMAIN-SUFFIX,sowers.org.hk,🍃 Proxy
+DOMAIN-SUFFIX,speedsmart.net,🍃 Proxy
+DOMAIN-SUFFIX,spike.com,🍃 Proxy
+DOMAIN-SUFFIX,squarespace.com,🍃 Proxy
+DOMAIN-SUFFIX,ssa.gov,🍃 Proxy
+DOMAIN-SUFFIX,sstatic.net,🍃 Proxy
+DOMAIN-SUFFIX,st.luluku.pw,🍃 Proxy
+DOMAIN-SUFFIX,stackoverflow.com,🍃 Proxy
+DOMAIN-SUFFIX,starp2p.com,🍃 Proxy
+DOMAIN-SUFFIX,startpage.com,🍃 Proxy
+DOMAIN-SUFFIX,state.gov,🍃 Proxy
+DOMAIN-SUFFIX,staticflickr.com,🍃 Proxy
+DOMAIN-SUFFIX,storify.com,🍃 Proxy
+DOMAIN-SUFFIX,stumbleupon.com,🍃 Proxy
+DOMAIN-SUFFIX,sugarsync.com,🍃 Proxy
+DOMAIN-SUFFIX,supermariorun.com,🍃 Proxy
+DOMAIN-SUFFIX,surfeasy.com.au,🍃 Proxy
+DOMAIN-SUFFIX,surge.run,🍃 Proxy
+DOMAIN-SUFFIX,surrenderat20.net,🍃 Proxy
+DOMAIN-SUFFIX,sydneytoday.com,🍃 Proxy
+DOMAIN-SUFFIX,symauth.com,🍃 Proxy
+DOMAIN-SUFFIX,symcb.com,🍃 Proxy
+DOMAIN-SUFFIX,symcd.com,🍃 Proxy
+DOMAIN-SUFFIX,t.me,🍃 Proxy
+DOMAIN-SUFFIX,t66y.com,🍃 Proxy
+DOMAIN-SUFFIX,tablesgenerator.com,🍃 Proxy
+DOMAIN-SUFFIX,tabtter.jp,🍃 Proxy
+DOMAIN-SUFFIX,talk853.com,🍃 Proxy
+DOMAIN-SUFFIX,talkboxapp.com,🍃 Proxy
+DOMAIN-SUFFIX,talkonly.net,🍃 Proxy
+DOMAIN-SUFFIX,tapbots.com,🍃 Proxy
+DOMAIN-SUFFIX,tapbots.net,🍃 Proxy
+DOMAIN-SUFFIX,tdesktop.com,🍃 Proxy
+DOMAIN-SUFFIX,techcrunch.com,🍃 Proxy
+DOMAIN-SUFFIX,technorati.com,🍃 Proxy
+DOMAIN-SUFFIX,techsmith.com,🍃 Proxy
+DOMAIN-SUFFIX,teddysun.com,🍃 Proxy
+DOMAIN-SUFFIX,telegra.ph,🍃 Proxy
+DOMAIN-SUFFIX,textnow.me,🍃 Proxy
+DOMAIN-SUFFIX,thebobs.com,🍃 Proxy
+DOMAIN-SUFFIX,theinitium.com,🍃 Proxy
+DOMAIN-SUFFIX,thepiratebay.org,🍃 Proxy
+DOMAIN-SUFFIX,theverge.com,🍃 Proxy
+DOMAIN-SUFFIX,thewgo.org,🍃 Proxy
+DOMAIN-SUFFIX,tiltbrush.com,🍃 Proxy
+DOMAIN-SUFFIX,time.com,🍃 Proxy
+DOMAIN-SUFFIX,timeinc.net,🍃 Proxy
+DOMAIN-SUFFIX,tinder.com,🍃 Proxy
+DOMAIN-SUFFIX,tiny.cc,🍃 Proxy
+DOMAIN-SUFFIX,tinychat.com,🍃 Proxy
+DOMAIN-SUFFIX,tinypic.com,🍃 Proxy
+DOMAIN-SUFFIX,tmblr.co,🍃 Proxy
+DOMAIN-SUFFIX,todoist.com,🍃 Proxy
+DOMAIN-SUFFIX,togetter.com,🍃 Proxy
+DOMAIN-SUFFIX,tokyocn.com,🍃 Proxy
+DOMAIN-SUFFIX,tomshardware.com,🍃 Proxy
+DOMAIN-SUFFIX,torcn.com,🍃 Proxy
+DOMAIN-SUFFIX,torrentprivacy.com,🍃 Proxy
+DOMAIN-SUFFIX,torrentproject.se,🍃 Proxy
+DOMAIN-SUFFIX,torrentz.eu,🍃 Proxy
+DOMAIN-SUFFIX,traffichaus.com,🍃 Proxy
+DOMAIN-SUFFIX,trakt.tv,🍃 Proxy
+DOMAIN-SUFFIX,transparency.org,🍃 Proxy
+DOMAIN-SUFFIX,trello.com,🍃 Proxy
+DOMAIN-SUFFIX,trendsmap.com,🍃 Proxy
+DOMAIN-SUFFIX,trulyergonomic.com,🍃 Proxy
+DOMAIN-SUFFIX,trustasiassl.com,🍃 Proxy
+DOMAIN-SUFFIX,tt-rss.org,🍃 Proxy
+DOMAIN-SUFFIX,ttvnw.net,🍃 Proxy
+DOMAIN-SUFFIX,tumblr.co,🍃 Proxy
+DOMAIN-SUFFIX,tumblr.com,🍃 Proxy
+DOMAIN-SUFFIX,turbobit.net,🍃 Proxy
+DOMAIN-SUFFIX,tv.com,🍃 Proxy
+DOMAIN-SUFFIX,tweetdeck.com,🍃 Proxy
+DOMAIN-SUFFIX,tweetmarker.net,🍃 Proxy
+DOMAIN-SUFFIX,twimg.co,🍃 Proxy
+DOMAIN-SUFFIX,twitch.tv,🍃 Proxy
+DOMAIN-SUFFIX,twitthat.com,🍃 Proxy
+DOMAIN-SUFFIX,twtkr.com,🍃 Proxy
+DOMAIN-SUFFIX,twttr.com,🍃 Proxy
+DOMAIN-SUFFIX,txmblr.com,🍃 Proxy
+DOMAIN-SUFFIX,typcn.com,🍃 Proxy
+DOMAIN-SUFFIX,typekit.net,🍃 Proxy
+DOMAIN-SUFFIX,typography.com,🍃 Proxy
+DOMAIN-SUFFIX,ubertags.com,🍃 Proxy
+DOMAIN-SUFFIX,ublock.org,🍃 Proxy
+DOMAIN-SUFFIX,ubnt.com,🍃 Proxy
+DOMAIN-SUFFIX,uchicago.edu,🍃 Proxy
+DOMAIN-SUFFIX,udn.com,🍃 Proxy
+DOMAIN-SUFFIX,ugo.com,🍃 Proxy
+DOMAIN-SUFFIX,uhdwallpapers.org,🍃 Proxy
+DOMAIN-SUFFIX,ulyssesapp.com,🍃 Proxy
+DOMAIN-SUFFIX,unblockdmm.com,🍃 Proxy
+DOMAIN-SUFFIX,unblocksites.co,🍃 Proxy
+DOMAIN-SUFFIX,unpo.org,🍃 Proxy
+DOMAIN-SUFFIX,unsplash.com,🍃 Proxy
+DOMAIN-SUFFIX,untraceable.us,🍃 Proxy
+DOMAIN-SUFFIX,uploaded.net,🍃 Proxy
+DOMAIN-SUFFIX,uProxy.org,🍃 Proxy
+DOMAIN-SUFFIX,upwork.com,🍃 Proxy
+DOMAIN-SUFFIX,urchin.com,🍃 Proxy
+DOMAIN-SUFFIX,urlparser.com,🍃 Proxy
+DOMAIN-SUFFIX,us.to,🍃 Proxy
+DOMAIN-SUFFIX,usertrust.com,🍃 Proxy
+DOMAIN-SUFFIX,usgs.gov,🍃 Proxy
+DOMAIN-SUFFIX,usma.edu,🍃 Proxy
+DOMAIN-SUFFIX,uspto.gov,🍃 Proxy
+DOMAIN-SUFFIX,ustream.tv,🍃 Proxy
+DOMAIN-SUFFIX,v.gd,🍃 Proxy
+DOMAIN-SUFFIX,v2ray.com,🍃 Proxy
+DOMAIN-SUFFIX,van001.com,🍃 Proxy
+DOMAIN-SUFFIX,vanpeople.com,🍃 Proxy
+DOMAIN-SUFFIX,vansky.com,🍃 Proxy
+DOMAIN-SUFFIX,vbstatic.co,🍃 Proxy
+DOMAIN-SUFFIX,venchina.com,🍃 Proxy
+DOMAIN-SUFFIX,venturebeat.com,🍃 Proxy
+DOMAIN-SUFFIX,veoh.com,🍃 Proxy
+DOMAIN-SUFFIX,verizonwireless.com,🍃 Proxy
+DOMAIN-SUFFIX,viber.com,🍃 Proxy
+DOMAIN-SUFFIX,vid.me,🍃 Proxy
+DOMAIN-SUFFIX,videomega.tv,🍃 Proxy
+DOMAIN-SUFFIX,vidinfo.org,🍃 Proxy
+DOMAIN-SUFFIX,vimeo.com,🍃 Proxy
+DOMAIN-SUFFIX,vimeocdn.com,🍃 Proxy
+DOMAIN-SUFFIX,vimperator.org,🍃 Proxy
+DOMAIN-SUFFIX,vine.co,🍃 Proxy
+DOMAIN-SUFFIX,visibletweets.com,🍃 Proxy
+DOMAIN-SUFFIX,viu.com,🍃 Proxy
+DOMAIN-SUFFIX,vivaldi.com,🍃 Proxy
+DOMAIN-SUFFIX,voachinese.com,🍃 Proxy
+DOMAIN-SUFFIX,vocativ.com,🍃 Proxy
+DOMAIN-SUFFIX,vox-cdn.com,🍃 Proxy
+DOMAIN-SUFFIX,vpnaccount.org,🍃 Proxy
+DOMAIN-SUFFIX,vpnbook.com,🍃 Proxy
+DOMAIN-SUFFIX,vpngate.net,🍃 Proxy
+DOMAIN-SUFFIX,vsco.co,🍃 Proxy
+DOMAIN-SUFFIX,vultr.com,🍃 Proxy
+DOMAIN-SUFFIX,vzw.com,🍃 Proxy
+DOMAIN-SUFFIX,w.org,🍃 Proxy
+DOMAIN-SUFFIX,w3schools.com,🍃 Proxy
+DOMAIN-SUFFIX,wattpad.com,🍃 Proxy
+DOMAIN-SUFFIX,web2project.net,🍃 Proxy
+DOMAIN-SUFFIX,webfreer.com,🍃 Proxy
+DOMAIN-SUFFIX,weblagu.com,🍃 Proxy
+DOMAIN-SUFFIX,websnapr.com,🍃 Proxy
+DOMAIN-SUFFIX,webtype.com,🍃 Proxy
+DOMAIN-SUFFIX,webwarper.net,🍃 Proxy
+DOMAIN-SUFFIX,wenxuecity.com,🍃 Proxy
+DOMAIN-SUFFIX,westca.com,🍃 Proxy
+DOMAIN-SUFFIX,westpoint.edu,🍃 Proxy
+DOMAIN-SUFFIX,whatbrowser.org,🍃 Proxy
+DOMAIN-SUFFIX,wikileaks.info,🍃 Proxy
+DOMAIN-SUFFIX,wikileaks.org,🍃 Proxy
+DOMAIN-SUFFIX,wikileaks-forum.com,🍃 Proxy
+DOMAIN-SUFFIX,wikimedia.org,🍃 Proxy
+DOMAIN-SUFFIX,wikipedia.com,🍃 Proxy
+DOMAIN-SUFFIX,wikipedia.org,🍃 Proxy
+DOMAIN-SUFFIX,windows.com,🍃 Proxy
+DOMAIN-SUFFIX,windows.net,🍃 Proxy
+DOMAIN-SUFFIX,wn.com,🍃 Proxy
+DOMAIN-SUFFIX,wordpress.com,🍃 Proxy
+DOMAIN-SUFFIX,workflow.is,🍃 Proxy
+DOMAIN-SUFFIX,worldcat.org,🍃 Proxy
+DOMAIN-SUFFIX,wow.com,🍃 Proxy
+DOMAIN-SUFFIX,wp.com,🍃 Proxy
+DOMAIN-SUFFIX,wsj.com,🍃 Proxy
+DOMAIN-SUFFIX,wsj.net,🍃 Proxy
+DOMAIN-SUFFIX,wwitv.com,🍃 Proxy
+DOMAIN-SUFFIX,xanga.com,🍃 Proxy
+DOMAIN-SUFFIX,xclient.info,🍃 Proxy
+DOMAIN-SUFFIX,xda-developers.com,🍃 Proxy
+DOMAIN-SUFFIX,xeeno.com,🍃 Proxy
+DOMAIN-SUFFIX,xiti.com,🍃 Proxy
+DOMAIN-SUFFIX,xuite.net,🍃 Proxy
+DOMAIN-SUFFIX,xvideos.com,🍃 Proxy
+DOMAIN-SUFFIX,yahoo.com,🍃 Proxy
+DOMAIN-SUFFIX,yahooapis.com,🍃 Proxy
+DOMAIN-SUFFIX,yasni.co.uk,🍃 Proxy
+DOMAIN-SUFFIX,yastatic.net,🍃 Proxy
+DOMAIN-SUFFIX,yeeyi.com,🍃 Proxy
+DOMAIN-SUFFIX,yesasia.com,🍃 Proxy
+DOMAIN-SUFFIX,yes-news.com,🍃 Proxy
+DOMAIN-SUFFIX,yidio.com,🍃 Proxy
+DOMAIN-SUFFIX,yimg.com,🍃 Proxy
+DOMAIN-SUFFIX,ying.com,🍃 Proxy
+DOMAIN-SUFFIX,yorkbbs.ca,🍃 Proxy
+DOMAIN-SUFFIX,youmaker.com,🍃 Proxy
+DOMAIN-SUFFIX,yourlisten.com,🍃 Proxy
+DOMAIN-SUFFIX,youtu.be,🍃 Proxy
+DOMAIN-SUFFIX,yoyo.org,🍃 Proxy
+DOMAIN-SUFFIX,ytimg.com,🍃 Proxy
+DOMAIN-SUFFIX,zacebook.com,🍃 Proxy
+DOMAIN-SUFFIX,zalmos.com,🍃 Proxy
+DOMAIN-SUFFIX,zaobao.com.sg,🍃 Proxy
+DOMAIN-SUFFIX,zeutch.com,🍃 Proxy
+DOMAIN-SUFFIX,zynamics.com,🍃 Proxy
+
+// Force some domains which are fucked by GFW while resolving DNS,or do not respect the system Proxy
+DOMAIN-KEYWORD,appledaily,🍃 Proxy,force-remote-dns
+DOMAIN-KEYWORD,beetalk,🍃 Proxy,force-remote-dns
+DOMAIN-KEYWORD,blogspot,🍃 Proxy,force-remote-dns
+DOMAIN-KEYWORD,dropbox,🍃 Proxy,force-remote-dns
+DOMAIN-KEYWORD,facebook,🍃 Proxy,force-remote-dns
+DOMAIN-KEYWORD,github,🍃 Proxy,force-remote-dns
+DOMAIN-KEYWORD,porn,🍃 Proxy,force-remote-dns
+DOMAIN-KEYWORD,spotify,🍃 Proxy,force-remote-dns
+DOMAIN-KEYWORD,telegram,🍃 Proxy,force-remote-dns
+DOMAIN-KEYWORD,twitter,🍃 Proxy,force-remote-dns
+DOMAIN-KEYWORD,whatsapp,🍃 Proxy,force-remote-dns
+DOMAIN-KEYWORD,youtube,🍃 Proxy,force-remote-dns
+DOMAIN-KEYWORD,google,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,1e100.net,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,2mdn.net,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,abc.xyz,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,akamai.net,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,appspot.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,autodraw.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,bandwagonhost.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,blogblog.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,cdninstagram.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,chromeexperiments.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,creativelab5.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,crittercism.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,culturalspot.org,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,dartlang.org,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,fb.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,fb.me,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,fbcdn.net,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,fbsbx.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,gcr.io,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,gmail.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,gosetsuden.jp,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,gvt1.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,gwtproject.org,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,heroku.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,html5rocks.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,instagram.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,keyhole.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,kobo.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,kobobooks.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,madewithcode.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,material.io,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,messenger.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,netmarble.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,nianticlabs.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,pinimg.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,pubnub.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,scdn.co,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,t.co,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,tensorflow.org,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,toggleable.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,torproject.org,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,twimg.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,twitpic.com,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,unfiltered.news,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,waveprotocol.org,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,webmproject.org,🍃 Proxy,force-remote-dns
+DOMAIN-SUFFIX,webrtc.org,🍃 Proxy,force-remote-dns
+
+// Amazon
+IP-CIDR,13.32.0.0/16,🍃 Proxy,no-resolve
+IP-CIDR,13.33.0.0/16,🍃 Proxy,no-resolve
+IP-CIDR,13.35.0.0/17,🍃 Proxy,no-resolve
+IP-CIDR,18.184.0.0/15,🍃 Proxy,no-resolve
+IP-CIDR,18.194.0.0/15,🍃 Proxy,no-resolve
+IP-CIDR,18.208.0.0/13,🍃 Proxy,no-resolve
+IP-CIDR,18.232.0.0/14,🍃 Proxy,no-resolve
+IP-CIDR,52.200.0.0/13,🍃 Proxy,no-resolve
+IP-CIDR,52.58.0.0/15,🍃 Proxy,no-resolve
+IP-CIDR,52.74.0.0/16,🍃 Proxy,no-resolve
+IP-CIDR,52.77.0.0/16,🍃 Proxy,no-resolve
+IP-CIDR,52.84.0.0/15,🍃 Proxy,no-resolve
+IP-CIDR,54.156.0.0/14,🍃 Proxy,no-resolve
+IP-CIDR,54.226.0.0/15,🍃 Proxy,no-resolve
+IP-CIDR,54.230.156.0/22,🍃 Proxy,no-resolve
+IP-CIDR,54.93.0.0/16,🍃 Proxy,no-resolve
+
+// Facebook
+IP-CIDR,103.4.96.0/22,🍃 Proxy,no-resolve
+IP-CIDR,129.134.0.0/17,🍃 Proxy,no-resolve
+IP-CIDR,157.240.0.0/17,🍃 Proxy,no-resolve
+IP-CIDR,173.252.64.0/19,🍃 Proxy,no-resolve
+IP-CIDR,173.252.96.0/19,🍃 Proxy,no-resolve
+IP-CIDR,179.60.192.0/22,🍃 Proxy,no-resolve
+IP-CIDR,185.60.216.0/22,🍃 Proxy,no-resolve
+IP-CIDR,204.15.20.0/22,🍃 Proxy,no-resolve
+IP-CIDR,31.13.24.0/21,🍃 Proxy,no-resolve
+IP-CIDR,31.13.64.0/18,🍃 Proxy,no-resolve
+IP-CIDR,45.64.40.0/22,🍃 Proxy,no-resolve
+IP-CIDR,66.220.144.0/20,🍃 Proxy,no-resolve
+IP-CIDR,69.171.224.0/19,🍃 Proxy,no-resolve
+IP-CIDR,69.63.176.0/20,🍃 Proxy,no-resolve
+IP-CIDR,74.119.76.0/22,🍃 Proxy,no-resolve
+
+// Google
+IP-CIDR,173.194.0.0/16,🍃 Proxy,no-resolve
+IP-CIDR,74.125.0.0/16,🍃 Proxy,no-resolve
+
+// Kakao Talk
+IP-CIDR,1.201.0.0/24,🍃 Proxy,no-resolve
+IP-CIDR,103.246.56.0/22,🍃 Proxy,no-resolve
+IP-CIDR,103.27.148.0/22,🍃 Proxy,no-resolve
+IP-CIDR,110.76.140.0/22,🍃 Proxy,no-resolve
+IP-CIDR,113.61.104.0/22,🍃 Proxy,no-resolve
+IP-CIDR,27.0.236.0/22,🍃 Proxy,no-resolve
+
+// LINE
+IP-CIDR,103.2.28.0/22,🍃 Proxy,no-resolve
+IP-CIDR,119.235.224.0/21,🍃 Proxy,no-resolve
+IP-CIDR,119.235.232.0/23,🍃 Proxy,no-resolve
+IP-CIDR,119.235.235.0/24,🍃 Proxy,no-resolve
+IP-CIDR,119.235.236.0/23,🍃 Proxy,no-resolve
+IP-CIDR,125.6.146.0/24,🍃 Proxy,no-resolve
+IP-CIDR,125.6.149.0/24,🍃 Proxy,no-resolve
+IP-CIDR,125.6.190.0/24,🍃 Proxy,no-resolve
+IP-CIDR,125.209.208.0/20,🍃 Proxy,no-resolve
+IP-CIDR,203.104.103.0/24,🍃 Proxy,no-resolve
+IP-CIDR,203.104.128.0/20,🍃 Proxy,no-resolve
+IP-CIDR,203.174.66.64/26,🍃 Proxy,no-resolve
+IP-CIDR,203.174.77.0/24,🍃 Proxy,no-resolve
+
+// Potato Chat
+IP-CIDR,13.251.24.157/24,🍃 Proxy,no-resolve
+IP-CIDR,13.251.41.203/24,🍃 Proxy,no-resolve
+IP-CIDR,17.252.156.147/24,🍃 Proxy,no-resolve
+IP-CIDR,17.252.157.26/24,🍃 Proxy,no-resolve
+
+// SoftLayer
+IP-CIDR,74.86.0.0/16,🍃 Proxy,no-resolve
+IP-CIDR,75.126.0.0/16,🍃 Proxy,no-resolve
+IP-CIDR,174.37.0.0/16,🍃 Proxy,no-resolve
+IP-CIDR,208.43.0.0/16,🍃 Proxy,no-resolve
+
+// Telegram
+IP-CIDR,109.239.140.0/24,🍃 Proxy,no-resolve
+IP-CIDR,149.154.160.0/20,🍃 Proxy,no-resolve
+IP-CIDR,149.154.164.0/22,🍃 Proxy,no-resolve
+IP-CIDR,149.154.168.0/22,🍃 Proxy,no-resolve
+IP-CIDR,149.154.172.0/22,🍃 Proxy,no-resolve
+IP-CIDR,91.108.4.0/22,🍃 Proxy,no-resolve
+IP-CIDR,91.108.56.0/22,🍃 Proxy,no-resolve
+IP-CIDR,91.108.8.0/22,🍃 Proxy,no-resolve
+
+# DIRECT
+
+// Client
+PROCESS-NAME,Paws for Trello,🍂 Domestic
+PROCESS-NAME,ss-local,🍂 Domestic
+PROCESS-NAME,Thunder,🍂 Domestic
+PROCESS-NAME,DownloadService,🍂 Domestic
+PROCESS-NAME,TeamViewer,🍂 Domestic
+PROCESS-NAME,trustd,🍂 Domestic
+PROCESS-NAME,WebTorrent,🍂 Domestic
+PROCESS-NAME,WeChat,🍂 Domestic
+
+// UA
+USER-AGENT, %E4%BA%AC%E4%B8%9C%E5%88%B0%E5%AE%B6*,🍂 Domestic
+USER-AGENT,%E5%8D%B3%E5%88%BB*,🍂 Domestic
+USER-AGENT,*Vainglory* ,🍂 Domestic
+USER-AGENT,AdBlock*,🍂 Domestic
+USER-AGENT,arrowio*,🍂 Domestic
+USER-AGENT,balls*,🍂 Domestic
+USER-AGENT,Beplay*,🍂 Domestic
+USER-AGENT,Best%20Trace*,🍂 Domestic
+USER-AGENT,cmblife*,🍂 Domestic
+USER-AGENT,eusoft_ting_en_iphone,🍂 Domestic
+USER-AGENT,hide*,🍂 Domestic
+USER-AGENT,JDLife*,🍂 Domestic
+USER-AGENT,LastPass*,🍂 Domestic
+USER-AGENT,MegaWerewolf*,🍂 Domestic
+USER-AGENT,MicroMessenger*,🍂 Domestic
+USER-AGENT,Microsoft*,🍂 Domestic
+USER-AGENT,Moke*,🍂 Domestic
+USER-AGENT,osee2unifiedRelease*,🍂 Domestic
+USER-AGENT,PayPal*,🍂 Domestic
+USER-AGENT,QQ*,🍂 Domestic
+USER-AGENT,Speedtest*,🍂 Domestic
+USER-AGENT,TeamViewer*,🍂 Domestic
+USER-AGENT,TIM*,🍂 Domestic
+USER-AGENT,ting_en,🍂 Domestic
+USER-AGENT,WebTorrent*,🍂 Domestic
+USER-AGENT,WeChat*,🍂 Domestic
+
+// Beplay
+DOMAIN-KEYWORD,beplay,🍂 Domestic
+
+// Blizzard
+USER-AGENT,Blizzard*,🍂 Domestic
+USER-AGENT,wowcompanion*,🍂 Domestic
+DOMAIN-SUFFIX,battle.net,🍂 Domestic
+DOMAIN-SUFFIX,battlenet.com,🍂 Domestic
+DOMAIN-SUFFIX,blizzard.com,🍂 Domestic
+
+// Prior
+DOMAIN,client.amplifi.com,🍂 Domestic
+DOMAIN,ip.bjango.com,🍂 Domestic // iStat Menu IP Test
+DOMAIN-SUFFIX,alphassl.com,🍂 Domestic
+DOMAIN-SUFFIX,edu.cn,🍂 Domestic
+
+// Steam
+DOMAIN-SUFFIX,steamcontent.com,🍂 Domestic
+
+// TeamViewer
+IP-CIDR,139.220.243.27/32,🍂 Domestic,no-resolve
+IP-CIDR,172.16.102.56/32,🍂 Domestic,no-resolve
+IP-CIDR,185.188.32.1/28,🍂 Domestic,no-resolve
+IP-CIDR,221.226.128.146/32,🍂 Domestic,no-resolve
+
+
+
+# Domestic
+
+DOMAIN-SUFFIX,cn,🍂 Domestic
+
+DOMAIN-SUFFIX,12306.com,🍂 Domestic
+DOMAIN-SUFFIX,126.net,🍂 Domestic
+DOMAIN-SUFFIX,163.com,🍂 Domestic
+DOMAIN-SUFFIX,360.cn,🍂 Domestic
+DOMAIN-SUFFIX,360.com,🍂 Domestic
+DOMAIN-SUFFIX,360buy.com,🍂 Domestic
+DOMAIN-SUFFIX,360buyimg.com,🍂 Domestic
+DOMAIN-SUFFIX,36kr.com,🍂 Domestic
+DOMAIN-SUFFIX,51ym.me,🍂 Domestic
+DOMAIN-SUFFIX,58.com,🍂 Domestic
+DOMAIN-SUFFIX,8686c.com,🍂 Domestic
+DOMAIN-SUFFIX,abercrombie.com,🍂 Domestic
+DOMAIN-SUFFIX,acfun.tv,🍂 Domestic
+DOMAIN-SUFFIX,acgvideo.com,🍂 Domestic
+DOMAIN-SUFFIX,adobesc.com,🍂 Domestic
+DOMAIN-SUFFIX,air-matters.com,🍂 Domestic
+DOMAIN-SUFFIX,air-matters.io,🍂 Domestic
+DOMAIN-SUFFIX,airtable.com,🍂 Domestic
+DOMAIN-SUFFIX,aixifan.com,🍂 Domestic
+DOMAIN-SUFFIX,akadns.net,🍂 Domestic
+DOMAIN-SUFFIX,alicdn.com,🍂 Domestic
+DOMAIN-SUFFIX,alipay.com,🍂 Domestic
+DOMAIN-SUFFIX,alipayobjects.com,🍂 Domestic
+DOMAIN-SUFFIX,aliyun.com,🍂 Domestic
+DOMAIN-SUFFIX,amap.com,🍂 Domestic
+DOMAIN-SUFFIX,apache.org,🍂 Domestic
+DOMAIN-SUFFIX,api.crisp.chat,🍂 Domestic
+DOMAIN-SUFFIX,api.termius.com,🍂 Domestic
+DOMAIN-SUFFIX,appshike.com,🍂 Domestic
+DOMAIN-SUFFIX,appstore.com,🍂 Domestic
+DOMAIN-SUFFIX,autonavi.com,🍂 Domestic
+DOMAIN-SUFFIX,aweme.snssdk.com,🍂 Domestic
+DOMAIN-SUFFIX,bababian.com,🍂 Domestic
+DOMAIN-SUFFIX,baidu.com,🍂 Domestic
+DOMAIN-SUFFIX,battle.net,🍂 Domestic
+DOMAIN-SUFFIX,bdimg.com,🍂 Domestic
+DOMAIN-SUFFIX,bdstatic.com,🍂 Domestic
+DOMAIN-SUFFIX,beatsbydre.com,🍂 Domestic
+DOMAIN-SUFFIX,bet365.com,🍂 Domestic
+DOMAIN-SUFFIX,bilibili.cn,🍂 Domestic
+DOMAIN-SUFFIX,bilibili.com,🍂 Domestic
+DOMAIN-SUFFIX,caiyunapp.com,🍂 Domestic
+DOMAIN-SUFFIX,ccgslb.com,🍂 Domestic
+DOMAIN-SUFFIX,ccgslb.net,🍂 Domestic
+DOMAIN-SUFFIX,chinacache.net,🍂 Domestic
+DOMAIN-SUFFIX,chunbo.com,🍂 Domestic
+DOMAIN-SUFFIX,chunboimg.com,🍂 Domestic
+DOMAIN-SUFFIX,clashroyaleapp.com,🍂 Domestic
+DOMAIN-SUFFIX,clouddn.com,🍂 Domestic
+DOMAIN-SUFFIX,cloudsigma.com,🍂 Domestic
+DOMAIN-SUFFIX,cloudxns.net,🍂 Domestic
+DOMAIN-SUFFIX,cmfu.com,🍂 Domestic
+DOMAIN-SUFFIX,cnbeta.com,🍂 Domestic
+DOMAIN-SUFFIX,cnbetacdn.com,🍂 Domestic
+DOMAIN-SUFFIX,culturedcode.com,🍂 Domestic
+DOMAIN-SUFFIX,dct-cloud.com,🍂 Domestic
+DOMAIN-SUFFIX,didialift.com,🍂 Domestic
+DOMAIN-SUFFIX,digicert.com,🍂 Domestic
+DOMAIN-SUFFIX,douban.com,🍂 Domestic
+DOMAIN-SUFFIX,doubanio.com,🍂 Domestic
+DOMAIN-SUFFIX,douyu.com,🍂 Domestic
+DOMAIN-SUFFIX,douyu.tv,🍂 Domestic
+DOMAIN-SUFFIX,douyutv.com,🍂 Domestic
+DOMAIN-SUFFIX,duokan.com,🍂 Domestic
+DOMAIN-SUFFIX,duoshuo.com,🍂 Domestic
+DOMAIN-SUFFIX,dytt8.net,🍂 Domestic
+DOMAIN-SUFFIX,easou.com,🍂 Domestic
+DOMAIN-SUFFIX,ecitic.com,🍂 Domestic
+DOMAIN-SUFFIX,ecitic.net,🍂 Domestic
+DOMAIN-SUFFIX,eclipse.org,🍂 Domestic
+DOMAIN-SUFFIX,eudic.net,🍂 Domestic
+DOMAIN-SUFFIX,ewqcxz.com,🍂 Domestic
+DOMAIN-SUFFIX,feng.com,🍂 Domestic
+DOMAIN-SUFFIX,fir.im,🍂 Domestic
+DOMAIN-SUFFIX,frdic.com,🍂 Domestic
+DOMAIN-SUFFIX,fresh-ideas.cc,🍂 Domestic
+DOMAIN-SUFFIX,geetest.com,🍂 Domestic
+DOMAIN-SUFFIX,godic.net,🍂 Domestic
+DOMAIN-SUFFIX,goodread.com,🍂 Domestic
+DOMAIN-SUFFIX,google.cn,🍂 Domestic
+DOMAIN-SUFFIX,gtimg.com,🍂 Domestic
+DOMAIN-SUFFIX,haibian.com,🍂 Domestic
+DOMAIN-SUFFIX,hao123.com,🍂 Domestic
+DOMAIN-SUFFIX,haosou.com,🍂 Domestic
+DOMAIN-SUFFIX,hdslb.com,🍂 Domestic
+DOMAIN-SUFFIX,hdslb.net,🍂 Domestic
+DOMAIN-SUFFIX,hollisterco.com,🍂 Domestic
+DOMAIN-SUFFIX,hongxiu.com,🍂 Domestic
+DOMAIN-SUFFIX,hxcdn.net,🍂 Domestic
+DOMAIN-SUFFIX,iciba.com,🍂 Domestic
+DOMAIN-SUFFIX,ifeng.com,🍂 Domestic
+DOMAIN-SUFFIX,ifengimg.com,🍂 Domestic
+DOMAIN-SUFFIX,images.unsplash.com,🍂 Domestic
+DOMAIN-SUFFIX,images-amazon.com,🍂 Domestic
+DOMAIN-SUFFIX,img4me.com,🍂 Domestic
+DOMAIN-SUFFIX,ipify.org,🍂 Domestic
+DOMAIN-SUFFIX,ipip.net,🍂 Domestic
+DOMAIN-SUFFIX,iqiyi.com,🍂 Domestic
+DOMAIN-SUFFIX,ithome.com,🍂 Domestic
+DOMAIN-SUFFIX,ixdzs.com,🍂 Domestic
+DOMAIN-SUFFIX,jd.com,🍂 Domestic
+DOMAIN-SUFFIX,jd.hk,🍂 Domestic
+DOMAIN-SUFFIX,jianshu.com,🍂 Domestic
+DOMAIN-SUFFIX,jianshu.io,🍂 Domestic
+DOMAIN-SUFFIX,jianshuapi.com,🍂 Domestic
+DOMAIN-SUFFIX,jiathis.com,🍂 Domestic
+DOMAIN-SUFFIX,jomodns.com,🍂 Domestic
+DOMAIN-SUFFIX,jsboxbbs.com,🍂 Domestic
+DOMAIN-SUFFIX,knewone.com,🍂 Domestic
+DOMAIN-SUFFIX,kuaidi100.com,🍂 Domestic
+DOMAIN-SUFFIX,lecloud.com,🍂 Domestic
+DOMAIN-SUFFIX,lemicp.com,🍂 Domestic
+DOMAIN-SUFFIX,letv.com,🍂 Domestic
+DOMAIN-SUFFIX,letvcloud.com,🍂 Domestic
+DOMAIN-SUFFIX,lizhi.io,🍂 Domestic
+DOMAIN-SUFFIX,localizecdn.com,🍂 Domestic
+DOMAIN-SUFFIX,lucifr.com,🍂 Domestic
+DOMAIN-SUFFIX,luoo.net,🍂 Domestic
+DOMAIN-SUFFIX,lxdns.com,🍂 Domestic
+DOMAIN-SUFFIX,mai.tn,🍂 Domestic
+DOMAIN-SUFFIX,maven.org,🍂 Domestic
+DOMAIN-SUFFIX,meizu.com,🍂 Domestic
+DOMAIN-SUFFIX,mi.com,🍂 Domestic
+DOMAIN-SUFFIX,miaopai.com,🍂 Domestic
+DOMAIN-SUFFIX,miui.com,🍂 Domestic
+DOMAIN-SUFFIX,miwifi.com,🍂 Domestic
+DOMAIN-SUFFIX,mob.com,🍂 Domestic
+DOMAIN-SUFFIX,moji.com,🍂 Domestic
+DOMAIN-SUFFIX,moke.com,🍂 Domestic
+DOMAIN-SUFFIX,mtalk.google.com,🍂 Domestic
+DOMAIN-SUFFIX,mxhichina.com,🍂 Domestic
+DOMAIN-SUFFIX,myqcloud.com,🍂 Domestic
+DOMAIN-SUFFIX,myunlu.com,🍂 Domestic
+DOMAIN-SUFFIX,netease.com,🍂 Domestic
+DOMAIN-SUFFIX,nfoservers.com,🍂 Domestic
+DOMAIN-SUFFIX,nssurge.com,🍂 Domestic
+DOMAIN-SUFFIX,nuomi.com,🍂 Domestic
+DOMAIN-SUFFIX,ourdvs.com,🍂 Domestic
+DOMAIN-SUFFIX,overcast.fm,🍂 Domestic
+DOMAIN-SUFFIX,paypal.com,🍂 Domestic
+DOMAIN-SUFFIX,paypalobjects.com,🍂 Domestic
+DOMAIN-SUFFIX,pgyer.com,🍂 Domestic
+DOMAIN-SUFFIX,pstatp.com,🍂 Domestic
+DOMAIN-SUFFIX,qbox.me,🍂 Domestic
+DOMAIN-SUFFIX,qcloud.com,🍂 Domestic
+DOMAIN-SUFFIX,qdaily.com,🍂 Domestic
+DOMAIN-SUFFIX,qdmm.com,🍂 Domestic
+DOMAIN-SUFFIX,qhimg.com,🍂 Domestic
+DOMAIN-SUFFIX,qidian.com,🍂 Domestic
+DOMAIN-SUFFIX,qihucdn.com,🍂 Domestic
+DOMAIN-SUFFIX,qin.io,🍂 Domestic
+DOMAIN-SUFFIX,qingmang.me,🍂 Domestic
+DOMAIN-SUFFIX,qingmang.mobi,🍂 Domestic
+DOMAIN-SUFFIX,qiniucdn.com,🍂 Domestic
+DOMAIN-SUFFIX,qiniudn.com,🍂 Domestic
+DOMAIN-SUFFIX,qiyi.com,🍂 Domestic
+DOMAIN-SUFFIX,qiyipic.com,🍂 Domestic
+DOMAIN-SUFFIX,qq.com,🍂 Domestic
+DOMAIN-SUFFIX,qqurl.com,🍂 Domestic
+DOMAIN-SUFFIX,rarbg.to,🍂 Domestic
+DOMAIN-SUFFIX,rrmj.tv,🍂 Domestic
+DOMAIN-SUFFIX,ruguoapp.com,🍂 Domestic
+DOMAIN-SUFFIX,sandai.net,🍂 Domestic
+DOMAIN-SUFFIX,sf-express.com,🍂 Domestic
+DOMAIN-SUFFIX,sinaapp.com,🍂 Domestic
+DOMAIN-SUFFIX,sinaimg.cn,🍂 Domestic
+DOMAIN-SUFFIX,sinaimg.com,🍂 Domestic
+DOMAIN-SUFFIX,sm.ms,🍂 Domestic
+DOMAIN-SUFFIX,smzdm.com,🍂 Domestic
+DOMAIN-SUFFIX,snssdk.com,🍂 Domestic
+DOMAIN-SUFFIX,snwx.com,🍂 Domestic
+DOMAIN-SUFFIX,so.com,🍂 Domestic
+DOMAIN-SUFFIX,sogou.com,🍂 Domestic
+DOMAIN-SUFFIX,sogoucdn.com,🍂 Domestic
+DOMAIN-SUFFIX,sohu.com,🍂 Domestic
+DOMAIN-SUFFIX,soku.com,🍂 Domestic
+DOMAIN-SUFFIX,soso.com,🍂 Domestic
+DOMAIN-SUFFIX,speedtest.net,🍂 Domestic
+DOMAIN-SUFFIX,sspai.com,🍂 Domestic
+DOMAIN-SUFFIX,startssl.com,🍂 Domestic
+DOMAIN-SUFFIX,store.steampowered.com,🍂 Domestic
+DOMAIN-SUFFIX,suning.com,🍂 Domestic
+DOMAIN-SUFFIX,symcd.com,🍂 Domestic
+DOMAIN-SUFFIX,taobao.com,🍂 Domestic
+DOMAIN-SUFFIX,teamviewer.com,🍂 Domestic
+DOMAIN-SUFFIX,tenpay.com,🍂 Domestic
+DOMAIN-SUFFIX,tietuku.com,🍂 Domestic
+DOMAIN-SUFFIX,tmall.com,🍂 Domestic
+DOMAIN-SUFFIX,tmzvps.com,🍂 Domestic
+DOMAIN-SUFFIX,trello.com,🍂 Domestic
+DOMAIN-SUFFIX,trellocdn.com,🍂 Domestic
+DOMAIN-SUFFIX,ttmeiju.com,🍂 Domestic
+DOMAIN-SUFFIX,tudou.com,🍂 Domestic
+DOMAIN-SUFFIX,udache.com,🍂 Domestic
+DOMAIN-SUFFIX,umengcloud.com,🍂 Domestic
+DOMAIN-SUFFIX,upaiyun.com,🍂 Domestic
+DOMAIN-SUFFIX,upyun.com,🍂 Domestic
+DOMAIN-SUFFIX,uxengine.net,🍂 Domestic
+DOMAIN-SUFFIX,v2ex.co,🍂 Domestic
+DOMAIN-SUFFIX,v2ex.com,🍂 Domestic
+DOMAIN-SUFFIX,wandoujia.com,🍂 Domestic
+DOMAIN-SUFFIX,weather.bjango.com,🍂 Domestic
+DOMAIN-SUFFIX,weather.com,🍂 Domestic
+DOMAIN-SUFFIX,webqxs.com,🍂 Domestic
+DOMAIN-SUFFIX,weibo.cn,🍂 Domestic
+DOMAIN-SUFFIX,weibo.com,🍂 Domestic
+DOMAIN-SUFFIX,weico.cc,🍂 Domestic
+DOMAIN-SUFFIX,weiphone.com,🍂 Domestic
+DOMAIN-SUFFIX,weiphone.net,🍂 Domestic
+DOMAIN-SUFFIX,wenku8.net,🍂 Domestic
+DOMAIN-SUFFIX,werewolf.53site.com,🍂 Domestic
+DOMAIN-SUFFIX,windowsupdate.com,🍂 Domestic
+DOMAIN-SUFFIX,wkcdn.com,🍂 Domestic
+DOMAIN-SUFFIX,workflowy.com,🍂 Domestic
+DOMAIN-SUFFIX,xdrig.com,🍂 Domestic
+DOMAIN-SUFFIX,xiami.com,🍂 Domestic
+DOMAIN-SUFFIX,xiami.net,🍂 Domestic
+DOMAIN-SUFFIX,xiaojukeji.com,🍂 Domestic
+DOMAIN-SUFFIX,xiaomi.com,🍂 Domestic
+DOMAIN-SUFFIX,xiaomi.net,🍂 Domestic
+DOMAIN-SUFFIX,xiaomicp.com,🍂 Domestic
+DOMAIN-SUFFIX,ximalaya.com,🍂 Domestic
+DOMAIN-SUFFIX,xitek.com,🍂 Domestic
+DOMAIN-SUFFIX,xmcdn.com,🍂 Domestic
+DOMAIN-SUFFIX,xslb.net,🍂 Domestic
+DOMAIN-SUFFIX,xteko.com,🍂 Domestic
+DOMAIN-SUFFIX,xunlei.com,🍂 Domestic
+DOMAIN-SUFFIX,yach.me,🍂 Domestic
+DOMAIN-SUFFIX,yeepay.com,🍂 Domestic
+DOMAIN-SUFFIX,yhd.com,🍂 Domestic
+DOMAIN-SUFFIX,yinxiang.com,🍂 Domestic
+DOMAIN-SUFFIX,yixia.com,🍂 Domestic
+DOMAIN-SUFFIX,ykimg.com,🍂 Domestic
+DOMAIN-SUFFIX,youdao.com,🍂 Domestic
+DOMAIN-SUFFIX,youku.com,🍂 Domestic
+DOMAIN-SUFFIX,yunjiasu-cdn.net,🍂 Domestic
+DOMAIN-SUFFIX,zealer.com,🍂 Domestic
+DOMAIN-SUFFIX,zgslb.net,🍂 Domestic
+DOMAIN-SUFFIX,zhihu.com,🍂 Domestic
+DOMAIN-SUFFIX,zhimg.com,🍂 Domestic
+DOMAIN-SUFFIX,zimuzu.tv,🍂 Domestic
+DOMAIN-SUFFIX,zmz002.com,🍂 Domestic
+
+// Accelerate direct sites
+DOMAIN-KEYWORD,torrent,🍂 Domestic
+URL-REGEX,(Subject|HELO|SMTP),🍂 Domestic
+URL-REGEX,(api|ps|sv|offnavi|newvector|ulog\.imap|newloc)(\.map|)\.(baidu|n\.shifen)\.com,🍂 Domestic
+URL-REGEX,(.+\.|^)(360|so|qihoo|360safe|qhimg|360totalsecurity|yunpan)\.(cn|com),🍂 Domestic
+URL-REGEX,(ed2k|torrent|\.torrent|peer_id=|announce|info_hash|get_peers|find_node|BitTorrent|announce_peer|protocol|announce\.php\?passkey=|magnet:|xunlei|sandai|Thunder|XLLiveUD|bt_key),🍂 Domestic
+URL-REGEX,/^.*@(guerrillamail\.(info|biz|com|de|net|org)|guerrillamailblock\.com|sharklasers\.com|grr\.la|pokemail\.net|spam4\.me|(mail\.)?bccto\.me|chacuo\.net|027168\.com)$/i,🍂 Domestic
+
+// LAN,debugging rules should place above this line
+DOMAIN-SUFFIX,local,DIRECT
+IP-CIDR,10.0.0.0/8,DIRECT
+IP-CIDR,100.64.0.0/10,DIRECT
+IP-CIDR,127.0.0.0/8,DIRECT
+IP-CIDR,172.16.0.0/12,DIRECT
+IP-CIDR,192.168.0.0/16,DIRECT
+
+GEOIP,CN,🍂 Domestic
+FINAL,☁️ Others
+
+[DNS]
+system, 119.29.29.29, 223.6.6.6, 114.114.114.114
+
+[STATE]
+STATE,AUTO

+ 1169 - 0
resources/conf/surfboard/default.tpl

@@ -0,0 +1,1169 @@
+PROCESS-NAME,aria2c,DIRECT
+PROCESS-NAME,fdm,DIRECT
+PROCESS-NAME,Folx,DIRECT
+PROCESS-NAME,NetTransport,DIRECT
+PROCESS-NAME,Thunder,DIRECT
+PROCESS-NAME,Transmission,DIRECT
+PROCESS-NAME,uTorrent,DIRECT
+PROCESS-NAME,WebTorrent,DIRECT
+PROCESS-NAME,WebTorrent Helper,DIRECT
+DOMAIN-SUFFIX,smtp,DIRECT
+DOMAIN-KEYWORD,aria2,DIRECT
+URL-REGEX,(Subject|HELO|SMTP),DIRECT
+URL-REGEX,(api|ps|sv|offnavi|newvector|ulog.imap|newloc)(.map|).(baidu|n.shifen).com,DIRECT
+URL-REGEX,(.+.|^)(360|so|qihoo|360safe|qhimg|360totalsecurity|yunpan).(cn|com),DIRECT
+URL-REGEX,(.+.)?(torrent|announce.php?passkey=|tracker|BitTorrent|bt_key|ed2k|find_node|get_peers|info_hash|magnet:|peer_id=|xunlei)(..+)?,DIRECT
+URL-REGEX,(.?)(xunlei|sandai|Thunder|XLLiveUD)(.),DIRECT
+PROCESS-NAME,DownloadService,DIRECT
+URL-REGEX,(.+\.|^)(360|so)\.(cn|com),DIRECT
+PROCESS-NAME,Weiyun,DIRECT
+
+DOMAIN-SUFFIX,ampproject.org,🔰国外流量
+DOMAIN-SUFFIX,appspot.com,🔰国外流量
+DOMAIN-SUFFIX,blogger.com,🔰国外流量
+DOMAIN-SUFFIX,getoutline.org,🔰国外流量
+DOMAIN-SUFFIX,gvt0.com,🔰国外流量
+DOMAIN-SUFFIX,gvt1.com,🔰国外流量
+DOMAIN-SUFFIX,gvt3.com,🔰国外流量
+DOMAIN-SUFFIX,xn--ngstr-lra8j.com,🔰国外流量
+DOMAIN-KEYWORD,google,🔰国外流量
+DOMAIN-KEYWORD,blogspot,🔰国外流量
+DOMAIN-SUFFIX,onedrive.live.com,🔰国外流量
+DOMAIN-SUFFIX,xboxlive.com,🔰国外流量
+DOMAIN-SUFFIX,cdninstagram.com,🔰国外流量
+DOMAIN-SUFFIX,fb.com,🔰国外流量
+DOMAIN-SUFFIX,fb.me,🔰国外流量
+DOMAIN-SUFFIX,fbaddins.com,🔰国外流量
+DOMAIN-SUFFIX,fbcdn.net,🔰国外流量
+DOMAIN-SUFFIX,fbsbx.com,🔰国外流量
+DOMAIN-SUFFIX,fbworkmail.com,🔰国外流量
+DOMAIN-SUFFIX,instagram.com,🔰国外流量
+DOMAIN-SUFFIX,m.me,🔰国外流量
+DOMAIN-SUFFIX,messenger.com,🔰国外流量
+DOMAIN-SUFFIX,oculus.com,🔰国外流量
+DOMAIN-SUFFIX,oculuscdn.com,🔰国外流量
+DOMAIN-SUFFIX,rocksdb.org,🔰国外流量
+DOMAIN-SUFFIX,whatsapp.com,🔰国外流量
+DOMAIN-SUFFIX,whatsapp.net,🔰国外流量
+DOMAIN-KEYWORD,facebook,🔰国外流量
+IP-CIDR,3.123.36.126/32,🔰国外流量,no-resolve
+IP-CIDR,35.157.215.84/32,🔰国外流量,no-resolve
+IP-CIDR,35.157.217.255/32,🔰国外流量,no-resolve
+IP-CIDR,52.58.209.134/32,🔰国外流量,no-resolve
+IP-CIDR,54.93.124.31/32,🔰国外流量,no-resolve
+IP-CIDR,54.162.243.80/32,🔰国外流量,no-resolve
+IP-CIDR,54.173.34.141/32,🔰国外流量,no-resolve
+IP-CIDR,54.235.23.242/32,🔰国外流量,no-resolve
+IP-CIDR,169.45.248.118/32,🔰国外流量,no-resolve
+DOMAIN-SUFFIX,pscp.tv,🔰国外流量
+DOMAIN-SUFFIX,periscope.tv,🔰国外流量
+DOMAIN-SUFFIX,t.co,🔰国外流量
+DOMAIN-SUFFIX,twimg.co,🔰国外流量
+DOMAIN-SUFFIX,twimg.com,🔰国外流量
+DOMAIN-SUFFIX,twitpic.com,🔰国外流量
+DOMAIN-SUFFIX,vine.co,🔰国外流量
+DOMAIN-KEYWORD,twitter,🔰国外流量
+DOMAIN-SUFFIX,t.me,🔰国外流量
+DOMAIN-SUFFIX,tdesktop.com,🔰国外流量
+DOMAIN-SUFFIX,telegra.ph,🔰国外流量
+DOMAIN-SUFFIX,telegram.me,🔰国外流量
+DOMAIN-SUFFIX,telegram.org,🔰国外流量
+IP-CIDR,91.108.4.0/22,🔰国外流量,no-resolve
+IP-CIDR,91.108.8.0/22,🔰国外流量,no-resolve
+IP-CIDR,91.108.12.0/22,🔰国外流量,no-resolve
+IP-CIDR,91.108.16.0/22,🔰国外流量,no-resolve
+IP-CIDR,91.108.56.0/22,🔰国外流量,no-resolve
+IP-CIDR,149.154.160.0/20,🔰国外流量,no-resolve
+IP-CIDR6,2001:b28:f23d::/48,🔰国外流量,no-resolve
+IP-CIDR6,2001:b28:f23f::/48,🔰国外流量,no-resolve
+IP-CIDR6,2001:67c:4e8::/48,🔰国外流量,no-resolve
+DOMAIN-SUFFIX,line.me,🔰国外流量
+DOMAIN-SUFFIX,line-apps.com,🔰国外流量
+DOMAIN-SUFFIX,line-scdn.net,🔰国外流量
+DOMAIN-SUFFIX,naver.jp,🔰国外流量
+IP-CIDR,103.2.30.0/23,🔰国外流量,no-resolve
+IP-CIDR,125.209.208.0/20,🔰国外流量,no-resolve
+IP-CIDR,147.92.128.0/17,🔰国外流量,no-resolve
+IP-CIDR,203.104.144.0/21,🔰国外流量,no-resolve
+DOMAIN-SUFFIX,4shared.com,🔰国外流量
+DOMAIN-SUFFIX,520cc.cc,🔰国外流量
+DOMAIN-SUFFIX,881903.com,🔰国外流量
+DOMAIN-SUFFIX,9cache.com,🔰国外流量
+DOMAIN-SUFFIX,9gag.com,🔰国外流量
+DOMAIN-SUFFIX,abc.com,🔰国外流量
+DOMAIN-SUFFIX,abc.net.au,🔰国外流量
+DOMAIN-SUFFIX,abebooks.com,🔰国外流量
+DOMAIN-SUFFIX,amazon.co.jp,🔰国外流量
+DOMAIN-SUFFIX,apigee.com,🔰国外流量
+DOMAIN-SUFFIX,apk-dl.com,🔰国外流量
+DOMAIN-SUFFIX,apkfind.com,🔰国外流量
+DOMAIN-SUFFIX,apkmirror.com,🔰国外流量
+DOMAIN-SUFFIX,apkmonk.com,🔰国外流量
+DOMAIN-SUFFIX,apkpure.com,🔰国外流量
+DOMAIN-SUFFIX,aptoide.com,🔰国外流量
+DOMAIN-SUFFIX,archive.is,🔰国外流量
+DOMAIN-SUFFIX,archive.org,🔰国外流量
+DOMAIN-SUFFIX,arte.tv,🔰国外流量
+DOMAIN-SUFFIX,artstation.com,🔰国外流量
+DOMAIN-SUFFIX,arukas.io,🔰国外流量
+DOMAIN-SUFFIX,ask.com,🔰国外流量
+DOMAIN-SUFFIX,avg.com,🔰国外流量
+DOMAIN-SUFFIX,avgle.com,🔰国外流量
+DOMAIN-SUFFIX,badoo.com,🔰国外流量
+DOMAIN-SUFFIX,bandwagonhost.com,🔰国外流量
+DOMAIN-SUFFIX,bbc.com,🔰国外流量
+DOMAIN-SUFFIX,behance.net,🔰国外流量
+DOMAIN-SUFFIX,bibox.com,🔰国外流量
+DOMAIN-SUFFIX,biggo.com.tw,🔰国外流量
+DOMAIN-SUFFIX,binance.com,🔰国外流量
+DOMAIN-SUFFIX,bitcointalk.org,🔰国外流量
+DOMAIN-SUFFIX,bitfinex.com,🔰国外流量
+DOMAIN-SUFFIX,bitmex.com,🔰国外流量
+DOMAIN-SUFFIX,bit-z.com,🔰国外流量
+DOMAIN-SUFFIX,bloglovin.com,🔰国外流量
+DOMAIN-SUFFIX,bloomberg.cn,🔰国外流量
+DOMAIN-SUFFIX,bloomberg.com,🔰国外流量
+DOMAIN-SUFFIX,blubrry.com,🔰国外流量
+DOMAIN-SUFFIX,book.com.tw,🔰国外流量
+DOMAIN-SUFFIX,booklive.jp,🔰国外流量
+DOMAIN-SUFFIX,books.com.tw,🔰国外流量
+DOMAIN-SUFFIX,boslife.net,🔰国外流量
+DOMAIN-SUFFIX,box.com,🔰国外流量
+DOMAIN-SUFFIX,businessinsider.com,🔰国外流量
+DOMAIN-SUFFIX,bwh1.net,🔰国外流量
+DOMAIN-SUFFIX,castbox.fm,🔰国外流量
+DOMAIN-SUFFIX,cbc.ca,🔰国外流量
+DOMAIN-SUFFIX,cdw.com,🔰国外流量
+DOMAIN-SUFFIX,change.org,🔰国外流量
+DOMAIN-SUFFIX,channelnewsasia.com,🔰国外流量
+DOMAIN-SUFFIX,ck101.com,🔰国外流量
+DOMAIN-SUFFIX,clarionproject.org,🔰国外流量
+DOMAIN-SUFFIX,clyp.it,🔰国外流量
+DOMAIN-SUFFIX,cna.com.tw,🔰国外流量
+DOMAIN-SUFFIX,comparitech.com,🔰国外流量
+DOMAIN-SUFFIX,conoha.jp,🔰国外流量
+DOMAIN-SUFFIX,crucial.com,🔰国外流量
+DOMAIN-SUFFIX,cts.com.tw,🔰国外流量
+DOMAIN-SUFFIX,cw.com.tw,🔰国外流量
+DOMAIN-SUFFIX,cyberctm.com,🔰国外流量
+DOMAIN-SUFFIX,dailymotion.com,🔰国外流量
+DOMAIN-SUFFIX,dailyview.tw,🔰国外流量
+DOMAIN-SUFFIX,daum.net,🔰国外流量
+DOMAIN-SUFFIX,daumcdn.net,🔰国外流量
+DOMAIN-SUFFIX,dcard.tw,🔰国外流量
+DOMAIN-SUFFIX,deepdiscount.com,🔰国外流量
+DOMAIN-SUFFIX,depositphotos.com,🔰国外流量
+DOMAIN-SUFFIX,deviantart.com,🔰国外流量
+DOMAIN-SUFFIX,disconnect.me,🔰国外流量
+DOMAIN-SUFFIX,discordapp.com,🔰国外流量
+DOMAIN-SUFFIX,discordapp.net,🔰国外流量
+DOMAIN-SUFFIX,disqus.com,🔰国外流量
+DOMAIN-SUFFIX,dlercloud.com,🔰国外流量
+DOMAIN-SUFFIX,dns2go.com,🔰国外流量
+DOMAIN-SUFFIX,dowjones.com,🔰国外流量
+DOMAIN-SUFFIX,dropbox.com,🔰国外流量
+DOMAIN-SUFFIX,dropboxusercontent.com,🔰国外流量
+DOMAIN-SUFFIX,duckduckgo.com,🔰国外流量
+DOMAIN-SUFFIX,dw.com,🔰国外流量
+DOMAIN-SUFFIX,dynu.com,🔰国外流量
+DOMAIN-SUFFIX,earthcam.com,🔰国外流量
+DOMAIN-SUFFIX,ebookservice.tw,🔰国外流量
+DOMAIN-SUFFIX,economist.com,🔰国外流量
+DOMAIN-SUFFIX,edgecastcdn.net,🔰国外流量
+DOMAIN-SUFFIX,edu,🔰国外流量
+DOMAIN-SUFFIX,elpais.com,🔰国外流量
+DOMAIN-SUFFIX,enanyang.my,🔰国外流量
+DOMAIN-SUFFIX,encyclopedia.com,🔰国外流量
+DOMAIN-SUFFIX,esoir.be,🔰国外流量
+DOMAIN-SUFFIX,etherscan.io,🔰国外流量
+DOMAIN-SUFFIX,euronews.com,🔰国外流量
+DOMAIN-SUFFIX,evozi.com,🔰国外流量
+DOMAIN-SUFFIX,feedly.com,🔰国外流量
+DOMAIN-SUFFIX,firech.at,🔰国外流量
+DOMAIN-SUFFIX,flickr.com,🔰国外流量
+DOMAIN-SUFFIX,flitto.com,🔰国外流量
+DOMAIN-SUFFIX,foreignpolicy.com,🔰国外流量
+DOMAIN-SUFFIX,freebrowser.org,🔰国外流量
+DOMAIN-SUFFIX,freewechat.com,🔰国外流量
+DOMAIN-SUFFIX,freeweibo.com,🔰国外流量
+DOMAIN-SUFFIX,friday.tw,🔰国外流量
+DOMAIN-SUFFIX,ftchinese.com,🔰国外流量
+DOMAIN-SUFFIX,ftimg.net,🔰国外流量
+DOMAIN-SUFFIX,gate.io,🔰国外流量
+DOMAIN-SUFFIX,getlantern.org,🔰国外流量
+DOMAIN-SUFFIX,getsync.com,🔰国外流量
+DOMAIN-SUFFIX,globalvoices.org,🔰国外流量
+DOMAIN-SUFFIX,goo.ne.jp,🔰国外流量
+DOMAIN-SUFFIX,goodreads.com,🔰国外流量
+DOMAIN-SUFFIX,gov,🔰国外流量
+DOMAIN-SUFFIX,gov.tw,🔰国外流量
+DOMAIN-SUFFIX,greatfire.org,🔰国外流量
+DOMAIN-SUFFIX,gumroad.com,🔰国外流量
+DOMAIN-SUFFIX,hbg.com,🔰国外流量
+DOMAIN-SUFFIX,heroku.com,🔰国外流量
+DOMAIN-SUFFIX,hightail.com,🔰国外流量
+DOMAIN-SUFFIX,hk01.com,🔰国外流量
+DOMAIN-SUFFIX,hkbf.org,🔰国外流量
+DOMAIN-SUFFIX,hkbookcity.com,🔰国外流量
+DOMAIN-SUFFIX,hkej.com,🔰国外流量
+DOMAIN-SUFFIX,hket.com,🔰国外流量
+DOMAIN-SUFFIX,hkgolden.com,🔰国外流量
+DOMAIN-SUFFIX,hootsuite.com,🔰国外流量
+DOMAIN-SUFFIX,hudson.org,🔰国外流量
+DOMAIN-SUFFIX,hyread.com.tw,🔰国外流量
+DOMAIN-SUFFIX,ibtimes.com,🔰国外流量
+DOMAIN-SUFFIX,i-cable.com,🔰国外流量
+DOMAIN-SUFFIX,icij.org,🔰国外流量
+DOMAIN-SUFFIX,icoco.com,🔰国外流量
+DOMAIN-SUFFIX,imgur.com,🔰国外流量
+DOMAIN-SUFFIX,initiummall.com,🔰国外流量
+DOMAIN-SUFFIX,insecam.org,🔰国外流量
+DOMAIN-SUFFIX,ipfs.io,🔰国外流量
+DOMAIN-SUFFIX,issuu.com,🔰国外流量
+DOMAIN-SUFFIX,istockphoto.com,🔰国外流量
+DOMAIN-SUFFIX,japantimes.co.jp,🔰国外流量
+DOMAIN-SUFFIX,jiji.com,🔰国外流量
+DOMAIN-SUFFIX,jinx.com,🔰国外流量
+DOMAIN-SUFFIX,jkforum.net,🔰国外流量
+DOMAIN-SUFFIX,joinmastodon.org,🔰国外流量
+DOMAIN-SUFFIX,justmysocks.net,🔰国外流量
+DOMAIN-SUFFIX,justpaste.it,🔰国外流量
+DOMAIN-SUFFIX,kakao.com,🔰国外流量
+DOMAIN-SUFFIX,kakaocorp.com,🔰国外流量
+DOMAIN-SUFFIX,kik.com,🔰国外流量
+DOMAIN-SUFFIX,kobo.com,🔰国外流量
+DOMAIN-SUFFIX,kobobooks.com,🔰国外流量
+DOMAIN-SUFFIX,kodingen.com,🔰国外流量
+DOMAIN-SUFFIX,lemonde.fr,🔰国外流量
+DOMAIN-SUFFIX,lepoint.fr,🔰国外流量
+DOMAIN-SUFFIX,lihkg.com,🔰国外流量
+DOMAIN-SUFFIX,listennotes.com,🔰国外流量
+DOMAIN-SUFFIX,livestream.com,🔰国外流量
+DOMAIN-SUFFIX,logmein.com,🔰国外流量
+DOMAIN-SUFFIX,mail.ru,🔰国外流量
+DOMAIN-SUFFIX,mailchimp.com,🔰国外流量
+DOMAIN-SUFFIX,marc.info,🔰国外流量
+DOMAIN-SUFFIX,matters.news,🔰国外流量
+DOMAIN-SUFFIX,maying.co,🔰国外流量
+DOMAIN-SUFFIX,medium.com,🔰国外流量
+DOMAIN-SUFFIX,mega.nz,🔰国外流量
+DOMAIN-SUFFIX,mil,🔰国外流量
+DOMAIN-SUFFIX,mingpao.com,🔰国外流量
+DOMAIN-SUFFIX,mobile01.com,🔰国外流量
+DOMAIN-SUFFIX,myspace.com,🔰国外流量
+DOMAIN-SUFFIX,myspacecdn.com,🔰国外流量
+DOMAIN-SUFFIX,nanyang.com,🔰国外流量
+DOMAIN-SUFFIX,naver.com,🔰国外流量
+DOMAIN-SUFFIX,neowin.net,🔰国外流量
+DOMAIN-SUFFIX,newstapa.org,🔰国外流量
+DOMAIN-SUFFIX,nexitally.com,🔰国外流量
+DOMAIN-SUFFIX,nhk.or.jp,🔰国外流量
+DOMAIN-SUFFIX,nicovideo.jp,🔰国外流量
+DOMAIN-SUFFIX,nii.ac.jp,🔰国外流量
+DOMAIN-SUFFIX,nikkei.com,🔰国外流量
+DOMAIN-SUFFIX,nofile.io,🔰国外流量
+DOMAIN-SUFFIX,now.com,🔰国外流量
+DOMAIN-SUFFIX,nrk.no,🔰国外流量
+DOMAIN-SUFFIX,nyt.com,🔰国外流量
+DOMAIN-SUFFIX,nytchina.com,🔰国外流量
+DOMAIN-SUFFIX,nytcn.me,🔰国外流量
+DOMAIN-SUFFIX,nytco.com,🔰国外流量
+DOMAIN-SUFFIX,nytimes.com,🔰国外流量
+DOMAIN-SUFFIX,nytimg.com,🔰国外流量
+DOMAIN-SUFFIX,nytlog.com,🔰国外流量
+DOMAIN-SUFFIX,nytstyle.com,🔰国外流量
+DOMAIN-SUFFIX,ok.ru,🔰国外流量
+DOMAIN-SUFFIX,okex.com,🔰国外流量
+DOMAIN-SUFFIX,on.cc,🔰国外流量
+DOMAIN-SUFFIX,orientaldaily.com.my,🔰国外流量
+DOMAIN-SUFFIX,overcast.fm,🔰国外流量
+DOMAIN-SUFFIX,paltalk.com,🔰国外流量
+DOMAIN-SUFFIX,pao-pao.net,🔰国外流量
+DOMAIN-SUFFIX,parsevideo.com,🔰国外流量
+DOMAIN-SUFFIX,pbxes.com,🔰国外流量
+DOMAIN-SUFFIX,pcdvd.com.tw,🔰国外流量
+DOMAIN-SUFFIX,pchome.com.tw,🔰国外流量
+DOMAIN-SUFFIX,pcloud.com,🔰国外流量
+DOMAIN-SUFFIX,picacomic.com,🔰国外流量
+DOMAIN-SUFFIX,pinimg.com,🔰国外流量
+DOMAIN-SUFFIX,pixiv.net,🔰国外流量
+DOMAIN-SUFFIX,player.fm,🔰国外流量
+DOMAIN-SUFFIX,plurk.com,🔰国外流量
+DOMAIN-SUFFIX,po18.tw,🔰国外流量
+DOMAIN-SUFFIX,potato.im,🔰国外流量
+DOMAIN-SUFFIX,potatso.com,🔰国外流量
+DOMAIN-SUFFIX,prism-break.org,🔰国外流量
+DOMAIN-SUFFIX,proxifier.com,🔰国外流量
+DOMAIN-SUFFIX,pt.im,🔰国外流量
+DOMAIN-SUFFIX,pts.org.tw,🔰国外流量
+DOMAIN-SUFFIX,pubu.com.tw,🔰国外流量
+DOMAIN-SUFFIX,pubu.tw,🔰国外流量
+DOMAIN-SUFFIX,pureapk.com,🔰国外流量
+DOMAIN-SUFFIX,quora.com,🔰国外流量
+DOMAIN-SUFFIX,quoracdn.net,🔰国外流量
+DOMAIN-SUFFIX,rakuten.co.jp,🔰国外流量
+DOMAIN-SUFFIX,readingtimes.com.tw,🔰国外流量
+DOMAIN-SUFFIX,readmoo.com,🔰国外流量
+DOMAIN-SUFFIX,redbubble.com,🔰国外流量
+DOMAIN-SUFFIX,reddit.com,🔰国外流量
+DOMAIN-SUFFIX,redditmedia.com,🔰国外流量
+DOMAIN-SUFFIX,resilio.com,🔰国外流量
+DOMAIN-SUFFIX,reuters.com,🔰国外流量
+DOMAIN-SUFFIX,reutersmedia.net,🔰国外流量
+DOMAIN-SUFFIX,rfi.fr,🔰国外流量
+DOMAIN-SUFFIX,rixcloud.com,🔰国外流量
+DOMAIN-SUFFIX,roadshow.hk,🔰国外流量
+DOMAIN-SUFFIX,scmp.com,🔰国外流量
+DOMAIN-SUFFIX,scribd.com,🔰国外流量
+DOMAIN-SUFFIX,seatguru.com,🔰国外流量
+DOMAIN-SUFFIX,shadowsocks.org,🔰国外流量
+DOMAIN-SUFFIX,shopee.tw,🔰国外流量
+DOMAIN-SUFFIX,slideshare.net,🔰国外流量
+DOMAIN-SUFFIX,softfamous.com,🔰国外流量
+DOMAIN-SUFFIX,soundcloud.com,🔰国外流量
+DOMAIN-SUFFIX,ssrcloud.org,🔰国外流量
+DOMAIN-SUFFIX,startpage.com,🔰国外流量
+DOMAIN-SUFFIX,steamcommunity.com,🔰国外流量
+DOMAIN-SUFFIX,steemit.com,🔰国外流量
+DOMAIN-SUFFIX,steemitwallet.com,🔰国外流量
+DOMAIN-SUFFIX,t66y.com,🔰国外流量
+DOMAIN-SUFFIX,tapatalk.com,🔰国外流量
+DOMAIN-SUFFIX,teco-hk.org,🔰国外流量
+DOMAIN-SUFFIX,teco-mo.org,🔰国外流量
+DOMAIN-SUFFIX,teddysun.com,🔰国外流量
+DOMAIN-SUFFIX,textnow.me,🔰国外流量
+DOMAIN-SUFFIX,theguardian.com,🔰国外流量
+DOMAIN-SUFFIX,theinitium.com,🔰国外流量
+DOMAIN-SUFFIX,thetvdb.com,🔰国外流量
+DOMAIN-SUFFIX,tineye.com,🔰国外流量
+DOMAIN-SUFFIX,torproject.org,🔰国外流量
+DOMAIN-SUFFIX,tumblr.com,🔰国外流量
+DOMAIN-SUFFIX,turbobit.net,🔰国外流量
+DOMAIN-SUFFIX,tutanota.com,🔰国外流量
+DOMAIN-SUFFIX,tvboxnow.com,🔰国外流量
+DOMAIN-SUFFIX,udn.com,🔰国外流量
+DOMAIN-SUFFIX,unseen.is,🔰国外流量
+DOMAIN-SUFFIX,upmedia.mg,🔰国外流量
+DOMAIN-SUFFIX,uptodown.com,🔰国外流量
+DOMAIN-SUFFIX,urbandictionary.com,🔰国外流量
+DOMAIN-SUFFIX,ustream.tv,🔰国外流量
+DOMAIN-SUFFIX,uwants.com,🔰国外流量
+DOMAIN-SUFFIX,v2ray.com,🔰国外流量
+DOMAIN-SUFFIX,viber.com,🔰国外流量
+DOMAIN-SUFFIX,videopress.com,🔰国外流量
+DOMAIN-SUFFIX,vimeo.com,🔰国外流量
+DOMAIN-SUFFIX,voachinese.com,🔰国外流量
+DOMAIN-SUFFIX,voanews.com,🔰国外流量
+DOMAIN-SUFFIX,voxer.com,🔰国外流量
+DOMAIN-SUFFIX,vzw.com,🔰国外流量
+DOMAIN-SUFFIX,w3schools.com,🔰国外流量
+DOMAIN-SUFFIX,washingtonpost.com,🔰国外流量
+DOMAIN-SUFFIX,wattpad.com,🔰国外流量
+DOMAIN-SUFFIX,whoer.net,🔰国外流量
+DOMAIN-SUFFIX,wikimapia.org,🔰国外流量
+DOMAIN-SUFFIX,wikipedia.org,🔰国外流量
+DOMAIN-SUFFIX,wikiquote.org,🔰国外流量
+DOMAIN-SUFFIX,wikiwand.com,🔰国外流量
+DOMAIN-SUFFIX,winudf.com,🔰国外流量
+DOMAIN-SUFFIX,wire.com,🔰国外流量
+DOMAIN-SUFFIX,wordpress.com,🔰国外流量
+DOMAIN-SUFFIX,workflow.is,🔰国外流量
+DOMAIN-SUFFIX,worldcat.org,🔰国外流量
+DOMAIN-SUFFIX,wsj.com,🔰国外流量
+DOMAIN-SUFFIX,wsj.net,🔰国外流量
+DOMAIN-SUFFIX,xhamster.com,🔰国外流量
+DOMAIN-SUFFIX,xn--90wwvt03e.com,🔰国外流量
+DOMAIN-SUFFIX,xn--i2ru8q2qg.com,🔰国外流量
+DOMAIN-SUFFIX,xnxx.com,🔰国外流量
+DOMAIN-SUFFIX,xvideos.com,🔰国外流量
+DOMAIN-SUFFIX,yahoo.com,🔰国外流量
+DOMAIN-SUFFIX,yandex.ru,🔰国外流量
+DOMAIN-SUFFIX,ycombinator.com,🔰国外流量
+DOMAIN-SUFFIX,yesasia.com,🔰国外流量
+DOMAIN-SUFFIX,yes-news.com,🔰国外流量
+DOMAIN-SUFFIX,yomiuri.co.jp,🔰国外流量
+DOMAIN-SUFFIX,you-get.org,🔰国外流量
+DOMAIN-SUFFIX,zaobao.com,🔰国外流量
+DOMAIN-SUFFIX,zb.com,🔰国外流量
+DOMAIN-SUFFIX,zello.com,🔰国外流量
+DOMAIN-SUFFIX,zeronet.io,🔰国外流量
+DOMAIN-SUFFIX,zoom.us,🔰国外流量
+DOMAIN-KEYWORD,github,🔰国外流量
+DOMAIN-KEYWORD,jav,🔰国外流量
+DOMAIN-KEYWORD,pinterest,🔰国外流量
+DOMAIN-KEYWORD,porn,🔰国外流量
+DOMAIN-KEYWORD,wikileaks,🔰国外流量
+DOMAIN-SUFFIX,apartmentratings.com,🔰国外流量
+DOMAIN-SUFFIX,apartments.com,🔰国外流量
+DOMAIN-SUFFIX,bankmobilevibe.com,🔰国外流量
+DOMAIN-SUFFIX,bing.com,🔰国外流量
+DOMAIN-SUFFIX,booktopia.com.au,🔰国外流量
+DOMAIN-SUFFIX,cccat.io,🔰国外流量
+DOMAIN-SUFFIX,centauro.com.br,🔰国外流量
+DOMAIN-SUFFIX,clearsurance.com,🔰国外流量
+DOMAIN-SUFFIX,costco.com,🔰国外流量
+DOMAIN-SUFFIX,crackle.com,🔰国外流量
+DOMAIN-SUFFIX,depositphotos.cn,🔰国外流量
+DOMAIN-SUFFIX,dish.com,🔰国外流量
+DOMAIN-SUFFIX,dmm.co.jp,🔰国外流量
+DOMAIN-SUFFIX,dmm.com,🔰国外流量
+DOMAIN-SUFFIX,dnvod.tv,🔰国外流量
+DOMAIN-SUFFIX,esurance.com,🔰国外流量
+DOMAIN-SUFFIX,extmatrix.com,🔰国外流量
+DOMAIN-SUFFIX,fastpic.ru,🔰国外流量
+DOMAIN-SUFFIX,flipboard.com,🔰国外流量
+DOMAIN-SUFFIX,fnac.be,🔰国外流量
+DOMAIN-SUFFIX,fnac.com,🔰国外流量
+DOMAIN-SUFFIX,funkyimg.com,🔰国外流量
+DOMAIN-SUFFIX,fxnetworks.com,🔰国外流量
+DOMAIN-SUFFIX,gettyimages.com,🔰国外流量
+DOMAIN-SUFFIX,go.com,🔰国外流量
+DOMAIN-SUFFIX,here.com,🔰国外流量
+DOMAIN-SUFFIX,jcpenney.com,🔰国外流量
+DOMAIN-SUFFIX,jiehua.tv,🔰国外流量
+DOMAIN-SUFFIX,mailfence.com,🔰国外流量
+DOMAIN-SUFFIX,nationwide.com,🔰国外流量
+DOMAIN-SUFFIX,nbc.com,🔰国外流量
+DOMAIN-SUFFIX,nexon.com,🔰国外流量
+DOMAIN-SUFFIX,nordstrom.com,🔰国外流量
+DOMAIN-SUFFIX,nordstromimage.com,🔰国外流量
+DOMAIN-SUFFIX,nordstromrack.com,🔰国外流量
+DOMAIN-SUFFIX,superpages.com,🔰国外流量
+DOMAIN-SUFFIX,target.com,🔰国外流量
+DOMAIN-SUFFIX,thinkgeek.com,🔰国外流量
+DOMAIN-SUFFIX,tracfone.com,🔰国外流量
+DOMAIN-SUFFIX,unity3d.com,🔰国外流量
+DOMAIN-SUFFIX,uploader.jp,🔰国外流量
+DOMAIN-SUFFIX,vevo.com,🔰国外流量
+DOMAIN-SUFFIX,viu.tv,🔰国外流量
+DOMAIN-SUFFIX,vk.com,🔰国外流量
+DOMAIN-SUFFIX,vsco.co,🔰国外流量
+DOMAIN-SUFFIX,xfinity.com,🔰国外流量
+DOMAIN-SUFFIX,zattoo.com,🔰国外流量
+USER-AGENT,Roam*,🔰国外流量
+DOMAIN,testflight.apple.com,🔰国外流量
+DOMAIN-SUFFIX,appsto.re,🔰国外流量
+DOMAIN,books.itunes.apple.com,🔰国外流量
+DOMAIN,hls.itunes.apple.com,🔰国外流量
+DOMAIN,apps.apple.com,🔰国外流量
+DOMAIN,itunes.apple.com,🔰国外流量
+DOMAIN,api-glb-sea.smoot.apple.com,🔰国外流量
+DOMAIN,lookup-api.apple.com,🔰国外流量
+PROCESS-NAME,LookupViewService,🔰国外流量
+DOMAIN-SUFFIX,abc.xyz,🔰国外流量
+DOMAIN-SUFFIX,android.com,🔰国外流量
+DOMAIN-SUFFIX,androidify.com,🔰国外流量
+DOMAIN-SUFFIX,dialogflow.com,🔰国外流量
+DOMAIN-SUFFIX,autodraw.com,🔰国外流量
+DOMAIN-SUFFIX,capitalg.com,🔰国外流量
+DOMAIN-SUFFIX,certificate-transparency.org,🔰国外流量
+DOMAIN-SUFFIX,chrome.com,🔰国外流量
+DOMAIN-SUFFIX,chromeexperiments.com,🔰国外流量
+DOMAIN-SUFFIX,chromestatus.com,🔰国外流量
+DOMAIN-SUFFIX,chromium.org,🔰国外流量
+DOMAIN-SUFFIX,creativelab5.com,🔰国外流量
+DOMAIN-SUFFIX,debug.com,🔰国外流量
+DOMAIN-SUFFIX,deepmind.com,🔰国外流量
+DOMAIN-SUFFIX,firebaseio.com,🔰国外流量
+DOMAIN-SUFFIX,getmdl.io,🔰国外流量
+DOMAIN-SUFFIX,ggpht.com,🔰国外流量
+DOMAIN-SUFFIX,gmail.com,🔰国外流量
+DOMAIN-SUFFIX,gmodules.com,🔰国外流量
+DOMAIN-SUFFIX,godoc.org,🔰国外流量
+DOMAIN-SUFFIX,golang.org,🔰国外流量
+DOMAIN-SUFFIX,gstatic.com,🔰国外流量
+DOMAIN-SUFFIX,gv.com,🔰国外流量
+DOMAIN-SUFFIX,gwtproject.org,🔰国外流量
+DOMAIN-SUFFIX,itasoftware.com,🔰国外流量
+DOMAIN-SUFFIX,madewithcode.com,🔰国外流量
+DOMAIN-SUFFIX,material.io,🔰国外流量
+DOMAIN-SUFFIX,polymer-project.org,🔰国外流量
+DOMAIN-SUFFIX,admin.recaptcha.net,🔰国外流量
+DOMAIN-SUFFIX,recaptcha.net,🔰国外流量
+DOMAIN-SUFFIX,shattered.io,🔰国外流量
+DOMAIN-SUFFIX,synergyse.com,🔰国外流量
+DOMAIN-SUFFIX,tensorflow.org,🔰国外流量
+DOMAIN-SUFFIX,tfhub.dev,🔰国外流量
+DOMAIN-SUFFIX,tiltbrush.com,🔰国外流量
+DOMAIN-SUFFIX,waveprotocol.org,🔰国外流量
+DOMAIN-SUFFIX,waymo.com,🔰国外流量
+DOMAIN-SUFFIX,webmproject.org,🔰国外流量
+DOMAIN-SUFFIX,webrtc.org,🔰国外流量
+DOMAIN-SUFFIX,whatbrowser.org,🔰国外流量
+DOMAIN-SUFFIX,widevine.com,🔰国外流量
+DOMAIN-SUFFIX,x.company,🔰国外流量
+DOMAIN-SUFFIX,youtu.be,🔰国外流量
+DOMAIN-SUFFIX,yt.be,🔰国外流量
+DOMAIN-SUFFIX,ytimg.com,🔰国外流量
+DOMAIN-SUFFIX,1drv.com,🔰国外流量
+DOMAIN-SUFFIX,1drv.ms,🔰国外流量
+DOMAIN-SUFFIX,blob.core.windows.net,🔰国外流量
+DOMAIN-SUFFIX,livefilestore.com,🔰国外流量
+DOMAIN-SUFFIX,onedrive.com,🔰国外流量
+DOMAIN-SUFFIX,storage.live.com,🔰国外流量
+DOMAIN-SUFFIX,storage.msn.com,🔰国外流量
+DOMAIN,oneclient.sfx.ms,🔰国外流量
+DOMAIN-SUFFIX,0rz.tw,🔰国外流量
+DOMAIN-SUFFIX,4bluestones.biz,🔰国外流量
+DOMAIN-SUFFIX,9bis.net,🔰国外流量
+DOMAIN-SUFFIX,allconnected.co,🔰国外流量
+DOMAIN-SUFFIX,aol.com,🔰国外流量
+DOMAIN-SUFFIX,bcc.com.tw,🔰国外流量
+DOMAIN-SUFFIX,bit.ly,🔰国外流量
+DOMAIN-SUFFIX,bitshare.com,🔰国外流量
+DOMAIN-SUFFIX,blog.jp,🔰国外流量
+DOMAIN-SUFFIX,blogimg.jp,🔰国外流量
+DOMAIN-SUFFIX,blogtd.org,🔰国外流量
+DOMAIN-SUFFIX,broadcast.co.nz,🔰国外流量
+DOMAIN-SUFFIX,camfrog.com,🔰国外流量
+DOMAIN-SUFFIX,cfos.de,🔰国外流量
+DOMAIN-SUFFIX,citypopulation.de,🔰国外流量
+DOMAIN-SUFFIX,cloudfront.net,🔰国外流量
+DOMAIN-SUFFIX,ctitv.com.tw,🔰国外流量
+DOMAIN-SUFFIX,cuhk.edu.hk,🔰国外流量
+DOMAIN-SUFFIX,cusu.hk,🔰国外流量
+DOMAIN-SUFFIX,discord.gg,🔰国外流量
+DOMAIN-SUFFIX,discuss.com.hk,🔰国外流量
+DOMAIN-SUFFIX,dropboxapi.com,🔰国外流量
+DOMAIN-SUFFIX,duolingo.cn,🔰国外流量
+DOMAIN-SUFFIX,edditstatic.com,🔰国外流量
+DOMAIN-SUFFIX,flickriver.com,🔰国外流量
+DOMAIN-SUFFIX,focustaiwan.tw,🔰国外流量
+DOMAIN-SUFFIX,free.fr,🔰国外流量
+DOMAIN-SUFFIX,gigacircle.com,🔰国外流量
+DOMAIN-SUFFIX,hk-pub.com,🔰国外流量
+DOMAIN-SUFFIX,hosting.co.uk,🔰国外流量
+DOMAIN-SUFFIX,hwcdn.net,🔰国外流量
+DOMAIN-SUFFIX,ifixit.com,🔰国外流量
+DOMAIN-SUFFIX,iphone4hongkong.com,🔰国外流量
+DOMAIN-SUFFIX,iphonetaiwan.org,🔰国外流量
+DOMAIN-SUFFIX,iptvbin.com,🔰国外流量
+DOMAIN-SUFFIX,linksalpha.com,🔰国外流量
+DOMAIN-SUFFIX,manyvids.com,🔰国外流量
+DOMAIN-SUFFIX,myactimes.com,🔰国外流量
+DOMAIN-SUFFIX,newsblur.com,🔰国外流量
+DOMAIN-SUFFIX,now.im,🔰国外流量
+DOMAIN-SUFFIX,nowe.com,🔰国外流量
+DOMAIN-SUFFIX,redditlist.com,🔰国外流量
+DOMAIN-SUFFIX,s3.amazonaws.com,🔰国外流量
+DOMAIN-SUFFIX,signal.org,🔰国外流量
+DOMAIN-SUFFIX,smartmailcloud.com,🔰国外流量
+DOMAIN-SUFFIX,sparknotes.com,🔰国外流量
+DOMAIN-SUFFIX,streetvoice.com,🔰国外流量
+DOMAIN-SUFFIX,supertop.co,🔰国外流量
+DOMAIN-SUFFIX,tv.com,🔰国外流量
+DOMAIN-SUFFIX,typepad.com,🔰国外流量
+DOMAIN-SUFFIX,udnbkk.com,🔰国外流量
+DOMAIN-SUFFIX,urbanairship.com,🔰国外流量
+DOMAIN-SUFFIX,whispersystems.org,🔰国外流量
+DOMAIN-SUFFIX,wikia.com,🔰国外流量
+DOMAIN-SUFFIX,wn.com,🔰国外流量
+DOMAIN-SUFFIX,wolframalpha.com,🔰国外流量
+DOMAIN-SUFFIX,x-art.com,🔰国外流量
+DOMAIN-SUFFIX,yimg.com,🔰国外流量
+DOMAIN,api.steampowered.com,🔰国外流量
+DOMAIN,store.steampowered.com,🔰国外流量
+
+DOMAIN-SUFFIX,t.me,✈️Telegram
+DOMAIN-SUFFIX,tdesktop.com,✈️Telegram
+DOMAIN-SUFFIX,telegra.ph,✈️Telegram
+DOMAIN-SUFFIX,telegram.me,✈️Telegram
+DOMAIN-SUFFIX,telegram.org,✈️Telegram
+IP-CIDR,91.108.4.0/22,✈️Telegram,no-resolve
+IP-CIDR,91.108.8.0/22,✈️Telegram,no-resolve
+IP-CIDR,91.108.12.0/22,✈️Telegram,no-resolve
+IP-CIDR,91.108.16.0/22,✈️Telegram,no-resolve
+IP-CIDR,91.108.56.0/22,✈️Telegram,no-resolve
+IP-CIDR,149.154.160.0/20,✈️Telegram,no-resolve
+IP-CIDR6,2001:b28:f23d::/48,✈️Telegram,no-resolve
+IP-CIDR6,2001:b28:f23f::/48,✈️Telegram,no-resolve
+IP-CIDR6,2001:67c:4e8::/48,✈️Telegram,no-resolve
+
+USER-AGENT,com.google.ios.youtube*,🎬Youtube
+USER-AGENT,YouTube*,🎬Youtube
+DOMAIN-SUFFIX,googlevideo.com,🎬Youtube
+DOMAIN-SUFFIX,youtube.com,🎬Youtube
+DOMAIN,youtubei.googleapis.com,🎬Youtube
+
+USER-AGENT,Argo*,🎬Netflix
+DOMAIN-SUFFIX,netflix.com,🎬Netflix
+DOMAIN-SUFFIX,netflix.net,🎬Netflix
+DOMAIN-SUFFIX,nflxext.com,🎬Netflix
+DOMAIN-SUFFIX,nflximg.com,🎬Netflix
+DOMAIN-SUFFIX,nflximg.net,🎬Netflix
+DOMAIN-SUFFIX,nflxso.net,🎬Netflix
+DOMAIN-SUFFIX,nflxvideo.net,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest0.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest1.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest2.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest3.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest4.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest5.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest6.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest7.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest8.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest9.com,🎬Netflix
+IP-CIDR,23.246.0.0/18,🎬Netflix,no-resolve
+IP-CIDR,37.77.184.0/21,🎬Netflix,no-resolve
+IP-CIDR,45.57.0.0/17,🎬Netflix,no-resolve
+IP-CIDR,64.120.128.0/17,🎬Netflix,no-resolve
+IP-CIDR,66.197.128.0/17,🎬Netflix,no-resolve
+IP-CIDR,108.175.32.0/20,🎬Netflix,no-resolve
+IP-CIDR,192.173.64.0/18,🎬Netflix,no-resolve
+IP-CIDR,198.38.96.0/19,🎬Netflix,no-resolve
+IP-CIDR,198.45.48.0/20,🎬Netflix,no-resolve
+
+USER-AGENT,Deezer*,🎬国外媒体
+DOMAIN-SUFFIX,deezer.com,🎬国外媒体
+DOMAIN-SUFFIX,dzcdn.net,🎬国外媒体
+DOMAIN-SUFFIX,kkbox.com,🎬国外媒体
+DOMAIN-SUFFIX,kkbox.com.tw,🎬国外媒体
+DOMAIN-SUFFIX,kfs.io,🎬国外媒体
+USER-AGENT,WeMusic*,🎬国外媒体
+USER-AGENT,JOOX*,🎬国外媒体
+DOMAIN-SUFFIX,joox.com,🎬国外媒体
+USER-AGENT,Pandora*,🎬国外媒体
+DOMAIN-SUFFIX,pandora.com,🎬国外媒体
+USER-AGENT,SoundCloud*,🎬国外媒体
+DOMAIN-SUFFIX,p-cdn.us,🎬国外媒体
+DOMAIN-SUFFIX,sndcdn.com,🎬国外媒体
+DOMAIN-SUFFIX,soundcloud.com,🎬国外媒体
+USER-AGENT,Spotify*,🎬国外媒体
+DOMAIN-SUFFIX,pscdn.co,🎬国外媒体
+DOMAIN-SUFFIX,scdn.co,🎬国外媒体
+DOMAIN-SUFFIX,spotify.com,🎬国外媒体
+DOMAIN-SUFFIX,spoti.fi,🎬国外媒体
+DOMAIN-KEYWORD,spotify.com,🎬国外媒体
+DOMAIN-KEYWORD,-spotify-com,🎬国外媒体
+USER-AGENT,TIDAL*,🎬国外媒体
+DOMAIN-SUFFIX,tidal.com,🎬国外媒体
+USER-AGENT,com.google.ios.youtubemusic*,🎬国外媒体
+USER-AGENT,YouTubeMusic*,🎬国外媒体
+USER-AGENT,All4*,🎬国外媒体
+DOMAIN-SUFFIX,c4assets.com,🎬国外媒体
+DOMAIN-SUFFIX,channel4.com,🎬国外媒体
+USER-AGENT,AbemaTV*,🎬国外媒体
+DOMAIN-SUFFIX,abema.io,🎬国外媒体
+DOMAIN-SUFFIX,ameba.jp,🎬国外媒体
+DOMAIN-SUFFIX,abema.tv,🎬国外媒体
+DOMAIN-SUFFIX,hayabusa.io,🎬国外媒体
+DOMAIN,abematv.akamaized.net,🎬国外媒体
+DOMAIN,ds-linear-abematv.akamaized.net,🎬国外媒体
+DOMAIN,ds-vod-abematv.akamaized.net,🎬国外媒体
+DOMAIN,linear-abematv.akamaized.net,🎬国外媒体
+USER-AGENT,InstantVideo.US*,🎬国外媒体
+USER-AGENT,Prime%20Video*,🎬国外媒体
+DOMAIN-SUFFIX,aiv-cdn.net,🎬国外媒体
+DOMAIN-SUFFIX,aiv-delivery.net,🎬国外媒体
+DOMAIN-SUFFIX,amazonvideo.com,🎬国外媒体
+DOMAIN-SUFFIX,primevideo.com,🎬国外媒体
+DOMAIN,avodmp4s3ww-a.akamaihd.net,🎬国外媒体
+DOMAIN,d25xi40x97liuc.cloudfront.net,🎬国外媒体
+DOMAIN,dmqdd6hw24ucf.cloudfront.net,🎬国外媒体
+DOMAIN,d22qjgkvxw22r6.cloudfront.net,🎬国外媒体
+DOMAIN,d1v5ir2lpwr8os.cloudfront.net,🎬国外媒体
+DOMAIN-KEYWORD,avoddashs,🎬国外媒体
+USER-AGENT,Anime*,🎬国外媒体
+DOMAIN-SUFFIX,bahamut.com.tw,🎬国外媒体
+DOMAIN-SUFFIX,gamer.com.tw,🎬国外媒体
+DOMAIN,gamer-cds.cdn.hinet.net,🎬国外媒体
+DOMAIN,gamer2-cds.cdn.hinet.net,🎬国外媒体
+USER-AGENT,BBCiPlayer*,🎬国外媒体
+DOMAIN-SUFFIX,bbc.co.uk,🎬国外媒体
+DOMAIN-SUFFIX,bbci.co.uk,🎬国外媒体
+DOMAIN-KEYWORD,bbcfmt,🎬国外媒体
+DOMAIN-KEYWORD,uk-live,🎬国外媒体
+USER-AGENT,DAZN*,🎬国外媒体
+DOMAIN-SUFFIX,dazn.com,🎬国外媒体
+DOMAIN-SUFFIX,dazn-api.com,🎬国外媒体
+DOMAIN,d151l6v8er5bdm.cloudfront.net,🎬国外媒体
+DOMAIN-KEYWORD,voddazn,🎬国外媒体
+USER-AGENT,Disney+*,🎬国外媒体
+DOMAIN-SUFFIX,bamgrid.com,🎬国外媒体
+DOMAIN-SUFFIX,disney-plus.net,🎬国外媒体
+DOMAIN-SUFFIX,disneyplus.com,🎬国外媒体
+DOMAIN-SUFFIX,dssott.com,🎬国外媒体
+DOMAIN,cdn.registerdisney.go.com,🎬国外媒体
+USER-AGENT,encoreTVB*,🎬国外媒体
+DOMAIN-SUFFIX,encoretvb.com,🎬国外媒体
+DOMAIN,edge.api.brightcove.com,🎬国外媒体
+DOMAIN,bcbolt446c5271-a.akamaihd.net,🎬国外媒体
+USER-AGENT,FOX%20NOW*,🎬国外媒体
+DOMAIN-SUFFIX,fox.com,🎬国外媒体
+DOMAIN-SUFFIX,foxdcg.com,🎬国外媒体
+DOMAIN-SUFFIX,theplatform.com,🎬国外媒体
+DOMAIN-SUFFIX,uplynk.com,🎬国外媒体
+USER-AGENT,HBO%20NOW*,🎬国外媒体
+DOMAIN-SUFFIX,hbo.com,🎬国外媒体
+DOMAIN-SUFFIX,hbogo.com,🎬国外媒体
+DOMAIN-SUFFIX,hbonow.com,🎬国外媒体
+USER-AGENT,HBO%20GO%20PROD%20HKG*,🎬国外媒体
+DOMAIN-SUFFIX,hbogoasia.com,🎬国外媒体
+DOMAIN-SUFFIX,hbogoasia.hk,🎬国外媒体
+DOMAIN,bcbolthboa-a.akamaihd.net,🎬国外媒体
+DOMAIN,players.brightcove.net,🎬国外媒体
+DOMAIN,s3-ap-southeast-1.amazonaws.com,🎬国外媒体
+DOMAIN,dai3fd1oh325y.cloudfront.net,🎬国外媒体
+DOMAIN,44wilhpljf.execute-api.ap-southeast-1.amazonaws.com,🎬国外媒体
+DOMAIN,hboasia1-i.akamaihd.net,🎬国外媒体
+DOMAIN,hboasia2-i.akamaihd.net,🎬国外媒体
+DOMAIN,hboasia3-i.akamaihd.net,🎬国外媒体
+DOMAIN,hboasia4-i.akamaihd.net,🎬国外媒体
+DOMAIN,hboasia5-i.akamaihd.net,🎬国外媒体
+DOMAIN,cf-images.ap-southeast-1.prod.boltdns.net,🎬国外媒体
+USER-AGENT,HWTVMobile*,🎬国外媒体
+DOMAIN-SUFFIX,5itv.tv,🎬国外媒体
+DOMAIN-SUFFIX,ocnttv.com,🎬国外媒体
+DOMAIN-SUFFIX,hulu.com,🎬国外媒体
+DOMAIN-SUFFIX,huluim.com,🎬国外媒体
+DOMAIN-SUFFIX,hulustream.com,🎬国外媒体
+DOMAIN-SUFFIX,happyon.jp,🎬国外媒体
+DOMAIN-SUFFIX,hulu.jp,🎬国外媒体
+USER-AGENT,ITV_Player*,🎬国外媒体
+DOMAIN-SUFFIX,itv.com,🎬国外媒体
+DOMAIN-SUFFIX,itvstatic.com,🎬国外媒体
+DOMAIN,itvpnpmobile-a.akamaihd.net,🎬国外媒体
+USER-AGENT,KKTV*,🎬国外媒体
+USER-AGENT,com.kktv.ios.kktv*,🎬国外媒体
+DOMAIN-SUFFIX,kktv.com.tw,🎬国外媒体
+DOMAIN-SUFFIX,kktv.me,🎬国外媒体
+DOMAIN,kktv-theater.kk.stream,🎬国外媒体
+USER-AGENT,LINE%20TV*,🎬国外媒体
+DOMAIN-SUFFIX,linetv.tw,🎬国外媒体
+DOMAIN,d3c7rimkq79yfu.cloudfront.net,🎬国外媒体
+DOMAIN-SUFFIX,litv.tv,🎬国外媒体
+DOMAIN,litvfreemobile-hichannel.cdn.hinet.net,🎬国外媒体
+USER-AGENT,My5*,🎬国外媒体
+DOMAIN-SUFFIX,channel5.com,🎬国外媒体
+DOMAIN-SUFFIX,my5.tv,🎬国外媒体
+DOMAIN,d349g9zuie06uo.cloudfront.net,🎬国外媒体
+USER-AGENT,mytv*,🎬国外媒体
+DOMAIN-SUFFIX,mytvsuper.com,🎬国外媒体
+DOMAIN-SUFFIX,tvb.com,🎬国外媒体
+USER-AGENT,Argo*,🎬国外媒体
+DOMAIN-SUFFIX,netflix.com,🎬国外媒体
+DOMAIN-SUFFIX,netflix.net,🎬国外媒体
+DOMAIN-SUFFIX,nflxext.com,🎬国外媒体
+DOMAIN-SUFFIX,nflximg.com,🎬国外媒体
+DOMAIN-SUFFIX,nflximg.net,🎬国外媒体
+DOMAIN-SUFFIX,nflxso.net,🎬国外媒体
+DOMAIN-SUFFIX,nflxvideo.net,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest0.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest1.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest2.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest3.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest4.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest5.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest6.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest7.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest8.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest9.com,🎬国外媒体
+IP-CIDR,23.246.0.0/18,🎬国外媒体,no-resolve
+IP-CIDR,37.77.184.0/21,🎬国外媒体,no-resolve
+IP-CIDR,45.57.0.0/17,🎬国外媒体,no-resolve
+IP-CIDR,64.120.128.0/17,🎬国外媒体,no-resolve
+IP-CIDR,66.197.128.0/17,🎬国外媒体,no-resolve
+IP-CIDR,108.175.32.0/20,🎬国外媒体,no-resolve
+IP-CIDR,192.173.64.0/18,🎬国外媒体,no-resolve
+IP-CIDR,198.38.96.0/19,🎬国外媒体,no-resolve
+IP-CIDR,198.45.48.0/20,🎬国外媒体,no-resolve
+USER-AGENT,Niconico*,🎬国外媒体
+DOMAIN-SUFFIX,dmc.nico,🎬国外媒体
+DOMAIN-SUFFIX,nicovideo.jp,🎬国外媒体
+DOMAIN-SUFFIX,nimg.jp,🎬国外媒体
+DOMAIN-SUFFIX,socdm.com,🎬国外媒体
+USER-AGENT,PBS*,🎬国外媒体
+DOMAIN-SUFFIX,pbs.org,🎬国外媒体
+DOMAIN-SUFFIX,phncdn.com,🎬国外媒体
+DOMAIN-SUFFIX,pornhub.com,🎬国外媒体
+DOMAIN-SUFFIX,pornhubpremium.com,🎬国外媒体
+USER-AGENT,TaiwanGood*,🎬国外媒体
+DOMAIN-SUFFIX,skyking.com.tw,🎬国外媒体
+DOMAIN,hamifans.emome.net,🎬国外媒体
+DOMAIN-SUFFIX,twitch.tv,🎬国外媒体
+DOMAIN-SUFFIX,twitchcdn.net,🎬国外媒体
+DOMAIN-SUFFIX,ttvnw.net,🎬国外媒体
+DOMAIN-SUFFIX,jtvnw.net,🎬国外媒体
+USER-AGENT,Viu*,🎬国外媒体
+USER-AGENT,ViuTV*,🎬国外媒体
+DOMAIN-SUFFIX,viu.com,🎬国外媒体
+DOMAIN-SUFFIX,viu.tv,🎬国外媒体
+DOMAIN,api.viu.now.com,🎬国外媒体
+DOMAIN,d1k2us671qcoau.cloudfront.net,🎬国外媒体
+DOMAIN,d2anahhhmp1ffz.cloudfront.net,🎬国外媒体
+DOMAIN,dfp6rglgjqszk.cloudfront.net,🎬国外媒体
+USER-AGENT,com.google.ios.youtube*,🎬国外媒体
+USER-AGENT,YouTube*,🎬国外媒体
+DOMAIN-SUFFIX,googlevideo.com,🎬国外媒体
+DOMAIN-SUFFIX,youtube.com,🎬国外媒体
+DOMAIN,youtubei.googleapis.com,🎬国外媒体
+
+DOMAIN-SUFFIX,local,DIRECT
+IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
+IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
+IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
+IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
+IP-CIDR,100.64.0.0/10,DIRECT,no-resolve
+IP-CIDR6,::1/128,DIRECT,no-resolve
+IP-CIDR6,fc00::/7,DIRECT,no-resolve
+IP-CIDR6,fe80::/10,DIRECT,no-resolve
+IP-CIDR6,fd00::/8,DIRECT,no-resolve
+USER-AGENT,coffeecorp*,DIRECT
+USER-AGENT,restaurant-mobile*,DIRECT
+DOMAIN,app.adjust.com,DIRECT
+DOMAIN-SUFFIX,googletraveladservices.com,DIRECT
+DOMAIN,dl.google.com,DIRECT
+DOMAIN,mtalk.google.com,DIRECT
+DOMAIN,livew.l.qq.com,DIRECT
+DOMAIN,vd.l.qq.com,DIRECT
+DOMAIN,analytics.strava.com,DIRECT
+DOMAIN,msg.umeng.com,DIRECT
+DOMAIN,msg.umengcloud.com,DIRECT
+DOMAIN-SUFFIX,qhres.com,DIRECT
+DOMAIN-SUFFIX,qhimg.com,DIRECT
+DOMAIN-SUFFIX,akadns.net,DIRECT
+USER-AGENT,%E4%BC%98%E9%85%B7*,DIRECT
+DOMAIN-SUFFIX,alibaba.com,DIRECT
+DOMAIN-SUFFIX,alicdn.com,DIRECT
+DOMAIN-SUFFIX,alikunlun.com,DIRECT
+DOMAIN-SUFFIX,alipay.com,DIRECT
+DOMAIN-SUFFIX,amap.com,DIRECT
+DOMAIN-SUFFIX,autonavi.com,DIRECT
+DOMAIN-SUFFIX,dingtalk.com,DIRECT
+DOMAIN-SUFFIX,mxhichina.com,DIRECT
+DOMAIN-SUFFIX,soku.com,DIRECT
+DOMAIN-SUFFIX,taobao.com,DIRECT
+DOMAIN-SUFFIX,tmall.com,DIRECT
+DOMAIN-SUFFIX,tmall.hk,DIRECT
+DOMAIN-SUFFIX,ykimg.com,DIRECT
+DOMAIN-SUFFIX,youku.com,DIRECT
+DOMAIN-SUFFIX,xiami.com,DIRECT
+DOMAIN-SUFFIX,xiami.net,DIRECT
+DOMAIN-SUFFIX,aaplimg.com,DIRECT
+DOMAIN-SUFFIX,apple.co,DIRECT
+DOMAIN-SUFFIX,apple.com,DIRECT
+DOMAIN-SUFFIX,apple-cloudkit.com,DIRECT
+DOMAIN-SUFFIX,appstore.com,DIRECT
+DOMAIN-SUFFIX,cdn-apple.com,DIRECT
+DOMAIN-SUFFIX,crashlytics.com,DIRECT
+DOMAIN-SUFFIX,icloud.com,DIRECT
+DOMAIN-SUFFIX,icloud-content.com,DIRECT
+DOMAIN-SUFFIX,me.com,DIRECT
+DOMAIN-SUFFIX,mzstatic.com,DIRECT
+DOMAIN,www-cdn.icloud.com.akadns.net,DIRECT
+DOMAIN-SUFFIX,baidu.com,DIRECT
+DOMAIN-SUFFIX,baidubcr.com,DIRECT
+DOMAIN-SUFFIX,bdstatic.com,DIRECT
+DOMAIN-SUFFIX,yunjiasu-cdn.net,DIRECT
+DOMAIN-SUFFIX,acgvideo.com,DIRECT
+DOMAIN-SUFFIX,biliapi.com,DIRECT
+DOMAIN-SUFFIX,biliapi.net,DIRECT
+DOMAIN-SUFFIX,bilibili.com,DIRECT
+DOMAIN-SUFFIX,bilibili.tv,DIRECT
+DOMAIN-SUFFIX,hdslb.com,DIRECT
+DOMAIN-SUFFIX,blizzard.com,DIRECT
+DOMAIN-SUFFIX,battle.net,DIRECT
+DOMAIN,blzddist1-a.akamaihd.net,DIRECT
+DOMAIN-SUFFIX,feiliao.com,DIRECT
+DOMAIN-SUFFIX,pstatp.com,DIRECT
+DOMAIN-SUFFIX,snssdk.com,DIRECT
+DOMAIN-SUFFIX,iesdouyin.com,DIRECT
+DOMAIN-SUFFIX,toutiao.com,DIRECT
+DOMAIN-SUFFIX,cctv.com,DIRECT
+DOMAIN-SUFFIX,cctvpic.com,DIRECT
+DOMAIN-SUFFIX,livechina.com,DIRECT
+DOMAIN-SUFFIX,didialift.com,DIRECT
+DOMAIN-SUFFIX,didiglobal.com,DIRECT
+DOMAIN-SUFFIX,udache.com,DIRECT
+DOMAIN-SUFFIX,343480.com,DIRECT
+DOMAIN-SUFFIX,baduziyuan.com,DIRECT
+DOMAIN-SUFFIX,com-hs-hkdy.com,DIRECT
+DOMAIN-SUFFIX,czybjz.com,DIRECT
+DOMAIN-SUFFIX,dandanzan.com,DIRECT
+DOMAIN-SUFFIX,fjhps.com,DIRECT
+DOMAIN-SUFFIX,kuyunbo.club,DIRECT
+DOMAIN-SUFFIX,21cn.com,DIRECT
+DOMAIN-SUFFIX,hitv.com,DIRECT
+DOMAIN-SUFFIX,mgtv.com,DIRECT
+DOMAIN-SUFFIX,iqiyi.com,DIRECT
+DOMAIN-SUFFIX,iqiyipic.com,DIRECT
+DOMAIN-SUFFIX,71.am.com,DIRECT
+DOMAIN-SUFFIX,jd.com,DIRECT
+DOMAIN-SUFFIX,jd.hk,DIRECT
+DOMAIN-SUFFIX,jdpay.com,DIRECT
+DOMAIN-SUFFIX,360buyimg.com,DIRECT
+DOMAIN-SUFFIX,iciba.com,DIRECT
+DOMAIN-SUFFIX,ksosoft.com,DIRECT
+DOMAIN-SUFFIX,meitu.com,DIRECT
+DOMAIN-SUFFIX,meitudata.com,DIRECT
+DOMAIN-SUFFIX,meitustat.com,DIRECT
+DOMAIN-SUFFIX,meipai.com,DIRECT
+DOMAIN-SUFFIX,duokan.com,DIRECT
+DOMAIN-SUFFIX,mi-img.com,DIRECT
+DOMAIN-SUFFIX,miui.com,DIRECT
+DOMAIN-SUFFIX,miwifi.com,DIRECT
+DOMAIN-SUFFIX,xiaomi.com,DIRECT
+DOMAIN-SUFFIX,microsoft.com,DIRECT
+DOMAIN-SUFFIX,msecnd.net,DIRECT
+DOMAIN-SUFFIX,office365.com,DIRECT
+DOMAIN-SUFFIX,outlook.com,DIRECT
+DOMAIN-SUFFIX,s-microsoft.com,DIRECT
+DOMAIN-SUFFIX,visualstudio.com,DIRECT
+DOMAIN-SUFFIX,windows.com,DIRECT
+DOMAIN-SUFFIX,windowsupdate.com,DIRECT
+DOMAIN,officecdn-microsoft-com.akamaized.net,DIRECT
+USER-AGENT,NeteaseMusic*,DIRECT
+USER-AGENT,%E7%BD%91%E6%98%93%E4%BA%91%E9%9F%B3%E4%B9%90*,DIRECT
+DOMAIN-SUFFIX,163.com,DIRECT
+DOMAIN-SUFFIX,126.net,DIRECT
+DOMAIN-SUFFIX,127.net,DIRECT
+DOMAIN-SUFFIX,163yun.com,DIRECT
+DOMAIN-SUFFIX,lofter.com,DIRECT
+DOMAIN-SUFFIX,netease.com,DIRECT
+DOMAIN-SUFFIX,ydstatic.com,DIRECT
+DOMAIN-SUFFIX,sina.com,DIRECT
+DOMAIN-SUFFIX,weibo.com,DIRECT
+DOMAIN-SUFFIX,weibocdn.com,DIRECT
+DOMAIN-SUFFIX,sohu.com,DIRECT
+DOMAIN-SUFFIX,sohucs.com,DIRECT
+DOMAIN-SUFFIX,sohu-inc.com,DIRECT
+DOMAIN-SUFFIX,v-56.com,DIRECT
+DOMAIN-SUFFIX,sogo.com,DIRECT
+DOMAIN-SUFFIX,sogou.com,DIRECT
+DOMAIN-SUFFIX,sogoucdn.com,DIRECT
+DOMAIN-SUFFIX,steampowered.com,DIRECT
+DOMAIN-SUFFIX,steam-chat.com,DIRECT
+DOMAIN-SUFFIX,steamgames.com,DIRECT
+DOMAIN-SUFFIX,steamusercontent.com,DIRECT
+DOMAIN-SUFFIX,steamcontent.com,DIRECT
+DOMAIN-SUFFIX,steamstatic.com,DIRECT
+DOMAIN-SUFFIX,steamcdn-a.akamaihd.net,DIRECT
+DOMAIN-SUFFIX,steamstat.us,DIRECT
+USER-AGENT,MicroMessenger%20Client,DIRECT
+USER-AGENT,WeChat*,DIRECT
+DOMAIN-SUFFIX,gtimg.com,DIRECT
+DOMAIN-SUFFIX,idqqimg.com,DIRECT
+DOMAIN-SUFFIX,igamecj.com,DIRECT
+DOMAIN-SUFFIX,myapp.com,DIRECT
+DOMAIN-SUFFIX,myqcloud.com,DIRECT
+DOMAIN-SUFFIX,qq.com,DIRECT
+DOMAIN-SUFFIX,tencent.com,DIRECT
+DOMAIN-SUFFIX,tencent-cloud.net,DIRECT
+USER-AGENT,YYeTs*,DIRECT
+DOMAIN-SUFFIX,jstucdn.com,DIRECT
+DOMAIN-SUFFIX,zimuzu.io,DIRECT
+DOMAIN-SUFFIX,zimuzu.tv,DIRECT
+DOMAIN-SUFFIX,zmz2019.com,DIRECT
+DOMAIN-SUFFIX,zmzapi.com,DIRECT
+DOMAIN-SUFFIX,zmzapi.net,DIRECT
+DOMAIN-SUFFIX,zmzfile.com,DIRECT
+DOMAIN-SUFFIX,ccgslb.com,DIRECT
+DOMAIN-SUFFIX,ccgslb.net,DIRECT
+DOMAIN-SUFFIX,chinanetcenter.com,DIRECT
+DOMAIN-SUFFIX,meixincdn.com,DIRECT
+DOMAIN-SUFFIX,ourdvs.com,DIRECT
+DOMAIN-SUFFIX,staticdn.net,DIRECT
+DOMAIN-SUFFIX,wangsu.com,DIRECT
+DOMAIN-SUFFIX,ipip.net,DIRECT
+DOMAIN-SUFFIX,ip.la,DIRECT
+DOMAIN-SUFFIX,ip-cdn.com,DIRECT
+DOMAIN-SUFFIX,ipv6-test.com,DIRECT
+DOMAIN-SUFFIX,test-ipv6.com,DIRECT
+DOMAIN-SUFFIX,whatismyip.com,DIRECT
+DOMAIN-SUFFIX,netspeedtestmaster.com,DIRECT
+DOMAIN,speedtest.macpaw.com,DIRECT
+DOMAIN-SUFFIX,awesome-hd.me,DIRECT
+DOMAIN-SUFFIX,broadcasthe.net,DIRECT
+DOMAIN-SUFFIX,chdbits.co,DIRECT
+DOMAIN-SUFFIX,classix-unlimited.co.uk,DIRECT
+DOMAIN-SUFFIX,empornium.me,DIRECT
+DOMAIN-SUFFIX,gazellegames.net,DIRECT
+DOMAIN-SUFFIX,hdchina.org,DIRECT
+DOMAIN-SUFFIX,hdsky.me,DIRECT
+DOMAIN-SUFFIX,icetorrent.org,DIRECT
+DOMAIN-SUFFIX,jpopsuki.eu,DIRECT
+DOMAIN-SUFFIX,keepfrds.com,DIRECT
+DOMAIN-SUFFIX,madsrevolution.net,DIRECT
+DOMAIN-SUFFIX,m-team.cc,DIRECT
+DOMAIN-SUFFIX,nanyangpt.com,DIRECT
+DOMAIN-SUFFIX,ncore.cc,DIRECT
+DOMAIN-SUFFIX,open.cd,DIRECT
+DOMAIN-SUFFIX,ourbits.club,DIRECT
+DOMAIN-SUFFIX,passthepopcorn.me,DIRECT
+DOMAIN-SUFFIX,privatehd.to,DIRECT
+DOMAIN-SUFFIX,redacted.ch,DIRECT
+DOMAIN-SUFFIX,springsunday.net,DIRECT
+DOMAIN-SUFFIX,tjupt.org,DIRECT
+DOMAIN-SUFFIX,totheglory.im,DIRECT
+DOMAIN-SUFFIX,acm.org,DIRECT
+DOMAIN-SUFFIX,acs.org,DIRECT
+DOMAIN-SUFFIX,aip.org,DIRECT
+DOMAIN-SUFFIX,ams.org,DIRECT
+DOMAIN-SUFFIX,annualreviews.org,DIRECT
+DOMAIN-SUFFIX,aps.org,DIRECT
+DOMAIN-SUFFIX,ascelibrary.org,DIRECT
+DOMAIN-SUFFIX,asm.org,DIRECT
+DOMAIN-SUFFIX,asme.org,DIRECT
+DOMAIN-SUFFIX,astm.org,DIRECT
+DOMAIN-SUFFIX,bmj.com,DIRECT
+DOMAIN-SUFFIX,cambridge.org,DIRECT
+DOMAIN-SUFFIX,cas.org,DIRECT
+DOMAIN-SUFFIX,clarivate.com,DIRECT
+DOMAIN-SUFFIX,ebscohost.com,DIRECT
+DOMAIN-SUFFIX,emerald.com,DIRECT
+DOMAIN-SUFFIX,engineeringvillage.com,DIRECT
+DOMAIN-SUFFIX,icevirtuallibrary.com,DIRECT
+DOMAIN-SUFFIX,ieee.org,DIRECT
+DOMAIN-SUFFIX,imf.org,DIRECT
+DOMAIN-SUFFIX,iop.org,DIRECT
+DOMAIN-SUFFIX,jamanetwork.com,DIRECT
+DOMAIN-SUFFIX,jhu.edu,DIRECT
+DOMAIN-SUFFIX,jstor.org,DIRECT
+DOMAIN-SUFFIX,karger.com,DIRECT
+DOMAIN-SUFFIX,libguides.com,DIRECT
+DOMAIN-SUFFIX,madsrevolution.net,DIRECT
+DOMAIN-SUFFIX,mpg.de,DIRECT
+DOMAIN-SUFFIX,myilibrary.com,DIRECT
+DOMAIN-SUFFIX,nature.com,DIRECT
+DOMAIN-SUFFIX,oecd-ilibrary.org,DIRECT
+DOMAIN-SUFFIX,osapublishing.org,DIRECT
+DOMAIN-SUFFIX,oup.com,DIRECT
+DOMAIN-SUFFIX,ovid.com,DIRECT
+DOMAIN-SUFFIX,oxfordartonline.com,DIRECT
+DOMAIN-SUFFIX,oxfordbibliographies.com,DIRECT
+DOMAIN-SUFFIX,oxfordmusiconline.com,DIRECT
+DOMAIN-SUFFIX,pnas.org,DIRECT
+DOMAIN-SUFFIX,proquest.com,DIRECT
+DOMAIN-SUFFIX,rsc.org,DIRECT
+DOMAIN-SUFFIX,sagepub.com,DIRECT
+DOMAIN-SUFFIX,sciencedirect.com,DIRECT
+DOMAIN-SUFFIX,sciencemag.org,DIRECT
+DOMAIN-SUFFIX,scopus.com,DIRECT
+DOMAIN-SUFFIX,siam.org,DIRECT
+DOMAIN-SUFFIX,spiedigitallibrary.org,DIRECT
+DOMAIN-SUFFIX,springer.com,DIRECT
+DOMAIN-SUFFIX,springerlink.com,DIRECT
+DOMAIN-SUFFIX,tandfonline.com,DIRECT
+DOMAIN-SUFFIX,un.org,DIRECT
+DOMAIN-SUFFIX,uni-bielefeld.de,DIRECT
+DOMAIN-SUFFIX,webofknowledge.com,DIRECT
+DOMAIN-SUFFIX,westlaw.com,DIRECT
+DOMAIN-SUFFIX,wiley.com,DIRECT
+DOMAIN-SUFFIX,worldbank.org,DIRECT
+DOMAIN-SUFFIX,worldscientific.com,DIRECT
+DOMAIN-SUFFIX,cn,DIRECT
+DOMAIN-SUFFIX,360in.com,DIRECT
+DOMAIN-SUFFIX,51ym.me,DIRECT
+DOMAIN-SUFFIX,8686c.com,DIRECT
+DOMAIN-SUFFIX,abchina.com,DIRECT
+DOMAIN-SUFFIX,accuweather.com,DIRECT
+DOMAIN-SUFFIX,aicoinstorge.com,DIRECT
+DOMAIN-SUFFIX,air-matters.com,DIRECT
+DOMAIN-SUFFIX,air-matters.io,DIRECT
+DOMAIN-SUFFIX,aixifan.com,DIRECT
+DOMAIN-SUFFIX,amd.com,DIRECT
+DOMAIN-SUFFIX,b612.net,DIRECT
+DOMAIN-SUFFIX,bdatu.com,DIRECT
+DOMAIN-SUFFIX,beitaichufang.com,DIRECT
+DOMAIN-SUFFIX,bjango.com,DIRECT
+DOMAIN-SUFFIX,booking.com,DIRECT
+DOMAIN-SUFFIX,bstatic.com,DIRECT
+DOMAIN-SUFFIX,cailianpress.com,DIRECT
+DOMAIN-SUFFIX,camera360.com,DIRECT
+DOMAIN-SUFFIX,chinaso.com,DIRECT
+DOMAIN-SUFFIX,chua.pro,DIRECT
+DOMAIN-SUFFIX,chuimg.com,DIRECT
+DOMAIN-SUFFIX,chunyu.mobi,DIRECT
+DOMAIN-SUFFIX,chushou.tv,DIRECT
+DOMAIN-SUFFIX,cmbchina.com,DIRECT
+DOMAIN-SUFFIX,cmbimg.com,DIRECT
+DOMAIN-SUFFIX,ctrip.com,DIRECT
+DOMAIN-SUFFIX,dfcfw.com,DIRECT
+DOMAIN-SUFFIX,docschina.org,DIRECT
+DOMAIN-SUFFIX,douban.com,DIRECT
+DOMAIN-SUFFIX,doubanio.com,DIRECT
+DOMAIN-SUFFIX,douyu.com,DIRECT
+DOMAIN-SUFFIX,dxycdn.com,DIRECT
+DOMAIN-SUFFIX,dytt8.net,DIRECT
+DOMAIN-SUFFIX,eastmoney.com,DIRECT
+DOMAIN-SUFFIX,eudic.net,DIRECT
+DOMAIN-SUFFIX,feng.com,DIRECT
+DOMAIN-SUFFIX,fengkongcloud.com,DIRECT
+DOMAIN-SUFFIX,frdic.com,DIRECT
+DOMAIN-SUFFIX,futu5.com,DIRECT
+DOMAIN-SUFFIX,futunn.com,DIRECT
+DOMAIN-SUFFIX,gandi.net,DIRECT
+DOMAIN-SUFFIX,geilicdn.com,DIRECT
+DOMAIN-SUFFIX,getpricetag.com,DIRECT
+DOMAIN-SUFFIX,gifshow.com,DIRECT
+DOMAIN-SUFFIX,godic.net,DIRECT
+DOMAIN-SUFFIX,hicloud.com,DIRECT
+DOMAIN-SUFFIX,hongxiu.com,DIRECT
+DOMAIN-SUFFIX,hostbuf.com,DIRECT
+DOMAIN-SUFFIX,huxiucdn.com,DIRECT
+DOMAIN-SUFFIX,huya.com,DIRECT
+DOMAIN-SUFFIX,infinitynewtab.com,DIRECT
+DOMAIN-SUFFIX,ithome.com,DIRECT
+DOMAIN-SUFFIX,java.com,DIRECT
+DOMAIN-SUFFIX,jidian.im,DIRECT
+DOMAIN-SUFFIX,kaiyanapp.com,DIRECT
+DOMAIN-SUFFIX,kaspersky-labs.com,DIRECT
+DOMAIN-SUFFIX,keepcdn.com,DIRECT
+DOMAIN-SUFFIX,kkmh.com,DIRECT
+DOMAIN-SUFFIX,licdn.com,DIRECT
+DOMAIN-SUFFIX,linkedin.com,DIRECT
+DOMAIN-SUFFIX,loli.net,DIRECT
+DOMAIN-SUFFIX,luojilab.com,DIRECT
+DOMAIN-SUFFIX,maoyan.com,DIRECT
+DOMAIN-SUFFIX,maoyun.tv,DIRECT
+DOMAIN-SUFFIX,meituan.com,DIRECT
+DOMAIN-SUFFIX,meituan.net,DIRECT
+DOMAIN-SUFFIX,mobike.com,DIRECT
+DOMAIN-SUFFIX,moke.com,DIRECT
+DOMAIN-SUFFIX,mubu.com,DIRECT
+DOMAIN-SUFFIX,myzaker.com,DIRECT
+DOMAIN-SUFFIX,nim-lang-cn.org,DIRECT
+DOMAIN-SUFFIX,nvidia.com,DIRECT
+DOMAIN-SUFFIX,oracle.com,DIRECT
+DOMAIN-SUFFIX,paypal.com,DIRECT
+DOMAIN-SUFFIX,paypalobjects.com,DIRECT
+DOMAIN-SUFFIX,qdaily.com,DIRECT
+DOMAIN-SUFFIX,qidian.com,DIRECT
+DOMAIN-SUFFIX,qyer.com,DIRECT
+DOMAIN-SUFFIX,qyerstatic.com,DIRECT
+DOMAIN-SUFFIX,raychase.net,DIRECT
+DOMAIN-SUFFIX,ronghub.com,DIRECT
+DOMAIN-SUFFIX,ruguoapp.com,DIRECT
+DOMAIN-SUFFIX,s-reader.com,DIRECT
+DOMAIN-SUFFIX,sankuai.com,DIRECT
+DOMAIN-SUFFIX,scomper.me,DIRECT
+DOMAIN-SUFFIX,seafile.com,DIRECT
+DOMAIN-SUFFIX,sm.ms,DIRECT
+DOMAIN-SUFFIX,smzdm.com,DIRECT
+DOMAIN-SUFFIX,snapdrop.net,DIRECT
+DOMAIN-SUFFIX,snwx.com,DIRECT
+DOMAIN-SUFFIX,sspai.com,DIRECT
+DOMAIN-SUFFIX,takungpao.com,DIRECT
+DOMAIN-SUFFIX,teamviewer.com,DIRECT
+DOMAIN-SUFFIX,tianyancha.com,DIRECT
+DOMAIN-SUFFIX,udacity.com,DIRECT
+DOMAIN-SUFFIX,uning.com,DIRECT
+DOMAIN-SUFFIX,vmware.com,DIRECT
+DOMAIN-SUFFIX,weather.com,DIRECT
+DOMAIN-SUFFIX,weico.cc,DIRECT
+DOMAIN-SUFFIX,weidian.com,DIRECT
+DOMAIN-SUFFIX,xiachufang.com,DIRECT
+DOMAIN-SUFFIX,ximalaya.com,DIRECT
+DOMAIN-SUFFIX,xinhuanet.com,DIRECT
+DOMAIN-SUFFIX,xmcdn.com,DIRECT
+DOMAIN-SUFFIX,yangkeduo.com,DIRECT
+DOMAIN-SUFFIX,zhangzishi.cc,DIRECT
+DOMAIN-SUFFIX,zhihu.com,DIRECT
+DOMAIN-SUFFIX,zhimg.com,DIRECT
+DOMAIN-SUFFIX,zhuihd.com,DIRECT
+DOMAIN,download.jetbrains.com,DIRECT
+DOMAIN,images-cn.ssl-images-amazon.com,DIRECT
+IP-CIDR,119.28.28.28/32,DIRECT,no-resolve
+GEOIP,CN,DIRECT
+
+FINAL,⚓️其他流量

+ 1185 - 0
resources/conf/surge/default.tpl

@@ -0,0 +1,1185 @@
+PROCESS-NAME,aria2c,DIRECT
+PROCESS-NAME,fdm,DIRECT
+PROCESS-NAME,Folx,DIRECT
+PROCESS-NAME,NetTransport,DIRECT
+PROCESS-NAME,Thunder,DIRECT
+PROCESS-NAME,Transmission,DIRECT
+PROCESS-NAME,uTorrent,DIRECT
+PROCESS-NAME,WebTorrent,DIRECT
+PROCESS-NAME,WebTorrent Helper,DIRECT
+DOMAIN-SUFFIX,smtp,DIRECT
+DOMAIN-KEYWORD,aria2,DIRECT
+URL-REGEX,(Subject|HELO|SMTP),DIRECT
+URL-REGEX,(api|ps|sv|offnavi|newvector|ulog.imap|newloc)(.map|).(baidu|n.shifen).com,DIRECT
+URL-REGEX,(.+.|^)(360|so|qihoo|360safe|qhimg|360totalsecurity|yunpan).(cn|com),DIRECT
+URL-REGEX,(.+.)?(torrent|announce.php?passkey=|tracker|BitTorrent|bt_key|ed2k|find_node|get_peers|info_hash|magnet:|peer_id=|xunlei)(..+)?,DIRECT
+URL-REGEX,(.?)(xunlei|sandai|Thunder|XLLiveUD)(.),DIRECT
+PROCESS-NAME,DownloadService,DIRECT
+URL-REGEX,(.+\.|^)(360|so)\.(cn|com),DIRECT
+PROCESS-NAME,Weiyun,DIRECT
+
+DOMAIN-SUFFIX,ampproject.org,🔰国外流量
+DOMAIN-SUFFIX,appspot.com,🔰国外流量
+DOMAIN-SUFFIX,blogger.com,🔰国外流量
+DOMAIN-SUFFIX,getoutline.org,🔰国外流量
+DOMAIN-SUFFIX,gvt0.com,🔰国外流量
+DOMAIN-SUFFIX,gvt1.com,🔰国外流量
+DOMAIN-SUFFIX,gvt3.com,🔰国外流量
+DOMAIN-SUFFIX,xn--ngstr-lra8j.com,🔰国外流量
+DOMAIN-KEYWORD,google,🔰国外流量
+DOMAIN-KEYWORD,blogspot,🔰国外流量
+DOMAIN-SUFFIX,onedrive.live.com,🔰国外流量
+DOMAIN-SUFFIX,xboxlive.com,🔰国外流量
+DOMAIN-SUFFIX,cdninstagram.com,🔰国外流量
+DOMAIN-SUFFIX,fb.com,🔰国外流量
+DOMAIN-SUFFIX,fb.me,🔰国外流量
+DOMAIN-SUFFIX,fbaddins.com,🔰国外流量
+DOMAIN-SUFFIX,fbcdn.net,🔰国外流量
+DOMAIN-SUFFIX,fbsbx.com,🔰国外流量
+DOMAIN-SUFFIX,fbworkmail.com,🔰国外流量
+DOMAIN-SUFFIX,instagram.com,🔰国外流量
+DOMAIN-SUFFIX,m.me,🔰国外流量
+DOMAIN-SUFFIX,messenger.com,🔰国外流量
+DOMAIN-SUFFIX,oculus.com,🔰国外流量
+DOMAIN-SUFFIX,oculuscdn.com,🔰国外流量
+DOMAIN-SUFFIX,rocksdb.org,🔰国外流量
+DOMAIN-SUFFIX,whatsapp.com,🔰国外流量
+DOMAIN-SUFFIX,whatsapp.net,🔰国外流量
+DOMAIN-KEYWORD,facebook,🔰国外流量
+IP-CIDR,3.123.36.126/32,🔰国外流量,no-resolve
+IP-CIDR,35.157.215.84/32,🔰国外流量,no-resolve
+IP-CIDR,35.157.217.255/32,🔰国外流量,no-resolve
+IP-CIDR,52.58.209.134/32,🔰国外流量,no-resolve
+IP-CIDR,54.93.124.31/32,🔰国外流量,no-resolve
+IP-CIDR,54.162.243.80/32,🔰国外流量,no-resolve
+IP-CIDR,54.173.34.141/32,🔰国外流量,no-resolve
+IP-CIDR,54.235.23.242/32,🔰国外流量,no-resolve
+IP-CIDR,169.45.248.118/32,🔰国外流量,no-resolve
+DOMAIN-SUFFIX,pscp.tv,🔰国外流量
+DOMAIN-SUFFIX,periscope.tv,🔰国外流量
+DOMAIN-SUFFIX,t.co,🔰国外流量
+DOMAIN-SUFFIX,twimg.co,🔰国外流量
+DOMAIN-SUFFIX,twimg.com,🔰国外流量
+DOMAIN-SUFFIX,twitpic.com,🔰国外流量
+DOMAIN-SUFFIX,vine.co,🔰国外流量
+DOMAIN-KEYWORD,twitter,🔰国外流量
+DOMAIN-SUFFIX,t.me,🔰国外流量
+DOMAIN-SUFFIX,tdesktop.com,🔰国外流量
+DOMAIN-SUFFIX,telegra.ph,🔰国外流量
+DOMAIN-SUFFIX,telegram.me,🔰国外流量
+DOMAIN-SUFFIX,telegram.org,🔰国外流量
+IP-CIDR,91.108.4.0/22,🔰国外流量,no-resolve
+IP-CIDR,91.108.8.0/22,🔰国外流量,no-resolve
+IP-CIDR,91.108.12.0/22,🔰国外流量,no-resolve
+IP-CIDR,91.108.16.0/22,🔰国外流量,no-resolve
+IP-CIDR,91.108.56.0/22,🔰国外流量,no-resolve
+IP-CIDR,149.154.160.0/20,🔰国外流量,no-resolve
+IP-CIDR6,2001:b28:f23d::/48,🔰国外流量,no-resolve
+IP-CIDR6,2001:b28:f23f::/48,🔰国外流量,no-resolve
+IP-CIDR6,2001:67c:4e8::/48,🔰国外流量,no-resolve
+DOMAIN-SUFFIX,line.me,🔰国外流量
+DOMAIN-SUFFIX,line-apps.com,🔰国外流量
+DOMAIN-SUFFIX,line-scdn.net,🔰国外流量
+DOMAIN-SUFFIX,naver.jp,🔰国外流量
+IP-CIDR,103.2.30.0/23,🔰国外流量,no-resolve
+IP-CIDR,125.209.208.0/20,🔰国外流量,no-resolve
+IP-CIDR,147.92.128.0/17,🔰国外流量,no-resolve
+IP-CIDR,203.104.144.0/21,🔰国外流量,no-resolve
+DOMAIN-SUFFIX,4shared.com,🔰国外流量
+DOMAIN-SUFFIX,520cc.cc,🔰国外流量
+DOMAIN-SUFFIX,881903.com,🔰国外流量
+DOMAIN-SUFFIX,9cache.com,🔰国外流量
+DOMAIN-SUFFIX,9gag.com,🔰国外流量
+DOMAIN-SUFFIX,abc.com,🔰国外流量
+DOMAIN-SUFFIX,abc.net.au,🔰国外流量
+DOMAIN-SUFFIX,abebooks.com,🔰国外流量
+DOMAIN-SUFFIX,amazon.co.jp,🔰国外流量
+DOMAIN-SUFFIX,apigee.com,🔰国外流量
+DOMAIN-SUFFIX,apk-dl.com,🔰国外流量
+DOMAIN-SUFFIX,apkfind.com,🔰国外流量
+DOMAIN-SUFFIX,apkmirror.com,🔰国外流量
+DOMAIN-SUFFIX,apkmonk.com,🔰国外流量
+DOMAIN-SUFFIX,apkpure.com,🔰国外流量
+DOMAIN-SUFFIX,aptoide.com,🔰国外流量
+DOMAIN-SUFFIX,archive.is,🔰国外流量
+DOMAIN-SUFFIX,archive.org,🔰国外流量
+DOMAIN-SUFFIX,arte.tv,🔰国外流量
+DOMAIN-SUFFIX,artstation.com,🔰国外流量
+DOMAIN-SUFFIX,arukas.io,🔰国外流量
+DOMAIN-SUFFIX,ask.com,🔰国外流量
+DOMAIN-SUFFIX,avg.com,🔰国外流量
+DOMAIN-SUFFIX,avgle.com,🔰国外流量
+DOMAIN-SUFFIX,badoo.com,🔰国外流量
+DOMAIN-SUFFIX,bandwagonhost.com,🔰国外流量
+DOMAIN-SUFFIX,bbc.com,🔰国外流量
+DOMAIN-SUFFIX,behance.net,🔰国外流量
+DOMAIN-SUFFIX,bibox.com,🔰国外流量
+DOMAIN-SUFFIX,biggo.com.tw,🔰国外流量
+DOMAIN-SUFFIX,binance.com,🔰国外流量
+DOMAIN-SUFFIX,bitcointalk.org,🔰国外流量
+DOMAIN-SUFFIX,bitfinex.com,🔰国外流量
+DOMAIN-SUFFIX,bitmex.com,🔰国外流量
+DOMAIN-SUFFIX,bit-z.com,🔰国外流量
+DOMAIN-SUFFIX,bloglovin.com,🔰国外流量
+DOMAIN-SUFFIX,bloomberg.cn,🔰国外流量
+DOMAIN-SUFFIX,bloomberg.com,🔰国外流量
+DOMAIN-SUFFIX,blubrry.com,🔰国外流量
+DOMAIN-SUFFIX,book.com.tw,🔰国外流量
+DOMAIN-SUFFIX,booklive.jp,🔰国外流量
+DOMAIN-SUFFIX,books.com.tw,🔰国外流量
+DOMAIN-SUFFIX,boslife.net,🔰国外流量
+DOMAIN-SUFFIX,box.com,🔰国外流量
+DOMAIN-SUFFIX,businessinsider.com,🔰国外流量
+DOMAIN-SUFFIX,bwh1.net,🔰国外流量
+DOMAIN-SUFFIX,castbox.fm,🔰国外流量
+DOMAIN-SUFFIX,cbc.ca,🔰国外流量
+DOMAIN-SUFFIX,cdw.com,🔰国外流量
+DOMAIN-SUFFIX,change.org,🔰国外流量
+DOMAIN-SUFFIX,channelnewsasia.com,🔰国外流量
+DOMAIN-SUFFIX,ck101.com,🔰国外流量
+DOMAIN-SUFFIX,clarionproject.org,🔰国外流量
+DOMAIN-SUFFIX,clyp.it,🔰国外流量
+DOMAIN-SUFFIX,cna.com.tw,🔰国外流量
+DOMAIN-SUFFIX,comparitech.com,🔰国外流量
+DOMAIN-SUFFIX,conoha.jp,🔰国外流量
+DOMAIN-SUFFIX,crucial.com,🔰国外流量
+DOMAIN-SUFFIX,cts.com.tw,🔰国外流量
+DOMAIN-SUFFIX,cw.com.tw,🔰国外流量
+DOMAIN-SUFFIX,cyberctm.com,🔰国外流量
+DOMAIN-SUFFIX,dailymotion.com,🔰国外流量
+DOMAIN-SUFFIX,dailyview.tw,🔰国外流量
+DOMAIN-SUFFIX,daum.net,🔰国外流量
+DOMAIN-SUFFIX,daumcdn.net,🔰国外流量
+DOMAIN-SUFFIX,dcard.tw,🔰国外流量
+DOMAIN-SUFFIX,deepdiscount.com,🔰国外流量
+DOMAIN-SUFFIX,depositphotos.com,🔰国外流量
+DOMAIN-SUFFIX,deviantart.com,🔰国外流量
+DOMAIN-SUFFIX,disconnect.me,🔰国外流量
+DOMAIN-SUFFIX,discordapp.com,🔰国外流量
+DOMAIN-SUFFIX,discordapp.net,🔰国外流量
+DOMAIN-SUFFIX,disqus.com,🔰国外流量
+DOMAIN-SUFFIX,dlercloud.com,🔰国外流量
+DOMAIN-SUFFIX,dns2go.com,🔰国外流量
+DOMAIN-SUFFIX,dowjones.com,🔰国外流量
+DOMAIN-SUFFIX,dropbox.com,🔰国外流量
+DOMAIN-SUFFIX,dropboxusercontent.com,🔰国外流量
+DOMAIN-SUFFIX,duckduckgo.com,🔰国外流量
+DOMAIN-SUFFIX,dw.com,🔰国外流量
+DOMAIN-SUFFIX,dynu.com,🔰国外流量
+DOMAIN-SUFFIX,earthcam.com,🔰国外流量
+DOMAIN-SUFFIX,ebookservice.tw,🔰国外流量
+DOMAIN-SUFFIX,economist.com,🔰国外流量
+DOMAIN-SUFFIX,edgecastcdn.net,🔰国外流量
+DOMAIN-SUFFIX,edu,🔰国外流量
+DOMAIN-SUFFIX,elpais.com,🔰国外流量
+DOMAIN-SUFFIX,enanyang.my,🔰国外流量
+DOMAIN-SUFFIX,encyclopedia.com,🔰国外流量
+DOMAIN-SUFFIX,esoir.be,🔰国外流量
+DOMAIN-SUFFIX,etherscan.io,🔰国外流量
+DOMAIN-SUFFIX,euronews.com,🔰国外流量
+DOMAIN-SUFFIX,evozi.com,🔰国外流量
+DOMAIN-SUFFIX,feedly.com,🔰国外流量
+DOMAIN-SUFFIX,firech.at,🔰国外流量
+DOMAIN-SUFFIX,flickr.com,🔰国外流量
+DOMAIN-SUFFIX,flitto.com,🔰国外流量
+DOMAIN-SUFFIX,foreignpolicy.com,🔰国外流量
+DOMAIN-SUFFIX,freebrowser.org,🔰国外流量
+DOMAIN-SUFFIX,freewechat.com,🔰国外流量
+DOMAIN-SUFFIX,freeweibo.com,🔰国外流量
+DOMAIN-SUFFIX,friday.tw,🔰国外流量
+DOMAIN-SUFFIX,ftchinese.com,🔰国外流量
+DOMAIN-SUFFIX,ftimg.net,🔰国外流量
+DOMAIN-SUFFIX,gate.io,🔰国外流量
+DOMAIN-SUFFIX,getlantern.org,🔰国外流量
+DOMAIN-SUFFIX,getsync.com,🔰国外流量
+DOMAIN-SUFFIX,globalvoices.org,🔰国外流量
+DOMAIN-SUFFIX,goo.ne.jp,🔰国外流量
+DOMAIN-SUFFIX,goodreads.com,🔰国外流量
+DOMAIN-SUFFIX,gov,🔰国外流量
+DOMAIN-SUFFIX,gov.tw,🔰国外流量
+DOMAIN-SUFFIX,greatfire.org,🔰国外流量
+DOMAIN-SUFFIX,gumroad.com,🔰国外流量
+DOMAIN-SUFFIX,hbg.com,🔰国外流量
+DOMAIN-SUFFIX,heroku.com,🔰国外流量
+DOMAIN-SUFFIX,hightail.com,🔰国外流量
+DOMAIN-SUFFIX,hk01.com,🔰国外流量
+DOMAIN-SUFFIX,hkbf.org,🔰国外流量
+DOMAIN-SUFFIX,hkbookcity.com,🔰国外流量
+DOMAIN-SUFFIX,hkej.com,🔰国外流量
+DOMAIN-SUFFIX,hket.com,🔰国外流量
+DOMAIN-SUFFIX,hkgolden.com,🔰国外流量
+DOMAIN-SUFFIX,hootsuite.com,🔰国外流量
+DOMAIN-SUFFIX,hudson.org,🔰国外流量
+DOMAIN-SUFFIX,hyread.com.tw,🔰国外流量
+DOMAIN-SUFFIX,ibtimes.com,🔰国外流量
+DOMAIN-SUFFIX,i-cable.com,🔰国外流量
+DOMAIN-SUFFIX,icij.org,🔰国外流量
+DOMAIN-SUFFIX,icoco.com,🔰国外流量
+DOMAIN-SUFFIX,imgur.com,🔰国外流量
+DOMAIN-SUFFIX,initiummall.com,🔰国外流量
+DOMAIN-SUFFIX,insecam.org,🔰国外流量
+DOMAIN-SUFFIX,ipfs.io,🔰国外流量
+DOMAIN-SUFFIX,issuu.com,🔰国外流量
+DOMAIN-SUFFIX,istockphoto.com,🔰国外流量
+DOMAIN-SUFFIX,japantimes.co.jp,🔰国外流量
+DOMAIN-SUFFIX,jiji.com,🔰国外流量
+DOMAIN-SUFFIX,jinx.com,🔰国外流量
+DOMAIN-SUFFIX,jkforum.net,🔰国外流量
+DOMAIN-SUFFIX,joinmastodon.org,🔰国外流量
+DOMAIN-SUFFIX,justmysocks.net,🔰国外流量
+DOMAIN-SUFFIX,justpaste.it,🔰国外流量
+DOMAIN-SUFFIX,kakao.com,🔰国外流量
+DOMAIN-SUFFIX,kakaocorp.com,🔰国外流量
+DOMAIN-SUFFIX,kik.com,🔰国外流量
+DOMAIN-SUFFIX,kobo.com,🔰国外流量
+DOMAIN-SUFFIX,kobobooks.com,🔰国外流量
+DOMAIN-SUFFIX,kodingen.com,🔰国外流量
+DOMAIN-SUFFIX,lemonde.fr,🔰国外流量
+DOMAIN-SUFFIX,lepoint.fr,🔰国外流量
+DOMAIN-SUFFIX,lihkg.com,🔰国外流量
+DOMAIN-SUFFIX,listennotes.com,🔰国外流量
+DOMAIN-SUFFIX,livestream.com,🔰国外流量
+DOMAIN-SUFFIX,logmein.com,🔰国外流量
+DOMAIN-SUFFIX,mail.ru,🔰国外流量
+DOMAIN-SUFFIX,mailchimp.com,🔰国外流量
+DOMAIN-SUFFIX,marc.info,🔰国外流量
+DOMAIN-SUFFIX,matters.news,🔰国外流量
+DOMAIN-SUFFIX,maying.co,🔰国外流量
+DOMAIN-SUFFIX,medium.com,🔰国外流量
+DOMAIN-SUFFIX,mega.nz,🔰国外流量
+DOMAIN-SUFFIX,mil,🔰国外流量
+DOMAIN-SUFFIX,mingpao.com,🔰国外流量
+DOMAIN-SUFFIX,mobile01.com,🔰国外流量
+DOMAIN-SUFFIX,myspace.com,🔰国外流量
+DOMAIN-SUFFIX,myspacecdn.com,🔰国外流量
+DOMAIN-SUFFIX,nanyang.com,🔰国外流量
+DOMAIN-SUFFIX,naver.com,🔰国外流量
+DOMAIN-SUFFIX,neowin.net,🔰国外流量
+DOMAIN-SUFFIX,newstapa.org,🔰国外流量
+DOMAIN-SUFFIX,nexitally.com,🔰国外流量
+DOMAIN-SUFFIX,nhk.or.jp,🔰国外流量
+DOMAIN-SUFFIX,nicovideo.jp,🔰国外流量
+DOMAIN-SUFFIX,nii.ac.jp,🔰国外流量
+DOMAIN-SUFFIX,nikkei.com,🔰国外流量
+DOMAIN-SUFFIX,nofile.io,🔰国外流量
+DOMAIN-SUFFIX,now.com,🔰国外流量
+DOMAIN-SUFFIX,nrk.no,🔰国外流量
+DOMAIN-SUFFIX,nyt.com,🔰国外流量
+DOMAIN-SUFFIX,nytchina.com,🔰国外流量
+DOMAIN-SUFFIX,nytcn.me,🔰国外流量
+DOMAIN-SUFFIX,nytco.com,🔰国外流量
+DOMAIN-SUFFIX,nytimes.com,🔰国外流量
+DOMAIN-SUFFIX,nytimg.com,🔰国外流量
+DOMAIN-SUFFIX,nytlog.com,🔰国外流量
+DOMAIN-SUFFIX,nytstyle.com,🔰国外流量
+DOMAIN-SUFFIX,ok.ru,🔰国外流量
+DOMAIN-SUFFIX,okex.com,🔰国外流量
+DOMAIN-SUFFIX,on.cc,🔰国外流量
+DOMAIN-SUFFIX,orientaldaily.com.my,🔰国外流量
+DOMAIN-SUFFIX,overcast.fm,🔰国外流量
+DOMAIN-SUFFIX,paltalk.com,🔰国外流量
+DOMAIN-SUFFIX,pao-pao.net,🔰国外流量
+DOMAIN-SUFFIX,parsevideo.com,🔰国外流量
+DOMAIN-SUFFIX,pbxes.com,🔰国外流量
+DOMAIN-SUFFIX,pcdvd.com.tw,🔰国外流量
+DOMAIN-SUFFIX,pchome.com.tw,🔰国外流量
+DOMAIN-SUFFIX,pcloud.com,🔰国外流量
+DOMAIN-SUFFIX,picacomic.com,🔰国外流量
+DOMAIN-SUFFIX,pinimg.com,🔰国外流量
+DOMAIN-SUFFIX,pixiv.net,🔰国外流量
+DOMAIN-SUFFIX,player.fm,🔰国外流量
+DOMAIN-SUFFIX,plurk.com,🔰国外流量
+DOMAIN-SUFFIX,po18.tw,🔰国外流量
+DOMAIN-SUFFIX,potato.im,🔰国外流量
+DOMAIN-SUFFIX,potatso.com,🔰国外流量
+DOMAIN-SUFFIX,prism-break.org,🔰国外流量
+DOMAIN-SUFFIX,proxifier.com,🔰国外流量
+DOMAIN-SUFFIX,pt.im,🔰国外流量
+DOMAIN-SUFFIX,pts.org.tw,🔰国外流量
+DOMAIN-SUFFIX,pubu.com.tw,🔰国外流量
+DOMAIN-SUFFIX,pubu.tw,🔰国外流量
+DOMAIN-SUFFIX,pureapk.com,🔰国外流量
+DOMAIN-SUFFIX,quora.com,🔰国外流量
+DOMAIN-SUFFIX,quoracdn.net,🔰国外流量
+DOMAIN-SUFFIX,rakuten.co.jp,🔰国外流量
+DOMAIN-SUFFIX,readingtimes.com.tw,🔰国外流量
+DOMAIN-SUFFIX,readmoo.com,🔰国外流量
+DOMAIN-SUFFIX,redbubble.com,🔰国外流量
+DOMAIN-SUFFIX,reddit.com,🔰国外流量
+DOMAIN-SUFFIX,redditmedia.com,🔰国外流量
+DOMAIN-SUFFIX,resilio.com,🔰国外流量
+DOMAIN-SUFFIX,reuters.com,🔰国外流量
+DOMAIN-SUFFIX,reutersmedia.net,🔰国外流量
+DOMAIN-SUFFIX,rfi.fr,🔰国外流量
+DOMAIN-SUFFIX,rixcloud.com,🔰国外流量
+DOMAIN-SUFFIX,roadshow.hk,🔰国外流量
+DOMAIN-SUFFIX,scmp.com,🔰国外流量
+DOMAIN-SUFFIX,scribd.com,🔰国外流量
+DOMAIN-SUFFIX,seatguru.com,🔰国外流量
+DOMAIN-SUFFIX,shadowsocks.org,🔰国外流量
+DOMAIN-SUFFIX,shopee.tw,🔰国外流量
+DOMAIN-SUFFIX,slideshare.net,🔰国外流量
+DOMAIN-SUFFIX,softfamous.com,🔰国外流量
+DOMAIN-SUFFIX,soundcloud.com,🔰国外流量
+DOMAIN-SUFFIX,ssrcloud.org,🔰国外流量
+DOMAIN-SUFFIX,startpage.com,🔰国外流量
+DOMAIN-SUFFIX,steamcommunity.com,🔰国外流量
+DOMAIN-SUFFIX,steemit.com,🔰国外流量
+DOMAIN-SUFFIX,steemitwallet.com,🔰国外流量
+DOMAIN-SUFFIX,t66y.com,🔰国外流量
+DOMAIN-SUFFIX,tapatalk.com,🔰国外流量
+DOMAIN-SUFFIX,teco-hk.org,🔰国外流量
+DOMAIN-SUFFIX,teco-mo.org,🔰国外流量
+DOMAIN-SUFFIX,teddysun.com,🔰国外流量
+DOMAIN-SUFFIX,textnow.me,🔰国外流量
+DOMAIN-SUFFIX,theguardian.com,🔰国外流量
+DOMAIN-SUFFIX,theinitium.com,🔰国外流量
+DOMAIN-SUFFIX,thetvdb.com,🔰国外流量
+DOMAIN-SUFFIX,tineye.com,🔰国外流量
+DOMAIN-SUFFIX,torproject.org,🔰国外流量
+DOMAIN-SUFFIX,tumblr.com,🔰国外流量
+DOMAIN-SUFFIX,turbobit.net,🔰国外流量
+DOMAIN-SUFFIX,tutanota.com,🔰国外流量
+DOMAIN-SUFFIX,tvboxnow.com,🔰国外流量
+DOMAIN-SUFFIX,udn.com,🔰国外流量
+DOMAIN-SUFFIX,unseen.is,🔰国外流量
+DOMAIN-SUFFIX,upmedia.mg,🔰国外流量
+DOMAIN-SUFFIX,uptodown.com,🔰国外流量
+DOMAIN-SUFFIX,urbandictionary.com,🔰国外流量
+DOMAIN-SUFFIX,ustream.tv,🔰国外流量
+DOMAIN-SUFFIX,uwants.com,🔰国外流量
+DOMAIN-SUFFIX,v2ray.com,🔰国外流量
+DOMAIN-SUFFIX,viber.com,🔰国外流量
+DOMAIN-SUFFIX,videopress.com,🔰国外流量
+DOMAIN-SUFFIX,vimeo.com,🔰国外流量
+DOMAIN-SUFFIX,voachinese.com,🔰国外流量
+DOMAIN-SUFFIX,voanews.com,🔰国外流量
+DOMAIN-SUFFIX,voxer.com,🔰国外流量
+DOMAIN-SUFFIX,vzw.com,🔰国外流量
+DOMAIN-SUFFIX,w3schools.com,🔰国外流量
+DOMAIN-SUFFIX,washingtonpost.com,🔰国外流量
+DOMAIN-SUFFIX,wattpad.com,🔰国外流量
+DOMAIN-SUFFIX,whoer.net,🔰国外流量
+DOMAIN-SUFFIX,wikimapia.org,🔰国外流量
+DOMAIN-SUFFIX,wikipedia.org,🔰国外流量
+DOMAIN-SUFFIX,wikiquote.org,🔰国外流量
+DOMAIN-SUFFIX,wikiwand.com,🔰国外流量
+DOMAIN-SUFFIX,winudf.com,🔰国外流量
+DOMAIN-SUFFIX,wire.com,🔰国外流量
+DOMAIN-SUFFIX,wordpress.com,🔰国外流量
+DOMAIN-SUFFIX,workflow.is,🔰国外流量
+DOMAIN-SUFFIX,worldcat.org,🔰国外流量
+DOMAIN-SUFFIX,wsj.com,🔰国外流量
+DOMAIN-SUFFIX,wsj.net,🔰国外流量
+DOMAIN-SUFFIX,xhamster.com,🔰国外流量
+DOMAIN-SUFFIX,xn--90wwvt03e.com,🔰国外流量
+DOMAIN-SUFFIX,xn--i2ru8q2qg.com,🔰国外流量
+DOMAIN-SUFFIX,xnxx.com,🔰国外流量
+DOMAIN-SUFFIX,xvideos.com,🔰国外流量
+DOMAIN-SUFFIX,yahoo.com,🔰国外流量
+DOMAIN-SUFFIX,yandex.ru,🔰国外流量
+DOMAIN-SUFFIX,ycombinator.com,🔰国外流量
+DOMAIN-SUFFIX,yesasia.com,🔰国外流量
+DOMAIN-SUFFIX,yes-news.com,🔰国外流量
+DOMAIN-SUFFIX,yomiuri.co.jp,🔰国外流量
+DOMAIN-SUFFIX,you-get.org,🔰国外流量
+DOMAIN-SUFFIX,zaobao.com,🔰国外流量
+DOMAIN-SUFFIX,zb.com,🔰国外流量
+DOMAIN-SUFFIX,zello.com,🔰国外流量
+DOMAIN-SUFFIX,zeronet.io,🔰国外流量
+DOMAIN-SUFFIX,zoom.us,🔰国外流量
+DOMAIN-KEYWORD,github,🔰国外流量
+DOMAIN-KEYWORD,jav,🔰国外流量
+DOMAIN-KEYWORD,pinterest,🔰国外流量
+DOMAIN-KEYWORD,porn,🔰国外流量
+DOMAIN-KEYWORD,wikileaks,🔰国外流量
+DOMAIN-SUFFIX,apartmentratings.com,🔰国外流量
+DOMAIN-SUFFIX,apartments.com,🔰国外流量
+DOMAIN-SUFFIX,bankmobilevibe.com,🔰国外流量
+DOMAIN-SUFFIX,bing.com,🔰国外流量
+DOMAIN-SUFFIX,booktopia.com.au,🔰国外流量
+DOMAIN-SUFFIX,cccat.io,🔰国外流量
+DOMAIN-SUFFIX,centauro.com.br,🔰国外流量
+DOMAIN-SUFFIX,clearsurance.com,🔰国外流量
+DOMAIN-SUFFIX,costco.com,🔰国外流量
+DOMAIN-SUFFIX,crackle.com,🔰国外流量
+DOMAIN-SUFFIX,depositphotos.cn,🔰国外流量
+DOMAIN-SUFFIX,dish.com,🔰国外流量
+DOMAIN-SUFFIX,dmm.co.jp,🔰国外流量
+DOMAIN-SUFFIX,dmm.com,🔰国外流量
+DOMAIN-SUFFIX,dnvod.tv,🔰国外流量
+DOMAIN-SUFFIX,esurance.com,🔰国外流量
+DOMAIN-SUFFIX,extmatrix.com,🔰国外流量
+DOMAIN-SUFFIX,fastpic.ru,🔰国外流量
+DOMAIN-SUFFIX,flipboard.com,🔰国外流量
+DOMAIN-SUFFIX,fnac.be,🔰国外流量
+DOMAIN-SUFFIX,fnac.com,🔰国外流量
+DOMAIN-SUFFIX,funkyimg.com,🔰国外流量
+DOMAIN-SUFFIX,fxnetworks.com,🔰国外流量
+DOMAIN-SUFFIX,gettyimages.com,🔰国外流量
+DOMAIN-SUFFIX,go.com,🔰国外流量
+DOMAIN-SUFFIX,here.com,🔰国外流量
+DOMAIN-SUFFIX,jcpenney.com,🔰国外流量
+DOMAIN-SUFFIX,jiehua.tv,🔰国外流量
+DOMAIN-SUFFIX,mailfence.com,🔰国外流量
+DOMAIN-SUFFIX,nationwide.com,🔰国外流量
+DOMAIN-SUFFIX,nbc.com,🔰国外流量
+DOMAIN-SUFFIX,nexon.com,🔰国外流量
+DOMAIN-SUFFIX,nordstrom.com,🔰国外流量
+DOMAIN-SUFFIX,nordstromimage.com,🔰国外流量
+DOMAIN-SUFFIX,nordstromrack.com,🔰国外流量
+DOMAIN-SUFFIX,superpages.com,🔰国外流量
+DOMAIN-SUFFIX,target.com,🔰国外流量
+DOMAIN-SUFFIX,thinkgeek.com,🔰国外流量
+DOMAIN-SUFFIX,tracfone.com,🔰国外流量
+DOMAIN-SUFFIX,unity3d.com,🔰国外流量
+DOMAIN-SUFFIX,uploader.jp,🔰国外流量
+DOMAIN-SUFFIX,vevo.com,🔰国外流量
+DOMAIN-SUFFIX,viu.tv,🔰国外流量
+DOMAIN-SUFFIX,vk.com,🔰国外流量
+DOMAIN-SUFFIX,vsco.co,🔰国外流量
+DOMAIN-SUFFIX,xfinity.com,🔰国外流量
+DOMAIN-SUFFIX,zattoo.com,🔰国外流量
+USER-AGENT,Roam*,🔰国外流量
+DOMAIN,testflight.apple.com,🔰国外流量
+DOMAIN-SUFFIX,appsto.re,🔰国外流量
+DOMAIN,books.itunes.apple.com,🔰国外流量
+DOMAIN,hls.itunes.apple.com,🔰国外流量
+DOMAIN,apps.apple.com,🔰国外流量
+DOMAIN,itunes.apple.com,🔰国外流量
+DOMAIN,api-glb-sea.smoot.apple.com,🔰国外流量
+DOMAIN,lookup-api.apple.com,🔰国外流量
+PROCESS-NAME,LookupViewService,🔰国外流量
+DOMAIN-SUFFIX,abc.xyz,🔰国外流量
+DOMAIN-SUFFIX,android.com,🔰国外流量
+DOMAIN-SUFFIX,androidify.com,🔰国外流量
+DOMAIN-SUFFIX,dialogflow.com,🔰国外流量
+DOMAIN-SUFFIX,autodraw.com,🔰国外流量
+DOMAIN-SUFFIX,capitalg.com,🔰国外流量
+DOMAIN-SUFFIX,certificate-transparency.org,🔰国外流量
+DOMAIN-SUFFIX,chrome.com,🔰国外流量
+DOMAIN-SUFFIX,chromeexperiments.com,🔰国外流量
+DOMAIN-SUFFIX,chromestatus.com,🔰国外流量
+DOMAIN-SUFFIX,chromium.org,🔰国外流量
+DOMAIN-SUFFIX,creativelab5.com,🔰国外流量
+DOMAIN-SUFFIX,debug.com,🔰国外流量
+DOMAIN-SUFFIX,deepmind.com,🔰国外流量
+DOMAIN-SUFFIX,firebaseio.com,🔰国外流量
+DOMAIN-SUFFIX,getmdl.io,🔰国外流量
+DOMAIN-SUFFIX,ggpht.com,🔰国外流量
+DOMAIN-SUFFIX,gmail.com,🔰国外流量
+DOMAIN-SUFFIX,gmodules.com,🔰国外流量
+DOMAIN-SUFFIX,godoc.org,🔰国外流量
+DOMAIN-SUFFIX,golang.org,🔰国外流量
+DOMAIN-SUFFIX,gstatic.com,🔰国外流量
+DOMAIN-SUFFIX,gv.com,🔰国外流量
+DOMAIN-SUFFIX,gwtproject.org,🔰国外流量
+DOMAIN-SUFFIX,itasoftware.com,🔰国外流量
+DOMAIN-SUFFIX,madewithcode.com,🔰国外流量
+DOMAIN-SUFFIX,material.io,🔰国外流量
+DOMAIN-SUFFIX,polymer-project.org,🔰国外流量
+DOMAIN-SUFFIX,admin.recaptcha.net,🔰国外流量
+DOMAIN-SUFFIX,recaptcha.net,🔰国外流量
+DOMAIN-SUFFIX,shattered.io,🔰国外流量
+DOMAIN-SUFFIX,synergyse.com,🔰国外流量
+DOMAIN-SUFFIX,tensorflow.org,🔰国外流量
+DOMAIN-SUFFIX,tfhub.dev,🔰国外流量
+DOMAIN-SUFFIX,tiltbrush.com,🔰国外流量
+DOMAIN-SUFFIX,waveprotocol.org,🔰国外流量
+DOMAIN-SUFFIX,waymo.com,🔰国外流量
+DOMAIN-SUFFIX,webmproject.org,🔰国外流量
+DOMAIN-SUFFIX,webrtc.org,🔰国外流量
+DOMAIN-SUFFIX,whatbrowser.org,🔰国外流量
+DOMAIN-SUFFIX,widevine.com,🔰国外流量
+DOMAIN-SUFFIX,x.company,🔰国外流量
+DOMAIN-SUFFIX,youtu.be,🔰国外流量
+DOMAIN-SUFFIX,yt.be,🔰国外流量
+DOMAIN-SUFFIX,ytimg.com,🔰国外流量
+DOMAIN-SUFFIX,1drv.com,🔰国外流量
+DOMAIN-SUFFIX,1drv.ms,🔰国外流量
+DOMAIN-SUFFIX,blob.core.windows.net,🔰国外流量
+DOMAIN-SUFFIX,livefilestore.com,🔰国外流量
+DOMAIN-SUFFIX,onedrive.com,🔰国外流量
+DOMAIN-SUFFIX,storage.live.com,🔰国外流量
+DOMAIN-SUFFIX,storage.msn.com,🔰国外流量
+DOMAIN,oneclient.sfx.ms,🔰国外流量
+DOMAIN-SUFFIX,0rz.tw,🔰国外流量
+DOMAIN-SUFFIX,4bluestones.biz,🔰国外流量
+DOMAIN-SUFFIX,9bis.net,🔰国外流量
+DOMAIN-SUFFIX,allconnected.co,🔰国外流量
+DOMAIN-SUFFIX,aol.com,🔰国外流量
+DOMAIN-SUFFIX,bcc.com.tw,🔰国外流量
+DOMAIN-SUFFIX,bit.ly,🔰国外流量
+DOMAIN-SUFFIX,bitshare.com,🔰国外流量
+DOMAIN-SUFFIX,blog.jp,🔰国外流量
+DOMAIN-SUFFIX,blogimg.jp,🔰国外流量
+DOMAIN-SUFFIX,blogtd.org,🔰国外流量
+DOMAIN-SUFFIX,broadcast.co.nz,🔰国外流量
+DOMAIN-SUFFIX,camfrog.com,🔰国外流量
+DOMAIN-SUFFIX,cfos.de,🔰国外流量
+DOMAIN-SUFFIX,citypopulation.de,🔰国外流量
+DOMAIN-SUFFIX,cloudfront.net,🔰国外流量
+DOMAIN-SUFFIX,ctitv.com.tw,🔰国外流量
+DOMAIN-SUFFIX,cuhk.edu.hk,🔰国外流量
+DOMAIN-SUFFIX,cusu.hk,🔰国外流量
+DOMAIN-SUFFIX,discord.gg,🔰国外流量
+DOMAIN-SUFFIX,discuss.com.hk,🔰国外流量
+DOMAIN-SUFFIX,dropboxapi.com,🔰国外流量
+DOMAIN-SUFFIX,duolingo.cn,🔰国外流量
+DOMAIN-SUFFIX,edditstatic.com,🔰国外流量
+DOMAIN-SUFFIX,flickriver.com,🔰国外流量
+DOMAIN-SUFFIX,focustaiwan.tw,🔰国外流量
+DOMAIN-SUFFIX,free.fr,🔰国外流量
+DOMAIN-SUFFIX,gigacircle.com,🔰国外流量
+DOMAIN-SUFFIX,hk-pub.com,🔰国外流量
+DOMAIN-SUFFIX,hosting.co.uk,🔰国外流量
+DOMAIN-SUFFIX,hwcdn.net,🔰国外流量
+DOMAIN-SUFFIX,ifixit.com,🔰国外流量
+DOMAIN-SUFFIX,iphone4hongkong.com,🔰国外流量
+DOMAIN-SUFFIX,iphonetaiwan.org,🔰国外流量
+DOMAIN-SUFFIX,iptvbin.com,🔰国外流量
+DOMAIN-SUFFIX,linksalpha.com,🔰国外流量
+DOMAIN-SUFFIX,manyvids.com,🔰国外流量
+DOMAIN-SUFFIX,myactimes.com,🔰国外流量
+DOMAIN-SUFFIX,newsblur.com,🔰国外流量
+DOMAIN-SUFFIX,now.im,🔰国外流量
+DOMAIN-SUFFIX,nowe.com,🔰国外流量
+DOMAIN-SUFFIX,redditlist.com,🔰国外流量
+DOMAIN-SUFFIX,s3.amazonaws.com,🔰国外流量
+DOMAIN-SUFFIX,signal.org,🔰国外流量
+DOMAIN-SUFFIX,smartmailcloud.com,🔰国外流量
+DOMAIN-SUFFIX,sparknotes.com,🔰国外流量
+DOMAIN-SUFFIX,streetvoice.com,🔰国外流量
+DOMAIN-SUFFIX,supertop.co,🔰国外流量
+DOMAIN-SUFFIX,tv.com,🔰国外流量
+DOMAIN-SUFFIX,typepad.com,🔰国外流量
+DOMAIN-SUFFIX,udnbkk.com,🔰国外流量
+DOMAIN-SUFFIX,urbanairship.com,🔰国外流量
+DOMAIN-SUFFIX,whispersystems.org,🔰国外流量
+DOMAIN-SUFFIX,wikia.com,🔰国外流量
+DOMAIN-SUFFIX,wn.com,🔰国外流量
+DOMAIN-SUFFIX,wolframalpha.com,🔰国外流量
+DOMAIN-SUFFIX,x-art.com,🔰国外流量
+DOMAIN-SUFFIX,yimg.com,🔰国外流量
+DOMAIN,api.steampowered.com,🔰国外流量
+DOMAIN,store.steampowered.com,🔰国外流量
+
+DOMAIN-SUFFIX,aaplimg.com,🍎苹果服务
+DOMAIN-SUFFIX,apple.co,🍎苹果服务
+DOMAIN-SUFFIX,apple.com,🍎苹果服务
+DOMAIN-SUFFIX,apple-cloudkit.com,🍎苹果服务
+DOMAIN-SUFFIX,appstore.com,🍎苹果服务
+DOMAIN-SUFFIX,cdn-apple.com,🍎苹果服务
+DOMAIN-SUFFIX,crashlytics.com,🍎苹果服务
+DOMAIN-SUFFIX,icloud.com,🍎苹果服务
+DOMAIN-SUFFIX,icloud-content.com,🍎苹果服务
+DOMAIN-SUFFIX,me.com,🍎苹果服务
+DOMAIN-SUFFIX,mzstatic.com,🍎苹果服务
+DOMAIN,www-cdn.icloud.com.akadns.net,🍎苹果服务
+
+DOMAIN-SUFFIX,t.me,✈️Telegram
+DOMAIN-SUFFIX,tdesktop.com,✈️Telegram
+DOMAIN-SUFFIX,telegra.ph,✈️Telegram
+DOMAIN-SUFFIX,telegram.me,✈️Telegram
+DOMAIN-SUFFIX,telegram.org,✈️Telegram
+IP-CIDR,91.108.4.0/22,✈️Telegram,no-resolve
+IP-CIDR,91.108.8.0/22,✈️Telegram,no-resolve
+IP-CIDR,91.108.12.0/22,✈️Telegram,no-resolve
+IP-CIDR,91.108.16.0/22,✈️Telegram,no-resolve
+IP-CIDR,91.108.56.0/22,✈️Telegram,no-resolve
+IP-CIDR,149.154.160.0/20,✈️Telegram,no-resolve
+IP-CIDR6,2001:b28:f23d::/48,✈️Telegram,no-resolve
+IP-CIDR6,2001:b28:f23f::/48,✈️Telegram,no-resolve
+IP-CIDR6,2001:67c:4e8::/48,✈️Telegram,no-resolve
+
+USER-AGENT,com.google.ios.youtube*,🎬Youtube
+USER-AGENT,YouTube*,🎬Youtube
+DOMAIN-SUFFIX,googlevideo.com,🎬Youtube
+DOMAIN-SUFFIX,youtube.com,🎬Youtube
+DOMAIN,youtubei.googleapis.com,🎬Youtube
+
+USER-AGENT,Argo*,🎬Netflix
+DOMAIN-SUFFIX,netflix.com,🎬Netflix
+DOMAIN-SUFFIX,netflix.net,🎬Netflix
+DOMAIN-SUFFIX,nflxext.com,🎬Netflix
+DOMAIN-SUFFIX,nflximg.com,🎬Netflix
+DOMAIN-SUFFIX,nflximg.net,🎬Netflix
+DOMAIN-SUFFIX,nflxso.net,🎬Netflix
+DOMAIN-SUFFIX,nflxvideo.net,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest0.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest1.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest2.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest3.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest4.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest5.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest6.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest7.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest8.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest9.com,🎬Netflix
+IP-CIDR,23.246.0.0/18,🎬Netflix,no-resolve
+IP-CIDR,37.77.184.0/21,🎬Netflix,no-resolve
+IP-CIDR,45.57.0.0/17,🎬Netflix,no-resolve
+IP-CIDR,64.120.128.0/17,🎬Netflix,no-resolve
+IP-CIDR,66.197.128.0/17,🎬Netflix,no-resolve
+IP-CIDR,108.175.32.0/20,🎬Netflix,no-resolve
+IP-CIDR,192.173.64.0/18,🎬Netflix,no-resolve
+IP-CIDR,198.38.96.0/19,🎬Netflix,no-resolve
+IP-CIDR,198.45.48.0/20,🎬Netflix,no-resolve
+
+USER-AGENT,Deezer*,🎬国外媒体
+DOMAIN-SUFFIX,deezer.com,🎬国外媒体
+DOMAIN-SUFFIX,dzcdn.net,🎬国外媒体
+DOMAIN-SUFFIX,kkbox.com,🎬国外媒体
+DOMAIN-SUFFIX,kkbox.com.tw,🎬国外媒体
+DOMAIN-SUFFIX,kfs.io,🎬国外媒体
+USER-AGENT,WeMusic*,🎬国外媒体
+USER-AGENT,JOOX*,🎬国外媒体
+DOMAIN-SUFFIX,joox.com,🎬国外媒体
+USER-AGENT,Pandora*,🎬国外媒体
+DOMAIN-SUFFIX,pandora.com,🎬国外媒体
+USER-AGENT,SoundCloud*,🎬国外媒体
+DOMAIN-SUFFIX,p-cdn.us,🎬国外媒体
+DOMAIN-SUFFIX,sndcdn.com,🎬国外媒体
+DOMAIN-SUFFIX,soundcloud.com,🎬国外媒体
+USER-AGENT,Spotify*,🎬国外媒体
+DOMAIN-SUFFIX,pscdn.co,🎬国外媒体
+DOMAIN-SUFFIX,scdn.co,🎬国外媒体
+DOMAIN-SUFFIX,spotify.com,🎬国外媒体
+DOMAIN-SUFFIX,spoti.fi,🎬国外媒体
+DOMAIN-KEYWORD,spotify.com,🎬国外媒体
+DOMAIN-KEYWORD,-spotify-com,🎬国外媒体
+USER-AGENT,TIDAL*,🎬国外媒体
+DOMAIN-SUFFIX,tidal.com,🎬国外媒体
+USER-AGENT,com.google.ios.youtubemusic*,🎬国外媒体
+USER-AGENT,YouTubeMusic*,🎬国外媒体
+USER-AGENT,All4*,🎬国外媒体
+DOMAIN-SUFFIX,c4assets.com,🎬国外媒体
+DOMAIN-SUFFIX,channel4.com,🎬国外媒体
+USER-AGENT,AbemaTV*,🎬国外媒体
+DOMAIN-SUFFIX,abema.io,🎬国外媒体
+DOMAIN-SUFFIX,ameba.jp,🎬国外媒体
+DOMAIN-SUFFIX,abema.tv,🎬国外媒体
+DOMAIN-SUFFIX,hayabusa.io,🎬国外媒体
+DOMAIN,abematv.akamaized.net,🎬国外媒体
+DOMAIN,ds-linear-abematv.akamaized.net,🎬国外媒体
+DOMAIN,ds-vod-abematv.akamaized.net,🎬国外媒体
+DOMAIN,linear-abematv.akamaized.net,🎬国外媒体
+USER-AGENT,InstantVideo.US*,🎬国外媒体
+USER-AGENT,Prime%20Video*,🎬国外媒体
+DOMAIN-SUFFIX,aiv-cdn.net,🎬国外媒体
+DOMAIN-SUFFIX,aiv-delivery.net,🎬国外媒体
+DOMAIN-SUFFIX,amazonvideo.com,🎬国外媒体
+DOMAIN-SUFFIX,primevideo.com,🎬国外媒体
+DOMAIN,avodmp4s3ww-a.akamaihd.net,🎬国外媒体
+DOMAIN,d25xi40x97liuc.cloudfront.net,🎬国外媒体
+DOMAIN,dmqdd6hw24ucf.cloudfront.net,🎬国外媒体
+DOMAIN,d22qjgkvxw22r6.cloudfront.net,🎬国外媒体
+DOMAIN,d1v5ir2lpwr8os.cloudfront.net,🎬国外媒体
+DOMAIN-KEYWORD,avoddashs,🎬国外媒体
+USER-AGENT,Anime*,🎬国外媒体
+DOMAIN-SUFFIX,bahamut.com.tw,🎬国外媒体
+DOMAIN-SUFFIX,gamer.com.tw,🎬国外媒体
+DOMAIN,gamer-cds.cdn.hinet.net,🎬国外媒体
+DOMAIN,gamer2-cds.cdn.hinet.net,🎬国外媒体
+USER-AGENT,BBCiPlayer*,🎬国外媒体
+DOMAIN-SUFFIX,bbc.co.uk,🎬国外媒体
+DOMAIN-SUFFIX,bbci.co.uk,🎬国外媒体
+DOMAIN-KEYWORD,bbcfmt,🎬国外媒体
+DOMAIN-KEYWORD,uk-live,🎬国外媒体
+USER-AGENT,DAZN*,🎬国外媒体
+DOMAIN-SUFFIX,dazn.com,🎬国外媒体
+DOMAIN-SUFFIX,dazn-api.com,🎬国外媒体
+DOMAIN,d151l6v8er5bdm.cloudfront.net,🎬国外媒体
+DOMAIN-KEYWORD,voddazn,🎬国外媒体
+USER-AGENT,Disney+*,🎬国外媒体
+DOMAIN-SUFFIX,bamgrid.com,🎬国外媒体
+DOMAIN-SUFFIX,disney-plus.net,🎬国外媒体
+DOMAIN-SUFFIX,disneyplus.com,🎬国外媒体
+DOMAIN-SUFFIX,dssott.com,🎬国外媒体
+DOMAIN,cdn.registerdisney.go.com,🎬国外媒体
+USER-AGENT,encoreTVB*,🎬国外媒体
+DOMAIN-SUFFIX,encoretvb.com,🎬国外媒体
+DOMAIN,edge.api.brightcove.com,🎬国外媒体
+DOMAIN,bcbolt446c5271-a.akamaihd.net,🎬国外媒体
+USER-AGENT,FOX%20NOW*,🎬国外媒体
+DOMAIN-SUFFIX,fox.com,🎬国外媒体
+DOMAIN-SUFFIX,foxdcg.com,🎬国外媒体
+DOMAIN-SUFFIX,theplatform.com,🎬国外媒体
+DOMAIN-SUFFIX,uplynk.com,🎬国外媒体
+USER-AGENT,HBO%20NOW*,🎬国外媒体
+DOMAIN-SUFFIX,hbo.com,🎬国外媒体
+DOMAIN-SUFFIX,hbogo.com,🎬国外媒体
+DOMAIN-SUFFIX,hbonow.com,🎬国外媒体
+USER-AGENT,HBO%20GO%20PROD%20HKG*,🎬国外媒体
+DOMAIN-SUFFIX,hbogoasia.com,🎬国外媒体
+DOMAIN-SUFFIX,hbogoasia.hk,🎬国外媒体
+DOMAIN,bcbolthboa-a.akamaihd.net,🎬国外媒体
+DOMAIN,players.brightcove.net,🎬国外媒体
+DOMAIN,s3-ap-southeast-1.amazonaws.com,🎬国外媒体
+DOMAIN,dai3fd1oh325y.cloudfront.net,🎬国外媒体
+DOMAIN,44wilhpljf.execute-api.ap-southeast-1.amazonaws.com,🎬国外媒体
+DOMAIN,hboasia1-i.akamaihd.net,🎬国外媒体
+DOMAIN,hboasia2-i.akamaihd.net,🎬国外媒体
+DOMAIN,hboasia3-i.akamaihd.net,🎬国外媒体
+DOMAIN,hboasia4-i.akamaihd.net,🎬国外媒体
+DOMAIN,hboasia5-i.akamaihd.net,🎬国外媒体
+DOMAIN,cf-images.ap-southeast-1.prod.boltdns.net,🎬国外媒体
+USER-AGENT,HWTVMobile*,🎬国外媒体
+DOMAIN-SUFFIX,5itv.tv,🎬国外媒体
+DOMAIN-SUFFIX,ocnttv.com,🎬国外媒体
+DOMAIN-SUFFIX,hulu.com,🎬国外媒体
+DOMAIN-SUFFIX,huluim.com,🎬国外媒体
+DOMAIN-SUFFIX,hulustream.com,🎬国外媒体
+DOMAIN-SUFFIX,happyon.jp,🎬国外媒体
+DOMAIN-SUFFIX,hulu.jp,🎬国外媒体
+USER-AGENT,ITV_Player*,🎬国外媒体
+DOMAIN-SUFFIX,itv.com,🎬国外媒体
+DOMAIN-SUFFIX,itvstatic.com,🎬国外媒体
+DOMAIN,itvpnpmobile-a.akamaihd.net,🎬国外媒体
+USER-AGENT,KKTV*,🎬国外媒体
+USER-AGENT,com.kktv.ios.kktv*,🎬国外媒体
+DOMAIN-SUFFIX,kktv.com.tw,🎬国外媒体
+DOMAIN-SUFFIX,kktv.me,🎬国外媒体
+DOMAIN,kktv-theater.kk.stream,🎬国外媒体
+USER-AGENT,LINE%20TV*,🎬国外媒体
+DOMAIN-SUFFIX,linetv.tw,🎬国外媒体
+DOMAIN,d3c7rimkq79yfu.cloudfront.net,🎬国外媒体
+DOMAIN-SUFFIX,litv.tv,🎬国外媒体
+DOMAIN,litvfreemobile-hichannel.cdn.hinet.net,🎬国外媒体
+USER-AGENT,My5*,🎬国外媒体
+DOMAIN-SUFFIX,channel5.com,🎬国外媒体
+DOMAIN-SUFFIX,my5.tv,🎬国外媒体
+DOMAIN,d349g9zuie06uo.cloudfront.net,🎬国外媒体
+USER-AGENT,mytv*,🎬国外媒体
+DOMAIN-SUFFIX,mytvsuper.com,🎬国外媒体
+DOMAIN-SUFFIX,tvb.com,🎬国外媒体
+USER-AGENT,Argo*,🎬国外媒体
+DOMAIN-SUFFIX,netflix.com,🎬国外媒体
+DOMAIN-SUFFIX,netflix.net,🎬国外媒体
+DOMAIN-SUFFIX,nflxext.com,🎬国外媒体
+DOMAIN-SUFFIX,nflximg.com,🎬国外媒体
+DOMAIN-SUFFIX,nflximg.net,🎬国外媒体
+DOMAIN-SUFFIX,nflxso.net,🎬国外媒体
+DOMAIN-SUFFIX,nflxvideo.net,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest0.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest1.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest2.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest3.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest4.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest5.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest6.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest7.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest8.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest9.com,🎬国外媒体
+IP-CIDR,23.246.0.0/18,🎬国外媒体,no-resolve
+IP-CIDR,37.77.184.0/21,🎬国外媒体,no-resolve
+IP-CIDR,45.57.0.0/17,🎬国外媒体,no-resolve
+IP-CIDR,64.120.128.0/17,🎬国外媒体,no-resolve
+IP-CIDR,66.197.128.0/17,🎬国外媒体,no-resolve
+IP-CIDR,108.175.32.0/20,🎬国外媒体,no-resolve
+IP-CIDR,192.173.64.0/18,🎬国外媒体,no-resolve
+IP-CIDR,198.38.96.0/19,🎬国外媒体,no-resolve
+IP-CIDR,198.45.48.0/20,🎬国外媒体,no-resolve
+USER-AGENT,Niconico*,🎬国外媒体
+DOMAIN-SUFFIX,dmc.nico,🎬国外媒体
+DOMAIN-SUFFIX,nicovideo.jp,🎬国外媒体
+DOMAIN-SUFFIX,nimg.jp,🎬国外媒体
+DOMAIN-SUFFIX,socdm.com,🎬国外媒体
+USER-AGENT,PBS*,🎬国外媒体
+DOMAIN-SUFFIX,pbs.org,🎬国外媒体
+DOMAIN-SUFFIX,phncdn.com,🎬国外媒体
+DOMAIN-SUFFIX,pornhub.com,🎬国外媒体
+DOMAIN-SUFFIX,pornhubpremium.com,🎬国外媒体
+USER-AGENT,TaiwanGood*,🎬国外媒体
+DOMAIN-SUFFIX,skyking.com.tw,🎬国外媒体
+DOMAIN,hamifans.emome.net,🎬国外媒体
+DOMAIN-SUFFIX,twitch.tv,🎬国外媒体
+DOMAIN-SUFFIX,twitchcdn.net,🎬国外媒体
+DOMAIN-SUFFIX,ttvnw.net,🎬国外媒体
+DOMAIN-SUFFIX,jtvnw.net,🎬国外媒体
+USER-AGENT,Viu*,🎬国外媒体
+USER-AGENT,ViuTV*,🎬国外媒体
+DOMAIN-SUFFIX,viu.com,🎬国外媒体
+DOMAIN-SUFFIX,viu.tv,🎬国外媒体
+DOMAIN,api.viu.now.com,🎬国外媒体
+DOMAIN,d1k2us671qcoau.cloudfront.net,🎬国外媒体
+DOMAIN,d2anahhhmp1ffz.cloudfront.net,🎬国外媒体
+DOMAIN,dfp6rglgjqszk.cloudfront.net,🎬国外媒体
+USER-AGENT,com.google.ios.youtube*,🎬国外媒体
+USER-AGENT,YouTube*,🎬国外媒体
+DOMAIN-SUFFIX,googlevideo.com,🎬国外媒体
+DOMAIN-SUFFIX,youtube.com,🎬国外媒体
+DOMAIN,youtubei.googleapis.com,🎬国外媒体
+
+DOMAIN-SUFFIX,local,DIRECT
+IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
+IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
+IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
+IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
+IP-CIDR,100.64.0.0/10,DIRECT,no-resolve
+IP-CIDR6,::1/128,DIRECT,no-resolve
+IP-CIDR6,fc00::/7,DIRECT,no-resolve
+IP-CIDR6,fe80::/10,DIRECT,no-resolve
+IP-CIDR6,fd00::/8,DIRECT,no-resolve
+USER-AGENT,coffeecorp*,DIRECT
+USER-AGENT,restaurant-mobile*,DIRECT
+DOMAIN,app.adjust.com,DIRECT
+DOMAIN-SUFFIX,googletraveladservices.com,DIRECT
+DOMAIN,dl.google.com,DIRECT
+DOMAIN,mtalk.google.com,DIRECT
+DOMAIN,livew.l.qq.com,DIRECT
+DOMAIN,vd.l.qq.com,DIRECT
+DOMAIN,analytics.strava.com,DIRECT
+DOMAIN,msg.umeng.com,DIRECT
+DOMAIN,msg.umengcloud.com,DIRECT
+DOMAIN-SUFFIX,qhres.com,DIRECT
+DOMAIN-SUFFIX,qhimg.com,DIRECT
+DOMAIN-SUFFIX,akadns.net,DIRECT
+USER-AGENT,%E4%BC%98%E9%85%B7*,DIRECT
+DOMAIN-SUFFIX,alibaba.com,DIRECT
+DOMAIN-SUFFIX,alicdn.com,DIRECT
+DOMAIN-SUFFIX,alikunlun.com,DIRECT
+DOMAIN-SUFFIX,alipay.com,DIRECT
+DOMAIN-SUFFIX,amap.com,DIRECT
+DOMAIN-SUFFIX,autonavi.com,DIRECT
+DOMAIN-SUFFIX,dingtalk.com,DIRECT
+DOMAIN-SUFFIX,mxhichina.com,DIRECT
+DOMAIN-SUFFIX,soku.com,DIRECT
+DOMAIN-SUFFIX,taobao.com,DIRECT
+DOMAIN-SUFFIX,tmall.com,DIRECT
+DOMAIN-SUFFIX,tmall.hk,DIRECT
+DOMAIN-SUFFIX,ykimg.com,DIRECT
+DOMAIN-SUFFIX,youku.com,DIRECT
+DOMAIN-SUFFIX,xiami.com,DIRECT
+DOMAIN-SUFFIX,xiami.net,DIRECT
+DOMAIN-SUFFIX,aaplimg.com,DIRECT
+DOMAIN-SUFFIX,apple.co,DIRECT
+DOMAIN-SUFFIX,apple.com,DIRECT
+DOMAIN-SUFFIX,apple-cloudkit.com,DIRECT
+DOMAIN-SUFFIX,appstore.com,DIRECT
+DOMAIN-SUFFIX,cdn-apple.com,DIRECT
+DOMAIN-SUFFIX,crashlytics.com,DIRECT
+DOMAIN-SUFFIX,icloud.com,DIRECT
+DOMAIN-SUFFIX,icloud-content.com,DIRECT
+DOMAIN-SUFFIX,me.com,DIRECT
+DOMAIN-SUFFIX,mzstatic.com,DIRECT
+DOMAIN,www-cdn.icloud.com.akadns.net,DIRECT
+DOMAIN-SUFFIX,baidu.com,DIRECT
+DOMAIN-SUFFIX,baidubcr.com,DIRECT
+DOMAIN-SUFFIX,bdstatic.com,DIRECT
+DOMAIN-SUFFIX,yunjiasu-cdn.net,DIRECT
+DOMAIN-SUFFIX,acgvideo.com,DIRECT
+DOMAIN-SUFFIX,biliapi.com,DIRECT
+DOMAIN-SUFFIX,biliapi.net,DIRECT
+DOMAIN-SUFFIX,bilibili.com,DIRECT
+DOMAIN-SUFFIX,bilibili.tv,DIRECT
+DOMAIN-SUFFIX,hdslb.com,DIRECT
+DOMAIN-SUFFIX,blizzard.com,DIRECT
+DOMAIN-SUFFIX,battle.net,DIRECT
+DOMAIN,blzddist1-a.akamaihd.net,DIRECT
+DOMAIN-SUFFIX,feiliao.com,DIRECT
+DOMAIN-SUFFIX,pstatp.com,DIRECT
+DOMAIN-SUFFIX,snssdk.com,DIRECT
+DOMAIN-SUFFIX,iesdouyin.com,DIRECT
+DOMAIN-SUFFIX,toutiao.com,DIRECT
+DOMAIN-SUFFIX,cctv.com,DIRECT
+DOMAIN-SUFFIX,cctvpic.com,DIRECT
+DOMAIN-SUFFIX,livechina.com,DIRECT
+DOMAIN-SUFFIX,didialift.com,DIRECT
+DOMAIN-SUFFIX,didiglobal.com,DIRECT
+DOMAIN-SUFFIX,udache.com,DIRECT
+DOMAIN-SUFFIX,343480.com,DIRECT
+DOMAIN-SUFFIX,baduziyuan.com,DIRECT
+DOMAIN-SUFFIX,com-hs-hkdy.com,DIRECT
+DOMAIN-SUFFIX,czybjz.com,DIRECT
+DOMAIN-SUFFIX,dandanzan.com,DIRECT
+DOMAIN-SUFFIX,fjhps.com,DIRECT
+DOMAIN-SUFFIX,kuyunbo.club,DIRECT
+DOMAIN-SUFFIX,21cn.com,DIRECT
+DOMAIN-SUFFIX,hitv.com,DIRECT
+DOMAIN-SUFFIX,mgtv.com,DIRECT
+DOMAIN-SUFFIX,iqiyi.com,DIRECT
+DOMAIN-SUFFIX,iqiyipic.com,DIRECT
+DOMAIN-SUFFIX,71.am.com,DIRECT
+DOMAIN-SUFFIX,jd.com,DIRECT
+DOMAIN-SUFFIX,jd.hk,DIRECT
+DOMAIN-SUFFIX,jdpay.com,DIRECT
+DOMAIN-SUFFIX,360buyimg.com,DIRECT
+DOMAIN-SUFFIX,iciba.com,DIRECT
+DOMAIN-SUFFIX,ksosoft.com,DIRECT
+DOMAIN-SUFFIX,meitu.com,DIRECT
+DOMAIN-SUFFIX,meitudata.com,DIRECT
+DOMAIN-SUFFIX,meitustat.com,DIRECT
+DOMAIN-SUFFIX,meipai.com,DIRECT
+DOMAIN-SUFFIX,duokan.com,DIRECT
+DOMAIN-SUFFIX,mi-img.com,DIRECT
+DOMAIN-SUFFIX,miui.com,DIRECT
+DOMAIN-SUFFIX,miwifi.com,DIRECT
+DOMAIN-SUFFIX,xiaomi.com,DIRECT
+DOMAIN-SUFFIX,microsoft.com,DIRECT
+DOMAIN-SUFFIX,msecnd.net,DIRECT
+DOMAIN-SUFFIX,office365.com,DIRECT
+DOMAIN-SUFFIX,outlook.com,DIRECT
+DOMAIN-SUFFIX,s-microsoft.com,DIRECT
+DOMAIN-SUFFIX,visualstudio.com,DIRECT
+DOMAIN-SUFFIX,windows.com,DIRECT
+DOMAIN-SUFFIX,windowsupdate.com,DIRECT
+DOMAIN,officecdn-microsoft-com.akamaized.net,DIRECT
+USER-AGENT,NeteaseMusic*,DIRECT
+USER-AGENT,%E7%BD%91%E6%98%93%E4%BA%91%E9%9F%B3%E4%B9%90*,DIRECT
+DOMAIN-SUFFIX,163.com,DIRECT
+DOMAIN-SUFFIX,126.net,DIRECT
+DOMAIN-SUFFIX,127.net,DIRECT
+DOMAIN-SUFFIX,163yun.com,DIRECT
+DOMAIN-SUFFIX,lofter.com,DIRECT
+DOMAIN-SUFFIX,netease.com,DIRECT
+DOMAIN-SUFFIX,ydstatic.com,DIRECT
+DOMAIN-SUFFIX,sina.com,DIRECT
+DOMAIN-SUFFIX,weibo.com,DIRECT
+DOMAIN-SUFFIX,weibocdn.com,DIRECT
+DOMAIN-SUFFIX,sohu.com,DIRECT
+DOMAIN-SUFFIX,sohucs.com,DIRECT
+DOMAIN-SUFFIX,sohu-inc.com,DIRECT
+DOMAIN-SUFFIX,v-56.com,DIRECT
+DOMAIN-SUFFIX,sogo.com,DIRECT
+DOMAIN-SUFFIX,sogou.com,DIRECT
+DOMAIN-SUFFIX,sogoucdn.com,DIRECT
+DOMAIN-SUFFIX,steampowered.com,DIRECT
+DOMAIN-SUFFIX,steam-chat.com,DIRECT
+DOMAIN-SUFFIX,steamgames.com,DIRECT
+DOMAIN-SUFFIX,steamusercontent.com,DIRECT
+DOMAIN-SUFFIX,steamcontent.com,DIRECT
+DOMAIN-SUFFIX,steamstatic.com,DIRECT
+DOMAIN-SUFFIX,steamcdn-a.akamaihd.net,DIRECT
+DOMAIN-SUFFIX,steamstat.us,DIRECT
+USER-AGENT,MicroMessenger%20Client,DIRECT
+USER-AGENT,WeChat*,DIRECT
+DOMAIN-SUFFIX,gtimg.com,DIRECT
+DOMAIN-SUFFIX,idqqimg.com,DIRECT
+DOMAIN-SUFFIX,igamecj.com,DIRECT
+DOMAIN-SUFFIX,myapp.com,DIRECT
+DOMAIN-SUFFIX,myqcloud.com,DIRECT
+DOMAIN-SUFFIX,qq.com,DIRECT
+DOMAIN-SUFFIX,tencent.com,DIRECT
+DOMAIN-SUFFIX,tencent-cloud.net,DIRECT
+USER-AGENT,YYeTs*,DIRECT
+DOMAIN-SUFFIX,jstucdn.com,DIRECT
+DOMAIN-SUFFIX,zimuzu.io,DIRECT
+DOMAIN-SUFFIX,zimuzu.tv,DIRECT
+DOMAIN-SUFFIX,zmz2019.com,DIRECT
+DOMAIN-SUFFIX,zmzapi.com,DIRECT
+DOMAIN-SUFFIX,zmzapi.net,DIRECT
+DOMAIN-SUFFIX,zmzfile.com,DIRECT
+DOMAIN-SUFFIX,ccgslb.com,DIRECT
+DOMAIN-SUFFIX,ccgslb.net,DIRECT
+DOMAIN-SUFFIX,chinanetcenter.com,DIRECT
+DOMAIN-SUFFIX,meixincdn.com,DIRECT
+DOMAIN-SUFFIX,ourdvs.com,DIRECT
+DOMAIN-SUFFIX,staticdn.net,DIRECT
+DOMAIN-SUFFIX,wangsu.com,DIRECT
+DOMAIN-SUFFIX,ipip.net,DIRECT
+DOMAIN-SUFFIX,ip.la,DIRECT
+DOMAIN-SUFFIX,ip-cdn.com,DIRECT
+DOMAIN-SUFFIX,ipv6-test.com,DIRECT
+DOMAIN-SUFFIX,test-ipv6.com,DIRECT
+DOMAIN-SUFFIX,whatismyip.com,DIRECT
+DOMAIN-SUFFIX,netspeedtestmaster.com,DIRECT
+DOMAIN,speedtest.macpaw.com,DIRECT
+DOMAIN-SUFFIX,awesome-hd.me,DIRECT
+DOMAIN-SUFFIX,broadcasthe.net,DIRECT
+DOMAIN-SUFFIX,chdbits.co,DIRECT
+DOMAIN-SUFFIX,classix-unlimited.co.uk,DIRECT
+DOMAIN-SUFFIX,empornium.me,DIRECT
+DOMAIN-SUFFIX,gazellegames.net,DIRECT
+DOMAIN-SUFFIX,hdchina.org,DIRECT
+DOMAIN-SUFFIX,hdsky.me,DIRECT
+DOMAIN-SUFFIX,icetorrent.org,DIRECT
+DOMAIN-SUFFIX,jpopsuki.eu,DIRECT
+DOMAIN-SUFFIX,keepfrds.com,DIRECT
+DOMAIN-SUFFIX,madsrevolution.net,DIRECT
+DOMAIN-SUFFIX,m-team.cc,DIRECT
+DOMAIN-SUFFIX,nanyangpt.com,DIRECT
+DOMAIN-SUFFIX,ncore.cc,DIRECT
+DOMAIN-SUFFIX,open.cd,DIRECT
+DOMAIN-SUFFIX,ourbits.club,DIRECT
+DOMAIN-SUFFIX,passthepopcorn.me,DIRECT
+DOMAIN-SUFFIX,privatehd.to,DIRECT
+DOMAIN-SUFFIX,redacted.ch,DIRECT
+DOMAIN-SUFFIX,springsunday.net,DIRECT
+DOMAIN-SUFFIX,tjupt.org,DIRECT
+DOMAIN-SUFFIX,totheglory.im,DIRECT
+DOMAIN-SUFFIX,acm.org,DIRECT
+DOMAIN-SUFFIX,acs.org,DIRECT
+DOMAIN-SUFFIX,aip.org,DIRECT
+DOMAIN-SUFFIX,ams.org,DIRECT
+DOMAIN-SUFFIX,annualreviews.org,DIRECT
+DOMAIN-SUFFIX,aps.org,DIRECT
+DOMAIN-SUFFIX,ascelibrary.org,DIRECT
+DOMAIN-SUFFIX,asm.org,DIRECT
+DOMAIN-SUFFIX,asme.org,DIRECT
+DOMAIN-SUFFIX,astm.org,DIRECT
+DOMAIN-SUFFIX,bmj.com,DIRECT
+DOMAIN-SUFFIX,cambridge.org,DIRECT
+DOMAIN-SUFFIX,cas.org,DIRECT
+DOMAIN-SUFFIX,clarivate.com,DIRECT
+DOMAIN-SUFFIX,ebscohost.com,DIRECT
+DOMAIN-SUFFIX,emerald.com,DIRECT
+DOMAIN-SUFFIX,engineeringvillage.com,DIRECT
+DOMAIN-SUFFIX,icevirtuallibrary.com,DIRECT
+DOMAIN-SUFFIX,ieee.org,DIRECT
+DOMAIN-SUFFIX,imf.org,DIRECT
+DOMAIN-SUFFIX,iop.org,DIRECT
+DOMAIN-SUFFIX,jamanetwork.com,DIRECT
+DOMAIN-SUFFIX,jhu.edu,DIRECT
+DOMAIN-SUFFIX,jstor.org,DIRECT
+DOMAIN-SUFFIX,karger.com,DIRECT
+DOMAIN-SUFFIX,libguides.com,DIRECT
+DOMAIN-SUFFIX,madsrevolution.net,DIRECT
+DOMAIN-SUFFIX,mpg.de,DIRECT
+DOMAIN-SUFFIX,myilibrary.com,DIRECT
+DOMAIN-SUFFIX,nature.com,DIRECT
+DOMAIN-SUFFIX,oecd-ilibrary.org,DIRECT
+DOMAIN-SUFFIX,osapublishing.org,DIRECT
+DOMAIN-SUFFIX,oup.com,DIRECT
+DOMAIN-SUFFIX,ovid.com,DIRECT
+DOMAIN-SUFFIX,oxfordartonline.com,DIRECT
+DOMAIN-SUFFIX,oxfordbibliographies.com,DIRECT
+DOMAIN-SUFFIX,oxfordmusiconline.com,DIRECT
+DOMAIN-SUFFIX,pnas.org,DIRECT
+DOMAIN-SUFFIX,proquest.com,DIRECT
+DOMAIN-SUFFIX,rsc.org,DIRECT
+DOMAIN-SUFFIX,sagepub.com,DIRECT
+DOMAIN-SUFFIX,sciencedirect.com,DIRECT
+DOMAIN-SUFFIX,sciencemag.org,DIRECT
+DOMAIN-SUFFIX,scopus.com,DIRECT
+DOMAIN-SUFFIX,siam.org,DIRECT
+DOMAIN-SUFFIX,spiedigitallibrary.org,DIRECT
+DOMAIN-SUFFIX,springer.com,DIRECT
+DOMAIN-SUFFIX,springerlink.com,DIRECT
+DOMAIN-SUFFIX,tandfonline.com,DIRECT
+DOMAIN-SUFFIX,un.org,DIRECT
+DOMAIN-SUFFIX,uni-bielefeld.de,DIRECT
+DOMAIN-SUFFIX,webofknowledge.com,DIRECT
+DOMAIN-SUFFIX,westlaw.com,DIRECT
+DOMAIN-SUFFIX,wiley.com,DIRECT
+DOMAIN-SUFFIX,worldbank.org,DIRECT
+DOMAIN-SUFFIX,worldscientific.com,DIRECT
+DOMAIN-SUFFIX,cn,DIRECT
+DOMAIN-SUFFIX,360in.com,DIRECT
+DOMAIN-SUFFIX,51ym.me,DIRECT
+DOMAIN-SUFFIX,8686c.com,DIRECT
+DOMAIN-SUFFIX,abchina.com,DIRECT
+DOMAIN-SUFFIX,accuweather.com,DIRECT
+DOMAIN-SUFFIX,aicoinstorge.com,DIRECT
+DOMAIN-SUFFIX,air-matters.com,DIRECT
+DOMAIN-SUFFIX,air-matters.io,DIRECT
+DOMAIN-SUFFIX,aixifan.com,DIRECT
+DOMAIN-SUFFIX,amd.com,DIRECT
+DOMAIN-SUFFIX,b612.net,DIRECT
+DOMAIN-SUFFIX,bdatu.com,DIRECT
+DOMAIN-SUFFIX,beitaichufang.com,DIRECT
+DOMAIN-SUFFIX,bjango.com,DIRECT
+DOMAIN-SUFFIX,booking.com,DIRECT
+DOMAIN-SUFFIX,bstatic.com,DIRECT
+DOMAIN-SUFFIX,cailianpress.com,DIRECT
+DOMAIN-SUFFIX,camera360.com,DIRECT
+DOMAIN-SUFFIX,chinaso.com,DIRECT
+DOMAIN-SUFFIX,chua.pro,DIRECT
+DOMAIN-SUFFIX,chuimg.com,DIRECT
+DOMAIN-SUFFIX,chunyu.mobi,DIRECT
+DOMAIN-SUFFIX,chushou.tv,DIRECT
+DOMAIN-SUFFIX,cmbchina.com,DIRECT
+DOMAIN-SUFFIX,cmbimg.com,DIRECT
+DOMAIN-SUFFIX,ctrip.com,DIRECT
+DOMAIN-SUFFIX,dfcfw.com,DIRECT
+DOMAIN-SUFFIX,docschina.org,DIRECT
+DOMAIN-SUFFIX,douban.com,DIRECT
+DOMAIN-SUFFIX,doubanio.com,DIRECT
+DOMAIN-SUFFIX,douyu.com,DIRECT
+DOMAIN-SUFFIX,dxycdn.com,DIRECT
+DOMAIN-SUFFIX,dytt8.net,DIRECT
+DOMAIN-SUFFIX,eastmoney.com,DIRECT
+DOMAIN-SUFFIX,eudic.net,DIRECT
+DOMAIN-SUFFIX,feng.com,DIRECT
+DOMAIN-SUFFIX,fengkongcloud.com,DIRECT
+DOMAIN-SUFFIX,frdic.com,DIRECT
+DOMAIN-SUFFIX,futu5.com,DIRECT
+DOMAIN-SUFFIX,futunn.com,DIRECT
+DOMAIN-SUFFIX,gandi.net,DIRECT
+DOMAIN-SUFFIX,geilicdn.com,DIRECT
+DOMAIN-SUFFIX,getpricetag.com,DIRECT
+DOMAIN-SUFFIX,gifshow.com,DIRECT
+DOMAIN-SUFFIX,godic.net,DIRECT
+DOMAIN-SUFFIX,hicloud.com,DIRECT
+DOMAIN-SUFFIX,hongxiu.com,DIRECT
+DOMAIN-SUFFIX,hostbuf.com,DIRECT
+DOMAIN-SUFFIX,huxiucdn.com,DIRECT
+DOMAIN-SUFFIX,huya.com,DIRECT
+DOMAIN-SUFFIX,infinitynewtab.com,DIRECT
+DOMAIN-SUFFIX,ithome.com,DIRECT
+DOMAIN-SUFFIX,java.com,DIRECT
+DOMAIN-SUFFIX,jidian.im,DIRECT
+DOMAIN-SUFFIX,kaiyanapp.com,DIRECT
+DOMAIN-SUFFIX,kaspersky-labs.com,DIRECT
+DOMAIN-SUFFIX,keepcdn.com,DIRECT
+DOMAIN-SUFFIX,kkmh.com,DIRECT
+DOMAIN-SUFFIX,licdn.com,DIRECT
+DOMAIN-SUFFIX,linkedin.com,DIRECT
+DOMAIN-SUFFIX,loli.net,DIRECT
+DOMAIN-SUFFIX,luojilab.com,DIRECT
+DOMAIN-SUFFIX,maoyan.com,DIRECT
+DOMAIN-SUFFIX,maoyun.tv,DIRECT
+DOMAIN-SUFFIX,meituan.com,DIRECT
+DOMAIN-SUFFIX,meituan.net,DIRECT
+DOMAIN-SUFFIX,mobike.com,DIRECT
+DOMAIN-SUFFIX,moke.com,DIRECT
+DOMAIN-SUFFIX,mubu.com,DIRECT
+DOMAIN-SUFFIX,myzaker.com,DIRECT
+DOMAIN-SUFFIX,nim-lang-cn.org,DIRECT
+DOMAIN-SUFFIX,nvidia.com,DIRECT
+DOMAIN-SUFFIX,oracle.com,DIRECT
+DOMAIN-SUFFIX,paypal.com,DIRECT
+DOMAIN-SUFFIX,paypalobjects.com,DIRECT
+DOMAIN-SUFFIX,qdaily.com,DIRECT
+DOMAIN-SUFFIX,qidian.com,DIRECT
+DOMAIN-SUFFIX,qyer.com,DIRECT
+DOMAIN-SUFFIX,qyerstatic.com,DIRECT
+DOMAIN-SUFFIX,raychase.net,DIRECT
+DOMAIN-SUFFIX,ronghub.com,DIRECT
+DOMAIN-SUFFIX,ruguoapp.com,DIRECT
+DOMAIN-SUFFIX,s-reader.com,DIRECT
+DOMAIN-SUFFIX,sankuai.com,DIRECT
+DOMAIN-SUFFIX,scomper.me,DIRECT
+DOMAIN-SUFFIX,seafile.com,DIRECT
+DOMAIN-SUFFIX,sm.ms,DIRECT
+DOMAIN-SUFFIX,smzdm.com,DIRECT
+DOMAIN-SUFFIX,snapdrop.net,DIRECT
+DOMAIN-SUFFIX,snwx.com,DIRECT
+DOMAIN-SUFFIX,sspai.com,DIRECT
+DOMAIN-SUFFIX,takungpao.com,DIRECT
+DOMAIN-SUFFIX,teamviewer.com,DIRECT
+DOMAIN-SUFFIX,tianyancha.com,DIRECT
+DOMAIN-SUFFIX,udacity.com,DIRECT
+DOMAIN-SUFFIX,uning.com,DIRECT
+DOMAIN-SUFFIX,vmware.com,DIRECT
+DOMAIN-SUFFIX,weather.com,DIRECT
+DOMAIN-SUFFIX,weico.cc,DIRECT
+DOMAIN-SUFFIX,weidian.com,DIRECT
+DOMAIN-SUFFIX,xiachufang.com,DIRECT
+DOMAIN-SUFFIX,ximalaya.com,DIRECT
+DOMAIN-SUFFIX,xinhuanet.com,DIRECT
+DOMAIN-SUFFIX,xmcdn.com,DIRECT
+DOMAIN-SUFFIX,yangkeduo.com,DIRECT
+DOMAIN-SUFFIX,zhangzishi.cc,DIRECT
+DOMAIN-SUFFIX,zhihu.com,DIRECT
+DOMAIN-SUFFIX,zhimg.com,DIRECT
+DOMAIN-SUFFIX,zhuihd.com,DIRECT
+DOMAIN,download.jetbrains.com,DIRECT
+DOMAIN,images-cn.ssl-images-amazon.com,DIRECT
+IP-CIDR,119.28.28.28/32,DIRECT,no-resolve
+GEOIP,CN,DIRECT
+
+FINAL,⚓️其他流量
+
+[URL Rewrite]
+^https?://(www.)?(g|google).cn https://www.google.com 302

+ 1185 - 0
resources/conf/surge2/default.tpl

@@ -0,0 +1,1185 @@
+PROCESS-NAME,aria2c,DIRECT
+PROCESS-NAME,fdm,DIRECT
+PROCESS-NAME,Folx,DIRECT
+PROCESS-NAME,NetTransport,DIRECT
+PROCESS-NAME,Thunder,DIRECT
+PROCESS-NAME,Transmission,DIRECT
+PROCESS-NAME,uTorrent,DIRECT
+PROCESS-NAME,WebTorrent,DIRECT
+PROCESS-NAME,WebTorrent Helper,DIRECT
+DOMAIN-SUFFIX,smtp,DIRECT
+DOMAIN-KEYWORD,aria2,DIRECT
+URL-REGEX,(Subject|HELO|SMTP),DIRECT
+URL-REGEX,(api|ps|sv|offnavi|newvector|ulog.imap|newloc)(.map|).(baidu|n.shifen).com,DIRECT
+URL-REGEX,(.+.|^)(360|so|qihoo|360safe|qhimg|360totalsecurity|yunpan).(cn|com),DIRECT
+URL-REGEX,(.+.)?(torrent|announce.php?passkey=|tracker|BitTorrent|bt_key|ed2k|find_node|get_peers|info_hash|magnet:|peer_id=|xunlei)(..+)?,DIRECT
+URL-REGEX,(.?)(xunlei|sandai|Thunder|XLLiveUD)(.),DIRECT
+PROCESS-NAME,DownloadService,DIRECT
+URL-REGEX,(.+\.|^)(360|so)\.(cn|com),DIRECT
+PROCESS-NAME,Weiyun,DIRECT
+
+DOMAIN-SUFFIX,ampproject.org,🔰国外流量
+DOMAIN-SUFFIX,appspot.com,🔰国外流量
+DOMAIN-SUFFIX,blogger.com,🔰国外流量
+DOMAIN-SUFFIX,getoutline.org,🔰国外流量
+DOMAIN-SUFFIX,gvt0.com,🔰国外流量
+DOMAIN-SUFFIX,gvt1.com,🔰国外流量
+DOMAIN-SUFFIX,gvt3.com,🔰国外流量
+DOMAIN-SUFFIX,xn--ngstr-lra8j.com,🔰国外流量
+DOMAIN-KEYWORD,google,🔰国外流量
+DOMAIN-KEYWORD,blogspot,🔰国外流量
+DOMAIN-SUFFIX,onedrive.live.com,🔰国外流量
+DOMAIN-SUFFIX,xboxlive.com,🔰国外流量
+DOMAIN-SUFFIX,cdninstagram.com,🔰国外流量
+DOMAIN-SUFFIX,fb.com,🔰国外流量
+DOMAIN-SUFFIX,fb.me,🔰国外流量
+DOMAIN-SUFFIX,fbaddins.com,🔰国外流量
+DOMAIN-SUFFIX,fbcdn.net,🔰国外流量
+DOMAIN-SUFFIX,fbsbx.com,🔰国外流量
+DOMAIN-SUFFIX,fbworkmail.com,🔰国外流量
+DOMAIN-SUFFIX,instagram.com,🔰国外流量
+DOMAIN-SUFFIX,m.me,🔰国外流量
+DOMAIN-SUFFIX,messenger.com,🔰国外流量
+DOMAIN-SUFFIX,oculus.com,🔰国外流量
+DOMAIN-SUFFIX,oculuscdn.com,🔰国外流量
+DOMAIN-SUFFIX,rocksdb.org,🔰国外流量
+DOMAIN-SUFFIX,whatsapp.com,🔰国外流量
+DOMAIN-SUFFIX,whatsapp.net,🔰国外流量
+DOMAIN-KEYWORD,facebook,🔰国外流量
+IP-CIDR,3.123.36.126/32,🔰国外流量,no-resolve
+IP-CIDR,35.157.215.84/32,🔰国外流量,no-resolve
+IP-CIDR,35.157.217.255/32,🔰国外流量,no-resolve
+IP-CIDR,52.58.209.134/32,🔰国外流量,no-resolve
+IP-CIDR,54.93.124.31/32,🔰国外流量,no-resolve
+IP-CIDR,54.162.243.80/32,🔰国外流量,no-resolve
+IP-CIDR,54.173.34.141/32,🔰国外流量,no-resolve
+IP-CIDR,54.235.23.242/32,🔰国外流量,no-resolve
+IP-CIDR,169.45.248.118/32,🔰国外流量,no-resolve
+DOMAIN-SUFFIX,pscp.tv,🔰国外流量
+DOMAIN-SUFFIX,periscope.tv,🔰国外流量
+DOMAIN-SUFFIX,t.co,🔰国外流量
+DOMAIN-SUFFIX,twimg.co,🔰国外流量
+DOMAIN-SUFFIX,twimg.com,🔰国外流量
+DOMAIN-SUFFIX,twitpic.com,🔰国外流量
+DOMAIN-SUFFIX,vine.co,🔰国外流量
+DOMAIN-KEYWORD,twitter,🔰国外流量
+DOMAIN-SUFFIX,t.me,🔰国外流量
+DOMAIN-SUFFIX,tdesktop.com,🔰国外流量
+DOMAIN-SUFFIX,telegra.ph,🔰国外流量
+DOMAIN-SUFFIX,telegram.me,🔰国外流量
+DOMAIN-SUFFIX,telegram.org,🔰国外流量
+IP-CIDR,91.108.4.0/22,🔰国外流量,no-resolve
+IP-CIDR,91.108.8.0/22,🔰国外流量,no-resolve
+IP-CIDR,91.108.12.0/22,🔰国外流量,no-resolve
+IP-CIDR,91.108.16.0/22,🔰国外流量,no-resolve
+IP-CIDR,91.108.56.0/22,🔰国外流量,no-resolve
+IP-CIDR,149.154.160.0/20,🔰国外流量,no-resolve
+IP-CIDR6,2001:b28:f23d::/48,🔰国外流量,no-resolve
+IP-CIDR6,2001:b28:f23f::/48,🔰国外流量,no-resolve
+IP-CIDR6,2001:67c:4e8::/48,🔰国外流量,no-resolve
+DOMAIN-SUFFIX,line.me,🔰国外流量
+DOMAIN-SUFFIX,line-apps.com,🔰国外流量
+DOMAIN-SUFFIX,line-scdn.net,🔰国外流量
+DOMAIN-SUFFIX,naver.jp,🔰国外流量
+IP-CIDR,103.2.30.0/23,🔰国外流量,no-resolve
+IP-CIDR,125.209.208.0/20,🔰国外流量,no-resolve
+IP-CIDR,147.92.128.0/17,🔰国外流量,no-resolve
+IP-CIDR,203.104.144.0/21,🔰国外流量,no-resolve
+DOMAIN-SUFFIX,4shared.com,🔰国外流量
+DOMAIN-SUFFIX,520cc.cc,🔰国外流量
+DOMAIN-SUFFIX,881903.com,🔰国外流量
+DOMAIN-SUFFIX,9cache.com,🔰国外流量
+DOMAIN-SUFFIX,9gag.com,🔰国外流量
+DOMAIN-SUFFIX,abc.com,🔰国外流量
+DOMAIN-SUFFIX,abc.net.au,🔰国外流量
+DOMAIN-SUFFIX,abebooks.com,🔰国外流量
+DOMAIN-SUFFIX,amazon.co.jp,🔰国外流量
+DOMAIN-SUFFIX,apigee.com,🔰国外流量
+DOMAIN-SUFFIX,apk-dl.com,🔰国外流量
+DOMAIN-SUFFIX,apkfind.com,🔰国外流量
+DOMAIN-SUFFIX,apkmirror.com,🔰国外流量
+DOMAIN-SUFFIX,apkmonk.com,🔰国外流量
+DOMAIN-SUFFIX,apkpure.com,🔰国外流量
+DOMAIN-SUFFIX,aptoide.com,🔰国外流量
+DOMAIN-SUFFIX,archive.is,🔰国外流量
+DOMAIN-SUFFIX,archive.org,🔰国外流量
+DOMAIN-SUFFIX,arte.tv,🔰国外流量
+DOMAIN-SUFFIX,artstation.com,🔰国外流量
+DOMAIN-SUFFIX,arukas.io,🔰国外流量
+DOMAIN-SUFFIX,ask.com,🔰国外流量
+DOMAIN-SUFFIX,avg.com,🔰国外流量
+DOMAIN-SUFFIX,avgle.com,🔰国外流量
+DOMAIN-SUFFIX,badoo.com,🔰国外流量
+DOMAIN-SUFFIX,bandwagonhost.com,🔰国外流量
+DOMAIN-SUFFIX,bbc.com,🔰国外流量
+DOMAIN-SUFFIX,behance.net,🔰国外流量
+DOMAIN-SUFFIX,bibox.com,🔰国外流量
+DOMAIN-SUFFIX,biggo.com.tw,🔰国外流量
+DOMAIN-SUFFIX,binance.com,🔰国外流量
+DOMAIN-SUFFIX,bitcointalk.org,🔰国外流量
+DOMAIN-SUFFIX,bitfinex.com,🔰国外流量
+DOMAIN-SUFFIX,bitmex.com,🔰国外流量
+DOMAIN-SUFFIX,bit-z.com,🔰国外流量
+DOMAIN-SUFFIX,bloglovin.com,🔰国外流量
+DOMAIN-SUFFIX,bloomberg.cn,🔰国外流量
+DOMAIN-SUFFIX,bloomberg.com,🔰国外流量
+DOMAIN-SUFFIX,blubrry.com,🔰国外流量
+DOMAIN-SUFFIX,book.com.tw,🔰国外流量
+DOMAIN-SUFFIX,booklive.jp,🔰国外流量
+DOMAIN-SUFFIX,books.com.tw,🔰国外流量
+DOMAIN-SUFFIX,boslife.net,🔰国外流量
+DOMAIN-SUFFIX,box.com,🔰国外流量
+DOMAIN-SUFFIX,businessinsider.com,🔰国外流量
+DOMAIN-SUFFIX,bwh1.net,🔰国外流量
+DOMAIN-SUFFIX,castbox.fm,🔰国外流量
+DOMAIN-SUFFIX,cbc.ca,🔰国外流量
+DOMAIN-SUFFIX,cdw.com,🔰国外流量
+DOMAIN-SUFFIX,change.org,🔰国外流量
+DOMAIN-SUFFIX,channelnewsasia.com,🔰国外流量
+DOMAIN-SUFFIX,ck101.com,🔰国外流量
+DOMAIN-SUFFIX,clarionproject.org,🔰国外流量
+DOMAIN-SUFFIX,clyp.it,🔰国外流量
+DOMAIN-SUFFIX,cna.com.tw,🔰国外流量
+DOMAIN-SUFFIX,comparitech.com,🔰国外流量
+DOMAIN-SUFFIX,conoha.jp,🔰国外流量
+DOMAIN-SUFFIX,crucial.com,🔰国外流量
+DOMAIN-SUFFIX,cts.com.tw,🔰国外流量
+DOMAIN-SUFFIX,cw.com.tw,🔰国外流量
+DOMAIN-SUFFIX,cyberctm.com,🔰国外流量
+DOMAIN-SUFFIX,dailymotion.com,🔰国外流量
+DOMAIN-SUFFIX,dailyview.tw,🔰国外流量
+DOMAIN-SUFFIX,daum.net,🔰国外流量
+DOMAIN-SUFFIX,daumcdn.net,🔰国外流量
+DOMAIN-SUFFIX,dcard.tw,🔰国外流量
+DOMAIN-SUFFIX,deepdiscount.com,🔰国外流量
+DOMAIN-SUFFIX,depositphotos.com,🔰国外流量
+DOMAIN-SUFFIX,deviantart.com,🔰国外流量
+DOMAIN-SUFFIX,disconnect.me,🔰国外流量
+DOMAIN-SUFFIX,discordapp.com,🔰国外流量
+DOMAIN-SUFFIX,discordapp.net,🔰国外流量
+DOMAIN-SUFFIX,disqus.com,🔰国外流量
+DOMAIN-SUFFIX,dlercloud.com,🔰国外流量
+DOMAIN-SUFFIX,dns2go.com,🔰国外流量
+DOMAIN-SUFFIX,dowjones.com,🔰国外流量
+DOMAIN-SUFFIX,dropbox.com,🔰国外流量
+DOMAIN-SUFFIX,dropboxusercontent.com,🔰国外流量
+DOMAIN-SUFFIX,duckduckgo.com,🔰国外流量
+DOMAIN-SUFFIX,dw.com,🔰国外流量
+DOMAIN-SUFFIX,dynu.com,🔰国外流量
+DOMAIN-SUFFIX,earthcam.com,🔰国外流量
+DOMAIN-SUFFIX,ebookservice.tw,🔰国外流量
+DOMAIN-SUFFIX,economist.com,🔰国外流量
+DOMAIN-SUFFIX,edgecastcdn.net,🔰国外流量
+DOMAIN-SUFFIX,edu,🔰国外流量
+DOMAIN-SUFFIX,elpais.com,🔰国外流量
+DOMAIN-SUFFIX,enanyang.my,🔰国外流量
+DOMAIN-SUFFIX,encyclopedia.com,🔰国外流量
+DOMAIN-SUFFIX,esoir.be,🔰国外流量
+DOMAIN-SUFFIX,etherscan.io,🔰国外流量
+DOMAIN-SUFFIX,euronews.com,🔰国外流量
+DOMAIN-SUFFIX,evozi.com,🔰国外流量
+DOMAIN-SUFFIX,feedly.com,🔰国外流量
+DOMAIN-SUFFIX,firech.at,🔰国外流量
+DOMAIN-SUFFIX,flickr.com,🔰国外流量
+DOMAIN-SUFFIX,flitto.com,🔰国外流量
+DOMAIN-SUFFIX,foreignpolicy.com,🔰国外流量
+DOMAIN-SUFFIX,freebrowser.org,🔰国外流量
+DOMAIN-SUFFIX,freewechat.com,🔰国外流量
+DOMAIN-SUFFIX,freeweibo.com,🔰国外流量
+DOMAIN-SUFFIX,friday.tw,🔰国外流量
+DOMAIN-SUFFIX,ftchinese.com,🔰国外流量
+DOMAIN-SUFFIX,ftimg.net,🔰国外流量
+DOMAIN-SUFFIX,gate.io,🔰国外流量
+DOMAIN-SUFFIX,getlantern.org,🔰国外流量
+DOMAIN-SUFFIX,getsync.com,🔰国外流量
+DOMAIN-SUFFIX,globalvoices.org,🔰国外流量
+DOMAIN-SUFFIX,goo.ne.jp,🔰国外流量
+DOMAIN-SUFFIX,goodreads.com,🔰国外流量
+DOMAIN-SUFFIX,gov,🔰国外流量
+DOMAIN-SUFFIX,gov.tw,🔰国外流量
+DOMAIN-SUFFIX,greatfire.org,🔰国外流量
+DOMAIN-SUFFIX,gumroad.com,🔰国外流量
+DOMAIN-SUFFIX,hbg.com,🔰国外流量
+DOMAIN-SUFFIX,heroku.com,🔰国外流量
+DOMAIN-SUFFIX,hightail.com,🔰国外流量
+DOMAIN-SUFFIX,hk01.com,🔰国外流量
+DOMAIN-SUFFIX,hkbf.org,🔰国外流量
+DOMAIN-SUFFIX,hkbookcity.com,🔰国外流量
+DOMAIN-SUFFIX,hkej.com,🔰国外流量
+DOMAIN-SUFFIX,hket.com,🔰国外流量
+DOMAIN-SUFFIX,hkgolden.com,🔰国外流量
+DOMAIN-SUFFIX,hootsuite.com,🔰国外流量
+DOMAIN-SUFFIX,hudson.org,🔰国外流量
+DOMAIN-SUFFIX,hyread.com.tw,🔰国外流量
+DOMAIN-SUFFIX,ibtimes.com,🔰国外流量
+DOMAIN-SUFFIX,i-cable.com,🔰国外流量
+DOMAIN-SUFFIX,icij.org,🔰国外流量
+DOMAIN-SUFFIX,icoco.com,🔰国外流量
+DOMAIN-SUFFIX,imgur.com,🔰国外流量
+DOMAIN-SUFFIX,initiummall.com,🔰国外流量
+DOMAIN-SUFFIX,insecam.org,🔰国外流量
+DOMAIN-SUFFIX,ipfs.io,🔰国外流量
+DOMAIN-SUFFIX,issuu.com,🔰国外流量
+DOMAIN-SUFFIX,istockphoto.com,🔰国外流量
+DOMAIN-SUFFIX,japantimes.co.jp,🔰国外流量
+DOMAIN-SUFFIX,jiji.com,🔰国外流量
+DOMAIN-SUFFIX,jinx.com,🔰国外流量
+DOMAIN-SUFFIX,jkforum.net,🔰国外流量
+DOMAIN-SUFFIX,joinmastodon.org,🔰国外流量
+DOMAIN-SUFFIX,justmysocks.net,🔰国外流量
+DOMAIN-SUFFIX,justpaste.it,🔰国外流量
+DOMAIN-SUFFIX,kakao.com,🔰国外流量
+DOMAIN-SUFFIX,kakaocorp.com,🔰国外流量
+DOMAIN-SUFFIX,kik.com,🔰国外流量
+DOMAIN-SUFFIX,kobo.com,🔰国外流量
+DOMAIN-SUFFIX,kobobooks.com,🔰国外流量
+DOMAIN-SUFFIX,kodingen.com,🔰国外流量
+DOMAIN-SUFFIX,lemonde.fr,🔰国外流量
+DOMAIN-SUFFIX,lepoint.fr,🔰国外流量
+DOMAIN-SUFFIX,lihkg.com,🔰国外流量
+DOMAIN-SUFFIX,listennotes.com,🔰国外流量
+DOMAIN-SUFFIX,livestream.com,🔰国外流量
+DOMAIN-SUFFIX,logmein.com,🔰国外流量
+DOMAIN-SUFFIX,mail.ru,🔰国外流量
+DOMAIN-SUFFIX,mailchimp.com,🔰国外流量
+DOMAIN-SUFFIX,marc.info,🔰国外流量
+DOMAIN-SUFFIX,matters.news,🔰国外流量
+DOMAIN-SUFFIX,maying.co,🔰国外流量
+DOMAIN-SUFFIX,medium.com,🔰国外流量
+DOMAIN-SUFFIX,mega.nz,🔰国外流量
+DOMAIN-SUFFIX,mil,🔰国外流量
+DOMAIN-SUFFIX,mingpao.com,🔰国外流量
+DOMAIN-SUFFIX,mobile01.com,🔰国外流量
+DOMAIN-SUFFIX,myspace.com,🔰国外流量
+DOMAIN-SUFFIX,myspacecdn.com,🔰国外流量
+DOMAIN-SUFFIX,nanyang.com,🔰国外流量
+DOMAIN-SUFFIX,naver.com,🔰国外流量
+DOMAIN-SUFFIX,neowin.net,🔰国外流量
+DOMAIN-SUFFIX,newstapa.org,🔰国外流量
+DOMAIN-SUFFIX,nexitally.com,🔰国外流量
+DOMAIN-SUFFIX,nhk.or.jp,🔰国外流量
+DOMAIN-SUFFIX,nicovideo.jp,🔰国外流量
+DOMAIN-SUFFIX,nii.ac.jp,🔰国外流量
+DOMAIN-SUFFIX,nikkei.com,🔰国外流量
+DOMAIN-SUFFIX,nofile.io,🔰国外流量
+DOMAIN-SUFFIX,now.com,🔰国外流量
+DOMAIN-SUFFIX,nrk.no,🔰国外流量
+DOMAIN-SUFFIX,nyt.com,🔰国外流量
+DOMAIN-SUFFIX,nytchina.com,🔰国外流量
+DOMAIN-SUFFIX,nytcn.me,🔰国外流量
+DOMAIN-SUFFIX,nytco.com,🔰国外流量
+DOMAIN-SUFFIX,nytimes.com,🔰国外流量
+DOMAIN-SUFFIX,nytimg.com,🔰国外流量
+DOMAIN-SUFFIX,nytlog.com,🔰国外流量
+DOMAIN-SUFFIX,nytstyle.com,🔰国外流量
+DOMAIN-SUFFIX,ok.ru,🔰国外流量
+DOMAIN-SUFFIX,okex.com,🔰国外流量
+DOMAIN-SUFFIX,on.cc,🔰国外流量
+DOMAIN-SUFFIX,orientaldaily.com.my,🔰国外流量
+DOMAIN-SUFFIX,overcast.fm,🔰国外流量
+DOMAIN-SUFFIX,paltalk.com,🔰国外流量
+DOMAIN-SUFFIX,pao-pao.net,🔰国外流量
+DOMAIN-SUFFIX,parsevideo.com,🔰国外流量
+DOMAIN-SUFFIX,pbxes.com,🔰国外流量
+DOMAIN-SUFFIX,pcdvd.com.tw,🔰国外流量
+DOMAIN-SUFFIX,pchome.com.tw,🔰国外流量
+DOMAIN-SUFFIX,pcloud.com,🔰国外流量
+DOMAIN-SUFFIX,picacomic.com,🔰国外流量
+DOMAIN-SUFFIX,pinimg.com,🔰国外流量
+DOMAIN-SUFFIX,pixiv.net,🔰国外流量
+DOMAIN-SUFFIX,player.fm,🔰国外流量
+DOMAIN-SUFFIX,plurk.com,🔰国外流量
+DOMAIN-SUFFIX,po18.tw,🔰国外流量
+DOMAIN-SUFFIX,potato.im,🔰国外流量
+DOMAIN-SUFFIX,potatso.com,🔰国外流量
+DOMAIN-SUFFIX,prism-break.org,🔰国外流量
+DOMAIN-SUFFIX,proxifier.com,🔰国外流量
+DOMAIN-SUFFIX,pt.im,🔰国外流量
+DOMAIN-SUFFIX,pts.org.tw,🔰国外流量
+DOMAIN-SUFFIX,pubu.com.tw,🔰国外流量
+DOMAIN-SUFFIX,pubu.tw,🔰国外流量
+DOMAIN-SUFFIX,pureapk.com,🔰国外流量
+DOMAIN-SUFFIX,quora.com,🔰国外流量
+DOMAIN-SUFFIX,quoracdn.net,🔰国外流量
+DOMAIN-SUFFIX,rakuten.co.jp,🔰国外流量
+DOMAIN-SUFFIX,readingtimes.com.tw,🔰国外流量
+DOMAIN-SUFFIX,readmoo.com,🔰国外流量
+DOMAIN-SUFFIX,redbubble.com,🔰国外流量
+DOMAIN-SUFFIX,reddit.com,🔰国外流量
+DOMAIN-SUFFIX,redditmedia.com,🔰国外流量
+DOMAIN-SUFFIX,resilio.com,🔰国外流量
+DOMAIN-SUFFIX,reuters.com,🔰国外流量
+DOMAIN-SUFFIX,reutersmedia.net,🔰国外流量
+DOMAIN-SUFFIX,rfi.fr,🔰国外流量
+DOMAIN-SUFFIX,rixcloud.com,🔰国外流量
+DOMAIN-SUFFIX,roadshow.hk,🔰国外流量
+DOMAIN-SUFFIX,scmp.com,🔰国外流量
+DOMAIN-SUFFIX,scribd.com,🔰国外流量
+DOMAIN-SUFFIX,seatguru.com,🔰国外流量
+DOMAIN-SUFFIX,shadowsocks.org,🔰国外流量
+DOMAIN-SUFFIX,shopee.tw,🔰国外流量
+DOMAIN-SUFFIX,slideshare.net,🔰国外流量
+DOMAIN-SUFFIX,softfamous.com,🔰国外流量
+DOMAIN-SUFFIX,soundcloud.com,🔰国外流量
+DOMAIN-SUFFIX,ssrcloud.org,🔰国外流量
+DOMAIN-SUFFIX,startpage.com,🔰国外流量
+DOMAIN-SUFFIX,steamcommunity.com,🔰国外流量
+DOMAIN-SUFFIX,steemit.com,🔰国外流量
+DOMAIN-SUFFIX,steemitwallet.com,🔰国外流量
+DOMAIN-SUFFIX,t66y.com,🔰国外流量
+DOMAIN-SUFFIX,tapatalk.com,🔰国外流量
+DOMAIN-SUFFIX,teco-hk.org,🔰国外流量
+DOMAIN-SUFFIX,teco-mo.org,🔰国外流量
+DOMAIN-SUFFIX,teddysun.com,🔰国外流量
+DOMAIN-SUFFIX,textnow.me,🔰国外流量
+DOMAIN-SUFFIX,theguardian.com,🔰国外流量
+DOMAIN-SUFFIX,theinitium.com,🔰国外流量
+DOMAIN-SUFFIX,thetvdb.com,🔰国外流量
+DOMAIN-SUFFIX,tineye.com,🔰国外流量
+DOMAIN-SUFFIX,torproject.org,🔰国外流量
+DOMAIN-SUFFIX,tumblr.com,🔰国外流量
+DOMAIN-SUFFIX,turbobit.net,🔰国外流量
+DOMAIN-SUFFIX,tutanota.com,🔰国外流量
+DOMAIN-SUFFIX,tvboxnow.com,🔰国外流量
+DOMAIN-SUFFIX,udn.com,🔰国外流量
+DOMAIN-SUFFIX,unseen.is,🔰国外流量
+DOMAIN-SUFFIX,upmedia.mg,🔰国外流量
+DOMAIN-SUFFIX,uptodown.com,🔰国外流量
+DOMAIN-SUFFIX,urbandictionary.com,🔰国外流量
+DOMAIN-SUFFIX,ustream.tv,🔰国外流量
+DOMAIN-SUFFIX,uwants.com,🔰国外流量
+DOMAIN-SUFFIX,v2ray.com,🔰国外流量
+DOMAIN-SUFFIX,viber.com,🔰国外流量
+DOMAIN-SUFFIX,videopress.com,🔰国外流量
+DOMAIN-SUFFIX,vimeo.com,🔰国外流量
+DOMAIN-SUFFIX,voachinese.com,🔰国外流量
+DOMAIN-SUFFIX,voanews.com,🔰国外流量
+DOMAIN-SUFFIX,voxer.com,🔰国外流量
+DOMAIN-SUFFIX,vzw.com,🔰国外流量
+DOMAIN-SUFFIX,w3schools.com,🔰国外流量
+DOMAIN-SUFFIX,washingtonpost.com,🔰国外流量
+DOMAIN-SUFFIX,wattpad.com,🔰国外流量
+DOMAIN-SUFFIX,whoer.net,🔰国外流量
+DOMAIN-SUFFIX,wikimapia.org,🔰国外流量
+DOMAIN-SUFFIX,wikipedia.org,🔰国外流量
+DOMAIN-SUFFIX,wikiquote.org,🔰国外流量
+DOMAIN-SUFFIX,wikiwand.com,🔰国外流量
+DOMAIN-SUFFIX,winudf.com,🔰国外流量
+DOMAIN-SUFFIX,wire.com,🔰国外流量
+DOMAIN-SUFFIX,wordpress.com,🔰国外流量
+DOMAIN-SUFFIX,workflow.is,🔰国外流量
+DOMAIN-SUFFIX,worldcat.org,🔰国外流量
+DOMAIN-SUFFIX,wsj.com,🔰国外流量
+DOMAIN-SUFFIX,wsj.net,🔰国外流量
+DOMAIN-SUFFIX,xhamster.com,🔰国外流量
+DOMAIN-SUFFIX,xn--90wwvt03e.com,🔰国外流量
+DOMAIN-SUFFIX,xn--i2ru8q2qg.com,🔰国外流量
+DOMAIN-SUFFIX,xnxx.com,🔰国外流量
+DOMAIN-SUFFIX,xvideos.com,🔰国外流量
+DOMAIN-SUFFIX,yahoo.com,🔰国外流量
+DOMAIN-SUFFIX,yandex.ru,🔰国外流量
+DOMAIN-SUFFIX,ycombinator.com,🔰国外流量
+DOMAIN-SUFFIX,yesasia.com,🔰国外流量
+DOMAIN-SUFFIX,yes-news.com,🔰国外流量
+DOMAIN-SUFFIX,yomiuri.co.jp,🔰国外流量
+DOMAIN-SUFFIX,you-get.org,🔰国外流量
+DOMAIN-SUFFIX,zaobao.com,🔰国外流量
+DOMAIN-SUFFIX,zb.com,🔰国外流量
+DOMAIN-SUFFIX,zello.com,🔰国外流量
+DOMAIN-SUFFIX,zeronet.io,🔰国外流量
+DOMAIN-SUFFIX,zoom.us,🔰国外流量
+DOMAIN-KEYWORD,github,🔰国外流量
+DOMAIN-KEYWORD,jav,🔰国外流量
+DOMAIN-KEYWORD,pinterest,🔰国外流量
+DOMAIN-KEYWORD,porn,🔰国外流量
+DOMAIN-KEYWORD,wikileaks,🔰国外流量
+DOMAIN-SUFFIX,apartmentratings.com,🔰国外流量
+DOMAIN-SUFFIX,apartments.com,🔰国外流量
+DOMAIN-SUFFIX,bankmobilevibe.com,🔰国外流量
+DOMAIN-SUFFIX,bing.com,🔰国外流量
+DOMAIN-SUFFIX,booktopia.com.au,🔰国外流量
+DOMAIN-SUFFIX,cccat.io,🔰国外流量
+DOMAIN-SUFFIX,centauro.com.br,🔰国外流量
+DOMAIN-SUFFIX,clearsurance.com,🔰国外流量
+DOMAIN-SUFFIX,costco.com,🔰国外流量
+DOMAIN-SUFFIX,crackle.com,🔰国外流量
+DOMAIN-SUFFIX,depositphotos.cn,🔰国外流量
+DOMAIN-SUFFIX,dish.com,🔰国外流量
+DOMAIN-SUFFIX,dmm.co.jp,🔰国外流量
+DOMAIN-SUFFIX,dmm.com,🔰国外流量
+DOMAIN-SUFFIX,dnvod.tv,🔰国外流量
+DOMAIN-SUFFIX,esurance.com,🔰国外流量
+DOMAIN-SUFFIX,extmatrix.com,🔰国外流量
+DOMAIN-SUFFIX,fastpic.ru,🔰国外流量
+DOMAIN-SUFFIX,flipboard.com,🔰国外流量
+DOMAIN-SUFFIX,fnac.be,🔰国外流量
+DOMAIN-SUFFIX,fnac.com,🔰国外流量
+DOMAIN-SUFFIX,funkyimg.com,🔰国外流量
+DOMAIN-SUFFIX,fxnetworks.com,🔰国外流量
+DOMAIN-SUFFIX,gettyimages.com,🔰国外流量
+DOMAIN-SUFFIX,go.com,🔰国外流量
+DOMAIN-SUFFIX,here.com,🔰国外流量
+DOMAIN-SUFFIX,jcpenney.com,🔰国外流量
+DOMAIN-SUFFIX,jiehua.tv,🔰国外流量
+DOMAIN-SUFFIX,mailfence.com,🔰国外流量
+DOMAIN-SUFFIX,nationwide.com,🔰国外流量
+DOMAIN-SUFFIX,nbc.com,🔰国外流量
+DOMAIN-SUFFIX,nexon.com,🔰国外流量
+DOMAIN-SUFFIX,nordstrom.com,🔰国外流量
+DOMAIN-SUFFIX,nordstromimage.com,🔰国外流量
+DOMAIN-SUFFIX,nordstromrack.com,🔰国外流量
+DOMAIN-SUFFIX,superpages.com,🔰国外流量
+DOMAIN-SUFFIX,target.com,🔰国外流量
+DOMAIN-SUFFIX,thinkgeek.com,🔰国外流量
+DOMAIN-SUFFIX,tracfone.com,🔰国外流量
+DOMAIN-SUFFIX,unity3d.com,🔰国外流量
+DOMAIN-SUFFIX,uploader.jp,🔰国外流量
+DOMAIN-SUFFIX,vevo.com,🔰国外流量
+DOMAIN-SUFFIX,viu.tv,🔰国外流量
+DOMAIN-SUFFIX,vk.com,🔰国外流量
+DOMAIN-SUFFIX,vsco.co,🔰国外流量
+DOMAIN-SUFFIX,xfinity.com,🔰国外流量
+DOMAIN-SUFFIX,zattoo.com,🔰国外流量
+USER-AGENT,Roam*,🔰国外流量
+DOMAIN,testflight.apple.com,🔰国外流量
+DOMAIN-SUFFIX,appsto.re,🔰国外流量
+DOMAIN,books.itunes.apple.com,🔰国外流量
+DOMAIN,hls.itunes.apple.com,🔰国外流量
+DOMAIN,apps.apple.com,🔰国外流量
+DOMAIN,itunes.apple.com,🔰国外流量
+DOMAIN,api-glb-sea.smoot.apple.com,🔰国外流量
+DOMAIN,lookup-api.apple.com,🔰国外流量
+PROCESS-NAME,LookupViewService,🔰国外流量
+DOMAIN-SUFFIX,abc.xyz,🔰国外流量
+DOMAIN-SUFFIX,android.com,🔰国外流量
+DOMAIN-SUFFIX,androidify.com,🔰国外流量
+DOMAIN-SUFFIX,dialogflow.com,🔰国外流量
+DOMAIN-SUFFIX,autodraw.com,🔰国外流量
+DOMAIN-SUFFIX,capitalg.com,🔰国外流量
+DOMAIN-SUFFIX,certificate-transparency.org,🔰国外流量
+DOMAIN-SUFFIX,chrome.com,🔰国外流量
+DOMAIN-SUFFIX,chromeexperiments.com,🔰国外流量
+DOMAIN-SUFFIX,chromestatus.com,🔰国外流量
+DOMAIN-SUFFIX,chromium.org,🔰国外流量
+DOMAIN-SUFFIX,creativelab5.com,🔰国外流量
+DOMAIN-SUFFIX,debug.com,🔰国外流量
+DOMAIN-SUFFIX,deepmind.com,🔰国外流量
+DOMAIN-SUFFIX,firebaseio.com,🔰国外流量
+DOMAIN-SUFFIX,getmdl.io,🔰国外流量
+DOMAIN-SUFFIX,ggpht.com,🔰国外流量
+DOMAIN-SUFFIX,gmail.com,🔰国外流量
+DOMAIN-SUFFIX,gmodules.com,🔰国外流量
+DOMAIN-SUFFIX,godoc.org,🔰国外流量
+DOMAIN-SUFFIX,golang.org,🔰国外流量
+DOMAIN-SUFFIX,gstatic.com,🔰国外流量
+DOMAIN-SUFFIX,gv.com,🔰国外流量
+DOMAIN-SUFFIX,gwtproject.org,🔰国外流量
+DOMAIN-SUFFIX,itasoftware.com,🔰国外流量
+DOMAIN-SUFFIX,madewithcode.com,🔰国外流量
+DOMAIN-SUFFIX,material.io,🔰国外流量
+DOMAIN-SUFFIX,polymer-project.org,🔰国外流量
+DOMAIN-SUFFIX,admin.recaptcha.net,🔰国外流量
+DOMAIN-SUFFIX,recaptcha.net,🔰国外流量
+DOMAIN-SUFFIX,shattered.io,🔰国外流量
+DOMAIN-SUFFIX,synergyse.com,🔰国外流量
+DOMAIN-SUFFIX,tensorflow.org,🔰国外流量
+DOMAIN-SUFFIX,tfhub.dev,🔰国外流量
+DOMAIN-SUFFIX,tiltbrush.com,🔰国外流量
+DOMAIN-SUFFIX,waveprotocol.org,🔰国外流量
+DOMAIN-SUFFIX,waymo.com,🔰国外流量
+DOMAIN-SUFFIX,webmproject.org,🔰国外流量
+DOMAIN-SUFFIX,webrtc.org,🔰国外流量
+DOMAIN-SUFFIX,whatbrowser.org,🔰国外流量
+DOMAIN-SUFFIX,widevine.com,🔰国外流量
+DOMAIN-SUFFIX,x.company,🔰国外流量
+DOMAIN-SUFFIX,youtu.be,🔰国外流量
+DOMAIN-SUFFIX,yt.be,🔰国外流量
+DOMAIN-SUFFIX,ytimg.com,🔰国外流量
+DOMAIN-SUFFIX,1drv.com,🔰国外流量
+DOMAIN-SUFFIX,1drv.ms,🔰国外流量
+DOMAIN-SUFFIX,blob.core.windows.net,🔰国外流量
+DOMAIN-SUFFIX,livefilestore.com,🔰国外流量
+DOMAIN-SUFFIX,onedrive.com,🔰国外流量
+DOMAIN-SUFFIX,storage.live.com,🔰国外流量
+DOMAIN-SUFFIX,storage.msn.com,🔰国外流量
+DOMAIN,oneclient.sfx.ms,🔰国外流量
+DOMAIN-SUFFIX,0rz.tw,🔰国外流量
+DOMAIN-SUFFIX,4bluestones.biz,🔰国外流量
+DOMAIN-SUFFIX,9bis.net,🔰国外流量
+DOMAIN-SUFFIX,allconnected.co,🔰国外流量
+DOMAIN-SUFFIX,aol.com,🔰国外流量
+DOMAIN-SUFFIX,bcc.com.tw,🔰国外流量
+DOMAIN-SUFFIX,bit.ly,🔰国外流量
+DOMAIN-SUFFIX,bitshare.com,🔰国外流量
+DOMAIN-SUFFIX,blog.jp,🔰国外流量
+DOMAIN-SUFFIX,blogimg.jp,🔰国外流量
+DOMAIN-SUFFIX,blogtd.org,🔰国外流量
+DOMAIN-SUFFIX,broadcast.co.nz,🔰国外流量
+DOMAIN-SUFFIX,camfrog.com,🔰国外流量
+DOMAIN-SUFFIX,cfos.de,🔰国外流量
+DOMAIN-SUFFIX,citypopulation.de,🔰国外流量
+DOMAIN-SUFFIX,cloudfront.net,🔰国外流量
+DOMAIN-SUFFIX,ctitv.com.tw,🔰国外流量
+DOMAIN-SUFFIX,cuhk.edu.hk,🔰国外流量
+DOMAIN-SUFFIX,cusu.hk,🔰国外流量
+DOMAIN-SUFFIX,discord.gg,🔰国外流量
+DOMAIN-SUFFIX,discuss.com.hk,🔰国外流量
+DOMAIN-SUFFIX,dropboxapi.com,🔰国外流量
+DOMAIN-SUFFIX,duolingo.cn,🔰国外流量
+DOMAIN-SUFFIX,edditstatic.com,🔰国外流量
+DOMAIN-SUFFIX,flickriver.com,🔰国外流量
+DOMAIN-SUFFIX,focustaiwan.tw,🔰国外流量
+DOMAIN-SUFFIX,free.fr,🔰国外流量
+DOMAIN-SUFFIX,gigacircle.com,🔰国外流量
+DOMAIN-SUFFIX,hk-pub.com,🔰国外流量
+DOMAIN-SUFFIX,hosting.co.uk,🔰国外流量
+DOMAIN-SUFFIX,hwcdn.net,🔰国外流量
+DOMAIN-SUFFIX,ifixit.com,🔰国外流量
+DOMAIN-SUFFIX,iphone4hongkong.com,🔰国外流量
+DOMAIN-SUFFIX,iphonetaiwan.org,🔰国外流量
+DOMAIN-SUFFIX,iptvbin.com,🔰国外流量
+DOMAIN-SUFFIX,linksalpha.com,🔰国外流量
+DOMAIN-SUFFIX,manyvids.com,🔰国外流量
+DOMAIN-SUFFIX,myactimes.com,🔰国外流量
+DOMAIN-SUFFIX,newsblur.com,🔰国外流量
+DOMAIN-SUFFIX,now.im,🔰国外流量
+DOMAIN-SUFFIX,nowe.com,🔰国外流量
+DOMAIN-SUFFIX,redditlist.com,🔰国外流量
+DOMAIN-SUFFIX,s3.amazonaws.com,🔰国外流量
+DOMAIN-SUFFIX,signal.org,🔰国外流量
+DOMAIN-SUFFIX,smartmailcloud.com,🔰国外流量
+DOMAIN-SUFFIX,sparknotes.com,🔰国外流量
+DOMAIN-SUFFIX,streetvoice.com,🔰国外流量
+DOMAIN-SUFFIX,supertop.co,🔰国外流量
+DOMAIN-SUFFIX,tv.com,🔰国外流量
+DOMAIN-SUFFIX,typepad.com,🔰国外流量
+DOMAIN-SUFFIX,udnbkk.com,🔰国外流量
+DOMAIN-SUFFIX,urbanairship.com,🔰国外流量
+DOMAIN-SUFFIX,whispersystems.org,🔰国外流量
+DOMAIN-SUFFIX,wikia.com,🔰国外流量
+DOMAIN-SUFFIX,wn.com,🔰国外流量
+DOMAIN-SUFFIX,wolframalpha.com,🔰国外流量
+DOMAIN-SUFFIX,x-art.com,🔰国外流量
+DOMAIN-SUFFIX,yimg.com,🔰国外流量
+DOMAIN,api.steampowered.com,🔰国外流量
+DOMAIN,store.steampowered.com,🔰国外流量
+
+DOMAIN-SUFFIX,aaplimg.com,🍎苹果服务
+DOMAIN-SUFFIX,apple.co,🍎苹果服务
+DOMAIN-SUFFIX,apple.com,🍎苹果服务
+DOMAIN-SUFFIX,apple-cloudkit.com,🍎苹果服务
+DOMAIN-SUFFIX,appstore.com,🍎苹果服务
+DOMAIN-SUFFIX,cdn-apple.com,🍎苹果服务
+DOMAIN-SUFFIX,crashlytics.com,🍎苹果服务
+DOMAIN-SUFFIX,icloud.com,🍎苹果服务
+DOMAIN-SUFFIX,icloud-content.com,🍎苹果服务
+DOMAIN-SUFFIX,me.com,🍎苹果服务
+DOMAIN-SUFFIX,mzstatic.com,🍎苹果服务
+DOMAIN,www-cdn.icloud.com.akadns.net,🍎苹果服务
+
+DOMAIN-SUFFIX,t.me,✈️Telegram
+DOMAIN-SUFFIX,tdesktop.com,✈️Telegram
+DOMAIN-SUFFIX,telegra.ph,✈️Telegram
+DOMAIN-SUFFIX,telegram.me,✈️Telegram
+DOMAIN-SUFFIX,telegram.org,✈️Telegram
+IP-CIDR,91.108.4.0/22,✈️Telegram,no-resolve
+IP-CIDR,91.108.8.0/22,✈️Telegram,no-resolve
+IP-CIDR,91.108.12.0/22,✈️Telegram,no-resolve
+IP-CIDR,91.108.16.0/22,✈️Telegram,no-resolve
+IP-CIDR,91.108.56.0/22,✈️Telegram,no-resolve
+IP-CIDR,149.154.160.0/20,✈️Telegram,no-resolve
+IP-CIDR6,2001:b28:f23d::/48,✈️Telegram,no-resolve
+IP-CIDR6,2001:b28:f23f::/48,✈️Telegram,no-resolve
+IP-CIDR6,2001:67c:4e8::/48,✈️Telegram,no-resolve
+
+USER-AGENT,com.google.ios.youtube*,🎬Youtube
+USER-AGENT,YouTube*,🎬Youtube
+DOMAIN-SUFFIX,googlevideo.com,🎬Youtube
+DOMAIN-SUFFIX,youtube.com,🎬Youtube
+DOMAIN,youtubei.googleapis.com,🎬Youtube
+
+USER-AGENT,Argo*,🎬Netflix
+DOMAIN-SUFFIX,netflix.com,🎬Netflix
+DOMAIN-SUFFIX,netflix.net,🎬Netflix
+DOMAIN-SUFFIX,nflxext.com,🎬Netflix
+DOMAIN-SUFFIX,nflximg.com,🎬Netflix
+DOMAIN-SUFFIX,nflximg.net,🎬Netflix
+DOMAIN-SUFFIX,nflxso.net,🎬Netflix
+DOMAIN-SUFFIX,nflxvideo.net,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest0.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest1.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest2.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest3.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest4.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest5.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest6.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest7.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest8.com,🎬Netflix
+DOMAIN-SUFFIX,netflixdnstest9.com,🎬Netflix
+IP-CIDR,23.246.0.0/18,🎬Netflix,no-resolve
+IP-CIDR,37.77.184.0/21,🎬Netflix,no-resolve
+IP-CIDR,45.57.0.0/17,🎬Netflix,no-resolve
+IP-CIDR,64.120.128.0/17,🎬Netflix,no-resolve
+IP-CIDR,66.197.128.0/17,🎬Netflix,no-resolve
+IP-CIDR,108.175.32.0/20,🎬Netflix,no-resolve
+IP-CIDR,192.173.64.0/18,🎬Netflix,no-resolve
+IP-CIDR,198.38.96.0/19,🎬Netflix,no-resolve
+IP-CIDR,198.45.48.0/20,🎬Netflix,no-resolve
+
+USER-AGENT,Deezer*,🎬国外媒体
+DOMAIN-SUFFIX,deezer.com,🎬国外媒体
+DOMAIN-SUFFIX,dzcdn.net,🎬国外媒体
+DOMAIN-SUFFIX,kkbox.com,🎬国外媒体
+DOMAIN-SUFFIX,kkbox.com.tw,🎬国外媒体
+DOMAIN-SUFFIX,kfs.io,🎬国外媒体
+USER-AGENT,WeMusic*,🎬国外媒体
+USER-AGENT,JOOX*,🎬国外媒体
+DOMAIN-SUFFIX,joox.com,🎬国外媒体
+USER-AGENT,Pandora*,🎬国外媒体
+DOMAIN-SUFFIX,pandora.com,🎬国外媒体
+USER-AGENT,SoundCloud*,🎬国外媒体
+DOMAIN-SUFFIX,p-cdn.us,🎬国外媒体
+DOMAIN-SUFFIX,sndcdn.com,🎬国外媒体
+DOMAIN-SUFFIX,soundcloud.com,🎬国外媒体
+USER-AGENT,Spotify*,🎬国外媒体
+DOMAIN-SUFFIX,pscdn.co,🎬国外媒体
+DOMAIN-SUFFIX,scdn.co,🎬国外媒体
+DOMAIN-SUFFIX,spotify.com,🎬国外媒体
+DOMAIN-SUFFIX,spoti.fi,🎬国外媒体
+DOMAIN-KEYWORD,spotify.com,🎬国外媒体
+DOMAIN-KEYWORD,-spotify-com,🎬国外媒体
+USER-AGENT,TIDAL*,🎬国外媒体
+DOMAIN-SUFFIX,tidal.com,🎬国外媒体
+USER-AGENT,com.google.ios.youtubemusic*,🎬国外媒体
+USER-AGENT,YouTubeMusic*,🎬国外媒体
+USER-AGENT,All4*,🎬国外媒体
+DOMAIN-SUFFIX,c4assets.com,🎬国外媒体
+DOMAIN-SUFFIX,channel4.com,🎬国外媒体
+USER-AGENT,AbemaTV*,🎬国外媒体
+DOMAIN-SUFFIX,abema.io,🎬国外媒体
+DOMAIN-SUFFIX,ameba.jp,🎬国外媒体
+DOMAIN-SUFFIX,abema.tv,🎬国外媒体
+DOMAIN-SUFFIX,hayabusa.io,🎬国外媒体
+DOMAIN,abematv.akamaized.net,🎬国外媒体
+DOMAIN,ds-linear-abematv.akamaized.net,🎬国外媒体
+DOMAIN,ds-vod-abematv.akamaized.net,🎬国外媒体
+DOMAIN,linear-abematv.akamaized.net,🎬国外媒体
+USER-AGENT,InstantVideo.US*,🎬国外媒体
+USER-AGENT,Prime%20Video*,🎬国外媒体
+DOMAIN-SUFFIX,aiv-cdn.net,🎬国外媒体
+DOMAIN-SUFFIX,aiv-delivery.net,🎬国外媒体
+DOMAIN-SUFFIX,amazonvideo.com,🎬国外媒体
+DOMAIN-SUFFIX,primevideo.com,🎬国外媒体
+DOMAIN,avodmp4s3ww-a.akamaihd.net,🎬国外媒体
+DOMAIN,d25xi40x97liuc.cloudfront.net,🎬国外媒体
+DOMAIN,dmqdd6hw24ucf.cloudfront.net,🎬国外媒体
+DOMAIN,d22qjgkvxw22r6.cloudfront.net,🎬国外媒体
+DOMAIN,d1v5ir2lpwr8os.cloudfront.net,🎬国外媒体
+DOMAIN-KEYWORD,avoddashs,🎬国外媒体
+USER-AGENT,Anime*,🎬国外媒体
+DOMAIN-SUFFIX,bahamut.com.tw,🎬国外媒体
+DOMAIN-SUFFIX,gamer.com.tw,🎬国外媒体
+DOMAIN,gamer-cds.cdn.hinet.net,🎬国外媒体
+DOMAIN,gamer2-cds.cdn.hinet.net,🎬国外媒体
+USER-AGENT,BBCiPlayer*,🎬国外媒体
+DOMAIN-SUFFIX,bbc.co.uk,🎬国外媒体
+DOMAIN-SUFFIX,bbci.co.uk,🎬国外媒体
+DOMAIN-KEYWORD,bbcfmt,🎬国外媒体
+DOMAIN-KEYWORD,uk-live,🎬国外媒体
+USER-AGENT,DAZN*,🎬国外媒体
+DOMAIN-SUFFIX,dazn.com,🎬国外媒体
+DOMAIN-SUFFIX,dazn-api.com,🎬国外媒体
+DOMAIN,d151l6v8er5bdm.cloudfront.net,🎬国外媒体
+DOMAIN-KEYWORD,voddazn,🎬国外媒体
+USER-AGENT,Disney+*,🎬国外媒体
+DOMAIN-SUFFIX,bamgrid.com,🎬国外媒体
+DOMAIN-SUFFIX,disney-plus.net,🎬国外媒体
+DOMAIN-SUFFIX,disneyplus.com,🎬国外媒体
+DOMAIN-SUFFIX,dssott.com,🎬国外媒体
+DOMAIN,cdn.registerdisney.go.com,🎬国外媒体
+USER-AGENT,encoreTVB*,🎬国外媒体
+DOMAIN-SUFFIX,encoretvb.com,🎬国外媒体
+DOMAIN,edge.api.brightcove.com,🎬国外媒体
+DOMAIN,bcbolt446c5271-a.akamaihd.net,🎬国外媒体
+USER-AGENT,FOX%20NOW*,🎬国外媒体
+DOMAIN-SUFFIX,fox.com,🎬国外媒体
+DOMAIN-SUFFIX,foxdcg.com,🎬国外媒体
+DOMAIN-SUFFIX,theplatform.com,🎬国外媒体
+DOMAIN-SUFFIX,uplynk.com,🎬国外媒体
+USER-AGENT,HBO%20NOW*,🎬国外媒体
+DOMAIN-SUFFIX,hbo.com,🎬国外媒体
+DOMAIN-SUFFIX,hbogo.com,🎬国外媒体
+DOMAIN-SUFFIX,hbonow.com,🎬国外媒体
+USER-AGENT,HBO%20GO%20PROD%20HKG*,🎬国外媒体
+DOMAIN-SUFFIX,hbogoasia.com,🎬国外媒体
+DOMAIN-SUFFIX,hbogoasia.hk,🎬国外媒体
+DOMAIN,bcbolthboa-a.akamaihd.net,🎬国外媒体
+DOMAIN,players.brightcove.net,🎬国外媒体
+DOMAIN,s3-ap-southeast-1.amazonaws.com,🎬国外媒体
+DOMAIN,dai3fd1oh325y.cloudfront.net,🎬国外媒体
+DOMAIN,44wilhpljf.execute-api.ap-southeast-1.amazonaws.com,🎬国外媒体
+DOMAIN,hboasia1-i.akamaihd.net,🎬国外媒体
+DOMAIN,hboasia2-i.akamaihd.net,🎬国外媒体
+DOMAIN,hboasia3-i.akamaihd.net,🎬国外媒体
+DOMAIN,hboasia4-i.akamaihd.net,🎬国外媒体
+DOMAIN,hboasia5-i.akamaihd.net,🎬国外媒体
+DOMAIN,cf-images.ap-southeast-1.prod.boltdns.net,🎬国外媒体
+USER-AGENT,HWTVMobile*,🎬国外媒体
+DOMAIN-SUFFIX,5itv.tv,🎬国外媒体
+DOMAIN-SUFFIX,ocnttv.com,🎬国外媒体
+DOMAIN-SUFFIX,hulu.com,🎬国外媒体
+DOMAIN-SUFFIX,huluim.com,🎬国外媒体
+DOMAIN-SUFFIX,hulustream.com,🎬国外媒体
+DOMAIN-SUFFIX,happyon.jp,🎬国外媒体
+DOMAIN-SUFFIX,hulu.jp,🎬国外媒体
+USER-AGENT,ITV_Player*,🎬国外媒体
+DOMAIN-SUFFIX,itv.com,🎬国外媒体
+DOMAIN-SUFFIX,itvstatic.com,🎬国外媒体
+DOMAIN,itvpnpmobile-a.akamaihd.net,🎬国外媒体
+USER-AGENT,KKTV*,🎬国外媒体
+USER-AGENT,com.kktv.ios.kktv*,🎬国外媒体
+DOMAIN-SUFFIX,kktv.com.tw,🎬国外媒体
+DOMAIN-SUFFIX,kktv.me,🎬国外媒体
+DOMAIN,kktv-theater.kk.stream,🎬国外媒体
+USER-AGENT,LINE%20TV*,🎬国外媒体
+DOMAIN-SUFFIX,linetv.tw,🎬国外媒体
+DOMAIN,d3c7rimkq79yfu.cloudfront.net,🎬国外媒体
+DOMAIN-SUFFIX,litv.tv,🎬国外媒体
+DOMAIN,litvfreemobile-hichannel.cdn.hinet.net,🎬国外媒体
+USER-AGENT,My5*,🎬国外媒体
+DOMAIN-SUFFIX,channel5.com,🎬国外媒体
+DOMAIN-SUFFIX,my5.tv,🎬国外媒体
+DOMAIN,d349g9zuie06uo.cloudfront.net,🎬国外媒体
+USER-AGENT,mytv*,🎬国外媒体
+DOMAIN-SUFFIX,mytvsuper.com,🎬国外媒体
+DOMAIN-SUFFIX,tvb.com,🎬国外媒体
+USER-AGENT,Argo*,🎬国外媒体
+DOMAIN-SUFFIX,netflix.com,🎬国外媒体
+DOMAIN-SUFFIX,netflix.net,🎬国外媒体
+DOMAIN-SUFFIX,nflxext.com,🎬国外媒体
+DOMAIN-SUFFIX,nflximg.com,🎬国外媒体
+DOMAIN-SUFFIX,nflximg.net,🎬国外媒体
+DOMAIN-SUFFIX,nflxso.net,🎬国外媒体
+DOMAIN-SUFFIX,nflxvideo.net,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest0.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest1.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest2.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest3.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest4.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest5.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest6.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest7.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest8.com,🎬国外媒体
+DOMAIN-SUFFIX,netflixdnstest9.com,🎬国外媒体
+IP-CIDR,23.246.0.0/18,🎬国外媒体,no-resolve
+IP-CIDR,37.77.184.0/21,🎬国外媒体,no-resolve
+IP-CIDR,45.57.0.0/17,🎬国外媒体,no-resolve
+IP-CIDR,64.120.128.0/17,🎬国外媒体,no-resolve
+IP-CIDR,66.197.128.0/17,🎬国外媒体,no-resolve
+IP-CIDR,108.175.32.0/20,🎬国外媒体,no-resolve
+IP-CIDR,192.173.64.0/18,🎬国外媒体,no-resolve
+IP-CIDR,198.38.96.0/19,🎬国外媒体,no-resolve
+IP-CIDR,198.45.48.0/20,🎬国外媒体,no-resolve
+USER-AGENT,Niconico*,🎬国外媒体
+DOMAIN-SUFFIX,dmc.nico,🎬国外媒体
+DOMAIN-SUFFIX,nicovideo.jp,🎬国外媒体
+DOMAIN-SUFFIX,nimg.jp,🎬国外媒体
+DOMAIN-SUFFIX,socdm.com,🎬国外媒体
+USER-AGENT,PBS*,🎬国外媒体
+DOMAIN-SUFFIX,pbs.org,🎬国外媒体
+DOMAIN-SUFFIX,phncdn.com,🎬国外媒体
+DOMAIN-SUFFIX,pornhub.com,🎬国外媒体
+DOMAIN-SUFFIX,pornhubpremium.com,🎬国外媒体
+USER-AGENT,TaiwanGood*,🎬国外媒体
+DOMAIN-SUFFIX,skyking.com.tw,🎬国外媒体
+DOMAIN,hamifans.emome.net,🎬国外媒体
+DOMAIN-SUFFIX,twitch.tv,🎬国外媒体
+DOMAIN-SUFFIX,twitchcdn.net,🎬国外媒体
+DOMAIN-SUFFIX,ttvnw.net,🎬国外媒体
+DOMAIN-SUFFIX,jtvnw.net,🎬国外媒体
+USER-AGENT,Viu*,🎬国外媒体
+USER-AGENT,ViuTV*,🎬国外媒体
+DOMAIN-SUFFIX,viu.com,🎬国外媒体
+DOMAIN-SUFFIX,viu.tv,🎬国外媒体
+DOMAIN,api.viu.now.com,🎬国外媒体
+DOMAIN,d1k2us671qcoau.cloudfront.net,🎬国外媒体
+DOMAIN,d2anahhhmp1ffz.cloudfront.net,🎬国外媒体
+DOMAIN,dfp6rglgjqszk.cloudfront.net,🎬国外媒体
+USER-AGENT,com.google.ios.youtube*,🎬国外媒体
+USER-AGENT,YouTube*,🎬国外媒体
+DOMAIN-SUFFIX,googlevideo.com,🎬国外媒体
+DOMAIN-SUFFIX,youtube.com,🎬国外媒体
+DOMAIN,youtubei.googleapis.com,🎬国外媒体
+
+DOMAIN-SUFFIX,local,DIRECT
+IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
+IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
+IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
+IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
+IP-CIDR,100.64.0.0/10,DIRECT,no-resolve
+IP-CIDR6,::1/128,DIRECT,no-resolve
+IP-CIDR6,fc00::/7,DIRECT,no-resolve
+IP-CIDR6,fe80::/10,DIRECT,no-resolve
+IP-CIDR6,fd00::/8,DIRECT,no-resolve
+USER-AGENT,coffeecorp*,DIRECT
+USER-AGENT,restaurant-mobile*,DIRECT
+DOMAIN,app.adjust.com,DIRECT
+DOMAIN-SUFFIX,googletraveladservices.com,DIRECT
+DOMAIN,dl.google.com,DIRECT
+DOMAIN,mtalk.google.com,DIRECT
+DOMAIN,livew.l.qq.com,DIRECT
+DOMAIN,vd.l.qq.com,DIRECT
+DOMAIN,analytics.strava.com,DIRECT
+DOMAIN,msg.umeng.com,DIRECT
+DOMAIN,msg.umengcloud.com,DIRECT
+DOMAIN-SUFFIX,qhres.com,DIRECT
+DOMAIN-SUFFIX,qhimg.com,DIRECT
+DOMAIN-SUFFIX,akadns.net,DIRECT
+USER-AGENT,%E4%BC%98%E9%85%B7*,DIRECT
+DOMAIN-SUFFIX,alibaba.com,DIRECT
+DOMAIN-SUFFIX,alicdn.com,DIRECT
+DOMAIN-SUFFIX,alikunlun.com,DIRECT
+DOMAIN-SUFFIX,alipay.com,DIRECT
+DOMAIN-SUFFIX,amap.com,DIRECT
+DOMAIN-SUFFIX,autonavi.com,DIRECT
+DOMAIN-SUFFIX,dingtalk.com,DIRECT
+DOMAIN-SUFFIX,mxhichina.com,DIRECT
+DOMAIN-SUFFIX,soku.com,DIRECT
+DOMAIN-SUFFIX,taobao.com,DIRECT
+DOMAIN-SUFFIX,tmall.com,DIRECT
+DOMAIN-SUFFIX,tmall.hk,DIRECT
+DOMAIN-SUFFIX,ykimg.com,DIRECT
+DOMAIN-SUFFIX,youku.com,DIRECT
+DOMAIN-SUFFIX,xiami.com,DIRECT
+DOMAIN-SUFFIX,xiami.net,DIRECT
+DOMAIN-SUFFIX,aaplimg.com,DIRECT
+DOMAIN-SUFFIX,apple.co,DIRECT
+DOMAIN-SUFFIX,apple.com,DIRECT
+DOMAIN-SUFFIX,apple-cloudkit.com,DIRECT
+DOMAIN-SUFFIX,appstore.com,DIRECT
+DOMAIN-SUFFIX,cdn-apple.com,DIRECT
+DOMAIN-SUFFIX,crashlytics.com,DIRECT
+DOMAIN-SUFFIX,icloud.com,DIRECT
+DOMAIN-SUFFIX,icloud-content.com,DIRECT
+DOMAIN-SUFFIX,me.com,DIRECT
+DOMAIN-SUFFIX,mzstatic.com,DIRECT
+DOMAIN,www-cdn.icloud.com.akadns.net,DIRECT
+DOMAIN-SUFFIX,baidu.com,DIRECT
+DOMAIN-SUFFIX,baidubcr.com,DIRECT
+DOMAIN-SUFFIX,bdstatic.com,DIRECT
+DOMAIN-SUFFIX,yunjiasu-cdn.net,DIRECT
+DOMAIN-SUFFIX,acgvideo.com,DIRECT
+DOMAIN-SUFFIX,biliapi.com,DIRECT
+DOMAIN-SUFFIX,biliapi.net,DIRECT
+DOMAIN-SUFFIX,bilibili.com,DIRECT
+DOMAIN-SUFFIX,bilibili.tv,DIRECT
+DOMAIN-SUFFIX,hdslb.com,DIRECT
+DOMAIN-SUFFIX,blizzard.com,DIRECT
+DOMAIN-SUFFIX,battle.net,DIRECT
+DOMAIN,blzddist1-a.akamaihd.net,DIRECT
+DOMAIN-SUFFIX,feiliao.com,DIRECT
+DOMAIN-SUFFIX,pstatp.com,DIRECT
+DOMAIN-SUFFIX,snssdk.com,DIRECT
+DOMAIN-SUFFIX,iesdouyin.com,DIRECT
+DOMAIN-SUFFIX,toutiao.com,DIRECT
+DOMAIN-SUFFIX,cctv.com,DIRECT
+DOMAIN-SUFFIX,cctvpic.com,DIRECT
+DOMAIN-SUFFIX,livechina.com,DIRECT
+DOMAIN-SUFFIX,didialift.com,DIRECT
+DOMAIN-SUFFIX,didiglobal.com,DIRECT
+DOMAIN-SUFFIX,udache.com,DIRECT
+DOMAIN-SUFFIX,343480.com,DIRECT
+DOMAIN-SUFFIX,baduziyuan.com,DIRECT
+DOMAIN-SUFFIX,com-hs-hkdy.com,DIRECT
+DOMAIN-SUFFIX,czybjz.com,DIRECT
+DOMAIN-SUFFIX,dandanzan.com,DIRECT
+DOMAIN-SUFFIX,fjhps.com,DIRECT
+DOMAIN-SUFFIX,kuyunbo.club,DIRECT
+DOMAIN-SUFFIX,21cn.com,DIRECT
+DOMAIN-SUFFIX,hitv.com,DIRECT
+DOMAIN-SUFFIX,mgtv.com,DIRECT
+DOMAIN-SUFFIX,iqiyi.com,DIRECT
+DOMAIN-SUFFIX,iqiyipic.com,DIRECT
+DOMAIN-SUFFIX,71.am.com,DIRECT
+DOMAIN-SUFFIX,jd.com,DIRECT
+DOMAIN-SUFFIX,jd.hk,DIRECT
+DOMAIN-SUFFIX,jdpay.com,DIRECT
+DOMAIN-SUFFIX,360buyimg.com,DIRECT
+DOMAIN-SUFFIX,iciba.com,DIRECT
+DOMAIN-SUFFIX,ksosoft.com,DIRECT
+DOMAIN-SUFFIX,meitu.com,DIRECT
+DOMAIN-SUFFIX,meitudata.com,DIRECT
+DOMAIN-SUFFIX,meitustat.com,DIRECT
+DOMAIN-SUFFIX,meipai.com,DIRECT
+DOMAIN-SUFFIX,duokan.com,DIRECT
+DOMAIN-SUFFIX,mi-img.com,DIRECT
+DOMAIN-SUFFIX,miui.com,DIRECT
+DOMAIN-SUFFIX,miwifi.com,DIRECT
+DOMAIN-SUFFIX,xiaomi.com,DIRECT
+DOMAIN-SUFFIX,microsoft.com,DIRECT
+DOMAIN-SUFFIX,msecnd.net,DIRECT
+DOMAIN-SUFFIX,office365.com,DIRECT
+DOMAIN-SUFFIX,outlook.com,DIRECT
+DOMAIN-SUFFIX,s-microsoft.com,DIRECT
+DOMAIN-SUFFIX,visualstudio.com,DIRECT
+DOMAIN-SUFFIX,windows.com,DIRECT
+DOMAIN-SUFFIX,windowsupdate.com,DIRECT
+DOMAIN,officecdn-microsoft-com.akamaized.net,DIRECT
+USER-AGENT,NeteaseMusic*,DIRECT
+USER-AGENT,%E7%BD%91%E6%98%93%E4%BA%91%E9%9F%B3%E4%B9%90*,DIRECT
+DOMAIN-SUFFIX,163.com,DIRECT
+DOMAIN-SUFFIX,126.net,DIRECT
+DOMAIN-SUFFIX,127.net,DIRECT
+DOMAIN-SUFFIX,163yun.com,DIRECT
+DOMAIN-SUFFIX,lofter.com,DIRECT
+DOMAIN-SUFFIX,netease.com,DIRECT
+DOMAIN-SUFFIX,ydstatic.com,DIRECT
+DOMAIN-SUFFIX,sina.com,DIRECT
+DOMAIN-SUFFIX,weibo.com,DIRECT
+DOMAIN-SUFFIX,weibocdn.com,DIRECT
+DOMAIN-SUFFIX,sohu.com,DIRECT
+DOMAIN-SUFFIX,sohucs.com,DIRECT
+DOMAIN-SUFFIX,sohu-inc.com,DIRECT
+DOMAIN-SUFFIX,v-56.com,DIRECT
+DOMAIN-SUFFIX,sogo.com,DIRECT
+DOMAIN-SUFFIX,sogou.com,DIRECT
+DOMAIN-SUFFIX,sogoucdn.com,DIRECT
+DOMAIN-SUFFIX,steampowered.com,DIRECT
+DOMAIN-SUFFIX,steam-chat.com,DIRECT
+DOMAIN-SUFFIX,steamgames.com,DIRECT
+DOMAIN-SUFFIX,steamusercontent.com,DIRECT
+DOMAIN-SUFFIX,steamcontent.com,DIRECT
+DOMAIN-SUFFIX,steamstatic.com,DIRECT
+DOMAIN-SUFFIX,steamcdn-a.akamaihd.net,DIRECT
+DOMAIN-SUFFIX,steamstat.us,DIRECT
+USER-AGENT,MicroMessenger%20Client,DIRECT
+USER-AGENT,WeChat*,DIRECT
+DOMAIN-SUFFIX,gtimg.com,DIRECT
+DOMAIN-SUFFIX,idqqimg.com,DIRECT
+DOMAIN-SUFFIX,igamecj.com,DIRECT
+DOMAIN-SUFFIX,myapp.com,DIRECT
+DOMAIN-SUFFIX,myqcloud.com,DIRECT
+DOMAIN-SUFFIX,qq.com,DIRECT
+DOMAIN-SUFFIX,tencent.com,DIRECT
+DOMAIN-SUFFIX,tencent-cloud.net,DIRECT
+USER-AGENT,YYeTs*,DIRECT
+DOMAIN-SUFFIX,jstucdn.com,DIRECT
+DOMAIN-SUFFIX,zimuzu.io,DIRECT
+DOMAIN-SUFFIX,zimuzu.tv,DIRECT
+DOMAIN-SUFFIX,zmz2019.com,DIRECT
+DOMAIN-SUFFIX,zmzapi.com,DIRECT
+DOMAIN-SUFFIX,zmzapi.net,DIRECT
+DOMAIN-SUFFIX,zmzfile.com,DIRECT
+DOMAIN-SUFFIX,ccgslb.com,DIRECT
+DOMAIN-SUFFIX,ccgslb.net,DIRECT
+DOMAIN-SUFFIX,chinanetcenter.com,DIRECT
+DOMAIN-SUFFIX,meixincdn.com,DIRECT
+DOMAIN-SUFFIX,ourdvs.com,DIRECT
+DOMAIN-SUFFIX,staticdn.net,DIRECT
+DOMAIN-SUFFIX,wangsu.com,DIRECT
+DOMAIN-SUFFIX,ipip.net,DIRECT
+DOMAIN-SUFFIX,ip.la,DIRECT
+DOMAIN-SUFFIX,ip-cdn.com,DIRECT
+DOMAIN-SUFFIX,ipv6-test.com,DIRECT
+DOMAIN-SUFFIX,test-ipv6.com,DIRECT
+DOMAIN-SUFFIX,whatismyip.com,DIRECT
+DOMAIN-SUFFIX,netspeedtestmaster.com,DIRECT
+DOMAIN,speedtest.macpaw.com,DIRECT
+DOMAIN-SUFFIX,awesome-hd.me,DIRECT
+DOMAIN-SUFFIX,broadcasthe.net,DIRECT
+DOMAIN-SUFFIX,chdbits.co,DIRECT
+DOMAIN-SUFFIX,classix-unlimited.co.uk,DIRECT
+DOMAIN-SUFFIX,empornium.me,DIRECT
+DOMAIN-SUFFIX,gazellegames.net,DIRECT
+DOMAIN-SUFFIX,hdchina.org,DIRECT
+DOMAIN-SUFFIX,hdsky.me,DIRECT
+DOMAIN-SUFFIX,icetorrent.org,DIRECT
+DOMAIN-SUFFIX,jpopsuki.eu,DIRECT
+DOMAIN-SUFFIX,keepfrds.com,DIRECT
+DOMAIN-SUFFIX,madsrevolution.net,DIRECT
+DOMAIN-SUFFIX,m-team.cc,DIRECT
+DOMAIN-SUFFIX,nanyangpt.com,DIRECT
+DOMAIN-SUFFIX,ncore.cc,DIRECT
+DOMAIN-SUFFIX,open.cd,DIRECT
+DOMAIN-SUFFIX,ourbits.club,DIRECT
+DOMAIN-SUFFIX,passthepopcorn.me,DIRECT
+DOMAIN-SUFFIX,privatehd.to,DIRECT
+DOMAIN-SUFFIX,redacted.ch,DIRECT
+DOMAIN-SUFFIX,springsunday.net,DIRECT
+DOMAIN-SUFFIX,tjupt.org,DIRECT
+DOMAIN-SUFFIX,totheglory.im,DIRECT
+DOMAIN-SUFFIX,acm.org,DIRECT
+DOMAIN-SUFFIX,acs.org,DIRECT
+DOMAIN-SUFFIX,aip.org,DIRECT
+DOMAIN-SUFFIX,ams.org,DIRECT
+DOMAIN-SUFFIX,annualreviews.org,DIRECT
+DOMAIN-SUFFIX,aps.org,DIRECT
+DOMAIN-SUFFIX,ascelibrary.org,DIRECT
+DOMAIN-SUFFIX,asm.org,DIRECT
+DOMAIN-SUFFIX,asme.org,DIRECT
+DOMAIN-SUFFIX,astm.org,DIRECT
+DOMAIN-SUFFIX,bmj.com,DIRECT
+DOMAIN-SUFFIX,cambridge.org,DIRECT
+DOMAIN-SUFFIX,cas.org,DIRECT
+DOMAIN-SUFFIX,clarivate.com,DIRECT
+DOMAIN-SUFFIX,ebscohost.com,DIRECT
+DOMAIN-SUFFIX,emerald.com,DIRECT
+DOMAIN-SUFFIX,engineeringvillage.com,DIRECT
+DOMAIN-SUFFIX,icevirtuallibrary.com,DIRECT
+DOMAIN-SUFFIX,ieee.org,DIRECT
+DOMAIN-SUFFIX,imf.org,DIRECT
+DOMAIN-SUFFIX,iop.org,DIRECT
+DOMAIN-SUFFIX,jamanetwork.com,DIRECT
+DOMAIN-SUFFIX,jhu.edu,DIRECT
+DOMAIN-SUFFIX,jstor.org,DIRECT
+DOMAIN-SUFFIX,karger.com,DIRECT
+DOMAIN-SUFFIX,libguides.com,DIRECT
+DOMAIN-SUFFIX,madsrevolution.net,DIRECT
+DOMAIN-SUFFIX,mpg.de,DIRECT
+DOMAIN-SUFFIX,myilibrary.com,DIRECT
+DOMAIN-SUFFIX,nature.com,DIRECT
+DOMAIN-SUFFIX,oecd-ilibrary.org,DIRECT
+DOMAIN-SUFFIX,osapublishing.org,DIRECT
+DOMAIN-SUFFIX,oup.com,DIRECT
+DOMAIN-SUFFIX,ovid.com,DIRECT
+DOMAIN-SUFFIX,oxfordartonline.com,DIRECT
+DOMAIN-SUFFIX,oxfordbibliographies.com,DIRECT
+DOMAIN-SUFFIX,oxfordmusiconline.com,DIRECT
+DOMAIN-SUFFIX,pnas.org,DIRECT
+DOMAIN-SUFFIX,proquest.com,DIRECT
+DOMAIN-SUFFIX,rsc.org,DIRECT
+DOMAIN-SUFFIX,sagepub.com,DIRECT
+DOMAIN-SUFFIX,sciencedirect.com,DIRECT
+DOMAIN-SUFFIX,sciencemag.org,DIRECT
+DOMAIN-SUFFIX,scopus.com,DIRECT
+DOMAIN-SUFFIX,siam.org,DIRECT
+DOMAIN-SUFFIX,spiedigitallibrary.org,DIRECT
+DOMAIN-SUFFIX,springer.com,DIRECT
+DOMAIN-SUFFIX,springerlink.com,DIRECT
+DOMAIN-SUFFIX,tandfonline.com,DIRECT
+DOMAIN-SUFFIX,un.org,DIRECT
+DOMAIN-SUFFIX,uni-bielefeld.de,DIRECT
+DOMAIN-SUFFIX,webofknowledge.com,DIRECT
+DOMAIN-SUFFIX,westlaw.com,DIRECT
+DOMAIN-SUFFIX,wiley.com,DIRECT
+DOMAIN-SUFFIX,worldbank.org,DIRECT
+DOMAIN-SUFFIX,worldscientific.com,DIRECT
+DOMAIN-SUFFIX,cn,DIRECT
+DOMAIN-SUFFIX,360in.com,DIRECT
+DOMAIN-SUFFIX,51ym.me,DIRECT
+DOMAIN-SUFFIX,8686c.com,DIRECT
+DOMAIN-SUFFIX,abchina.com,DIRECT
+DOMAIN-SUFFIX,accuweather.com,DIRECT
+DOMAIN-SUFFIX,aicoinstorge.com,DIRECT
+DOMAIN-SUFFIX,air-matters.com,DIRECT
+DOMAIN-SUFFIX,air-matters.io,DIRECT
+DOMAIN-SUFFIX,aixifan.com,DIRECT
+DOMAIN-SUFFIX,amd.com,DIRECT
+DOMAIN-SUFFIX,b612.net,DIRECT
+DOMAIN-SUFFIX,bdatu.com,DIRECT
+DOMAIN-SUFFIX,beitaichufang.com,DIRECT
+DOMAIN-SUFFIX,bjango.com,DIRECT
+DOMAIN-SUFFIX,booking.com,DIRECT
+DOMAIN-SUFFIX,bstatic.com,DIRECT
+DOMAIN-SUFFIX,cailianpress.com,DIRECT
+DOMAIN-SUFFIX,camera360.com,DIRECT
+DOMAIN-SUFFIX,chinaso.com,DIRECT
+DOMAIN-SUFFIX,chua.pro,DIRECT
+DOMAIN-SUFFIX,chuimg.com,DIRECT
+DOMAIN-SUFFIX,chunyu.mobi,DIRECT
+DOMAIN-SUFFIX,chushou.tv,DIRECT
+DOMAIN-SUFFIX,cmbchina.com,DIRECT
+DOMAIN-SUFFIX,cmbimg.com,DIRECT
+DOMAIN-SUFFIX,ctrip.com,DIRECT
+DOMAIN-SUFFIX,dfcfw.com,DIRECT
+DOMAIN-SUFFIX,docschina.org,DIRECT
+DOMAIN-SUFFIX,douban.com,DIRECT
+DOMAIN-SUFFIX,doubanio.com,DIRECT
+DOMAIN-SUFFIX,douyu.com,DIRECT
+DOMAIN-SUFFIX,dxycdn.com,DIRECT
+DOMAIN-SUFFIX,dytt8.net,DIRECT
+DOMAIN-SUFFIX,eastmoney.com,DIRECT
+DOMAIN-SUFFIX,eudic.net,DIRECT
+DOMAIN-SUFFIX,feng.com,DIRECT
+DOMAIN-SUFFIX,fengkongcloud.com,DIRECT
+DOMAIN-SUFFIX,frdic.com,DIRECT
+DOMAIN-SUFFIX,futu5.com,DIRECT
+DOMAIN-SUFFIX,futunn.com,DIRECT
+DOMAIN-SUFFIX,gandi.net,DIRECT
+DOMAIN-SUFFIX,geilicdn.com,DIRECT
+DOMAIN-SUFFIX,getpricetag.com,DIRECT
+DOMAIN-SUFFIX,gifshow.com,DIRECT
+DOMAIN-SUFFIX,godic.net,DIRECT
+DOMAIN-SUFFIX,hicloud.com,DIRECT
+DOMAIN-SUFFIX,hongxiu.com,DIRECT
+DOMAIN-SUFFIX,hostbuf.com,DIRECT
+DOMAIN-SUFFIX,huxiucdn.com,DIRECT
+DOMAIN-SUFFIX,huya.com,DIRECT
+DOMAIN-SUFFIX,infinitynewtab.com,DIRECT
+DOMAIN-SUFFIX,ithome.com,DIRECT
+DOMAIN-SUFFIX,java.com,DIRECT
+DOMAIN-SUFFIX,jidian.im,DIRECT
+DOMAIN-SUFFIX,kaiyanapp.com,DIRECT
+DOMAIN-SUFFIX,kaspersky-labs.com,DIRECT
+DOMAIN-SUFFIX,keepcdn.com,DIRECT
+DOMAIN-SUFFIX,kkmh.com,DIRECT
+DOMAIN-SUFFIX,licdn.com,DIRECT
+DOMAIN-SUFFIX,linkedin.com,DIRECT
+DOMAIN-SUFFIX,loli.net,DIRECT
+DOMAIN-SUFFIX,luojilab.com,DIRECT
+DOMAIN-SUFFIX,maoyan.com,DIRECT
+DOMAIN-SUFFIX,maoyun.tv,DIRECT
+DOMAIN-SUFFIX,meituan.com,DIRECT
+DOMAIN-SUFFIX,meituan.net,DIRECT
+DOMAIN-SUFFIX,mobike.com,DIRECT
+DOMAIN-SUFFIX,moke.com,DIRECT
+DOMAIN-SUFFIX,mubu.com,DIRECT
+DOMAIN-SUFFIX,myzaker.com,DIRECT
+DOMAIN-SUFFIX,nim-lang-cn.org,DIRECT
+DOMAIN-SUFFIX,nvidia.com,DIRECT
+DOMAIN-SUFFIX,oracle.com,DIRECT
+DOMAIN-SUFFIX,paypal.com,DIRECT
+DOMAIN-SUFFIX,paypalobjects.com,DIRECT
+DOMAIN-SUFFIX,qdaily.com,DIRECT
+DOMAIN-SUFFIX,qidian.com,DIRECT
+DOMAIN-SUFFIX,qyer.com,DIRECT
+DOMAIN-SUFFIX,qyerstatic.com,DIRECT
+DOMAIN-SUFFIX,raychase.net,DIRECT
+DOMAIN-SUFFIX,ronghub.com,DIRECT
+DOMAIN-SUFFIX,ruguoapp.com,DIRECT
+DOMAIN-SUFFIX,s-reader.com,DIRECT
+DOMAIN-SUFFIX,sankuai.com,DIRECT
+DOMAIN-SUFFIX,scomper.me,DIRECT
+DOMAIN-SUFFIX,seafile.com,DIRECT
+DOMAIN-SUFFIX,sm.ms,DIRECT
+DOMAIN-SUFFIX,smzdm.com,DIRECT
+DOMAIN-SUFFIX,snapdrop.net,DIRECT
+DOMAIN-SUFFIX,snwx.com,DIRECT
+DOMAIN-SUFFIX,sspai.com,DIRECT
+DOMAIN-SUFFIX,takungpao.com,DIRECT
+DOMAIN-SUFFIX,teamviewer.com,DIRECT
+DOMAIN-SUFFIX,tianyancha.com,DIRECT
+DOMAIN-SUFFIX,udacity.com,DIRECT
+DOMAIN-SUFFIX,uning.com,DIRECT
+DOMAIN-SUFFIX,vmware.com,DIRECT
+DOMAIN-SUFFIX,weather.com,DIRECT
+DOMAIN-SUFFIX,weico.cc,DIRECT
+DOMAIN-SUFFIX,weidian.com,DIRECT
+DOMAIN-SUFFIX,xiachufang.com,DIRECT
+DOMAIN-SUFFIX,ximalaya.com,DIRECT
+DOMAIN-SUFFIX,xinhuanet.com,DIRECT
+DOMAIN-SUFFIX,xmcdn.com,DIRECT
+DOMAIN-SUFFIX,yangkeduo.com,DIRECT
+DOMAIN-SUFFIX,zhangzishi.cc,DIRECT
+DOMAIN-SUFFIX,zhihu.com,DIRECT
+DOMAIN-SUFFIX,zhimg.com,DIRECT
+DOMAIN-SUFFIX,zhuihd.com,DIRECT
+DOMAIN,download.jetbrains.com,DIRECT
+DOMAIN,images-cn.ssl-images-amazon.com,DIRECT
+IP-CIDR,119.28.28.28/32,DIRECT,no-resolve
+GEOIP,CN,DIRECT
+
+FINAL,⚓️其他流量
+
+[URL Rewrite]
+^https?://(www.)?(g|google).cn https://www.google.com 302

+ 1 - 1
resources/views/material/admin/announcement/create.tpl

@@ -35,7 +35,7 @@
                                         <div class="form-group form-group-label">
                                         <div class="form-group form-group-label">
                                             <label class="floating-label" for="vip">VIP等级</label>
                                             <label class="floating-label" for="vip">VIP等级</label>
                                             <input class="form-control maxwidth-edit" id="vip" type="text" name="vip">
                                             <input class="form-control maxwidth-edit" id="vip" type="text" name="vip">
-                                            <p class="form-control-guide"><i class="material-icons">info</i>发送给高于这个等级的用户
+                                            <p class="form-control-guide"><i class="material-icons">info</i>发送给等于或高于这个等级的用户
                                                 0为不分级</p>
                                                 0为不分级</p>
                                             <div class="checkbox switch">
                                             <div class="checkbox switch">
                                                 <label for="issend">
                                                 <label for="issend">

+ 119 - 0
resources/views/material/admin/config/edit.tpl

@@ -0,0 +1,119 @@
+{include file='admin/main.tpl'}
+
+
+<main class="content">
+    <div class="content-header ui-content-header">
+        <div class="container">
+            <h1 class="content-heading">配置编辑 #{$edit_config->id}</h1>
+        </div>
+    </div>
+    <div class="container">
+        <div class="col-lg-12 col-sm-12">
+            <section class="content-inner margin-top-no">
+
+                <div class="card">
+                    <div class="card-main">
+                        <div class="card-inner">
+
+                            <div class="form-group form-group-label">
+                                <label class="floating-label" for="key">配置名</label>
+                                <input class="form-control maxwidth-edit" id="key" type="text" value="{$edit_config->key}" readonly>
+                            </div>
+
+                            <div class="form-group form-group-label">
+                                <label class="floating-label" for="name">配置名称</label>
+                                <input class="form-control maxwidth-edit" id="name" type="text" value="{$edit_config->name}" readonly>
+                            </div>
+
+                        {if $edit_config->comment!=''}
+                            <div class="form-group form-group-label">
+                                <label class="floating-label" for="comment">配置描述</label>
+                                <textarea class="form-control maxwidth-edit" id="comment" rows="4" readonly>{$edit_config->comment}</textarea>
+                            </div>
+                        {/if}
+
+                        {if strpos($edit_config->key,'.bool.') === false}
+                            <div class="form-group form-group-label">
+                                <label class="floating-label" for="value">配置值</label>
+                                <textarea class="form-control maxwidth-edit" id="value" rows="5">{$edit_config->getValue()}</textarea>
+                            </div>
+                        {else}
+                            <div class="form-group form-group-label">
+                                <label for="value">
+                                    <label class="floating-label" for="value">配置开关</label>
+                                    <select id="value" class="form-control maxwidth-edit" name="value">
+                                        <option value="0" {if !$edit_config->getValue()}selected{/if}>关闭</option>
+                                        <option value="1" {if $edit_config->getValue()}selected{/if}>开启</option>
+                                    </select>
+                                </label>
+                            </div>
+                        {/if}
+
+                        </div>
+                    </div>
+                </div>
+
+                <div class="card">
+                    <div class="card-main">
+                        <div class="card-inner">
+
+                            <div class="form-group">
+                                <div class="row">
+                                    <div class="col-md-10 col-md-push-1">
+                                        <button id="submit" type="submit"
+                                                class="btn btn-block btn-brand waves-attach waves-light">修改
+                                        </button>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
+                {include file='dialog.tpl'}
+        </div>
+
+
+    </div>
+</main>
+
+
+{include file='admin/footer.tpl'}
+
+
+<script>
+    window.addEventListener('load', () => {
+        function submit() {
+            $.ajax({
+                type: "PUT",
+                url: "/admin/config/update/{$edit_config->key}",
+                dataType: "json",
+                data: {
+                    value: $$getValue('value')
+                },
+                success: data => {
+                    if (data.ret) {
+                        $("#result").modal();
+                        $$.getElementById('msg').innerHTML = data.msg;
+                        window.setTimeout("location.href=top.document.referrer", {$config['jump_delay']});
+                    } else {
+                        $("#result").modal();
+                        $$.getElementById('msg').innerHTML = data.msg;
+                    }
+                },
+                error: jqXHR => {
+                    $("#result").modal();
+                    $$.getElementById('msg').innerHTML = `发生错误:${
+                            jqXHR.status
+                            }`;
+                }
+            });
+        }
+
+        $("html").keydown(event => {
+            if (event.keyCode == 13) login();
+        });
+
+        $$.getElementById('submit').addEventListener('click', submit);
+    })
+</script>

+ 41 - 0
resources/views/material/admin/config/telegram/index.tpl

@@ -0,0 +1,41 @@
+{include file='admin/main.tpl'}
+
+<main class="content">
+    <div class="content-header ui-content-header">
+        <div class="container">
+            <h1 class="content-heading">Telegram 配置</h1>
+        </div>
+    </div>
+    <div class="container">
+        <div class="col-lg-12 col-sm-12">
+            <section class="content-inner margin-top-no">
+
+                <div class="card">
+                    <div class="card-main">
+                        <div class="card-inner">
+                            <p>显示表项: {include file='table/checkbox.tpl'}</p>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="table-responsive">
+                    {include file='table/table.tpl'}
+                </div>
+
+
+        </div>
+
+
+    </div>
+</main>
+
+{include file='admin/footer.tpl'}
+
+<script>
+    {include file='table/js_1.tpl'}
+
+    window.addEventListener('load', () => {
+        {include file='table/js_2.tpl'}
+    });
+</script>
+

+ 113 - 0
resources/views/material/admin/config/user/register.tpl

@@ -0,0 +1,113 @@
+{include file='admin/main.tpl'}
+
+<main class="content">
+    <div class="content-header ui-content-header">
+        <div class="container">
+            <h1 class="content-heading">注册设置</h1>
+        </div>
+    </div>
+    <div class="container">
+        <div class="col-lg-12 col-sm-12">
+            <section class="content-inner margin-top-no">
+
+                <div class="card">
+                    <div class="card-main">
+                        <div class="card-inner">
+                            <div class="form-group form-group-label">
+                                <input class="form-control maxwidth-edit" id="name" type="text" value="{$edit_config->name}" readonly>
+                            </div>
+                            <div class="form-group form-group-label">
+                                <label for="value">
+                                    <select id="value" class="form-control maxwidth-edit" name="value">
+                                        {$value = $edit_config->getValue()}
+                                        <option value="open" {if $value == 'open'}selected{/if}>开启</option>
+                                        <option value="close" {if $value == 'close'}selected{/if}>关闭</option>
+                                        <option value="invite" {if $value == 'invite'}selected{/if}>仅限邀请码</option>
+                                    </select>
+                                </label>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="card">
+                    <div class="card-main">
+                        <div class="card-inner">
+
+                            <div class="form-group">
+                                <div class="row">
+                                    <div class="col-md-10 col-md-push-1">
+                                        <button id="submit" type="submit"
+                                                class="btn btn-block btn-brand waves-attach waves-light">修改
+                                        </button>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="card">
+                    <div class="card-main">
+                        <div class="card-inner">
+                            <p>显示表项: {include file='table/checkbox.tpl'}</p>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="table-responsive">
+                    {include file='table/table.tpl'}
+                </div>
+
+                {include file='dialog.tpl'}
+        </div>
+
+
+    </div>
+</main>
+
+{include file='admin/footer.tpl'}
+
+<script>
+    {include file='table/js_1.tpl'}
+
+    window.addEventListener('load', () => {
+        {include file='table/js_2.tpl'}
+    });
+</script>
+
+<script>
+    window.addEventListener('load', () => {
+        function submit() {
+            $.ajax({
+                type: "PUT",
+                url: "/admin/config/update/{$edit_config->key}",
+                dataType: "json",
+                data: {
+                    value: $$getValue('value')
+                },
+                success: data => {
+                    if (data.ret) {
+                        $("#result").modal();
+                        $$.getElementById('msg').innerHTML = data.msg;
+                        window.setTimeout("location.href=window.location.href", {$config['jump_delay']});
+                    } else {
+                        $("#result").modal();
+                        $$.getElementById('msg').innerHTML = data.msg;
+                    }
+                },
+                error: jqXHR => {
+                    $("#result").modal();
+                    $$.getElementById('msg').innerHTML = `发生错误:${
+                            jqXHR.status
+                            }`;
+                }
+            });
+        }
+
+        $("html").keydown(event => {
+            if (event.keyCode == 13) login();
+        });
+
+        $$.getElementById('submit').addEventListener('click', submit);
+    })
+</script>

+ 42 - 0
resources/views/material/admin/detect/ban.tpl

@@ -0,0 +1,42 @@
+ {include file='admin/main.tpl'}
+
+
+<main class="content">
+	<div class="content-header ui-content-header">
+		<div class="container">
+			<h1 class="content-heading">审计封禁记录</h1>
+		</div>
+	</div>
+	<div class="container">
+		<div class="col-lg-12 col-md-12">
+			<section class="content-inner margin-top-no">
+
+				<div class="card">
+					<div class="card-main">
+						<div class="card-inner">
+							<p>系统中所有审计封禁记录。</p>
+							<p>显示表项:
+								{include file='table/checkbox.tpl'}
+							</p>
+						</div>
+					</div>
+				</div>
+
+				<div class="table-responsive">
+					{include file='table/table.tpl'}
+				</div>
+
+		</div>
+	</div>
+</main>
+
+
+{include file='admin/footer.tpl'}
+
+<script>
+	{include file='table/js_1.tpl'}
+
+	$(document).ready(function(){
+		{include file='table/js_2.tpl'}
+	});
+</script>

+ 8 - 0
resources/views/material/admin/main.tpl

@@ -112,14 +112,22 @@
                         <li><a href="/admin/user"><i class="icon icon-lg">supervisor_account</i>&nbsp;用户列表</a></li>
                         <li><a href="/admin/user"><i class="icon icon-lg">supervisor_account</i>&nbsp;用户列表</a></li>
                         <li><a href="/admin/relay"><i class="icon icon-lg">compare_arrows</i>&nbsp;中转规则</a></li>
                         <li><a href="/admin/relay"><i class="icon icon-lg">compare_arrows</i>&nbsp;中转规则</a></li>
                         <li><a href="/admin/invite"><i class="icon icon-lg">loyalty</i>&nbsp;邀请与返利</a></li>
                         <li><a href="/admin/invite"><i class="icon icon-lg">loyalty</i>&nbsp;邀请与返利</a></li>
+                        <li><a href="/admin/subscribe"><i class="icon icon-lg">dialer_sip</i>&nbsp;订阅记录</a></li>
                         <li><a href="/admin/login"><i class="icon icon-lg">text_fields</i>&nbsp;登录记录</a></li>
                         <li><a href="/admin/login"><i class="icon icon-lg">text_fields</i>&nbsp;登录记录</a></li>
                         <li><a href="/admin/alive"><i class="icon icon-lg">important_devices</i>&nbsp;在线IP</a></li>
                         <li><a href="/admin/alive"><i class="icon icon-lg">important_devices</i>&nbsp;在线IP</a></li>
                     </ul>
                     </ul>
 
 
+                    <a class="waves-attach" data-toggle="collapse" href="#ui_menu_config">配置</a>
+                    <ul class="menu-collapse collapse in" id="ui_menu_config">
+                        <li><a href="/admin/config/telegram"><i class="icon icon-lg">supervisor_account</i>&nbsp;Telegram</a></li>
+                        <li><a href="/admin/config/register"><i class="icon icon-lg">supervisor_account</i>&nbsp;用户注册</a></li>
+                    </ul>
+
                     <a class="waves-attach" data-toggle="collapse" href="#ui_menu_detect">审计</a>
                     <a class="waves-attach" data-toggle="collapse" href="#ui_menu_detect">审计</a>
                     <ul class="menu-collapse collapse in" id="ui_menu_detect">
                     <ul class="menu-collapse collapse in" id="ui_menu_detect">
                         <li><a href="/admin/detect"><i class="icon icon-lg">account_balance</i>&nbsp;审计规则</a></li>
                         <li><a href="/admin/detect"><i class="icon icon-lg">account_balance</i>&nbsp;审计规则</a></li>
                         <li><a href="/admin/detect/log"><i class="icon icon-lg">assignment_late</i>&nbsp;审计记录</a></li>
                         <li><a href="/admin/detect/log"><i class="icon icon-lg">assignment_late</i>&nbsp;审计记录</a></li>
+                        <li><a href="/admin/detect/ban"><i class="icon icon-lg">text_fields</i>&nbsp;审计封禁</a></li>
                     </ul>
                     </ul>
 
 
 
 

+ 8 - 2
resources/views/material/admin/node/create.tpl

@@ -22,8 +22,14 @@
                                 <div class="form-group form-group-label">
                                 <div class="form-group form-group-label">
                                     <label class="floating-label" for="server">节点地址</label>
                                     <label class="floating-label" for="server">节点地址</label>
                                     <input class="form-control maxwidth-edit" id="server" type="text" name="server">
                                     <input class="form-control maxwidth-edit" id="server" type="text" name="server">
-                                    <p class="form-control-guide"><i class="material-icons">info</i>如果填写为域名,“节点IP”会自动设置为解析的IP
-                                    </p>
+                                    <p class="form-control-guide"><i class="material-icons">info</i>如果填写为域名,“节点IP”会自动设置为解析的IP</p>
+
+                                    <p class="form-control-guide"><i class="material-icons">info</i>附加说明,适用于 SS 节点以及 SS 中转,即 sort 为 0 或 10</p>
+                                    <p class="form-control-guide"><i class="material-icons">info</i>单个端口偏移格式:8.8.8.8;port=80#10080</p>
+                                    <p class="form-control-guide"><i class="material-icons">info</i>多个端口偏移格式:8.8.8.8;port=80#10080+443#10443</p>
+                                    <p class="form-control-guide"><i class="material-icons">info</i>重写节点入口地址:8.8.8.8;server=in.nodeserver.com</p>
+                                    <p class="form-control-guide"><i class="material-icons">info</i>以上两项同时使用:8.8.8.8;server=in.nodeserver.com|port=80#10080+443#10443</p>
+
                                 </div>
                                 </div>
 
 
                                 <div class="form-group form-group-label">
                                 <div class="form-group form-group-label">

+ 8 - 2
resources/views/material/admin/node/edit.tpl

@@ -24,8 +24,14 @@
                                     <label class="floating-label" for="server">节点地址</label>
                                     <label class="floating-label" for="server">节点地址</label>
                                     <input class="form-control maxwidth-edit" id="server" name="server" type="text"
                                     <input class="form-control maxwidth-edit" id="server" name="server" type="text"
                                            value="{$node->server}">
                                            value="{$node->server}">
-                                    <p class="form-control-guide"><i class="material-icons">info</i>如果填写为域名,“节点IP”会自动设置为解析的IP
-                                    </p>
+                                    <p class="form-control-guide"><i class="material-icons">info</i>如果填写为域名,“节点IP”会自动设置为解析的IP</p>
+
+                                    <p class="form-control-guide"><i class="material-icons">info</i>附加说明,适用于 SS 节点以及 SS 中转,即 sort 为 0 或 10</p>
+                                    <p class="form-control-guide"><i class="material-icons">info</i>单个端口偏移格式:8.8.8.8;port=80#10080</p>
+                                    <p class="form-control-guide"><i class="material-icons">info</i>多个端口偏移格式:8.8.8.8;port=80#10080+443#10443</p>
+                                    <p class="form-control-guide"><i class="material-icons">info</i>重写节点入口地址:8.8.8.8;server=in.nodeserver.com</p>
+                                    <p class="form-control-guide"><i class="material-icons">info</i>以上两项同时使用:8.8.8.8;server=in.nodeserver.com|port=80#10080+443#10443</p>
+
                                 </div>
                                 </div>
 
 
                                 <div class="form-group form-group-label">
                                 <div class="form-group form-group-label">

+ 41 - 0
resources/views/material/admin/subscribe.tpl

@@ -0,0 +1,41 @@
+{include file='admin/main.tpl'}
+
+<main class="content">
+    <div class="content-header ui-content-header">
+        <div class="container">
+            <h1 class="content-heading">订阅记录</h1>
+        </div>
+    </div>
+    <div class="container">
+        <div class="col-lg-12 col-sm-12">
+            <section class="content-inner margin-top-no">
+
+                <div class="card">
+                    <div class="card-main">
+                        <div class="card-inner">
+                            <p>这里是所有用户最近 {$config['subscribeLog_keep_days']} 天的订阅记录。</p>
+                            <p>显示表项: {include file='table/checkbox.tpl'}</p>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="table-responsive">
+                    {include file='table/table.tpl'}
+                </div>
+
+
+        </div>
+
+
+    </div>
+</main>
+
+{include file='admin/footer.tpl'}
+
+<script>
+    {include file='table/js_1.tpl'}
+
+    window.addEventListener('load', () => {
+        {include file='table/js_2.tpl'}
+    });
+</script>

+ 198 - 0
resources/views/material/admin/user/bought.tpl

@@ -0,0 +1,198 @@
+{include file='admin/main.tpl'}
+
+<main class="content">
+    <div class="content-header ui-content-header">
+        <div class="container">
+            <h1 class="content-heading">#{$user->id} [{$user->user_name}] 用户购买明细</h1>
+        </div>
+    </div>
+    <div class="container">
+        <div class="col-lg-12 col-sm-12">
+            <section class="content-inner margin-top-no">
+
+                <form id="main_form">
+                    <div class="card">
+                        <div class="card-main">
+                            <div class="card-inner">
+
+                                <div class="form-group form-group-label control-highlight-custom dropdown">
+                                    <label class="floating-label" for="buy_shop">选择套餐</label>
+                                    <button id="buy_shop" class="form-control maxwidth-edit" name="buy_shop"
+                                            data-toggle="dropdown">
+                                        请选择套餐
+                                    </button>
+                                    <ul class="dropdown-menu" aria-labelledby="buy_shop">
+                                        {foreach $shops as $shop}
+                                            <li>
+                                                <a href="#" class="dropdown-option" onclick="return false;"
+                                                   val="{$shop->id}" data="buy_shop">{$shop->name}</a>
+                                            </li>
+                                        {/foreach}
+                                    </ul>
+                                </div>
+
+                                <div class="form-group form-group-label control-highlight-custom dropdown">
+                                    <label class="floating-label" for="buy_type">类型</label>
+                                    <button id="buy_type" class="form-control maxwidth-edit" name="buy_type"
+                                            data-toggle="dropdown" value="0">
+                                        添加
+                                    </button>
+                                    <ul class="dropdown-menu" aria-labelledby="buy_type">
+                                        <li>
+                                            <a href="#" class="dropdown-option" onclick="return false;" val="0"
+                                               data="buy_type">添加</a>
+                                        </li>
+                                        <li>
+                                            <a href="#" class="dropdown-option" onclick="return false;" val="1"
+                                               data="buy_type">购买</a>
+                                        </li>
+                                    </ul>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="card">
+                        <div class="card-main">
+                            <div class="card-inner">
+
+                                <div class="form-group">
+                                    <div class="row">
+                                        <div class="col-md-10 col-md-push-1">
+                                            <button id="submit" type="submit" class="btn btn-block btn-brand">添加
+                                            </button>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                </form>
+
+                <div class="card">
+                    <div class="card-main">
+                        <div class="card-inner">
+                            <p>显示表项: {include file='table/checkbox.tpl'}</p>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="table-responsive">
+                    {include file='table/table.tpl'}
+                </div>
+
+                <div aria-hidden="true" class="modal modal-va-middle fade" id="delete_modal" role="dialog"
+                     tabindex="-1">
+                    <div class="modal-dialog modal-xs">
+                        <div class="modal-content">
+                            <div class="modal-heading">
+                                <a class="modal-close" data-dismiss="modal">×</a>
+                                <h2 class="modal-title">确认要删除该条购买记录?</h2>
+                            </div>
+                            <div class="modal-inner">
+                                <p>操作不可逆,请您确认。</p>
+                            </div>
+                            <div class="modal-footer">
+                                <p class="text-right">
+                                    <button class="btn btn-flat btn-brand-accent waves-attach waves-effect"
+                                            data-dismiss="modal" type="button">取消
+                                    </button>
+                                    <button class="btn btn-flat btn-brand-accent waves-attach" data-dismiss="modal"
+                                            id="delete_input" type="button">确定
+                                    </button>
+                                </p>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
+                {include file='dialog.tpl'}
+
+        </div>
+
+
+    </div>
+</main>
+
+{include file='admin/footer.tpl'}
+
+<script>
+    {include file='table/js_1.tpl'}
+
+    window.addEventListener('load', () => {
+        {include file='table/js_2.tpl'}
+    });
+
+    function delete_modal_show(id) {
+        deleteid = id;
+        $("#delete_modal").modal();
+    }
+
+    $$.getElementById('delete_input').addEventListener('click', delete_id);
+
+    function delete_id() {
+        $.ajax({
+            type: "DELETE",
+            url: "/admin/user/bought",
+            dataType: "json",
+            data: {
+                id: deleteid
+            },
+            success: data => {
+                if (data.ret) {
+                    $("#result").modal();
+                    $$.getElementById('msg').innerHTML = data.msg;
+                    {include file='table/js_delete.tpl'}
+                } else {
+                    $("#result").modal();
+                    $$.getElementById('msg').innerHTML = data.msg;
+                }
+            },
+            error: jqXHR => {
+                $("#result").modal();
+                $$.getElementById('msg').innerHTML = `${ldelim}jqXHR{rdelim} 发生了错误。`;
+            }
+        });
+    }
+</script>
+
+{literal}
+<script>
+    $('#main_form').validate({
+        submitHandler: () => {
+            $.ajax({
+                type: "POST",
+                url: "bought/buy",
+                dataType: "json",
+                {/literal}
+                data: {
+                    buy_shop: $$getValue('buy_shop'),
+                    buy_type: $$getValue('buy_type'),
+                    {literal}
+                },
+                success: (data) => {
+                    if (data.ret) {
+                        $("#result").modal();
+                        $$.getElementById('msg').innerHTML = data.msg;
+                        {/literal}
+                        window.setTimeout("window.location.reload()", {$config['jump_delay']});
+                        {literal}
+                    } else {
+                        $("#result").modal();
+                        $$.getElementById('msg').innerHTML = data.msg;
+                    }
+                },
+                error: (jqXHR) => {
+                    $("#result").modal();
+                    $$.getElementById('msg').innerHTML = `${
+                            data.msg
+                            } 发生错误了`;
+                }
+            });
+        }
+    });
+</script>
+
+{/literal}

+ 41 - 0
resources/views/material/admin/user/code.tpl

@@ -0,0 +1,41 @@
+{include file='admin/main.tpl'}
+
+<main class="content">
+    <div class="content-header ui-content-header">
+        <div class="container">
+            <h1 class="content-heading">#{$user->id} [{$user->user_name}] 用户充值明细</h1>
+        </div>
+    </div>
+    <div class="container">
+        <div class="col-lg-12 col-sm-12">
+            <section class="content-inner margin-top-no">
+
+                <div class="card">
+                    <div class="card-main">
+                        <div class="card-inner">
+                            <p>显示表项: {include file='table/checkbox.tpl'}</p>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="table-responsive">
+                    {include file='table/table.tpl'}
+                </div>
+
+        </div>
+
+
+    </div>
+</main>
+
+{include file='admin/footer.tpl'}
+
+<script>
+    {include file='table/js_1.tpl'}
+
+    window.addEventListener('load', () => {
+        {include file='table/js_2.tpl'}
+    });
+</script>
+
+

+ 41 - 0
resources/views/material/admin/user/detect.tpl

@@ -0,0 +1,41 @@
+{include file='admin/main.tpl'}
+
+<main class="content">
+    <div class="content-header ui-content-header">
+        <div class="container">
+            <h1 class="content-heading">#{$user->id} [{$user->user_name}] 用户审计记录</h1>
+        </div>
+    </div>
+    <div class="container">
+        <div class="col-lg-12 col-sm-12">
+            <section class="content-inner margin-top-no">
+
+                <div class="card">
+                    <div class="card-main">
+                        <div class="card-inner">
+                            <p>显示表项: {include file='table/checkbox.tpl'}</p>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="table-responsive">
+                    {include file='table/table.tpl'}
+                </div>
+
+        </div>
+
+
+    </div>
+</main>
+
+{include file='admin/footer.tpl'}
+
+<script>
+    {include file='table/js_1.tpl'}
+
+    window.addEventListener('load', () => {
+        {include file='table/js_2.tpl'}
+    });
+</script>
+
+

+ 39 - 0
resources/views/material/admin/user/edit.tpl

@@ -84,6 +84,44 @@
                     </div>
                     </div>
                 </div>
                 </div>
 
 
+				<div class="card">
+					<div class="card-main">
+						<div class="card-inner">
+
+                            <div class="form-group form-group-label">
+                                <label class="floating-label" for="ban_time">手动封禁时长 (分钟),不封禁不要修改</label>
+                                <input class="form-control maxwidth-edit" id="ban_time" type="text"
+                                       value="0">
+                            </div>
+
+                            <div class="form-group form-group-label">
+                                <label class="floating-label" for="last_detect_ban_time">最后一次被封禁的时间</label>
+                                <input class="form-control maxwidth-edit" id="last_detect_ban_time" type="text"
+                                       value="{$edit_user->last_detect_ban_time()}" readonly>
+                            </div>
+
+                            <div class="form-group form-group-label">
+                                <label class="floating-label" for="relieve_time">当前解封时间</label>
+                                <input class="form-control maxwidth-edit" id="relieve_time" type="text"
+                                       value="{$edit_user->relieve_time()}" readonly>
+                            </div>
+
+                            <div class="form-group form-group-label">
+                                <label class="floating-label" for="detect_ban_number">累计封禁次数</label>
+                                <input class="form-control maxwidth-edit" id="detect_ban_number" type="text"
+                                       value="{if $edit_user->detect_ban_number()==0}标杆用户,没有被封禁过耶{else}太坏了,这位用户累计被封禁过 {$edit_user->detect_ban_number()} 次呢{/if}" readonly>
+                            </div>
+
+                            <div class="form-group form-group-label">
+                                <label class="floating-label" for="all_detect_number">累计违规次数</label>
+                                <input class="form-control maxwidth-edit" id="all_detect_number" type="text"
+                                       value="{$edit_user->all_detect_number}" readonly>
+                            </div>
+
+						</div>
+					</div>
+				</div>
+
                 <div class="card">
                 <div class="card">
                     <div class="card-main">
                     <div class="card-main">
                         <div class="card-inner">
                         <div class="card-inner">
@@ -339,6 +377,7 @@
                     enable,
                     enable,
                     is_admin,
                     is_admin,
                     ga_enable,
                     ga_enable,
+                    ban_time: $$getValue('ban_time'),
                     ref_by: $$getValue('ref_by'),
                     ref_by: $$getValue('ref_by'),
                     forbidden_ip: $$getValue('forbidden_ip'),
                     forbidden_ip: $$getValue('forbidden_ip'),
                     forbidden_port: $$getValue('forbidden_port'),
                     forbidden_port: $$getValue('forbidden_port'),

+ 26 - 1
resources/views/material/admin/user/index.tpl

@@ -32,6 +32,28 @@
                                 <input class="form-control maxwidth-edit" id="quick_create" type="text">
                                 <input class="form-control maxwidth-edit" id="quick_create" type="text">
                             </div>
                             </div>
                         </div>
                         </div>
+
+                        <div class="card-inner">
+                            <div class="form-group form-group-label">
+                                <label for="new_user_add_shop">
+                                    <label class="floating-label" for="new_user_add_shop"> 是否添加套餐 </label>
+                                    <select id="new_user_add_shop" class="form-control maxwidth-edit">
+                                        <option value="0">不添加</option>
+                                    {foreach $shops as $shop}
+                                        <option value="{$shop->id}">{$shop->name}</option>
+                                    {/foreach}
+                                    </select>
+                                </label>
+                            </div>
+                        </div>
+
+                        <div class="card-inner">
+                            <div class="form-group form-group-label">
+                                <label class="floating-label" for="new_user_money"> 用户余额「-1为按默认设置,其他为指定值」 </label>
+                                <input class="form-control maxwidth-edit" id="new_user_money" type="text" value="-1">
+                            </div>
+                        </div>
+
                         <div class="card-action">
                         <div class="card-action">
                             <div class="card-action-btn pull-left">
                             <div class="card-action-btn pull-left">
                                 <a class="btn btn-flat waves-attach waves-light" id="quick_create_confirm"><span
                                 <a class="btn btn-flat waves-attach waves-light" id="quick_create_confirm"><span
@@ -131,6 +153,7 @@
             columns: [
             columns: [
                 {literal}
                 {literal}
                 {"data": "op", "orderable": false},
                 {"data": "op", "orderable": false},
+                {"data": "querys"},
                 {"data": "id"},
                 {"data": "id"},
                 {"data": "user_name"},
                 {"data": "user_name"},
                 {"data": "remark"},
                 {"data": "remark"},
@@ -261,7 +284,9 @@
                 url: '/admin/user/create',
                 url: '/admin/user/create',
                 dataType: 'json',
                 dataType: 'json',
                 data: {
                 data: {
-                    userEmail: $$getValue('quick_create')
+                    userEmail: $$getValue('quick_create'),
+                    userMoney: $$getValue('new_user_money'),
+                    userShop: $$getValue('new_user_add_shop')
                 },
                 },
                 success: data => {
                 success: data => {
                     $("#result").modal();
                     $("#result").modal();

+ 41 - 0
resources/views/material/admin/user/login.tpl

@@ -0,0 +1,41 @@
+{include file='admin/main.tpl'}
+
+<main class="content">
+    <div class="content-header ui-content-header">
+        <div class="container">
+            <h1 class="content-heading">#{$user->id} [{$user->user_name}] 用户登录记录</h1>
+        </div>
+    </div>
+    <div class="container">
+        <div class="col-lg-12 col-sm-12">
+            <section class="content-inner margin-top-no">
+
+                <div class="card">
+                    <div class="card-main">
+                        <div class="card-inner">
+                            <p>显示表项: {include file='table/checkbox.tpl'}</p>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="table-responsive">
+                    {include file='table/table.tpl'}
+                </div>
+
+        </div>
+
+
+    </div>
+</main>
+
+{include file='admin/footer.tpl'}
+
+<script>
+    {include file='table/js_1.tpl'}
+
+    window.addEventListener('load', () => {
+        {include file='table/js_2.tpl'}
+    });
+</script>
+
+

+ 41 - 0
resources/views/material/admin/user/sublog.tpl

@@ -0,0 +1,41 @@
+{include file='admin/main.tpl'}
+
+<main class="content">
+    <div class="content-header ui-content-header">
+        <div class="container">
+            <h1 class="content-heading">#{$user->id} [{$user->user_name}] 用户订阅记录</h1>
+        </div>
+    </div>
+    <div class="container">
+        <div class="col-lg-12 col-sm-12">
+            <section class="content-inner margin-top-no">
+
+                <div class="card">
+                    <div class="card-main">
+                        <div class="card-inner">
+                            <p>显示表项: {include file='table/checkbox.tpl'}</p>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="table-responsive">
+                    {include file='table/table.tpl'}
+                </div>
+
+        </div>
+
+
+    </div>
+</main>
+
+{include file='admin/footer.tpl'}
+
+<script>
+    {include file='table/js_1.tpl'}
+
+    window.addEventListener('load', () => {
+        {include file='table/js_2.tpl'}
+    });
+</script>
+
+

+ 41 - 0
resources/views/material/admin/user/traffic.tpl

@@ -0,0 +1,41 @@
+{include file='admin/main.tpl'}
+
+<main class="content">
+    <div class="content-header ui-content-header">
+        <div class="container">
+            <h1 class="content-heading">#{$user->id} [{$user->user_name}] 用户流量记录</h1>
+        </div>
+    </div>
+    <div class="container">
+        <div class="col-lg-12 col-sm-12">
+            <section class="content-inner margin-top-no">
+
+                <div class="card">
+                    <div class="card-main">
+                        <div class="card-inner">
+                            <p>显示表项: {include file='table/checkbox.tpl'}</p>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="table-responsive">
+                    {include file='table/table.tpl'}
+                </div>
+
+        </div>
+
+
+    </div>
+</main>
+
+{include file='admin/footer.tpl'}
+
+<script>
+    {include file='table/js_1.tpl'}
+
+    window.addEventListener('load', () => {
+        {include file='table/js_2.tpl'}
+    });
+</script>
+
+

+ 61 - 0
resources/views/material/doc/index.tpl

@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+  <meta name="viewport" content="width=device-width,initial-scale=1">
+  <meta charset="UTF-8">
+  <title>{$config['documents_name']}</title>
+  <link rel="stylesheet" href="//unpkg.com/docsify/themes/vue.css">
+</head>
+<body>
+  <nav>
+    <a href="/">回到主页</a>
+      <li><a href="/user/">用户中心</a>
+        <ul>
+          <li><a href="/user/edit">资料编辑</a></li>
+          <li><a href="/user/node">节点中心</a></li>
+          <li><a href="/user/code">充值捐赠</a></li>
+          <li><a href="/user/shop">套餐购买</a></li>
+        </ul>
+      </li>
+    </ul>
+  </nav>
+  <div id="docs">加载中...</div>
+  <script>
+    const root = window.location.host;
+    window.$docsify = {
+      name: '{$config['documents_name']}',
+      alias: {
+            '/.*/_sidebar.md': '/_sidebar.md'
+      },
+      basePath: '{if $config['remote_documents'] === true}{$config['documents_source']}{else}/docs/SSPanel{/if}',
+      auto2top: true,
+      loadSidebar: true,
+      autoHeader: true,
+      homepage: 'index.md',
+      nameLink: '/doc/',
+      el: '#docs',
+      copyCode: {
+          buttonText : '点击拷贝',
+          errorText  : '拷贝失败',
+          successText: '拷贝成功'
+      },
+      {literal}
+      plugins: [
+        function(hook, vm) {
+          hook.beforeEach((markdown) => {
+            const result = markdown.replace(/\/sublink\?type=(\w+)/g, `//${root}/sublink?type=$1`)
+            return result
+          })
+        }
+      ]
+      {/literal}
+    }
+  </script>
+  <script src="//unpkg.com/docsify/lib/docsify.min.js"></script>
+  <script src="//unpkg.com/docsify/lib/plugins/emoji.js"></script>
+  <script src="//unpkg.com/docsify/lib/plugins/zoom-image.js"></script>
+  <script src="//unpkg.com/docsify-copy-code"></script>
+  <script src="//unpkg.com/prismjs/components/prism-yaml.min.js"></script>
+</body>
+</html>

+ 4 - 1
resources/views/material/indexold.tpl

@@ -58,6 +58,9 @@
             <nav>
             <nav>
                 <ul>
                 <ul>
                     <li><a href="#1">简介</a></li>
                     <li><a href="#1">简介</a></li>
+                    {if $user->is_admin}
+                    <li><a href="/admin">管理后台</a></li>
+                    {/if}
                     <li><a href="/user">用户中心</a></li>
                     <li><a href="/user">用户中心</a></li>
                     <li><a href="/user/logout">退出登录</a></li>
                     <li><a href="/user/logout">退出登录</a></li>
                 </ul>
                 </ul>
@@ -70,7 +73,7 @@
                     如果想自定义文本请删除下面这段script代码,格式为
                     如果想自定义文本请删除下面这段script代码,格式为
                     <p>自定义文本</p>
                     <p>自定义文本</p>
                     -->
                     -->
-                    <p>够了,我无法忍受你的行为,现在你将成为我们中的一员</p>
+                    {$config['old_index_DESC']}
                 </div>
                 </div>
             </div>
             </div>
             <nav>
             <nav>

+ 1 - 1
resources/views/material/staff.tpl

@@ -32,7 +32,7 @@
     <p>MIT许可证(MIT)</p>
     <p>MIT许可证(MIT)</p>
 
 
     <p class="copyright">&copy;2015 orvice</p>
     <p class="copyright">&copy;2015 orvice</p>
-    <p class="copyright">&copy;2019 SSPanel UIM Dev Team</p>
+    <p class="copyright">&copy;{date("Y")} SSPanel UIM Dev Team</p>
 
 
     <p>特此免费授予任何获得副本的人这个软件和相关的文档文件(“软件”)来处理在软件中没有限制,
     <p>特此免费授予任何获得副本的人这个软件和相关的文档文件(“软件”)来处理在软件中没有限制,
         包括但不限于权利使用,复制,修改,合并,发布,分发,再许可和/或销售该软件的副本,
         包括但不限于权利使用,复制,修改,合并,发布,分发,再许可和/或销售该软件的副本,

File diff suppressed because it is too large
+ 12 - 0
resources/views/material/user/bitpayx.tpl


+ 23 - 0
resources/views/material/user/detect_index.tpl

@@ -19,6 +19,29 @@
                     </div>
                     </div>
                 </div>
                 </div>
 
 
+                <div class="card">
+                    <div class="card-main">
+                        <div class="card-inner">
+					{if $config['enable_auto_detect_ban']===true}
+                        {if $config['auto_detect_ban_type']==1}
+                            <p>请注意,每当您触发审计规则达 <strong>{$config['auto_detect_ban_number']}</strong> 次,将会被停止使用服务 <strong>{$config['auto_detect_ban_time']}</strong> 分钟</p>
+                        {else}
+                            <h4>请注意,审计将以以下规则执行:</h4>
+                            <dl class="dl-horizontal">
+                            {foreach $config['auto_detect_ban'] as $key => $value}
+                                {if $value['type']=='kill'}
+                                <dt><i class="material-icons icon-sm">info_outline</i> 当您触碰审计规则达 <strong>{$key}</strong> 次,将会被直接<strong>删除账号</strong></dt>
+                                {else}
+                                <dt><i class="material-icons icon-sm">info_outline</i> 当您触碰审计规则达 <strong>{$key}</strong> 次,将会被封禁 <strong>{$value['time']}</strong> 分钟</dt>
+                                {/if}
+                            {/foreach}
+                            </dl>
+                        {/if}
+					{/if}
+                        </div>
+                    </div>
+                </div>
+
                 <div class="card">
                 <div class="card">
                     <div class="card-main">
                     <div class="card-main">
                         <div class="card-inner">
                         <div class="card-inner">

+ 52 - 26
resources/views/material/user/edit.tpl

@@ -10,6 +10,7 @@
         <section class="content-inner margin-top-no">
         <section class="content-inner margin-top-no">
 
 
             <div class="col-xx-12 col-sm-6">
             <div class="col-xx-12 col-sm-6">
+
                 <div class="card margin-bottom-no">
                 <div class="card margin-bottom-no">
                     <div class="card-main">
                     <div class="card-main">
                         <div class="card-inner">
                         <div class="card-inner">
@@ -133,6 +134,22 @@
                     </div>
                     </div>
                 </div>
                 </div>
 
 
+				<div class="card margin-bottom-no">
+					<div class="card-main">
+						<div class="card-inner">
+							<div class="card-inner">
+								<div class="cardbtn-edit">
+									<div class="card-heading">重置订阅链接</div>
+									<div class="reset-flex">
+										<a class="reset-link btn btn-brand-accent btn-flat" ><i class="icon">autorenew</i>&nbsp;</a>
+									</div>
+								</div>
+                                <p>点击会重置您的订阅链接,此操作不可逆,请谨慎。</p>
+							</div>
+						</div>
+					</div>
+                </div>
+
             </div>
             </div>
 
 
 
 
@@ -361,31 +378,30 @@
                         <div class="card-main">
                         <div class="card-main">
                             <div class="card-inner">
                             <div class="card-inner">
                                 <div class="card-inner">
                                 <div class="card-inner">
+                                    <div class="cardbtn-edit">
+                                        <div class="card-heading">Telegram 绑定</div>
                                     {if $user->telegram_id != 0}
                                     {if $user->telegram_id != 0}
-                                        <div class="cardbtn-edit">
-                                            <div class="card-heading">Telegram 绑定</div>
-                                            <div><a class="btn btn-flat btn-brand-accent"
-                                                    href="/user/telegram_reset"><span class="icon">not_interested</span>&nbsp;</a>
-                                            </div>
-                                        </div>
-                                    {/if}
-
-                                    {if $user->telegram_id == 0}
-                                        <p>复制保存下方的二维码图片(有效期10分钟,超时请刷新本页面以重新获取,每张二维码只能使用一次)</p>
-                                        {if $user->telegram_id == 0}
-                                            <p>私聊发给 Telegram 机器人 <a href="https://t.me/{$telegram_bot}">@{$telegram_bot}</a> 以绑定
-                                                Telegram</p>
-                                        {/if}
-                                    {/if}
-                                    <div class="form-group form-group-label">
+                                        <div><a class="btn btn-flat btn-brand-accent" href="/user/telegram_reset"><span class="icon">not_interested</span>&nbsp;</a></div>
+                                    </div>
                                         <div class="text-center">
                                         <div class="text-center">
-                                            <div id="telegram-qr" class="qr-center"></div>
-                                            {if $user->telegram_id != 0}
-                                                <p>当前绑定Telegram账户:<a href="https://t.me/{$user->im_value}">@{$user->im_value}</a>
-                                                </p>
-                                            {/if}
+                                            <p>当前绑定的 Telegram 账户:<a href="https://t.me/{$user->im_value}">@{$user->im_value}</a></p>
                                         </div>
                                         </div>
+                                    {else}
                                     </div>
                                     </div>
+                                        <p>二维码或绑定码有效期 10 分钟,超时请刷新本页面以重新获取,每个只能使用一次</p>
+                                        {if $config['use_new_telegram_bot'] === true}
+                                            <p><button class="copy-text btn btn-subscription" type="button" data-clipboard-text="{$bind_token}">点击拷贝绑定码</button> 私聊发给 Telegram 机器人 <a href="https://t.me/{$telegram_bot}">@{$telegram_bot}</a> 以绑定 Telegram</p>
+                                            <p><a class="btn btn-subscription" type="button" href="https://t.me/{$telegram_bot}?start={$bind_token}">一键绑定至账户</a> 手机电脑平板等如已安装 Telegram 可点击</p>
+                                        {else}
+                                            <p>截图保存下方的二维码图片,切勿拍照保存否则会导致解码失败</p>
+                                            <p>私聊发给 Telegram 机器人 <a href="https://t.me/{$telegram_bot}">@{$telegram_bot}</a> 以绑定 Telegram</p>
+                                            <div class="form-group form-group-label">
+                                                <div class="text-center">
+                                                    <div id="telegram-qr" class="qr-center"></div>
+                                                </div>
+                                            </div>
+                                        {/if}
+                                    {/if}
                                 </div>
                                 </div>
                             </div>
                             </div>
                         </div>
                         </div>
@@ -421,6 +437,8 @@
                     </div>
                     </div>
                 </div>
                 </div>
 
 
+            </div>
+
                 {include file='dialog.tpl'}
                 {include file='dialog.tpl'}
 
 
         </section>
         </section>
@@ -521,6 +539,7 @@
         })
         })
     })
     })
 </script>
 </script>
+
 <script>
 <script>
     $(document).ready(function () {
     $(document).ready(function () {
         $("#portspecify").click(function () {
         $("#portspecify").click(function () {
@@ -688,7 +707,6 @@
     })
     })
 </script>
 </script>
 
 
-
 <script>
 <script>
     $(document).ready(function () {
     $(document).ready(function () {
         $("#relay-update").click(function () {
         $("#relay-update").click(function () {
@@ -744,7 +762,6 @@
     })
     })
 </script>
 </script>
 
 
-
 <script>
 <script>
     $(document).ready(function () {
     $(document).ready(function () {
         $("#ga-test").click(function () {
         $("#ga-test").click(function () {
@@ -768,7 +785,6 @@
     })
     })
 </script>
 </script>
 
 
-
 <script>
 <script>
     $(document).ready(function () {
     $(document).ready(function () {
         $("#ga-set").click(function () {
         $("#ga-set").click(function () {
@@ -822,7 +838,6 @@
     })
     })
 </script>
 </script>
 
 
-
 <script>
 <script>
     $(document).ready(function () {
     $(document).ready(function () {
         $("#mail-update").click(function () {
         $("#mail-update").click(function () {
@@ -884,7 +899,6 @@
     })
     })
 </script>
 </script>
 
 
-
 <script>
 <script>
     $(document).ready(function () {
     $(document).ready(function () {
         $("#method-update").click(function () {
         $("#method-update").click(function () {
@@ -915,4 +929,16 @@
         })
         })
     })
     })
 </script>
 </script>
+
 {/literal}
 {/literal}
+
+<script>
+    $(function () {
+        new Clipboard('.reset-link');
+    });
+    $(".reset-link").click(function () {
+        $("#result").modal();
+        $$.getElementById('msg').innerHTML = '已重置您的订阅链接,请变更或添加您的订阅链接!';
+        window.setTimeout("location.href='/user/url_reset'", {$config['jump_delay']});
+    });
+</script>

File diff suppressed because it is too large
+ 686 - 236
resources/views/material/user/index.tpl


+ 7 - 1
resources/views/material/user/main.tpl

@@ -88,6 +88,12 @@
                             <a href="/user/trafficlog"><i class="icon icon-lg">hourglass_empty</i>&nbsp;流量记录</a>
                             <a href="/user/trafficlog"><i class="icon icon-lg">hourglass_empty</i>&nbsp;流量记录</a>
                         </li>
                         </li>
 
 
+                    {if $config['subscribeLog']===true && $config['subscribeLog_show']===true}
+                        <li>
+                            <a href="/user/subscribe_log"><i class="icon icon-lg">important_devices</i>&nbsp;订阅记录</a>
+                        </li>
+                    {/if}
+
                         {if $config['enable_ticket']===true}
                         {if $config['enable_ticket']===true}
                             <li>
                             <li>
                                 <a href="/user/ticket"><i class="icon icon-lg">question_answer</i>&nbsp;工单系统</a>
                                 <a href="/user/ticket"><i class="icon icon-lg">question_answer</i>&nbsp;工单系统</a>
@@ -119,7 +125,7 @@
                         </li>
                         </li>
 
 
                         <li>
                         <li>
-                            <a href="/user/tutorial"><i class="icon icon-lg">start</i>&nbsp;使用教程</a>
+                            <a href="{if $config['use_this_doc'] === false}/user/tutorial{else}/doc/{/if}"><i class="icon icon-lg">start</i>&nbsp;使用教程</a>
                         </li>
                         </li>
                     </ul>
                     </ul>
 
 

+ 126 - 68
resources/views/material/user/node.tpl

@@ -8,33 +8,49 @@
 
 
     function hideURLbar() {
     function hideURLbar() {
         window.scrollTo(0, 1);
         window.scrollTo(0, 1);
-    } </script>
+    }
+</script>
 
 
 {function displayV2rayNode node=null}
 {function displayV2rayNode node=null}
-    {$v2server=URL::getV2Url($user, $node['raw_node'], 1)}
-    <p>地址:<span class="card-tag tag-blue">{$v2server['add']}</span></p>
-    <p>端口:<span class="card-tag tag-volcano">{$v2server['port']}</span></p>
+    {$v2server=URL::getV2Url($user, $node['raw_node'], true)}
+    <p>节点地址:<span class="card-tag tag-blue">{$v2server['add']}</span></p>
+    <p>节点端口:<span class="card-tag tag-volcano">{$v2server['port']}</span></p>
     <p>AlterId:<span class="card-tag tag-purple">{$v2server['aid']}</span></p>
     <p>AlterId:<span class="card-tag tag-purple">{$v2server['aid']}</span></p>
-    <p>用户 UUID:<span class="card-tag tag-geekblue">{$user->getUuid()}</span></p>
-    <p>传输协议:<span class="card-tag tag-green">{if $v2server['net']=="tls"}tcp{else}{$v2server['net']}{/if}</span></p>
-    {if $v2server['net']=="ws"}
-        <p>路径:<span class="card-tag tag-green">{$v2server['path']}</span></p>
+    <p>UUID:<span class="card-tag tag-geekblue">{$user->getUuid()}</span></p>
+    <p>传输协议:<span class="card-tag tag-green">{$v2server['net']}</span></p>
+    {if $v2server['net'] == 'ws'}
+        <p>伪装路径:<span class="card-tag tag-green">{$v2server['path']}</span></p>
+        <p>HOST:<span class="card-tag tag-green">{$v2server['host']}</span></p>
     {/if}
     {/if}
 
 
-    {if $v2server['net']=="kcp"}
+    {if $v2server['net'] == 'kcp'}
         <p>伪装方式:<span class="card-tag tag-green">{$v2server['type']}</span></p>
         <p>伪装方式:<span class="card-tag tag-green">{$v2server['type']}</span></p>
     {/if}
     {/if}
 
 
-    {if ($v2server['net']=="ws" && $v2server['tls']=="tls")||$v2server['net']=="tls"}
+    {if $v2server['tls'] == 'tls'}
         <p>TLS:<span class="card-tag tag-green">TLS</span></p>
         <p>TLS:<span class="card-tag tag-green">TLS</span></p>
     {/if}
     {/if}
-    <p>流量比例:<span class="card-tag tag-red">{$node['traffic_rate']}</span></p>
-    <p>VMess链接:
+
+    <p>V2RayN 链接:
         <a class="copy-text" data-clipboard-text="{URL::getV2Url($user, $node['raw_node'])}">点击复制</a>
         <a class="copy-text" data-clipboard-text="{URL::getV2Url($user, $node['raw_node'])}">点击复制</a>
     </p>
     </p>
 {/function}
 {/function}
 
 
-{function displayNodeLinkV2 node=null}
+{function displaySort13Node node=null}
+    {$sort13Node = URL::getV2RayPluginItem($user, $node['raw_node'], false)}
+    {if $sort13Node === null}
+        <p>您的加密方式非 AEAD 系列,无法使用此节点.</p>
+    {else}
+        <p>节点地址:<span class="card-tag tag-blue">{$sort13Node['address']}</span></p>
+        <p>节点端口:<span class="card-tag tag-volcano">{$sort13Node['port']}</span></p>
+        <p>节点加密:<span class="card-tag tag-purple">{$sort13Node['method']}</span></p>
+        <p>连接密码:<span class="card-tag tag-geekblue">{$sort13Node['passwd']}</span></p>
+        <p>混淆方式:<span class="card-tag tag-green">{$sort13Node['obfs']}</span></p>
+        <p>混淆参数:<span class="card-tag tag-volcano">{$sort13Node['obfs_param']}</span></p>
+    {/if}
+{/function}
+
+{function displayNodeLink node=null}
     <div class="tiptitle">
     <div class="tiptitle">
         <a href="javascript:void(0);">{$node['name']}</a>
         <a href="javascript:void(0);">{$node['name']}</a>
     </div>
     </div>
@@ -57,66 +73,97 @@
                             <div class="card">
                             <div class="card">
                                 <div class="card-main">
                                 <div class="card-main">
                                     <div class="card-inner ui-switch">
                                     <div class="card-inner ui-switch">
-                                        <div class="switch-btn" id="switch-cards"><a href="#" onclick="return false"><i
-                                                        class="mdui-icon material-icons">apps</i></a></div>
-                                        <div class="switch-btn" id="switch-table"><a href="#" onclick="return false"><i
-                                                        class="mdui-icon material-icons">dehaze</i></a></div>
+                                        <div class="switch-btn" id="switch-cards">
+                                            <a href="#" onclick="return false">
+                                                <i class="mdui-icon material-icons">apps</i>
+                                            </a>
+                                        </div>
+                                        <div class="switch-btn" id="switch-table">
+                                            <a href="#" onclick="return false">
+                                                <i class="mdui-icon material-icons">dehaze</i>
+                                            </a>
+                                        </div>
                                     </div>
                                     </div>
                                 </div>
                                 </div>
                             </div>
                             </div>
                         </div>
                         </div>
 
 
+
+
+
                         <div class="node-cardgroup">
                         <div class="node-cardgroup">
-                            {$class=-1}
-                            {foreach $nodes as $node}
-                            {if $node['class']!=$class}
-                            {$class=$node['class']}
+                    {$class=-1}
+                    {foreach $nodes as $node}
+                        {if $node['class'] != $class}
+                            {$class = $node['class']}
                             {if !$node@first}</div>{/if}
                             {if !$node@first}</div>{/if}
+
                         <div class="nodetitle">
                         <div class="nodetitle">
-                            <a class="waves-effect waves-button" data-toggle="collapse" href="#cardgroup{$class}"
-                               aria-expanded="true" aria-controls="cardgroup{$class}">
-                                <span>{if $class == 0}普通{else}VIP {$node['class']} {/if}用户节点</span><i
-                                        class="material-icons">expand_more</i>
+                            <a class="waves-effect waves-button" data-toggle="collapse" href="#cardgroup{$class}" aria-expanded="true" aria-controls="cardgroup{$class}">
+                                <span>{if $class == 0}普通{else}VIP {$node['class']} {/if}用户节点</span>
+                                <i class="material-icons">expand_more</i>
                             </a>
                             </a>
                         </div>
                         </div>
                         <div class="card-row collapse in" id="cardgroup{$class}">
                         <div class="card-row collapse in" id="cardgroup{$class}">
-                            {/if}
+                        {/if}
+
                             <div class="node-card node-flex" cardindex="{$node@index}">
                             <div class="node-card node-flex" cardindex="{$node@index}">
                                 <div class="nodemain">
                                 <div class="nodemain">
                                     <div class="nodehead node-flex">
                                     <div class="nodehead node-flex">
-                                        {if $config['enable_flag']===true}
-                                            <div class="flag"><img src="/images/prefix/{$node['flag']}">
-                                            </div>{/if}
+                                        {if $config['enable_flag'] === true}
+                                            <div class="flag">
+                                                <img src="/images/prefix/{$node['flag']}">
+                                            </div>
+                                        {/if}
                                         <div class="nodename">{$node['name']}</div>
                                         <div class="nodename">{$node['name']}</div>
                                     </div>
                                     </div>
+
+                                    <!-- 在线人数 -->
                                     <div class="nodemiddle node-flex">
                                     <div class="nodemiddle node-flex">
-                                        <div class="onlinemember node-flex"><i class="material-icons node-icon">flight_takeoff</i><span>{if $node['online_user'] == -1} N/A{else} {$node['online_user']}{/if}</span>
+                                        <div class="onlinemember node-flex">
+                                            <i class="material-icons node-icon">flight_takeoff</i>
+                                            <span>{if $node['online_user'] == -1} N/A{else} {$node['online_user']}{/if}</span>
                                         </div>
                                         </div>
                                         <div class="nodetype">{$node['status']}</div>
                                         <div class="nodetype">{$node['status']}</div>
                                     </div>
                                     </div>
+
                                     <div class="nodeinfo node-flex">
                                     <div class="nodeinfo node-flex">
-                                        <div class="nodetraffic node-flex"><i
-                                                    class="material-icons node-icon">equalizer</i><span>{if $node['traffic_limit']>0}{$node['traffic_used']}/{$node['traffic_limit']}GB{else}{$node['traffic_used']}GB{/if}</span>
+
+                                        <!-- 节点已用流量 -->
+                                        <div class="nodetraffic node-flex">
+                                            <i class="material-icons node-icon">equalizer</i>
+                                            <span>{if $node['traffic_limit']>0}{$node['traffic_used']}/{$node['traffic_limit']}GB{else}{$node['traffic_used']}GB{/if}</span>
                                         </div>
                                         </div>
+
+                                        <!-- 节点流量倍率 -->
                                         <div class="nodecheck node-flex">
                                         <div class="nodecheck node-flex">
-                                            <i class="material-icons node-icon">network_check</i><span>x{$node['traffic_rate']}</span>
+                                            <i class="material-icons node-icon">network_check</i>
+                                            <span>x{$node['traffic_rate']}</span>
                                         </div>
                                         </div>
-                                        <div class="nodeband node-flex"><i class="material-icons node-icon">flash_on</i><span>{if {$node['bandwidth']}==0}N/A{else}{$node['bandwidth']}{/if}</span>
+
+                                        <!-- 节点速率 -->
+                                        <div class="nodeband node-flex">
+                                            <i class="material-icons node-icon">flash_on</i>
+                                            <span>{if {$node['bandwidth']}==0}N/A{else}{$node['bandwidth']}{/if}</span>
                                         </div>
                                         </div>
+
                                     </div>
                                     </div>
                                 </div>
                                 </div>
                                 <div class="nodestatus">
                                 <div class="nodestatus">
-                                    <div class="{if $node['online']=="1"}nodeonline{elseif $node['online']=='0'}nodeunset{else}nodeoffline{/if}">
-                                        <i class="material-icons">{if $node['online']=="1"}cloud_queue{elseif $node['online']=='0'}wifi_off{else}flash_off{/if}</i>
+                                    <div class="{if $node['online'] == '1'}nodeonline{elseif $node['online'] == '0'}nodeunset{else}nodeoffline{/if}">
+                                        <i class="material-icons">{if $node['online']=='1'}cloud_queue{elseif $node['online']=='0'}wifi_off{else}flash_off{/if}</i>
                                     </div>
                                     </div>
                                 </div>
                                 </div>
 
 
                             </div>
                             </div>
                             <div class="node-tip cust-model" tipindex="{$node@index}">
                             <div class="node-tip cust-model" tipindex="{$node@index}">
                                 {if $node['class'] > $user->class}
                                 {if $node['class'] > $user->class}
-                                    <p class="card-heading" align="center"><b> <i
-                                                    class="icon icon-lg">visibility_off</i>
-                                            您当前等级不足以使用该节点,如需升级请<a href="/user/shop">点击这里</a>升级套餐</b></p>
+                                    <p class="card-heading" align="center">
+                                        <b>
+                                            <i class="icon icon-lg">visibility_off</i>
+                                            您当前等级不足以使用该节点,如需升级请<a href="/user/shop">点击这里</a>升级套餐
+                                        </b>
+                                    </p>
                                 {else}
                                 {else}
 
 
                                     {$relay_rule = null}
                                     {$relay_rule = null}
@@ -125,10 +172,9 @@
                                         {$relay_rule = $tools->pick_out_relay_rule($node['id'], $user->port, $relay_rules)}
                                         {$relay_rule = $tools->pick_out_relay_rule($node['id'], $user->port, $relay_rules)}
                                     {/if}
                                     {/if}
 
 
-                                    {if $node['mu_only'] != 1 && ($node['sort'] != 11 || $node['sort']!=12)}
+                                    {if $node['mu_only'] != 1 && ($node['sort'] != 11 || $node['sort'] != 12 || $node['sort'] != 13)}
                                         <div class="tiptitle">
                                         <div class="tiptitle">
-                                            <a href="javascript:void(0);"
-                                               onClick="urlChange('{$node['id']}',0,{if $relay_rule != null}{$relay_rule->id}{else}0{/if})">
+                                            <a href="javascript:void(0);" onClick="urlChange('{$node['id']}',0,{if $relay_rule != null}{$relay_rule->id}{else}0{/if})">
                                                 {$node['name']}{if $relay_rule != null} - {$relay_rule->dist_node()->name}{/if}
                                                 {$node['name']}{if $relay_rule != null} - {$relay_rule->dist_node()->name}{/if}
                                             </a>
                                             </a>
                                             <div class="nodeload">
                                             <div class="nodeload">
@@ -139,12 +185,11 @@
                                                 </div>
                                                 </div>
                                             </div>
                                             </div>
                                         </div>
                                         </div>
-                                    {elseif $node['sort'] == 11 || $node['sort']==12}
-                                        {displayNodeLinkV2 node=$node}
-                                        {$point_node=$node}
+                                    {elseif $node['sort'] == 11 || $node['sort'] == 12 || $node['sort'] == 13}
+                                        {displayNodeLink node=$node}
                                     {/if}
                                     {/if}
 
 
-                                    {if $node['sort'] == 0 || $node['sort'] == 10||$node['sort']==13}
+                                    {if $node['sort'] == 0 || $node['sort'] == 10 || $node['sort'] == 11 || $node['sort'] == 12 || $node['sort'] == 13}
                                         {$point_node=$node}
                                         {$point_node=$node}
                                     {/if}
                                     {/if}
 
 
@@ -161,53 +206,58 @@
                                                 {$relay_rule = $tools->pick_out_relay_rule($node['id'], $single_muport['server']->server, $relay_rules)}
                                                 {$relay_rule = $tools->pick_out_relay_rule($node['id'], $single_muport['server']->server, $relay_rules)}
                                             {/if}
                                             {/if}
                                             <div class="tiptitle">
                                             <div class="tiptitle">
-                                                <a href="javascript:void(0);"
-                                                   onClick="urlChange('{$node['id']}',{$single_muport['server']->server},{if $relay_rule != null}{$relay_rule->id}{else}0{/if})">{$node['name']}
+                                                <a href="javascript:void(0);" onClick="urlChange('{$node['id']}',{$single_muport['server']->server},{if $relay_rule != null}{$relay_rule->id}{else}0{/if})">{$node['name']}
                                                     {if $relay_rule != null} - {$relay_rule->dist_node()->name}{/if} -
                                                     {if $relay_rule != null} - {$relay_rule->dist_node()->name}{/if} -
-                                                    单端口 Shadowsocks - {$single_muport['server']->server} 端口
+                                                    单端口 Shadowsocks - {$node['raw_node']->getOffsetPort($single_muport['server']->server)} 端口
                                                 </a>
                                                 </a>
                                             </div>
                                             </div>
                                         {/foreach}
                                         {/foreach}
                                     {/if}
                                     {/if}
                                     <div class="tipmiddle">
                                     <div class="tipmiddle">
-                                        <div><span class="node-icon"><i
-                                                        class="icon icon-lg">chat</i> </span>{$node['info']}</div>
+                                        <div>
+                                            <span class="node-icon"><i class="icon icon-lg">chat</i> </span>{$node['info']}
+                                        </div>
                                     </div>
                                     </div>
                                     {if $node['sort'] == 11 || $node['sort'] == 12}
                                     {if $node['sort'] == 11 || $node['sort'] == 12}
                                         {displayV2rayNode node=$node}
                                         {displayV2rayNode node=$node}
                                     {/if}
                                     {/if}
 
 
+                                    {if $node['sort'] == 13}
+                                        {displaySort13Node node=$node}
+                                    {/if}
 
 
                                 {/if}
                                 {/if}
+
                             </div>
                             </div>
                             {$point_node=null}
                             {$point_node=null}
                             {if $node@last}</div>{/if}
                             {if $node@last}</div>{/if}
-                        {/foreach}
+                    {/foreach}
                     </div>
                     </div>
 
 
+
+
                     <div class="card node-table">
                     <div class="card node-table">
                         <div class="card-main">
                         <div class="card-main">
                             <div class="card-inner margin-bottom-no">
                             <div class="card-inner margin-bottom-no">
                                 <div class="tile-wrap">
                                 <div class="tile-wrap">
-                                    {$class=-1}
+                                    {$class = -1}
                                     {foreach $nodes as $node}
                                     {foreach $nodes as $node}
 
 
-                                        {if $node['class']!=$class}
-                                            {$class=$node['class']}
-                                            <p class="card-heading">{if $class == 0}普通{else}VIP {$node['class']} {/if}
-                                                用户节点</p>
+                                        {if $node['class'] != $class}
+                                            {$class = $node['class']}
+                                            <p class="card-heading">{if $class == 0}普通{else}VIP {$node['class']} {/if}用户节点</p>
                                         {/if}
                                         {/if}
                                         <div class="tile tile-collapse">
                                         <div class="tile tile-collapse">
                                             <div data-toggle="tile" data-target="#heading{$node['id']}">
                                             <div data-toggle="tile" data-target="#heading{$node['id']}">
                                                 <div class="tile-side pull-left" data-ignore="tile">
                                                 <div class="tile-side pull-left" data-ignore="tile">
-                                                    <div class="avatar avatar-sm {if $node['online']=="1"}nodeonline{elseif $node['online']=='0'}nodeunset{else}nodeoffline{/if}">
-                                                        <span class="material-icons">{if $node['online']=="1"}cloud_queue{elseif $node['online']=='0'}wifi_off{else}flash_off{/if}</span>
+                                                    <div class="avatar avatar-sm {if $node['online']=='1'}nodeonline{elseif $node['online']=='0'}nodeunset{else}nodeoffline{/if}">
+                                                        <span class="material-icons">{if $node['online']=='1'}cloud_queue{elseif $node['online']=='0'}wifi_off{else}flash_off{/if}</span>
                                                     </div>
                                                     </div>
                                                 </div>
                                                 </div>
                                                 <div class="tile-inner">
                                                 <div class="tile-inner">
                                                     <div class="text-overflow node-textcolor">
                                                     <div class="text-overflow node-textcolor">
 														<span class="enable-flag">
 														<span class="enable-flag">
-															{if $config['enable_flag']===true}
+															{if $config['enable_flag'] === true}
                                                                 <img src="/images/prefix/{$node['flag']}" height="22"
                                                                 <img src="/images/prefix/{$node['flag']}" height="22"
                                                                      width="40"/>
                                                                      width="40"/>
                                                             {/if}
                                                             {/if}
@@ -265,20 +315,19 @@
                                                         <div class="card nodetip-table">
                                                         <div class="card nodetip-table">
                                                             <div class="card-main">
                                                             <div class="card-main">
                                                                 <div class="card-inner">
                                                                 <div class="card-inner">
-                                                                    {if $node['mu_only'] != 1 && ($node['sort'] != 11 || $node['sort']!=12)}
+                                                                    {if $node['mu_only'] != 1 && ($node['sort'] != 11 || $node['sort'] != 12 || $node['sort'] != 13)}
                                                                         <p class="card-heading">
                                                                         <p class="card-heading">
                                                                             <a href="javascript:void(0);"
                                                                             <a href="javascript:void(0);"
                                                                                onClick="urlChange('{$node['id']}',0,{if $relay_rule != null}{$relay_rule->id}{else}0{/if})">{$node['name']}
                                                                                onClick="urlChange('{$node['id']}',0,{if $relay_rule != null}{$relay_rule->id}{else}0{/if})">{$node['name']}
                                                                                 {if $relay_rule != null} - {$relay_rule->dist_node()->name}{/if}</a>
                                                                                 {if $relay_rule != null} - {$relay_rule->dist_node()->name}{/if}</a>
                                                                             <span class="label label-brand-accent">←点击节点查看配置信息</span>
                                                                             <span class="label label-brand-accent">←点击节点查看配置信息</span>
                                                                         </p>
                                                                         </p>
-                                                                    {elseif $node['sort'] == 11|| $node['sort']==12}
-                                                                        {displayNodeLinkV2 node=$node}
-                                                                        {$point_node=$node}
+                                                                    {elseif $node['sort'] == 11 || $node['sort'] == 12 || $node['sort'] == 13}
+                                                                        {displayNodeLink node=$node}
                                                                     {/if}
                                                                     {/if}
 
 
-                                                                    {if $node['sort'] == 0 || $node['sort'] == 10||$node['sort']==13}
-                                                                        {$point_node=$node}
+                                                                    {if $node['sort'] == 0 || $node['sort'] == 10 || $node['sort'] == 11 || $node['sort'] == 12 || $node['sort'] == 13}
+                                                                        {$point_node = $node}
                                                                     {/if}
                                                                     {/if}
 
 
                                                                     {if ($node['sort'] == 0 || $node['sort'] == 10) && $node['mu_only'] != -1}
                                                                     {if ($node['sort'] == 0 || $node['sort'] == 10) && $node['mu_only'] != -1}
@@ -298,7 +347,7 @@
                                                                                    onClick="urlChange('{$node['id']}',{$single_muport['server']->server},{if $relay_rule != null}{$relay_rule->id}{else}0{/if})">{$node['name']}
                                                                                    onClick="urlChange('{$node['id']}',{$single_muport['server']->server},{if $relay_rule != null}{$relay_rule->id}{else}0{/if})">{$node['name']}
                                                                                     {if $relay_rule != null} - {$relay_rule->dist_node()->name}{/if}
                                                                                     {if $relay_rule != null} - {$relay_rule->dist_node()->name}{/if}
                                                                                     - 单端口 Shadowsocks -
                                                                                     - 单端口 Shadowsocks -
-                                                                                    {$single_muport['server']->server}
+                                                                                    {$node['raw_node']->getOffsetPort($single_muport['server']->server)}
                                                                                     端口</a><span
                                                                                     端口</a><span
                                                                                         class="label label-brand-accent">←点击节点查看配置信息</span>
                                                                                         class="label label-brand-accent">←点击节点查看配置信息</span>
                                                                             </p>
                                                                             </p>
@@ -309,9 +358,14 @@
                                                                         <i class="icon icon-lg node-icon">chat</i> {$node['info']}
                                                                         <i class="icon icon-lg node-icon">chat</i> {$node['info']}
                                                                     </div>
                                                                     </div>
 
 
-                                                                    {if $node['sort'] == 11 ||$node['sort']==12}
+                                                                    {if $node['sort'] == 11 || $node['sort'] == 12}
                                                                         {displayV2rayNode node=$node}
                                                                         {displayV2rayNode node=$node}
                                                                     {/if}
                                                                     {/if}
+
+                                                                    {if $node['sort'] == 13}
+                                                                        {displaySort13Node node=$node}
+                                                                    {/if}
+
                                                                 </div>
                                                                 </div>
                                                             </div>
                                                             </div>
 
 
@@ -351,6 +405,10 @@
                             </div>
                             </div>
                         </div>
                         </div>
                     </div>
                     </div>
+
+
+
+
                 </div>
                 </div>
 
 
                 {include file='dialog.tpl'}
                 {include file='dialog.tpl'}

+ 0 - 40
resources/views/material/user/nodeinfo.tpl

@@ -49,10 +49,6 @@
                                         <div class="tab-pane fade {if $ssr_prefer}active in{/if}" id="ssr_info">
                                         <div class="tab-pane fade {if $ssr_prefer}active in{/if}" id="ssr_info">
                                             {if URL::SSRCanConnect($user, $mu)}
                                             {if URL::SSRCanConnect($user, $mu)}
                                                 {$ssr_item = URL::getItem($user, $node, $mu, $relay_rule_id, 0)}
                                                 {$ssr_item = URL::getItem($user, $node, $mu, $relay_rule_id, 0)}
-                                                {if $ssr_item['obfs']=="v2ray"}
-                                                    <p>您好,Shadowsocks V2Ray-Plugin 节点需要您的加密方式使用 AEAD 系列。请您到 资料编辑
-                                                        页面修改后再来查看此处。</p>
-                                                {else}
                                                     <p>服务器地址:{$ssr_item['address']}<br>
                                                     <p>服务器地址:{$ssr_item['address']}<br>
                                                         服务器端口:{$ssr_item['port']}<br>
                                                         服务器端口:{$ssr_item['port']}<br>
                                                         加密方式:{$ssr_item['method']}<br>
                                                         加密方式:{$ssr_item['method']}<br>
@@ -61,7 +57,6 @@
                                                         协议参数:{$ssr_item['protocol_param']}<br>
                                                         协议参数:{$ssr_item['protocol_param']}<br>
                                                         混淆:{$ssr_item['obfs']}<br>
                                                         混淆:{$ssr_item['obfs']}<br>
                                                         混淆参数:{$ssr_item['obfs_param']}<br></p>
                                                         混淆参数:{$ssr_item['obfs_param']}<br></p>
-                                                {/if}
                                             {else}
                                             {else}
                                                 <p>您好,您目前的 加密方式,混淆,或者协议设置在 ShadowsocksR 客户端下无法连接。请您选用 Shadowsocks
                                                 <p>您好,您目前的 加密方式,混淆,或者协议设置在 ShadowsocksR 客户端下无法连接。请您选用 Shadowsocks
                                                     客户端来连接,或者到 资料编辑 页面修改后再来查看此处。</p>
                                                     客户端来连接,或者到 资料编辑 页面修改后再来查看此处。</p>
@@ -71,17 +66,12 @@
                                         <div class="tab-pane fade {if !$ssr_prefer}active in{/if}" id="ss_info">
                                         <div class="tab-pane fade {if !$ssr_prefer}active in{/if}" id="ss_info">
                                             {if URL::SSCanConnect($user, $mu)}
                                             {if URL::SSCanConnect($user, $mu)}
                                                 {$ss_item = URL::getItem($user, $node, $mu, $relay_rule_id, 1)}
                                                 {$ss_item = URL::getItem($user, $node, $mu, $relay_rule_id, 1)}
-                                                {if $ss_item['obfs']=="v2ray" && URL::CanMethodConnect($user->method)!=2}
-                                                    <p>您好,Shadowsocks V2Ray-Plugin 节点需要您的加密方式使用 AEAD 系列。请您到 资料编辑
-                                                        页面修改后再来查看此处。</p>
-                                                {else}
                                                     <p>服务器地址:{$ss_item['address']}<br>
                                                     <p>服务器地址:{$ss_item['address']}<br>
                                                         服务器端口:{$ss_item['port']}<br>
                                                         服务器端口:{$ss_item['port']}<br>
                                                         加密方式:{$ss_item['method']}<br>
                                                         加密方式:{$ss_item['method']}<br>
                                                         密码:{$ss_item['passwd']}<br>
                                                         密码:{$ss_item['passwd']}<br>
                                                         混淆:{$ss_item['obfs']}<br>
                                                         混淆:{$ss_item['obfs']}<br>
                                                         混淆参数:{$ss_item['obfs_param']}<br></p>
                                                         混淆参数:{$ss_item['obfs_param']}<br></p>
-                                                {/if}
                                             {else}
                                             {else}
                                                 <p>您好,您目前的 加密方式,混淆,或者协议设置在 Shadowsocks 客户端下无法连接。请您选用 ShadowsocksR
                                                 <p>您好,您目前的 加密方式,混淆,或者协议设置在 Shadowsocks 客户端下无法连接。请您选用 ShadowsocksR
                                                     客户端来连接,或者到 资料编辑 页面修改后再来查看此处。</p>
                                                     客户端来连接,或者到 资料编辑 页面修改后再来查看此处。</p>
@@ -111,10 +101,6 @@
                                     </nav>
                                     </nav>
                                     <div class="tab-pane fade {if $ssr_prefer}active in{/if}" id="ssr_json">
                                     <div class="tab-pane fade {if $ssr_prefer}active in{/if}" id="ssr_json">
                                         {if URL::SSRCanConnect($user, $mu)}
                                         {if URL::SSRCanConnect($user, $mu)}
-                                            {if $ssr_item['obfs']=="v2ray"}
-                                                <p>您好,Shadowsocks V2Ray-Plugin 节点需要您的加密方式使用 AEAD 系列。请您到 资料编辑
-                                                    页面修改后再来查看此处。</p>
-                                            {else}
                                                 <pre>
                                                 <pre>
 {
 {
     "server": "{$ssr_item['address']}",
     "server": "{$ssr_item['address']}",
@@ -131,7 +117,6 @@
     "protocol_param": "{$ssr_item['protocol_param']}"
     "protocol_param": "{$ssr_item['protocol_param']}"
 }
 }
                                                </pre>
                                                </pre>
-                                            {/if}
                                         {else}
                                         {else}
                                             <p>您好,您目前的 加密方式,混淆,或者协议设置在 ShadowsocksR 客户端下无法连接。请您选用 Shadowsocks 客户端来连接,或者到
                                             <p>您好,您目前的 加密方式,混淆,或者协议设置在 ShadowsocksR 客户端下无法连接。请您选用 Shadowsocks 客户端来连接,或者到
                                                 资料编辑 页面修改后再来查看此处。</p>
                                                 资料编辑 页面修改后再来查看此处。</p>
@@ -139,10 +124,6 @@
                                     </div>
                                     </div>
                                     <div class="tab-pane fade {if !$ssr_prefer}active in{/if}" id="ss_json">
                                     <div class="tab-pane fade {if !$ssr_prefer}active in{/if}" id="ss_json">
                                         {if URL::SSCanConnect($user, $mu)}
                                         {if URL::SSCanConnect($user, $mu)}
-                                            {if $ss_item['obfs']=="v2ray" && URL::CanMethodConnect($user->method)!=2}
-                                                <p>您好,Shadowsocks V2Ray-Plugin 节点需要您的加密方式使用 AEAD 系列。请您到 资料编辑
-                                                    页面修改后再来查看此处。</p>
-                                            {else}
                                                 <pre>
                                                 <pre>
 {
 {
         "server": "{$ss_item['address']}",
         "server": "{$ss_item['address']}",
@@ -156,7 +137,6 @@
         "plugin": "{URL::getJsonObfs($ss_item)}"
         "plugin": "{URL::getJsonObfs($ss_item)}"
 }
 }
 </pre>
 </pre>
-                                            {/if}
                                         {else}
                                         {else}
                                             <p>您好,您目前的 加密方式,混淆,或者协议设置在 Shadowsocks 客户端下无法连接。请您选用 ShadowsocksR 客户端来连接,或者到
                                             <p>您好,您目前的 加密方式,混淆,或者协议设置在 Shadowsocks 客户端下无法连接。请您选用 ShadowsocksR 客户端来连接,或者到
                                                 资料编辑 页面修改后再来查看此处。</p>
                                                 资料编辑 页面修改后再来查看此处。</p>
@@ -187,17 +167,12 @@
                                     </nav>
                                     </nav>
                                     <div class="tab-pane fade {if $ssr_prefer}active in{/if}" id="ssr_url">
                                     <div class="tab-pane fade {if $ssr_prefer}active in{/if}" id="ssr_url">
                                         {if URL::SSRCanConnect($user, $mu)}
                                         {if URL::SSRCanConnect($user, $mu)}
-                                            {if $ssr_item['obfs']=="v2ray"}
-                                                <p>您好,Shadowsocks V2Ray-Plugin 节点需要您的加密方式使用 AEAD 系列。请您到 资料编辑
-                                                    页面修改后再来查看此处。</p>
-                                            {else}
                                                 <p><a class="copy-text"
                                                 <p><a class="copy-text"
                                                       data-clipboard-text="{URL::getItemUrl($ssr_item, 0)}">点我复制配置链接</a>
                                                       data-clipboard-text="{URL::getItemUrl($ssr_item, 0)}">点我复制配置链接</a>
                                                 </p>
                                                 </p>
                                                 <p><a href="{URL::getItemUrl($ssr_item, 0)}">iOS 上用 Safari
                                                 <p><a href="{URL::getItemUrl($ssr_item, 0)}">iOS 上用 Safari
                                                         打开点我即可直接添加</a></p>
                                                         打开点我即可直接添加</a></p>
                                                 <p><button class="copy-text btn btn-subscription" type="button" data-clipboard-text="{URL::getItemUrl($ssr_item, 0)}">拷贝SSR链接</button></p>
                                                 <p><button class="copy-text btn btn-subscription" type="button" data-clipboard-text="{URL::getItemUrl($ssr_item, 0)}">拷贝SSR链接</button></p>
-                                            {/if}
                                         {else}
                                         {else}
                                             <p>您好,您目前的 加密方式,混淆,或者协议设置在 ShadowsocksR 客户端下无法连接。请您选用 Shadowsocks 客户端来连接,或者到
                                             <p>您好,您目前的 加密方式,混淆,或者协议设置在 ShadowsocksR 客户端下无法连接。请您选用 Shadowsocks 客户端来连接,或者到
                                                 资料编辑 页面修改后再来查看此处。</p>
                                                 资料编辑 页面修改后再来查看此处。</p>
@@ -205,17 +180,12 @@
                                     </div>
                                     </div>
                                     <div class="tab-pane fade {if !$ssr_prefer}active in{/if}" id="ss_url">
                                     <div class="tab-pane fade {if !$ssr_prefer}active in{/if}" id="ss_url">
                                         {if URL::SSCanConnect($user, $mu)}
                                         {if URL::SSCanConnect($user, $mu)}
-                                            {if $ss_item['obfs']=="v2ray" && URL::CanMethodConnect($user->method)!=2}
-                                                <p>您好,Shadowsocks V2Ray-Plugin 节点需要您的加密方式使用 AEAD 系列。请您到 资料编辑
-                                                    页面修改后再来查看此处。</p>
-                                            {else}
                                                 <p><a class="copy-text"
                                                 <p><a class="copy-text"
                                                       data-clipboard-text="{URL::getItemUrl($ss_item, 1)}">点我复制配置链接</a>
                                                       data-clipboard-text="{URL::getItemUrl($ss_item, 1)}">点我复制配置链接</a>
                                                 </p>
                                                 </p>
                                                 <p><a href="{URL::getItemUrl($ss_item, 1)}">iOS 上用 Safari 打开点我即可直接添加</a>
                                                 <p><a href="{URL::getItemUrl($ss_item, 1)}">iOS 上用 Safari 打开点我即可直接添加</a>
                                                 </p>
                                                 </p>
                                                 <p><button class="copy-text btn btn-subscription" type="button" data-clipboard-text="{URL::getItemUrl($ss_item, 1)}">拷贝SS链接</button></p>
                                                 <p><button class="copy-text btn btn-subscription" type="button" data-clipboard-text="{URL::getItemUrl($ss_item, 1)}">拷贝SS链接</button></p>
-                                            {/if}
                                         {else}
                                         {else}
                                             <p>您好,您目前的 加密方式,混淆,或者协议设置在 Shadowsocks 客户端下无法连接。请您选用 ShadowsocksR 客户端来连接,或者到
                                             <p>您好,您目前的 加密方式,混淆,或者协议设置在 Shadowsocks 客户端下无法连接。请您选用 ShadowsocksR 客户端来连接,或者到
                                                 资料编辑 页面修改后再来查看此处。</p>
                                                 资料编辑 页面修改后再来查看此处。</p>
@@ -251,14 +221,9 @@
                                     </nav>
                                     </nav>
                                     <div class="tab-pane fade {if $ssr_prefer}active in{/if}" id="ssr_qrcode">
                                     <div class="tab-pane fade {if $ssr_prefer}active in{/if}" id="ssr_qrcode">
                                         {if URL::SSRCanConnect($user, $mu)}
                                         {if URL::SSRCanConnect($user, $mu)}
-                                            {if $ssr_item['obfs']=="v2ray"}
-                                                <p>您好,Shadowsocks V2Ray-Plugin 节点需要您的加密方式使用 AEAD 系列。请您到 资料编辑
-                                                    页面修改后再来查看此处。</p>
-                                            {else}
                                                 <div class="text-center">
                                                 <div class="text-center">
                                                     <div id="ss-qr-n" class="qr-center"></div>
                                                     <div id="ss-qr-n" class="qr-center"></div>
                                                 </div>
                                                 </div>
-                                            {/if}
                                         {else}
                                         {else}
                                             <p>您好,您目前的 加密方式,混淆,或者协议设置在 ShadowsocksR 客户端下无法连接。请您选用 Shadowsocks 客户端来连接,或者到
                                             <p>您好,您目前的 加密方式,混淆,或者协议设置在 ShadowsocksR 客户端下无法连接。请您选用 Shadowsocks 客户端来连接,或者到
                                                 资料编辑 页面修改后再来查看此处。</p>
                                                 资料编辑 页面修改后再来查看此处。</p>
@@ -266,10 +231,6 @@
                                     </div>
                                     </div>
                                     <div class="tab-pane fade {if !$ssr_prefer}active in{/if}" id="ss_qrcode">
                                     <div class="tab-pane fade {if !$ssr_prefer}active in{/if}" id="ss_qrcode">
                                         {if URL::SSCanConnect($user, $mu)}
                                         {if URL::SSCanConnect($user, $mu)}
-                                            {if $ss_item['obfs']=="v2ray" && URL::CanMethodConnect($user->method)!=2}
-                                                <p>您好,Shadowsocks V2Ray-Plugin 节点需要您的加密方式使用 AEAD 系列。请您到 资料编辑
-                                                    页面修改后再来查看此处。</p>
-                                            {else}
                                                 <nav class="tab-nav">
                                                 <nav class="tab-nav">
                                                     <ul class="nav nav-list">
                                                     <ul class="nav nav-list">
                                                         <li class="active">
                                                         <li class="active">
@@ -296,7 +257,6 @@
                                                         <div id="ss-qr-win" class="qr-center"></div>
                                                         <div id="ss-qr-win" class="qr-center"></div>
                                                     </div>
                                                     </div>
                                                 </div>
                                                 </div>
-                                            {/if}
                                         {else}
                                         {else}
                                             <p>您好,您目前的 加密方式,混淆,或者协议设置在 Shadowsocks 客户端下无法连接。请您选用 ShadowsocksR 客户端来连接,或者到
                                             <p>您好,您目前的 加密方式,混淆,或者协议设置在 Shadowsocks 客户端下无法连接。请您选用 ShadowsocksR 客户端来连接,或者到
                                                 资料编辑 页面修改后再来查看此处。</p>
                                                 资料编辑 页面修改后再来查看此处。</p>

+ 41 - 0
resources/views/material/user/profile.tpl

@@ -38,6 +38,47 @@
                     </div>
                     </div>
                 </div>
                 </div>
 
 
+                <div class="col-lg-12 col-md-12">
+                    <div class="card">
+                        <div class="card-main">
+                            <div class="card-inner">
+                                <div class="card-doubleinner">
+                                    <p class="card-heading">当前生效中的套餐</p>
+                                </div>
+
+                                <div class="card-table">
+                                    <div class="table-responsive table-user">
+                                        <table class="table">
+                                            <thead>
+                                            <tr>
+                                              	<th>#ID</th>
+                                              	<th>套餐名称</th>
+                                              	<th>已用天数</th>
+                                              	<th>下次流量重置时间</th>
+                                              	<th>套餐过期时间</th>
+                                            </tr>
+                                            </thead>
+                                            <tbody>
+                                          	{foreach $boughts as $bought}
+                                          		{if $bought->valid()}
+                                                <tr>
+                                                    <td>#{$bought->id}</td>
+                                                    <td>{$bought->shop()->name}</td>
+                                                    <td>{$bought->used_days()} 天</td>
+                                                    <td>{$bought->reset_time()}</td>
+                                                    <td>{$bought->exp_time()}</td>
+                                                </tr>
+                                          		{/if}
+                                          	{/foreach}
+                                            </tbody>
+                                        </table>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
                 <div class="col-lg-6 col-md-6">
                 <div class="col-lg-6 col-md-6">
                     <div class="card">
                     <div class="card">
                         <div class="card-main">
                         <div class="card-main">

+ 62 - 0
resources/views/material/user/subscribe_log.tpl

@@ -0,0 +1,62 @@
+{include file='user/main.tpl'}
+
+
+<main class="content">
+    <div class="content-header ui-content-header">
+        <div class="container">
+            <h1 class="content-heading">订阅记录</h1>
+        </div>
+    </div>
+    <div class="container">
+        <div class="col-lg-12 col-md-12">
+            <section class="content-inner margin-top-no">
+
+                <div class="card">
+                    <div class="card-main">
+                        <div class="card-inner">
+                            <p>您可在此查询您账户最近 {$config['subscribeLog_keep_days']} 天的订阅记录,确保您的账户没有被盗用。</p>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="card">
+                    <div class="card-main">
+                        <div class="card-inner">
+                            <div class="card-table">
+                                <div class="table-responsive table-user">
+                                    {$logs->render()}
+                                    <table class="table">
+                                        <tr>
+                                            <th>ID</th>
+                                            <th>订阅类型</th>
+                                            <th>IP</th>
+                                            <th>归属地</th>
+                                            <th>时间</th>
+                                            <th>User-Agent</th>
+                                        </tr>
+                                        {foreach $logs as $log}
+                                            <tr>
+                                                <td>#{$log->id}</td>
+                                                <td>{$log->subscribe_type}</td>
+                                                <td>{$log->request_ip}</td>
+                                                {assign var="location" value=$iplocation->getlocation($log->request_ip)}
+                                                <td>{iconv("gbk", "utf-8//IGNORE", $location.country)} {iconv("gbk", "utf-8//IGNORE", $location.area)}</td>
+                                                <td>{$log->request_time}</td>
+                                                <td>{$log->request_user_agent}</td>
+                                            </tr>
+                                        {/foreach}
+                                    </table>
+                                    {$logs->render()}
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
+        </div>
+
+    </div>
+</main>
+
+
+{include file='user/footer.tpl'}

+ 19 - 0
sql/detect_ban_log.sql

@@ -0,0 +1,19 @@
+--
+-- 审计封禁日志
+--
+CREATE TABLE IF NOT EXISTS `detect_ban_log` (
+  `id`                int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `user_name`         varchar(128)     NOT NULL COMMENT '用户名',
+  `user_id`           int(11)          NOT NULL COMMENT '用户 ID',
+  `email`             varchar(32)      NOT NULL COMMENT '用户邮箱',
+  `detect_number`     int(11)          NOT NULL COMMENT '本次违规次数',
+  `ban_time`          int(11)          NOT NULL COMMENT '本次封禁时长',
+  `start_time`        bigint(20)       NOT NULL COMMENT '统计开始时间',
+  `end_time`          bigint(20)       NOT NULL COMMENT '统计结束时间',
+  `all_detect_number` int(11)          NOT NULL COMMENT '累计违规次数',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='审计封禁日志';
+
+
+ALTER TABLE `user` ADD `last_detect_ban_time` datetime DEFAULT '1989-06-04 00:05:00' AFTER `enable`;
+ALTER TABLE `user` ADD `all_detect_number` int(11) NOT NULL DEFAULT '0' AFTER `last_detect_ban_time`;

+ 14 - 0
sql/gconfig.sql

@@ -0,0 +1,14 @@
+CREATE TABLE IF NOT EXISTS `gconfig` (
+  `id`             int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `key`            varchar(128)     NOT NULL COMMENT '配置键名',
+  `type`           varchar(32)      NOT NULL COMMENT '值类型',
+  `value`          text             NOT NULL COMMENT '配置值',
+  `oldvalue`       text             NOT NULL COMMENT '之前的配置值',
+  `name`           varchar(128)     NOT NULL COMMENT '配置名称',
+  `comment`        text             NOT NULL COMMENT '配置描述',
+  `operator_id`    int(11)          NOT NULL COMMENT '操作员 ID',
+  `operator_name`  varchar(128)     NOT NULL COMMENT '操作员名称',
+  `operator_email` varchar(32)      NOT NULL COMMENT '操作员邮箱',
+  `last_update`    bigint(20)       NOT NULL COMMENT '修改时间',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='网站配置';

+ 80 - 1
sql/glzjin_all.sql

@@ -666,7 +666,7 @@ ALTER TABLE `relay`
   MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;
   MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;
 CREATE TABLE `telegram_session` ( `id` BIGINT NOT NULL AUTO_INCREMENT , `user_id` BIGINT NOT NULL , `type` INT NOT NULL , `session_content` TEXT NOT NULL , `datetime` BIGINT NOT NULL , PRIMARY KEY (`id`)) ENGINE = InnoDB;
 CREATE TABLE `telegram_session` ( `id` BIGINT NOT NULL AUTO_INCREMENT , `user_id` BIGINT NOT NULL , `type` INT NOT NULL , `session_content` TEXT NOT NULL , `datetime` BIGINT NOT NULL , PRIMARY KEY (`id`)) ENGINE = InnoDB;
 
 
-ALTER TABLE `user` ADD `telegram_id` BIGINT NULL AFTER `is_multi_user`; 
+ALTER TABLE `user` ADD `telegram_id` BIGINT NULL AFTER `is_multi_user`;
 
 
 CREATE TABLE IF NOT EXISTS `paylist` (
 CREATE TABLE IF NOT EXISTS `paylist` (
   `id` bigint(20) NOT NULL,
   `id` bigint(20) NOT NULL,
@@ -696,3 +696,82 @@ ALTER TABLE `paylist`
 --
 --
 ALTER TABLE `paylist`
 ALTER TABLE `paylist`
   MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;ALTER TABLE `user_traffic_log` CHANGE `u` `u` BIGINT(20) NOT NULL, CHANGE `d` `d` BIGINT(20) NOT NULL;
   MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;ALTER TABLE `user_traffic_log` CHANGE `u` `u` BIGINT(20) NOT NULL, CHANGE `d` `d` BIGINT(20) NOT NULL;
+
+
+--
+-- 用户订阅日志
+--
+CREATE TABLE IF NOT EXISTS `user_subscribe_log` (
+  `id`                 int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `user_name`          varchar(128)     NOT NULL COMMENT '用户名',
+  `user_id`            int(11)          NOT NULL COMMENT '用户 ID',
+  `email`              varchar(32)      NOT NULL COMMENT '用户邮箱',
+  `subscribe_type`     varchar(20)      NOT NULL COMMENT '获取的订阅类型',
+  `request_ip`         varchar(128)     NOT NULL COMMENT '请求 IP',
+  `request_time`       datetime         NOT NULL COMMENT '请求时间',
+  `request_user_agent` text                      COMMENT '请求 UA 信息',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户订阅日志';
+
+
+--
+-- 审计封禁日志
+--
+CREATE TABLE IF NOT EXISTS `detect_ban_log` (
+  `id`                int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `user_name`         varchar(128)     NOT NULL COMMENT '用户名',
+  `user_id`           int(11)          NOT NULL COMMENT '用户 ID',
+  `email`             varchar(32)      NOT NULL COMMENT '用户邮箱',
+  `detect_number`     int(11)          NOT NULL COMMENT '本次违规次数',
+  `ban_time`          int(11)          NOT NULL COMMENT '本次封禁时长',
+  `start_time`        bigint(20)       NOT NULL COMMENT '统计开始时间',
+  `end_time`          bigint(20)       NOT NULL COMMENT '统计结束时间',
+  `all_detect_number` int(11)          NOT NULL COMMENT '累计违规次数',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='审计封禁日志';
+
+
+ALTER TABLE `user` ADD `last_detect_ban_time` datetime DEFAULT '1989-06-04 00:05:00' AFTER `enable`;
+ALTER TABLE `user` ADD `all_detect_number` int(11) NOT NULL DEFAULT '0' AFTER `last_detect_ban_time`;
+
+
+--
+-- 网站配置
+--
+CREATE TABLE IF NOT EXISTS `gconfig` (
+  `id`             int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `key`            varchar(128)     NOT NULL COMMENT '配置键名',
+  `type`           varchar(32)      NOT NULL COMMENT '值类型',
+  `value`          text             NOT NULL COMMENT '配置值',
+  `oldvalue`       text             NOT NULL COMMENT '之前的配置值',
+  `name`           varchar(128)     NOT NULL COMMENT '配置名称',
+  `comment`        text             NOT NULL COMMENT '配置描述',
+  `operator_id`    int(11)          NOT NULL COMMENT '操作员 ID',
+  `operator_name`  varchar(128)     NOT NULL COMMENT '操作员名称',
+  `operator_email` varchar(32)      NOT NULL COMMENT '操作员邮箱',
+  `last_update`    bigint(20)       NOT NULL COMMENT '修改时间',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='网站配置';
+
+
+--
+-- Telegram 任务列表
+--
+CREATE TABLE IF NOT EXISTS `telegram_tasks` (
+  `id`           int(11) unsigned NOT     NULL AUTO_INCREMENT,
+  `type`         int(8)           NOT     NULL                COMMENT '任务类型',
+  `status`       int(2)           NOT     NULL DEFAULT '0'    COMMENT '任务状态',
+  `chatid`       varchar(128)     NOT     NULL DEFAULT '0'    COMMENT 'Telegram Chat ID',
+  `messageid`    varchar(128)     NOT     NULL DEFAULT '0'    COMMENT 'Telegram Message ID',
+  `content`      text             DEFAULT NULL                COMMENT '任务详细内容',
+  `process`      varchar(32)      DEFAULT NULL                COMMENT '临时任务进度',
+  `userid`       int(11)          NOT     NULL DEFAULT '0'    COMMENT '网站用户 ID',
+  `tguserid`     varchar(32)      NOT     NULL DEFAULT '0'    COMMENT 'Telegram User ID',
+  `executetime`  bigint(20)       NOT     NULL                COMMENT '任务执行时间',
+  `datetime`     bigint(20)       NOT     NULL                COMMENT '任务产生时间',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Telegram 任务列表';
+
+
+ALTER TABLE `detect_log` ADD `status` int(2) NOT NULL DEFAULT '0' AFTER `node_id`;
+

+ 14 - 0
sql/telegram_tasks.sql

@@ -0,0 +1,14 @@
+CREATE TABLE IF NOT EXISTS `telegram_tasks` (
+  `id`           int(11) unsigned NOT     NULL AUTO_INCREMENT,
+  `type`         int(8)           NOT     NULL                COMMENT '任务类型',
+  `status`       int(2)           NOT     NULL DEFAULT '0'    COMMENT '任务状态',
+  `chatid`       varchar(128)     NOT     NULL DEFAULT '0'    COMMENT 'Telegram Chat ID',
+  `messageid`    varchar(128)     NOT     NULL DEFAULT '0'    COMMENT 'Telegram Message ID',
+  `content`      text             DEFAULT NULL                COMMENT '任务详细内容',
+  `process`      varchar(32)      DEFAULT NULL                COMMENT '临时任务进度',
+  `userid`       int(11)          NOT     NULL DEFAULT '0'    COMMENT '网站用户 ID',
+  `tguserid`     varchar(32)      NOT     NULL DEFAULT '0'    COMMENT 'Telegram User ID',
+  `executetime`  bigint(20)       NOT     NULL                COMMENT '任务执行时间',
+  `datetime`     bigint(20)       NOT     NULL                COMMENT '任务产生时间',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Telegram 任务列表';

+ 14 - 0
sql/user_subscribe_log.sql

@@ -0,0 +1,14 @@
+--
+-- 用户订阅日志
+--
+CREATE TABLE IF NOT EXISTS `user_subscribe_log` (
+  `id`                 int(11) unsigned     NOT NULL AUTO_INCREMENT,
+  `user_name`          varchar(128)         NOT NULL COMMENT '用户名',
+  `user_id`            int(11)              NOT NULL COMMENT '用户 ID',
+  `email`              varchar(32)          NOT NULL COMMENT '用户邮箱',
+  `subscribe_type`     varchar(20)      DEFAULT NULL COMMENT '获取的订阅类型',
+  `request_ip`         varchar(128)     DEFAULT NULL COMMENT '请求 IP',
+  `request_time`       datetime         DEFAULT NULL COMMENT '请求时间',
+  `request_user_agent` text                          COMMENT '请求 UA 信息',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户订阅日志';

+ 15 - 6
src/Command/DailyMail.php

@@ -52,14 +52,23 @@ class DailyMail
 
 
         $sts = new Analytics();
         $sts = new Analytics();
 
 
-        Telegram::Send('各位老爷少奶奶,我来为大家报告一下系统今天的运行状况哈~' .
-            PHP_EOL .
-            '今日签到人数:' . $sts->getTodayCheckinUser() . PHP_EOL .
-            '今日使用总流量:' . Tools::flowAutoShow($lastday_total) . PHP_EOL .
-            '晚安~');
+        if (Config::getconfig('Telegram.bool.Diary')) {
+            Telegram::Send(
+                str_replace(
+                    array(
+                        '%getTodayCheckinUser%',
+                        '%lastday_total%'
+                    ),
+                    array(
+                        $sts->getTodayCheckinUser(),
+                        Tools::flowAutoShow($lastday_total)
+                    ),
+                    Config::getconfig('Telegram.string.Diary')
+                )
+            );
+        }
     }
     }
 
 
-
     public static function reall()
     public static function reall()
     {
     {
         $users = User::all();
         $users = User::all();

+ 0 - 1
src/Command/ExtMail.php

@@ -4,7 +4,6 @@
 namespace App\Command;
 namespace App\Command;
 
 
 use App\Models\User;
 use App\Models\User;
-use App\Services\Config;
 use App\Services\Mail;
 use App\Services\Mail;
 use Exception;
 use Exception;
 
 

+ 0 - 1
src/Command/FinanceMail.php

@@ -4,7 +4,6 @@
 namespace App\Command;
 namespace App\Command;
 
 
 use App\Models\User;
 use App\Models\User;
-use App\Services\Config;
 use App\Services\Mail;
 use App\Services\Mail;
 use App\Services\Analytics;
 use App\Services\Analytics;
 use App\Utils\Telegram;
 use App\Utils\Telegram;

+ 260 - 87
src/Command/Job.php

@@ -2,32 +2,42 @@
 
 
 namespace App\Command;
 namespace App\Command;
 
 
-use App\Models\Node;
-use App\Models\User;
-use App\Models\RadiusBan;
-use App\Models\LoginIp;
-use App\Models\Speedtest;
-use App\Models\Shop;
-use App\Models\Bought;
-use App\Models\Ip;
-use App\Models\NodeInfoLog;
-use App\Models\NodeOnlineLog;
-use App\Models\TrafficLog;
-use App\Models\DetectLog;
-use App\Models\BlockIp;
-use App\Models\TelegramSession;
-use App\Models\EmailVerify;
-use App\Services\Config;
-use App\Utils\Radius;
-use App\Utils\Tools;
-use App\Services\Mail;
-use App\Utils\QQWry;
-use App\Utils\GA;
-use App\Utils\Telegram;
-use ArrayObject;
-use App\Models\Disconnect;
-use App\Models\UnblockIp;
+use App\Models\{
+    Ip,
+    Node,
+    User,
+    Shop,
+    Token,
+    Bought,
+    BlockIp,
+    LoginIp,
+    DetectLog,
+    UnblockIp,
+    Speedtest,
+    RadiusBan,
+    TrafficLog,
+    Disconnect,
+    EmailVerify,
+    DetectBanLog,
+    NodeInfoLog,
+    NodeOnlineLog,
+    TelegramTasks,
+    TelegramSession,
+    UserSubscribeLog
+};
+use App\Services\{
+    Mail,
+    Config
+};
+use App\Utils\{
+    GA,
+    QQWry,
+    Tools,
+    Radius,
+    Telegram
+};
 use Exception;
 use Exception;
+use ArrayObject;
 use RuntimeException;
 use RuntimeException;
 
 
 class Job
 class Job
@@ -119,7 +129,7 @@ class Job
         $nodes = Node::all();
         $nodes = Node::all();
         foreach ($nodes as $node) {
         foreach ($nodes as $node) {
             $rule = preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $node->server);
             $rule = preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $node->server);
-            if (!$rule && (!$node->sort || $node->sort == 10 || $node->sort == 12 || $node->sort == 13)) {
+            if (!$rule && (in_array($node->sort, array(0, 10, 12, 13)))) {
                 $ip = gethostbyname($node->server);
                 $ip = gethostbyname($node->server);
                 $node->node_ip = $ip;
                 $node->node_ip = $ip;
                 $node->save();
                 $node->save();
@@ -134,7 +144,7 @@ class Job
         ini_set('memory_limit', '-1');
         ini_set('memory_limit', '-1');
         $nodes = Node::all();
         $nodes = Node::all();
         foreach ($nodes as $node) {
         foreach ($nodes as $node) {
-            if ($node->sort == 0 || $node->sort == 10 || $node->sort == 11 || $node->sort == 12 || $node->sort == 13) {
+            if (in_array($node->sort, array(0, 10, 11, 12, 13))) {
                 if (date('d') == $node->bandwidthlimit_resetday) {
                 if (date('d') == $node->bandwidthlimit_resetday) {
                     $node->node_bandwidth = 0;
                     $node->node_bandwidth = 0;
                     $node->save();
                     $node->save();
@@ -142,6 +152,11 @@ class Job
             }
             }
         }
         }
 
 
+        // 清理订阅记录
+        UserSubscribeLog::where('request_time', '<', date('Y-m-d H:i:s', time() - 86400 * (int) $_ENV['subscribeLog_keep_days']))->delete();
+
+        Token::where('expire_time', '<', time())->delete();
+
         NodeInfoLog::where('log_time', '<', time() - 86400 * 3)->delete();
         NodeInfoLog::where('log_time', '<', time() - 86400 * 3)->delete();
         NodeOnlineLog::where('log_time', '<', time() - 86400 * 3)->delete();
         NodeOnlineLog::where('log_time', '<', time() - 86400 * 3)->delete();
         TrafficLog::where('log_time', '<', time() - 86400 * 3)->delete();
         TrafficLog::where('log_time', '<', time() - 86400 * 3)->delete();
@@ -149,7 +164,10 @@ class Job
         Speedtest::where('datetime', '<', time() - 86400 * 3)->delete();
         Speedtest::where('datetime', '<', time() - 86400 * 3)->delete();
         EmailVerify::where('expire_in', '<', time() - 86400 * 3)->delete();
         EmailVerify::where('expire_in', '<', time() - 86400 * 3)->delete();
         system('rm ' . BASE_PATH . '/storage/*.png', $ret);
         system('rm ' . BASE_PATH . '/storage/*.png', $ret);
-        Telegram::Send('姐姐姐姐,数据库被清理了,感觉身体被掏空了呢~');
+
+        if (Config::getconfig('Telegram.bool.DailyJob')) {
+            Telegram::Send(Config::getconfig('Telegram.string.DailyJob'));
+        }
 
 
         //auto reset
         //auto reset
         $boughts = Bought::all();
         $boughts = Bought::all();
@@ -171,8 +189,8 @@ class Job
 
 
             if ($shop->reset() != 0 && $shop->reset_value() != 0 && $shop->reset_exp() != 0) {
             if ($shop->reset() != 0 && $shop->reset_value() != 0 && $shop->reset_exp() != 0) {
                 $boughted_users[] = $bought->userid;
                 $boughted_users[] = $bought->userid;
-                if ((time() - $shop->reset_exp() * 86400 < $bought->datetime) && (int)((time() - $bought->datetime) / 86400) % $shop->reset() == 0 && (int)((time() - $bought->datetime) / 86400) != 0) {
-                    echo('流量重置-' . $user->id . "\n");
+                if ((time() - $shop->reset_exp() * 86400 < $bought->datetime) && (int) ((time() - $bought->datetime) / 86400) % $shop->reset() == 0 && (int) ((time() - $bought->datetime) / 86400) != 0) {
+                    echo ('流量重置-' . $user->id . "\n");
                     $user->transfer_enable = Tools::toGB($shop->reset_value());
                     $user->transfer_enable = Tools::toGB($shop->reset_value());
                     $user->u = 0;
                     $user->u = 0;
                     $user->d = 0;
                     $user->d = 0;
@@ -186,8 +204,7 @@ class Job
                         Mail::send($to, $subject, 'news/warn.tpl', [
                         Mail::send($to, $subject, 'news/warn.tpl', [
                             'user' => $user,
                             'user' => $user,
                             'text' => $text
                             'text' => $text
-                        ], [
-                        ]);
+                        ], []);
                     } catch (Exception $e) {
                     } catch (Exception $e) {
                         echo $e->getMessage();
                         echo $e->getMessage();
                     }
                     }
@@ -217,8 +234,7 @@ class Job
                     Mail::send($to, $subject, 'news/warn.tpl', [
                     Mail::send($to, $subject, 'news/warn.tpl', [
                         'user' => $user,
                         'user' => $user,
                         'text' => $text
                         'text' => $text
-                    ], [
-                    ]);
+                    ], []);
                 } catch (Exception $e) {
                 } catch (Exception $e) {
                     echo $e->getMessage();
                     echo $e->getMessage();
                 }
                 }
@@ -254,7 +270,6 @@ class Job
         system('cd ' . BASE_PATH . '/public/ssr-download/ && git pull https://github.com/xcxnig/ssr-download.git && git gc');
         system('cd ' . BASE_PATH . '/public/ssr-download/ && git pull https://github.com/xcxnig/ssr-download.git && git gc');
     }
     }
 
 
-
     public static function CheckJob()
     public static function CheckJob()
     {
     {
         //在线人数检测
         //在线人数检测
@@ -365,8 +380,7 @@ class Job
                     Mail::send($to, $subject, 'news/warn.tpl', [
                     Mail::send($to, $subject, 'news/warn.tpl', [
                         'user' => $user,
                         'user' => $user,
                         'text' => $text
                         'text' => $text
-                    ], [
-                    ]);
+                    ], []);
                 } catch (Exception $e) {
                 } catch (Exception $e) {
                     echo $e->getMessage();
                     echo $e->getMessage();
                 }
                 }
@@ -429,8 +443,8 @@ class Job
 
 
         //节点掉线检测
         //节点掉线检测
         if ($_ENV['enable_detect_offline'] == true) {
         if ($_ENV['enable_detect_offline'] == true) {
+            echo '节点掉线检测开始' . PHP_EOL;
             $nodes = Node::all();
             $nodes = Node::all();
-
             foreach ($nodes as $node) {
             foreach ($nodes as $node) {
                 if ($node->isNodeOnline() === false && $node->online == true) {
                 if ($node->isNodeOnline() === false && $node->online == true) {
                     if ($_ENV['useScFtqq'] == true && $_ENV['enable_detect_offline_useScFtqq'] == true) {
                     if ($_ENV['useScFtqq'] == true && $_ENV['enable_detect_offline_useScFtqq'] == true) {
@@ -444,18 +458,18 @@ class Job
                         );
                         );
                         $opts = array(
                         $opts = array(
                             'http' =>
                             'http' =>
-                                array(
-                                    'method' => 'POST',
-                                    'header' => 'Content-type: application/x-www-form-urlencoded',
-                                    'content' => $postdata
-                                )
+                            array(
+                                'method' => 'POST',
+                                'header' => 'Content-type: application/x-www-form-urlencoded',
+                                'content' => $postdata
+                            )
                         );
                         );
                         $context = stream_context_create($opts);
                         $context = stream_context_create($opts);
                         file_get_contents('https://sc.ftqq.com/' . $ScFtqq_SCKEY . '.send', false, $context);
                         file_get_contents('https://sc.ftqq.com/' . $ScFtqq_SCKEY . '.send', false, $context);
                     }
                     }
 
 
                     foreach ($adminUser as $user) {
                     foreach ($adminUser as $user) {
-                        echo 'Send offline mail to user: ' . $user->id;
+                        echo 'Send offline mail to user: ' . $user->id . PHP_EOL;
                         $subject = $_ENV['appName'] . '-系统警告';
                         $subject = $_ENV['appName'] . '-系统警告';
                         $to = $user->email;
                         $to = $user->email;
                         $text = '管理员您好,系统发现节点 ' . $node->name . ' 掉线了,请您及时处理。';
                         $text = '管理员您好,系统发现节点 ' . $node->name . ' 掉线了,请您及时处理。';
@@ -468,10 +482,16 @@ class Job
                             echo $e->getMessage();
                             echo $e->getMessage();
                         }
                         }
 
 
-                        $notice_text = '喵喵喵~ ' . $node->name . ' 节点掉线了喵~';
+                        $notice_text = str_replace(
+                            '%node_name%',
+                            $node->name,
+                            Config::getconfig('Telegram.string.NodeOffline')
+                        );
                     }
                     }
 
 
-                    Telegram::Send($notice_text);
+                    if (Config::getconfig('Telegram.bool.NodeOffline')) {
+                        Telegram::Send($notice_text);
+                    }
 
 
                     $node->online = false;
                     $node->online = false;
                     $node->save();
                     $node->save();
@@ -488,17 +508,17 @@ class Job
 
 
                         $opts = array(
                         $opts = array(
                             'http' =>
                             'http' =>
-                                array(
-                                    'method' => 'POST',
-                                    'header' => 'Content-type: application/x-www-form-urlencoded',
-                                    'content' => $postdata
-                                )
+                            array(
+                                'method' => 'POST',
+                                'header' => 'Content-type: application/x-www-form-urlencoded',
+                                'content' => $postdata
+                            )
                         );
                         );
                         $context = stream_context_create($opts);
                         $context = stream_context_create($opts);
                         file_get_contents('https://sc.ftqq.com/' . $ScFtqq_SCKEY . '.send', false, $context);
                         file_get_contents('https://sc.ftqq.com/' . $ScFtqq_SCKEY . '.send', false, $context);
                     }
                     }
                     foreach ($adminUser as $user) {
                     foreach ($adminUser as $user) {
-                        echo 'Send offline mail to user: ' . $user->id;
+                        echo 'Send offline mail to user: ' . $user->id . PHP_EOL;
                         $subject = $_ENV['appName'] . '-系统提示';
                         $subject = $_ENV['appName'] . '-系统提示';
                         $to = $user->email;
                         $to = $user->email;
                         $text = '管理员您好,系统发现节点 ' . $node->name . ' 恢复上线了。';
                         $text = '管理员您好,系统发现节点 ' . $node->name . ' 恢复上线了。';
@@ -511,19 +531,28 @@ class Job
                             echo $e->getMessage();
                             echo $e->getMessage();
                         }
                         }
 
 
-                        $notice_text = '喵喵喵~ ' . $node->name . ' 节点恢复了喵~';
+                        $notice_text = str_replace(
+                            '%node_name%',
+                            $node->name,
+                            Config::getconfig('Telegram.string.NodeOnline')
+                        );
+                    }
+
+                    if (Config::getconfig('Telegram.bool.NodeOnline')) {
+                        Telegram::Send($notice_text);
                     }
                     }
 
 
-                    Telegram::Send($notice_text);
                     $node->online = true;
                     $node->online = true;
                     $node->save();
                     $node->save();
                 }
                 }
             }
             }
+            echo '节点掉线检测结束' . PHP_EOL;
         }
         }
 
 
 
 
         //登录地检测
         //登录地检测
         if ($_ENV['login_warn'] == true) {
         if ($_ENV['login_warn'] == true) {
+            echo '异常登录检测开始' . PHP_EOL;
             $iplocation = new QQWry();
             $iplocation = new QQWry();
             $Logs = LoginIp::where('datetime', '>', time() - 60)->get();
             $Logs = LoginIp::where('datetime', '>', time() - 60)->get();
             foreach ($Logs as $log) {
             foreach ($Logs as $log) {
@@ -559,8 +588,7 @@ class Job
                                     Mail::send($to, $subject, 'news/warn.tpl', [
                                     Mail::send($to, $subject, 'news/warn.tpl', [
                                         'user' => $user,
                                         'user' => $user,
                                         'text' => $text
                                         'text' => $text
-                                    ], [
-                                    ]);
+                                    ], []);
                                 } catch (Exception $e) {
                                 } catch (Exception $e) {
                                     echo $e->getMessage();
                                     echo $e->getMessage();
                                 }
                                 }
@@ -569,6 +597,7 @@ class Job
                     }
                     }
                 }
                 }
             }
             }
+            echo '异常登录检测结束' . PHP_EOL;
         }
         }
 
 
         $users = User::all();
         $users = User::all();
@@ -596,8 +625,7 @@ class Job
                     Mail::send($to, $subject, 'news/warn.tpl', [
                     Mail::send($to, $subject, 'news/warn.tpl', [
                         'user' => $user,
                         'user' => $user,
                         'text' => $text
                         'text' => $text
-                    ], [
-                    ]);
+                    ], []);
                 } catch (Exception $e) {
                 } catch (Exception $e) {
                     echo $e->getMessage();
                     echo $e->getMessage();
                 }
                 }
@@ -615,13 +643,17 @@ class Job
                 $under_limit = false;
                 $under_limit = false;
 
 
                 if ($user->transfer_enable != 0) {
                 if ($user->transfer_enable != 0) {
-                    if ($_ENV['notify_limit_mode'] == 'per' &&
-                        $user_traffic_left / $user->transfer_enable * 100 < $_ENV['notify_limit_value']) {
+                    if (
+                        $_ENV['notify_limit_mode'] == 'per' &&
+                        $user_traffic_left / $user->transfer_enable * 100 < $_ENV['notify_limit_value']
+                    ) {
                         $under_limit = true;
                         $under_limit = true;
                         $unit_text = '%';
                         $unit_text = '%';
                     }
                     }
-                } elseif ($_ENV['notify_limit_mode'] == 'mb' &&
-                    Tools::flowToMB($user_traffic_left) < $_ENV['notify_limit_value']) {
+                } elseif (
+                    $_ENV['notify_limit_mode'] == 'mb' &&
+                    Tools::flowToMB($user_traffic_left) < $_ENV['notify_limit_value']
+                ) {
                     $under_limit = true;
                     $under_limit = true;
                     $unit_text = 'MB';
                     $unit_text = 'MB';
                 }
                 }
@@ -646,7 +678,8 @@ class Job
                 }
                 }
             }
             }
 
 
-            if ($_ENV['account_expire_delete_days'] >= 0 &&
+            if (
+                $_ENV['account_expire_delete_days'] >= 0 &&
                 strtotime($user->expire_in) + $_ENV['account_expire_delete_days'] * 86400 < time() &&
                 strtotime($user->expire_in) + $_ENV['account_expire_delete_days'] * 86400 < time() &&
                 $user->money <= $_ENV['auto_clean_min_money']
                 $user->money <= $_ENV['auto_clean_min_money']
 
 
@@ -658,8 +691,7 @@ class Job
                     Mail::send($to, $subject, 'news/warn.tpl', [
                     Mail::send($to, $subject, 'news/warn.tpl', [
                         'user' => $user,
                         'user' => $user,
                         'text' => $text
                         'text' => $text
-                    ], [
-                    ]);
+                    ], []);
                 } catch (Exception $e) {
                 } catch (Exception $e) {
                     echo $e->getMessage();
                     echo $e->getMessage();
                 }
                 }
@@ -669,7 +701,8 @@ class Job
             }
             }
 
 
 
 
-            if ($_ENV['auto_clean_uncheck_days'] > 0 &&
+            if (
+                $_ENV['auto_clean_uncheck_days'] > 0 &&
                 max(
                 max(
                     $user->last_check_in_time,
                     $user->last_check_in_time,
                     strtotime($user->reg_date)
                     strtotime($user->reg_date)
@@ -684,8 +717,7 @@ class Job
                     Mail::send($to, $subject, 'news/warn.tpl', [
                     Mail::send($to, $subject, 'news/warn.tpl', [
                         'user' => $user,
                         'user' => $user,
                         'text' => $text
                         'text' => $text
-                    ], [
-                    ]);
+                    ], []);
                 } catch (Exception $e) {
                 } catch (Exception $e) {
                     echo $e->getMessage();
                     echo $e->getMessage();
                 }
                 }
@@ -693,7 +725,8 @@ class Job
                 continue;
                 continue;
             }
             }
 
 
-            if ($_ENV['auto_clean_unused_days'] > 0 &&
+            if (
+                $_ENV['auto_clean_unused_days'] > 0 &&
                 max($user->t, strtotime($user->reg_date)) + ($_ENV['auto_clean_unused_days'] * 86400) < time() &&
                 max($user->t, strtotime($user->reg_date)) + ($_ENV['auto_clean_unused_days'] * 86400) < time() &&
                 $user->class == 0 &&
                 $user->class == 0 &&
                 $user->money <= $_ENV['auto_clean_min_money']
                 $user->money <= $_ENV['auto_clean_min_money']
@@ -705,8 +738,7 @@ class Job
                     Mail::send($to, $subject, 'news/warn.tpl', [
                     Mail::send($to, $subject, 'news/warn.tpl', [
                         'user' => $user,
                         'user' => $user,
                         'text' => $text
                         'text' => $text
-                    ], [
-                    ]);
+                    ], []);
                 } catch (Exception $e) {
                 } catch (Exception $e) {
                     echo $e->getMessage();
                     echo $e->getMessage();
                 }
                 }
@@ -714,7 +746,8 @@ class Job
                 continue;
                 continue;
             }
             }
 
 
-            if ($user->class != 0 &&
+            if (
+                $user->class != 0 &&
                 strtotime($user->class_expire) < time() &&
                 strtotime($user->class_expire) < time() &&
                 strtotime($user->class_expire) > 1420041600
                 strtotime($user->class_expire) > 1420041600
             ) {
             ) {
@@ -733,8 +766,7 @@ class Job
                     Mail::send($to, $subject, 'news/warn.tpl', [
                     Mail::send($to, $subject, 'news/warn.tpl', [
                         'user' => $user,
                         'user' => $user,
                         'text' => $text
                         'text' => $text
-                    ], [
-                    ]);
+                    ], []);
                 } catch (Exception $e) {
                 } catch (Exception $e) {
                     echo $e->getMessage();
                     echo $e->getMessage();
                 }
                 }
@@ -742,6 +774,16 @@ class Job
                 $user->class = 0;
                 $user->class = 0;
             }
             }
 
 
+            // 审计封禁解封
+            if ($user->enable == 0) {
+                $logs = DetectBanLog::where('user_id', $user->id)->orderBy('id', 'desc')->first();
+                if ($logs != null) {
+                    if (($logs->end_time + $logs->ban_time * 60) <= time()) {
+                        $user->enable = 1;
+                    }
+                }
+            }
+
             $user->save();
             $user->save();
         }
         }
 
 
@@ -759,6 +801,125 @@ class Job
                 Radius::Add($user, $user->passwd);
                 Radius::Add($user, $user->passwd);
             }
             }
         }
         }
+
+        if ($_ENV['enable_telegram'] === true) {
+            self::Telegram();
+        }
+
+        if ($_ENV['enable_auto_detect_ban'] === true) {
+            self::DetectBan();
+        }
+    }
+
+    /**
+     * Telegram 任务
+     */
+    public static function Telegram(): void
+    {
+        # 删除 tg 消息
+        $TelegramTasks = TelegramTasks::where('type', 1)->where('executetime', '<', time())->get();
+        foreach ($TelegramTasks as $Task) {
+            \App\Utils\Telegram\TelegramTools::SendPost('deleteMessage', ['chat_id' => $Task->chatid, 'message_id' => $Task->messageid]);
+            TelegramTasks::where('chatid', $Task->chatid)->where('type', '<>', 1)->where('messageid', $Task->messageid)->delete();
+            $Task->delete();
+        }
+    }
+
+    /**
+     * 审计封禁任务
+     */
+    public static function DetectBan(): void
+    {
+        echo '审计封禁检查开始.' . PHP_EOL;
+        $new_logs = DetectLog::where('status', '=', 0)->orderBy('id', 'asc')->take($_ENV['auto_detect_ban_numProcess'])->get();
+        if (count($new_logs) != 0) {
+
+            $user_logs = [];
+            foreach ($new_logs as $log) {
+                // 分类各个用户的记录数量
+                if (!in_array($log->user_id, array_keys($user_logs))) {
+                    $user_logs[$log->user_id] = 0;
+                }
+                $user_logs[$log->user_id]++;
+                $log->status = 1;
+                $log->save();
+            }
+
+            foreach ($user_logs as $userid => $value) {
+                // 执行封禁
+                $user = User::find($userid);
+                if ($user == null) {
+                    continue;
+                }
+                $user->all_detect_number += $value;
+                $user->save();
+
+                if ($user->enable == 0 || ($user->is_admin && $_ENV['auto_detect_ban_allow_admin'] === true) || in_array($user->id, $_ENV['auto_detect_ban_allow_users'])) {
+                    // 如果用户已被封禁
+                    // 如果用户是管理员
+                    // 如果属于钦定用户
+                    // 则跳过
+                    continue;
+                }
+
+                if ($_ENV['auto_detect_ban_type'] == 1) {
+                    $last_DetectBanLog      = DetectBanLog::where('user_id', $userid)->orderBy('id', 'desc')->first();
+                    $last_all_detect_number = ($last_DetectBanLog == null ? 0 : (int) $last_DetectBanLog->all_detect_number);
+                    $detect_number          = ($user->all_detect_number - $last_all_detect_number);
+                    if ($detect_number >= $_ENV['auto_detect_ban_number']) {
+                        $last_detect_ban_time               = $user->last_detect_ban_time;
+                        $end_time                           = date('Y-m-d H:i:s');
+                        $user->enable                       = 0;
+                        $user->last_detect_ban_time         = $end_time;
+                        $user->save();
+                        $DetectBanLog                       = new DetectBanLog();
+                        $DetectBanLog->user_name            = $user->user_name;
+                        $DetectBanLog->user_id              = $user->id;
+                        $DetectBanLog->email                = $user->email;
+                        $DetectBanLog->detect_number        = $detect_number;
+                        $DetectBanLog->ban_time             = $_ENV['auto_detect_ban_time'];
+                        $DetectBanLog->start_time           = strtotime($last_detect_ban_time);
+                        $DetectBanLog->end_time             = strtotime($end_time);
+                        $DetectBanLog->all_detect_number    = $user->all_detect_number;
+                        $DetectBanLog->save();
+                    }
+                } else {
+                    $number = $user->all_detect_number;
+                    $tmp = 0;
+                    foreach ($_ENV['auto_detect_ban'] as $key => $value) {
+                        if ($number >= $key) {
+                            if ($key >= $tmp) {
+                                $tmp = $key;
+                            }
+                        }
+                    }
+                    if ($tmp != 0) {
+                        if ($_ENV['auto_detect_ban'][$tmp]['type'] == 'kill') {
+                            $user->kill_user();
+                        } else {
+                            $last_detect_ban_time               = $user->last_detect_ban_time;
+                            $end_time                           = date('Y-m-d H:i:s');
+                            $user->enable                       = 0;
+                            $user->last_detect_ban_time         = $end_time;
+                            $user->save();
+                            $DetectBanLog                       = new DetectBanLog();
+                            $DetectBanLog->user_name            = $user->user_name;
+                            $DetectBanLog->user_id              = $user->id;
+                            $DetectBanLog->email                = $user->email;
+                            $DetectBanLog->detect_number        = $number;
+                            $DetectBanLog->ban_time             = $_ENV['auto_detect_ban'][$tmp]['time'];
+                            $DetectBanLog->start_time           = strtotime('1989-06-04 00:05:00');
+                            $DetectBanLog->end_time             = strtotime($end_time);
+                            $DetectBanLog->all_detect_number    = $number;
+                            $DetectBanLog->save();
+                        }
+                    }
+                }
+            }
+        } else {
+            echo '- 暂无新记录.' . PHP_EOL;
+        }
+        echo '审计封禁检查结束.' . PHP_EOL;
     }
     }
 
 
     public static function detectGFW()
     public static function detectGFW()
@@ -773,9 +934,11 @@ class Job
                 $nodes = Node::all();
                 $nodes = Node::all();
                 $adminUser = User::where('is_admin', '=', '1')->get();
                 $adminUser = User::where('is_admin', '=', '1')->get();
                 foreach ($nodes as $node) {
                 foreach ($nodes as $node) {
-                    if ($node->node_ip == '' ||
+                    if (
+                        $node->node_ip == '' ||
                         $node->node_ip == null ||
                         $node->node_ip == null ||
-                        $node->online == false) {
+                        $node->online == false
+                    ) {
                         continue;
                         continue;
                     }
                     }
                     $api_url = $_ENV['detect_gfw_url'];
                     $api_url = $_ENV['detect_gfw_url'];
@@ -796,7 +959,7 @@ class Job
                     }
                     }
                     if ($result_tcping == false) {
                     if ($result_tcping == false) {
                         //被墙了
                         //被墙了
-                        echo($node->id . ':false' . PHP_EOL);
+                        echo ($node->id . ':false' . PHP_EOL);
                         //判断有没有发送过邮件
                         //判断有没有发送过邮件
                         if ($node->gfw_block == true) {
                         if ($node->gfw_block == true) {
                             continue;
                             continue;
@@ -810,19 +973,24 @@ class Job
                                 Mail::send($to, $subject, 'news/warn.tpl', [
                                 Mail::send($to, $subject, 'news/warn.tpl', [
                                     'user' => $user,
                                     'user' => $user,
                                     'text' => $text
                                     'text' => $text
-                                ], [
-                                ]);
+                                ], []);
                             } catch (Exception $e) {
                             } catch (Exception $e) {
                                 echo $e->getMessage();
                                 echo $e->getMessage();
                             }
                             }
-                            $notice_text = '喵喵喵~ ' . $node->name . ' 节点被墙了喵~';
+                            $notice_text = str_replace(
+                                '%node_name%',
+                                $node->name,
+                                Config::getconfig('Telegram.string.NodeGFW')
+                            );
+                        }
+                        if (Config::getconfig('Telegram.bool.NodeGFW')) {
+                            Telegram::Send($notice_text);
                         }
                         }
-                        Telegram::Send($notice_text);
                         $node->gfw_block = true;
                         $node->gfw_block = true;
                         $node->save();
                         $node->save();
                     } else {
                     } else {
                         //没有被墙
                         //没有被墙
-                        echo($node->id . ':true' . PHP_EOL);
+                        echo ($node->id . ':true' . PHP_EOL);
                         if ($node->gfw_block == false) {
                         if ($node->gfw_block == false) {
                             continue;
                             continue;
                         }
                         }
@@ -835,14 +1003,19 @@ class Job
                                 Mail::send($to, $subject, 'news/warn.tpl', [
                                 Mail::send($to, $subject, 'news/warn.tpl', [
                                     'user' => $user,
                                     'user' => $user,
                                     'text' => $text
                                     'text' => $text
-                                ], [
-                                ]);
+                                ], []);
                             } catch (Exception $e) {
                             } catch (Exception $e) {
                                 echo $e->getMessage();
                                 echo $e->getMessage();
                             }
                             }
-                            $notice_text = '喵喵喵~ ' . $node->name . ' 节点恢复了喵~';
+                            $notice_text = str_replace(
+                                '%node_name%',
+                                $node->name,
+                                Config::getconfig('Telegram.string.NodeGFW_recover')
+                            );
+                        }
+                        if (Config::getconfig('Telegram.bool.NodeGFW_recover')) {
+                            Telegram::Send($notice_text);
                         }
                         }
-                        Telegram::Send($notice_text);
                         $node->gfw_block = false;
                         $node->gfw_block = false;
                         $node->save();
                         $node->save();
                     }
                     }
@@ -850,7 +1023,7 @@ class Job
                 break;
                 break;
             }
             }
 
 
-            echo($node->id . 'interval skip' . PHP_EOL);
+            echo ($node->id . 'interval skip' . PHP_EOL);
             sleep(3);
             sleep(3);
         }
         }
     }
     }

+ 232 - 0
src/Command/PortAutoChange.php

@@ -0,0 +1,232 @@
+<?php
+
+/**
+ * [实验性] 检测到端口被墙则自动更换端口
+ *
+ * // 实验性,可能会有惊喜,请确保拥有承受能力
+ * // 请通过 Crontab 启动,间隔建议 60 分钟以上
+ */
+
+namespace App\Command;
+
+use App\Models\{
+    User,
+    Node
+};
+use App\Utils\URL;
+
+class PortAutoChange
+{
+    /**
+     *  配置
+     */
+    private const Config = [
+        // 取端口范围最小值,新的端口将是之间的随机数
+        'port_min' => 23333,
+
+        // 取端口范围最大值,新的端口将是之间的随机数
+        'port_max' => 65535,
+
+        // 当某个使用的端口的被墙节点数量超过该端口使用总数量的百分比
+        // 超过该百分比时,直接更换单端口多用户节点(sort=9)和承载用户的端口
+        // 未超过时,对已被墙该端口的节点进行端口偏移
+        'mu_node_port_change_percent' => 60,
+
+        // 例外的节点,填写节点 ID,英文逗号分隔
+        // 此处提供的节点将不会进行端口更换
+        // 即使当原先的承载端口被更换时,也会将例外节点的端口偏移回去
+        'exception_node_id' => array(),
+    ];
+
+    public static function index()
+    {
+        $gfw_port_nodes = [];
+        $nodes = Node::where(
+            static function ($query) {
+                $query->where('sort', 0)
+                    ->orwhere('sort', 10);
+            }
+        )
+            ->where('mu_only', '>=', '0')
+            ->where('type', '1')
+            ->get();
+        foreach ($nodes as $node) {
+            $mu_nodes = Node::where('sort', 9)->where('type', '1')
+                ->where(
+                    static function ($query) use ($node) {
+                        $query->Where('node_group', '=', $node->node_group)
+                            ->orWhere('node_group', '=', 0);
+                    }
+                )
+                ->where('node_class', '<=', $node->node_class)
+                ->get();
+            foreach ($mu_nodes as $mu_node) {
+                $mu_user = User::where('enable', 1)->where('is_multi_user', '<>', 0)->where('port', '=', $mu_node->server)->first();
+                if ($mu_user == null) continue;
+                $port = self::OutPort($node->server, $mu_node->server);
+                $api_url = $_ENV['detect_gfw_url'];
+                $api_url = str_replace(
+                    array('{ip}', '{port}'),
+                    array($node->node_ip, $port),
+                    $api_url
+                );
+                $result_tcping = self::DetectPort($api_url);
+                if ($result_tcping) continue;
+                $gfw_port_nodes[$mu_node->server][] = $node->id;
+                echo ('#' . $node->id . ' --- ' . $node->name . ' --- ' . $port . ' 端口不通' . PHP_EOL);
+            }
+        }
+        foreach ($gfw_port_nodes as $port => $array) {
+            $mu_node = Node::where('sort', 9)->where('server', '=', $port)->where('type', '1')->first();
+            $mu_user = User::where('enable', 1)->where('is_multi_user', '<>', 0)->where('port', '=', $port)->first();
+            if ($mu_node == null || $mu_user == null) continue;
+            $mu_port_nodes = Node::where(
+                static function ($query) {
+                    $query->where('sort', 0)
+                        ->orwhere('sort', 10);
+                }
+            )
+                ->where(
+                    static function ($query) use ($mu_node) {
+                        if ($mu_node->node_group == 0) {
+                            $query->where('node_group', '>=', 0);
+                        } else {
+                            $query->where('node_group', '=', $mu_node->node_group);
+                        }
+                    }
+                )
+                ->where('node_class', '>=', $mu_node->node_class)
+                ->where('mu_only', '>=', '0')
+                ->where('type', '1')
+                ->get();
+            for ($i = 0; $i <= 10; $i++) {
+                $new_port = rand((int) self::Config['port_min'], (int) self::Config['port_max']);
+                if (Node::where('sort', 9)->where('server', '=', $new_port)->first() == null && User::where('port', '=', $new_port)->first() == null) {
+                    break;
+                }
+            }
+            $number = (count($array) / count($mu_port_nodes)) * 100;
+            if ($number >= self::Config['mu_node_port_change_percent']) {
+                echo ('超过百分比:' . $number . '%'. PHP_EOL);
+                echo ('#' . $mu_node->id . ' - 单端口承载节点 - ' . $mu_node->name . ' - 更换了新的端口 ' . $new_port . PHP_EOL);
+                $mu_node->server = $new_port;
+                $mu_node->save();
+                echo ('#' . $mu_user->id . ' - 单端口承载用户 - ' . $mu_user->user_name . ' - 更换了新的端口 ' . $new_port . PHP_EOL);
+                $mu_user->port = $new_port;
+                $mu_user->save();
+                foreach ($mu_port_nodes as $mu_port_node) {
+                    $node_port = self::OutPort($mu_port_node->server, $port);
+                    if (in_array($mu_port_node->id, $array) && !in_array($mu_port_node->id, self::Config['exception_node_id'])) {
+                        if ($node_port != $port) {
+                            if ($node_port == $new_port) {
+                                if (strpos($mu_port_node->server, ($port . '#')) !== false) {
+                                    for ($i = 0; $i <= 10; $i++) {
+                                        $new_mu_node_port = rand((int) self::Config['port_min'], (int) self::Config['port_max']);
+                                        if ($new_mu_node_port != $new_port && Node::where('port', '=', $new_mu_node_port)->first() == null && User::where('port', '=', $new_mu_node_port)->first() == null) {
+                                            break;
+                                        }
+                                    }
+                                    $mu_port_node->server = str_replace(($port . '#' . $node_port), ($new_port . '#' . $new_mu_node_port), $mu_port_node->server);
+                                    echo ('#' . $mu_port_node->id . ' - 节点 - ' . $mu_port_node->name . ' - 端口从 ' . $node_port . ' 偏移到了新的端口 ' . $new_mu_node_port . PHP_EOL);
+                                }
+                            } else {
+                                if (strpos($mu_port_node->server, ($port . '#')) !== false) {
+                                    $mu_port_node->server = str_replace(('+' . $port . '#' . $node_port), '', $mu_port_node->server);
+                                    $mu_port_node->server = str_replace(($port . '#' . $node_port . '+'), '', $mu_port_node->server);
+                                    $mu_port_node->server = str_replace(($port . '#' . $node_port), '', $mu_port_node->server);
+                                    echo ('#' . $mu_port_node->id . ' - 节点 - ' . $mu_port_node->name . ' - 端口从 ' . $node_port . ' 偏移到了新的端口 ' . $new_port . PHP_EOL);
+                                }
+                            }
+                        }
+                    } else {
+                        if ($node_port == $port) {
+                            if (strpos($mu_port_node->server, ';') !== false) {
+                                if (strpos($mu_port_node->server, 'port=') !== false) {
+                                    $mu_port_node->server = str_replace('port=', ('port=' . $new_port . '#' . $port . '+'), $mu_port_node->server);
+                                } else {
+                                    $mu_port_node->server = ($mu_port_node->server . ';port=' . $new_port . '#' . $port);
+                                }
+                            } else {
+                                $mu_port_node->server = ($mu_port_node->server . ';port=' . $new_port . '#' . $port);
+                            }
+                        } else {
+                            if (strpos($mu_port_node->server, ($port . '#')) !== false) {
+                                $mu_port_node->server = str_replace(($port . '#'), ($new_port . '#'), $mu_port_node->server);
+                            }
+                        }
+                        echo ('#' . $mu_port_node->id . ' - 节点 - ' . $mu_port_node->name . ' - 由于端口未被墙或例外设置,已将端口偏移回原端口 ' . $node_port . PHP_EOL);
+                    }
+                    $mu_port_node->save();
+                }
+            } else {
+                foreach ($array as $node_id) {
+                    if (in_array($node_id, self::Config['exception_node_id'])) continue;
+                    $node = Node::find($node_id);
+                    $node_port = self::OutPort($node->server, $port);
+                    if ($node_port != $port) {
+                        if (strpos($node->server, ('#' . $node_port)) !== false) {
+                            echo ('#' . $node->id . ' - 节点 - ' . $node->name . ' - 端口从' . $node_port . '偏移到了新的端口 ' . $new_port . PHP_EOL);
+                            $node->server = str_replace(('#' . $node_port), ('#' . $new_port), $node->server);
+                        }
+                    } else {
+                        if (strpos($node->server, ';') !== false) {
+                            if (strpos($node->server, 'port=') !== false) {
+                                $node->server = str_replace('port=', ('port=' . $port . '#' . $new_port . '+'), $node->server);
+                            } else {
+                                $node->server = ($node->server . ';port=' . $port . '#' . $new_port);
+                            }
+                        } else {
+                            $node->server = ($node->server . ';port=' . $port . '#' . $new_port);
+                        }
+                        echo ('#' . $node->id . ' - 节点 - ' . $node->name . ' - 端口从' . $node_port . '偏移到了新的端口 ' . $new_port . PHP_EOL);
+                    }
+                    $node->save();
+                }
+            }
+        }
+    }
+
+    public static function OutPort($server, $mu_port)
+    {
+        $node_port = $mu_port;
+        if (strpos($server, ';') !== false) {
+            $node_server = explode(';', $server);
+            if (strpos($node_server[1], 'port') !== false) {
+                $item = URL::parse_args($node_server[1]);
+                if (strpos($item['port'], '#') !== false) {
+                    if (strpos($item['port'], '+') !== false) {
+                        $args_explode = explode('+', $item['port']);
+                        foreach ($args_explode as $arg) {
+                            if ((int) substr($arg, 0, strpos($arg, '#')) == $mu_port) {
+                                $node_port = (int) substr($arg, strpos($arg, '#') + 1);
+                            }
+                        }
+                    } else {
+                        if ((int) substr($item['port'], 0, strpos($item['port'], '#')) == $mu_port) {
+                            $node_port = (int) substr($item['port'], strpos($item['port'], '#') + 1);
+                        }
+                    }
+                } else {
+                    $node_port = ($mu_port + (int) $item['port']);
+                }
+            }
+        }
+
+        return $node_port;
+    }
+
+    public static function DetectPort($api_url)
+    {
+        $result_tcping = false;
+        $detect_time = $_ENV['detect_gfw_count'];
+        for ($i = 1; $i <= $detect_time; $i++) {
+            $json_tcping = json_decode(file_get_contents($api_url), true);
+            if (eval('return ' . $_ENV['detect_gfw_judge'] . ';')) {
+                $result_tcping = true;
+                break;
+            }
+        }
+
+        return $result_tcping;
+    }
+}

+ 0 - 2
src/Command/SyncRadius.php

@@ -8,12 +8,10 @@ use App\Models\Node;
 use App\Models\RadiusRadPostauth;
 use App\Models\RadiusRadPostauth;
 use App\Models\RadiusRadAcct;
 use App\Models\RadiusRadAcct;
 use App\Models\RadiusNas;
 use App\Models\RadiusNas;
-use App\Services\Config;
 use App\Services\Mail;
 use App\Services\Mail;
 use App\Models\TrafficLog;
 use App\Models\TrafficLog;
 use App\Utils\Tools;
 use App\Utils\Tools;
 use App\Utils\Radius;
 use App\Utils\Radius;
-use App\Utils\Da;
 use Exception;
 use Exception;
 
 
 class SyncRadius
 class SyncRadius

+ 4 - 1
src/Command/Update.php

@@ -2,7 +2,7 @@
 
 
 namespace App\Command;
 namespace App\Command;
 
 
-use App\Services\Config;
+use App\Services\DefaultConfig;
 
 
 class Update
 class Update
 {
 {
@@ -19,6 +19,9 @@ class Update
 
 
         echo(PHP_EOL);
         echo(PHP_EOL);
 
 
+        // 检查并创建新增的配置项
+        echo DefaultConfig::detectConfigs();
+
         echo('开始升级客户端...' . PHP_EOL);
         echo('开始升级客户端...' . PHP_EOL);
         Job::updatedownload();
         Job::updatedownload();
         echo('客户端升级结束' . PHP_EOL);
         echo('客户端升级结束' . PHP_EOL);

+ 84 - 54
src/Command/XCat.php

@@ -13,6 +13,7 @@ use App\Services\Gateway\ChenPay;
 use App\Utils\Hash;
 use App\Utils\Hash;
 use App\Utils\Tools;
 use App\Utils\Tools;
 use App\Services\Config;
 use App\Services\Config;
+use App\Services\DefaultConfig;
 
 
 use App\Utils\GA;
 use App\Utils\GA;
 use Exception;
 use Exception;
@@ -98,6 +99,12 @@ class XCat
                 return $this->npmbuild();
                 return $this->npmbuild();
             case ('getCookie'):
             case ('getCookie'):
                 return $this->getCookie();
                 return $this->getCookie();
+            case ('detectConfigs'):
+                return $this->detectConfigs();
+            case ('portAutoChange'):
+                return PortAutoChange::index();
+            case ('initdocuments'):
+                return $this->initdocuments();
             default:
             default:
                 return $this->defaultAction();
                 return $this->defaultAction();
         }
         }
@@ -105,17 +112,20 @@ class XCat
 
 
     public function defaultAction()
     public function defaultAction()
     {
     {
-        echo(PHP_EOL . '用法: php xcat [选项]' . PHP_EOL);
-        echo('常用选项:' . PHP_EOL);
-        echo('  createAdmin - 创建管理员帐号' . PHP_EOL);
-        echo('  setTelegram - 设置 Telegram 机器人' . PHP_EOL);
-        echo('  cleanRelayRule - 清除所有中转规则' . PHP_EOL);
-        echo('  resetPort - 重置单个用户端口' . PHP_EOL);
-        echo('  resetAllPort - 重置所有用户端口' . PHP_EOL);
-        echo('  initdownload - 下载 SSR 程序至服务器' . PHP_EOL);
-        echo('  initQQWry - 下载 IP 解析库' . PHP_EOL);
-        echo('  resetTraffic - 重置所有用户流量' . PHP_EOL);
-        echo('  update - 更新并迁移配置' . PHP_EOL);
+        echo (PHP_EOL . '用法: php xcat [选项]' . PHP_EOL);
+        echo ('常用选项:' . PHP_EOL);
+        echo ('  createAdmin - 创建管理员帐号' . PHP_EOL);
+        echo ('  setTelegram - 设置 Telegram 机器人' . PHP_EOL);
+        echo ('  cleanRelayRule - 清除所有中转规则' . PHP_EOL);
+        echo ('  resetPort - 重置单个用户端口' . PHP_EOL);
+        echo ('  resetAllPort - 重置所有用户端口' . PHP_EOL);
+        echo ('  initdownload - 下载 SSR 程序至服务器' . PHP_EOL);
+        echo ('  initQQWry - 下载 IP 解析库' . PHP_EOL);
+        echo ('  resetTraffic - 重置所有用户流量' . PHP_EOL);
+        echo ('  update - 更新并迁移配置' . PHP_EOL);
+        echo ('  detectConfigs - 检查数据库内新增的配置' . PHP_EOL);
+        echo ('  initdocuments - 下载用户使用文档至服务器' . PHP_EOL);
+        echo ('  portAutoChange - [实验]  SS 单端口被墙自动换' . PHP_EOL);
     }
     }
 
 
     public function resetPort()
     public function resetPort()
@@ -152,9 +162,9 @@ class XCat
     {
     {
         $rules = Relay::all();
         $rules = Relay::all();
         foreach ($rules as $rule) {
         foreach ($rules as $rule) {
-            echo($rule->id . "\n");
+            echo ($rule->id . "\n");
             if ($rule->source_node_id == 0) {
             if ($rule->source_node_id == 0) {
-                echo($rule->id . "被删除!\n");
+                echo ($rule->id . "被删除!\n");
                 $rule->delete();
                 $rule->delete();
                 continue;
                 continue;
             }
             }
@@ -162,7 +172,7 @@ class XCat
             $ruleset = Relay::where('user_id', $rule->user_id)->orwhere('user_id', 0)->get();
             $ruleset = Relay::where('user_id', $rule->user_id)->orwhere('user_id', 0)->get();
             $maybe_rule_id = Tools::has_conflict_rule($rule, $ruleset, $rule->id);
             $maybe_rule_id = Tools::has_conflict_rule($rule, $ruleset, $rule->id);
             if ($maybe_rule_id != 0) {
             if ($maybe_rule_id != 0) {
-                echo($rule->id . "被删除!\n");
+                echo ($rule->id . "被删除!\n");
                 $rule->delete();
                 $rule->delete();
             }
             }
         }
         }
@@ -189,7 +199,7 @@ class XCat
             fwrite(STDOUT, "Press [y] to create admin..... 按下[Y]确认来确认创建管理员账户..... \n");
             fwrite(STDOUT, "Press [y] to create admin..... 按下[Y]确认来确认创建管理员账户..... \n");
             $y = trim(fgets(STDIN));
             $y = trim(fgets(STDIN));
         } elseif (count($this->argv) === 4) {
         } elseif (count($this->argv) === 4) {
-            [, , $email, $passwd] = $this->argv;
+            [,, $email, $passwd] = $this->argv;
             $y = 'y';
             $y = 'y';
         }
         }
 
 
@@ -197,33 +207,33 @@ class XCat
             echo 'start create admin account';
             echo 'start create admin account';
             // create admin user
             // create admin user
             // do reg user
             // do reg user
-            $user = new User();
-            $user->user_name = 'admin';
-            $user->email = $email;
-            $user->pass = Hash::passwordHash($passwd);
-            $user->passwd = Tools::genRandomChar(6);
-            $user->port = Tools::getLastPort() + 1;
-            $user->t = 0;
-            $user->u = 0;
-            $user->d = 0;
-            $user->transfer_enable = Tools::toGB($_ENV['defaultTraffic']);
-            $user->invite_num = $_ENV['inviteNum'];
-            $user->ref_by = 0;
-            $user->is_admin = 1;
-            $user->expire_in = date('Y-m-d H:i:s', time() + $_ENV['user_expire_in_default'] * 86400);
-            $user->reg_date = date('Y-m-d H:i:s');
-            $user->money = 0;
-            $user->im_type = 1;
-            $user->im_value = '';
-            $user->class = 0;
-            $user->plan = 'A';
-            $user->node_speedlimit = 0;
-            $user->theme = $_ENV['theme'];
+            $user                   = new User();
+            $user->user_name        = 'admin';
+            $user->email            = $email;
+            $user->pass             = Hash::passwordHash($passwd);
+            $user->passwd           = Tools::genRandomChar(6);
+            $user->port             = Tools::getLastPort() + 1;
+            $user->t                = 0;
+            $user->u                = 0;
+            $user->d                = 0;
+            $user->transfer_enable  = Tools::toGB((int) Config::getconfig('Register.string.defaultTraffic'));
+            $user->invite_num       = (int) Config::getconfig('Register.string.defaultInviteNum');
+            $user->ref_by           = 0;
+            $user->is_admin         = 1;
+            $user->expire_in        = date('Y-m-d H:i:s', time() + (int) Config::getconfig('Register.string.defaultExpire_in') * 86400);
+            $user->reg_date         = date('Y-m-d H:i:s');
+            $user->money            = 0;
+            $user->im_type          = 1;
+            $user->im_value         = '';
+            $user->class            = 0;
+            $user->plan             = 'A';
+            $user->node_speedlimit  = 0;
+            $user->theme            = $_ENV['theme'];
 
 
-            $ga = new GA();
-            $secret = $ga->createSecret();
-            $user->ga_token = $secret;
-            $user->ga_enable = 0;
+            $ga                     = new GA();
+            $secret                 = $ga->createSecret();
+            $user->ga_token         = $secret;
+            $user->ga_enable        = 0;
 
 
             if ($user->save()) {
             if ($user->save()) {
                 echo "Successful/添加成功!\n";
                 echo "Successful/添加成功!\n";
@@ -253,33 +263,42 @@ class XCat
 
 
     public function setTelegram()
     public function setTelegram()
     {
     {
-        $bot = new BotApi($_ENV['telegram_token']);
-        $ch= curl_init();
-        curl_setopt ($ch, CURLOPT_URL, sprintf('https://api.telegram.org/bot%s/deleteWebhook', $_ENV['telegram_token']));
-        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
-        curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 5);
-        $deleteWebhookReturn = json_decode(curl_exec($ch));
-        curl_close($ch);
-        if ($deleteWebhookReturn->ok && $deleteWebhookReturn->result && $bot->setWebhook($_ENV['baseUrl'] . '/telegram_callback?token=' . $_ENV['telegram_request_token']) == 1) {
-            echo('设置成功!' . PHP_EOL);
+        if ($_ENV['use_new_telegram_bot'] === true) {
+            $WebhookUrl = ($_ENV['baseUrl'] . '/telegram_callback?token=' . $_ENV['telegram_request_token']);
+            $telegram = new \Telegram\Bot\Api($_ENV['telegram_token']);
+            $telegram->removeWebhook();
+            if ($telegram->setWebhook(['url' => $WebhookUrl])) {
+                echo ('New Bot @' . $telegram->getMe()->getUsername() . ' 设置成功!');
+            }
+        } else {
+            $bot = new BotApi($_ENV['telegram_token']);
+            $ch = curl_init();
+            curl_setopt($ch, CURLOPT_URL, sprintf('https://api.telegram.org/bot%s/deleteWebhook', $_ENV['telegram_token']));
+            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
+            $deleteWebhookReturn = json_decode(curl_exec($ch));
+            curl_close($ch);
+            if ($deleteWebhookReturn->ok && $deleteWebhookReturn->result && $bot->setWebhook($_ENV['baseUrl'] . '/telegram_callback?token=' . $_ENV['telegram_request_token']) == 1) {
+                echo ('Old Bot 设置成功!' . PHP_EOL);
+            }
         }
         }
     }
     }
 
 
     public function initQQWry()
     public function initQQWry()
     {
     {
-        echo('开始下载纯真 IP 数据库....');
+        echo ('开始下载纯真 IP 数据库....');
         $qqwry = file_get_contents('https://qqwry.mirror.noc.one/QQWry.Dat?from=sspanel_uim');
         $qqwry = file_get_contents('https://qqwry.mirror.noc.one/QQWry.Dat?from=sspanel_uim');
         if ($qqwry != '') {
         if ($qqwry != '') {
             $fp = fopen(BASE_PATH . '/storage/qqwry.dat', 'wb');
             $fp = fopen(BASE_PATH . '/storage/qqwry.dat', 'wb');
             if ($fp) {
             if ($fp) {
                 fwrite($fp, $qqwry);
                 fwrite($fp, $qqwry);
                 fclose($fp);
                 fclose($fp);
-                echo('纯真 IP 数据库下载成功!');
+                echo ('纯真 IP 数据库下载成功!');
             } else {
             } else {
-                echo('纯真 IP 数据库保存失败!');
+                echo ('纯真 IP 数据库保存失败!');
             }
             }
         } else {
         } else {
-            echo('下载失败!请重试,或在 https://github.com/SukkaW/qqwry-mirror/issues/new 反馈!');
+            echo ('下载失败!请重试,或在 https://github.com/SukkaW/qqwry-mirror/issues/new 反馈!');
         }
         }
     }
     }
 
 
@@ -334,4 +353,15 @@ class XCat
             echo Hash::cookieHash($user->pass, $expire_in) . ' ' . $expire_in;
             echo Hash::cookieHash($user->pass, $expire_in) . ' ' . $expire_in;
         }
         }
     }
     }
+
+    public function initdocuments()
+    {
+        system('git clone https://github.com/GeekQu/PANEL_DOC.git ' . BASE_PATH . "/public/docs/", $ret);
+        echo $ret;
+    }
+
+    public function detectConfigs()
+    {
+        echo DefaultConfig::detectConfigs();
+    }
 }
 }

+ 9 - 6
src/Controllers/Admin/AnnController.php

@@ -2,15 +2,18 @@
 
 
 namespace App\Controllers\Admin;
 namespace App\Controllers\Admin;
 
 
-use App\Models\Ann;
 use App\Controllers\AdminController;
 use App\Controllers\AdminController;
-use App\Utils\Telegram;
-use App\Services\Config;
+use App\Models\{
+    Ann,
+    User
+};
+use App\Utils\{
+    Telegram,
+    DatatablesHelper
+};
 use App\Services\Mail;
 use App\Services\Mail;
-use App\Models\User;
-use Exception;
 use Ozdemir\Datatables\Datatables;
 use Ozdemir\Datatables\Datatables;
-use App\Utils\DatatablesHelper;
+use Exception;
 
 
 class AnnController extends AdminController
 class AnnController extends AdminController
 {
 {

+ 10 - 7
src/Controllers/Admin/AutoController.php

@@ -2,19 +2,23 @@
 
 
 namespace App\Controllers\Admin;
 namespace App\Controllers\Admin;
 
 
-use App\Models\Auto;
 use App\Controllers\AdminController;
 use App\Controllers\AdminController;
-use Ozdemir\Datatables\Datatables;
+use App\Models\Auto;
 use App\Utils\DatatablesHelper;
 use App\Utils\DatatablesHelper;
+use Ozdemir\Datatables\Datatables;
 
 
 class AutoController extends AdminController
 class AutoController extends AdminController
 {
 {
     public function index($request, $response, $args)
     public function index($request, $response, $args)
     {
     {
-        $table_config['total_column'] = array('id' => 'ID',
-            'datetime' => '时间', 'type' => '类型', 'value' => '内容');
-        $table_config['default_show_column'] = array('op', 'id',
-            'datetime', 'type', 'value');
+        $table_config['total_column'] = array(
+            'id' => 'ID',
+            'datetime' => '时间', 'type' => '类型', 'value' => '内容'
+        );
+        $table_config['default_show_column'] = array(
+            'op', 'id',
+            'datetime', 'type', 'value'
+        );
         $table_config['ajax_url'] = 'auto/ajax';
         $table_config['ajax_url'] = 'auto/ajax';
         return $this->view()->assign('table_config', $table_config)->display('admin/auto/index.tpl');
         return $this->view()->assign('table_config', $table_config)->display('admin/auto/index.tpl');
     }
     }
@@ -42,7 +46,6 @@ class AutoController extends AdminController
         return $response->getBody()->write(json_encode($rs));
         return $response->getBody()->write(json_encode($rs));
     }
     }
 
 
-
     public function delete($request, $response, $args)
     public function delete($request, $response, $args)
     {
     {
         $id = $request->getParam('id');
         $id = $request->getParam('id');

+ 12 - 9
src/Controllers/Admin/CodeController.php

@@ -2,23 +2,28 @@
 
 
 namespace App\Controllers\Admin;
 namespace App\Controllers\Admin;
 
 
-use App\Models\Code;
-use App\Models\User;
 use App\Controllers\AdminController;
 use App\Controllers\AdminController;
-use App\Utils\Tools;
+use App\Models\{
+    Code,
+    User
+};
+use App\Utils\{
+    Tools,
+    DatatablesHelper
+};
 use App\Services\Auth;
 use App\Services\Auth;
-
 use Ozdemir\Datatables\Datatables;
 use Ozdemir\Datatables\Datatables;
-use App\Utils\DatatablesHelper;
 
 
 class CodeController extends AdminController
 class CodeController extends AdminController
 {
 {
     public function index($request, $response, $args)
     public function index($request, $response, $args)
     {
     {
-        $table_config['total_column'] = array('id' => 'ID', 'code' => '内容',
+        $table_config['total_column'] = array(
+            'id' => 'ID', 'code' => '内容',
             'type' => '类型', 'number' => '操作',
             'type' => '类型', 'number' => '操作',
             'isused' => '是否已经使用', 'userid' => '用户ID',
             'isused' => '是否已经使用', 'userid' => '用户ID',
-            'user_name' => '用户名', 'usedatetime' => '使用时间');
+            'user_name' => '用户名', 'usedatetime' => '使用时间'
+        );
         $table_config['default_show_column'] = array();
         $table_config['default_show_column'] = array();
         foreach ($table_config['total_column'] as $column => $value) {
         foreach ($table_config['total_column'] as $column => $value) {
             $table_config['default_show_column'][] = $column;
             $table_config['default_show_column'][] = $column;
@@ -60,13 +65,11 @@ class CodeController extends AdminController
             $code->save();
             $code->save();
         }
         }
 
 
-
         $rs['ret'] = 1;
         $rs['ret'] = 1;
         $rs['msg'] = '充值码添加成功';
         $rs['msg'] = '充值码添加成功';
         return $response->getBody()->write(json_encode($rs));
         return $response->getBody()->write(json_encode($rs));
     }
     }
 
 
-
     public function donate_add($request, $response, $args)
     public function donate_add($request, $response, $args)
     {
     {
         $amount = $request->getParam('amount');
         $amount = $request->getParam('amount');

+ 65 - 0
src/Controllers/Admin/DetectBanLogController.php

@@ -0,0 +1,65 @@
+<?php
+
+namespace App\Controllers\Admin;
+
+use App\Controllers\AdminController;
+use App\Utils\DatatablesHelper;
+use Ozdemir\Datatables\Datatables;
+use Psr\Http\Message\ResponseInterface;
+
+class DetectBanLogController extends AdminController
+{
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function index($request, $response, $args): ResponseInterface
+    {
+        $table_config['total_column'] = array(
+            "id"                => "ID",
+            "user_id"           => "用户ID",
+            "user_name"         => "用户名",
+            "email"             => "用户邮箱",
+            "detect_number"     => "违规次数",
+            "ban_time"          => "封禁时长(分钟)",
+            "start_time"        => "统计开始时间",
+            "end_time"          => "统计结束以及封禁开始时间",
+            "ban_end_time"      => "封禁结束时间",
+            "all_detect_number" => "累计违规次数"
+        );
+        $table_config['default_show_column'] = array();
+        foreach ($table_config['total_column'] as $column => $value) {
+            $table_config['default_show_column'][] = $column;
+        }
+        $table_config['ajax_url'] = 'ban/ajax';
+        return $response->write(
+            $this->view()
+                ->assign('table_config', $table_config)
+                ->display('admin/detect/ban.tpl')
+        );
+    }
+
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function ajax_log($request, $response, $args): ResponseInterface
+    {
+        $datatables = new Datatables(new DatatablesHelper());
+        $datatables->query('Select detect_ban_log.id,detect_ban_log.user_id,detect_ban_log.user_name,detect_ban_log.email,detect_ban_log.detect_number,detect_ban_log.ban_time,detect_ban_log.start_time,detect_ban_log.end_time,detect_ban_log.all_detect_number,detect_ban_log.end_time as ban_end_time from detect_ban_log');
+        $datatables->edit('start_time', function ($data) {
+            return date('Y-m-d H:i:s', $data['start_time']);
+        });
+        $datatables->edit('end_time', function ($data) {
+            return date('Y-m-d H:i:s', $data['end_time']);
+        });
+        $datatables->edit('ban_end_time', function ($data) {
+            return date('Y-m-d H:i:s', $data['ban_end_time'] + $data['ban_time'] * 60);
+        });
+        return $response->write(
+            $datatables->generate()
+        );
+    }
+}

+ 13 - 9
src/Controllers/Admin/DetectController.php

@@ -2,20 +2,23 @@
 
 
 namespace App\Controllers\Admin;
 namespace App\Controllers\Admin;
 
 
-use App\Models\DetectRule;
-use App\Utils\Telegram;
 use App\Controllers\AdminController;
 use App\Controllers\AdminController;
-
+use App\Models\DetectRule;
+use App\Utils\{
+    Telegram,
+    DatatablesHelper
+};
 use Ozdemir\Datatables\Datatables;
 use Ozdemir\Datatables\Datatables;
-use App\Utils\DatatablesHelper;
 
 
 class DetectController extends AdminController
 class DetectController extends AdminController
 {
 {
     public function index($request, $response, $args)
     public function index($request, $response, $args)
     {
     {
-        $table_config['total_column'] = array('op' => '操作', 'id' => 'ID', 'name' => '名称',
+        $table_config['total_column'] = array(
+            'op' => '操作', 'id' => 'ID', 'name' => '名称',
             'text' => '介绍', 'regex' => '正则表达式',
             'text' => '介绍', 'regex' => '正则表达式',
-            'type' => '类型');
+            'type' => '类型'
+        );
         $table_config['default_show_column'] = array();
         $table_config['default_show_column'] = array();
         foreach ($table_config['total_column'] as $column => $value) {
         foreach ($table_config['total_column'] as $column => $value) {
             $table_config['default_show_column'][] = $column;
             $table_config['default_show_column'][] = $column;
@@ -26,12 +29,14 @@ class DetectController extends AdminController
 
 
     public function log($request, $response, $args)
     public function log($request, $response, $args)
     {
     {
-        $table_config['total_column'] = array('id' => 'ID', 'user_id' => '用户ID',
+        $table_config['total_column'] = array(
+            'id' => 'ID', 'user_id' => '用户ID',
             'user_name' => '用户名', 'node_id' => '节点ID',
             'user_name' => '用户名', 'node_id' => '节点ID',
             'node_name' => '节点名', 'rule_id' => '规则ID',
             'node_name' => '节点名', 'rule_id' => '规则ID',
             'rule_name' => '规则名', 'rule_text' => '规则描述',
             'rule_name' => '规则名', 'rule_text' => '规则描述',
             'rule_regex' => '规则正则表达式', 'rule_type' => '规则类型',
             'rule_regex' => '规则正则表达式', 'rule_type' => '规则类型',
-            'datetime' => '时间');
+            'datetime' => '时间'
+        );
         $table_config['default_show_column'] = array();
         $table_config['default_show_column'] = array();
         foreach ($table_config['total_column'] as $column => $value) {
         foreach ($table_config['total_column'] as $column => $value) {
             $table_config['default_show_column'][] = $column;
             $table_config['default_show_column'][] = $column;
@@ -96,7 +101,6 @@ class DetectController extends AdminController
         return $response->getBody()->write(json_encode($rs));
         return $response->getBody()->write(json_encode($rs));
     }
     }
 
 
-
     public function delete($request, $response, $args)
     public function delete($request, $response, $args)
     {
     {
         $id = $request->getParam('id');
         $id = $request->getParam('id');

+ 198 - 0
src/Controllers/Admin/GConfigController.php

@@ -0,0 +1,198 @@
+<?php
+
+namespace App\Controllers\Admin;
+
+use App\Controllers\AdminController;
+use App\Models\GConfig;
+use Psr\Http\Message\ResponseInterface;
+
+class GConfigController extends AdminController
+{
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function update($request, $response, $args): ResponseInterface
+    {
+        $key    = trim($args['key']);
+        $user   = $this->user;
+        $config = GConfig::where('key', '=', $key)->first();
+        if ($config != null && $config->setValue($request->getParam('value'), $user) === true) {
+            return $response->write(
+                json_encode(
+                    [
+                    'ret' => 1,
+                    'msg' => '修改成功'
+                    ]
+                )
+            );
+        }
+        return $response->write(
+            json_encode(
+                [
+                    'ret' => 0,
+                    'msg' => '修改失败'
+                ]
+            )
+        );
+    }
+
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function edit($request, $response, $args): ResponseInterface
+    {
+        $key    = trim($args['key']);
+        $config = GConfig::where('key', '=', $key)->first();
+        return $response->write(
+            $this->view()
+                ->assign('edit_config', $config)
+                ->fetch('admin/config/edit.tpl')
+        );
+    }
+
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function register($request, $response, $args): ResponseInterface
+    {
+        $table_config['total_column'] = array(
+            'op'             => '操作',
+            'name'           => '配置名称',
+            'key'            => '配置名',
+            'value'          => '配置值',
+            'operator_id'    => '操作员 ID',
+            'operator_name'  => '操作员名称',
+            'operator_email' => '操作员邮箱',
+            'last_update'    => '修改时间'
+        );
+        $table_config['default_show_column'] = array('op', 'name', 'value', 'last_update');
+        foreach ($table_config['total_column'] as $column => $value) {
+            $table_config['default_show_column'][] = $column;
+        }
+        $table_config['ajax_url'] = 'register/ajax';
+        $edit_config = GConfig::where('key', '=', 'Register.string.Mode')->first();
+        return $response->write(
+            $this->view()
+                ->assign('edit_config', $edit_config)
+                ->assign('table_config', $table_config)
+                ->fetch('admin/config/user/register.tpl')
+        );
+    }
+
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function register_ajax($request, $response, $args): ResponseInterface
+    {
+        $start        = $request->getParam("start");
+        $limit_length = $request->getParam('length');
+        $configs      = GConfig::skip($start)->where('key', 'LIKE', "%Register%")->limit($limit_length)->get();
+        $total_conut  = GConfig::where('key', 'LIKE', "%Register%")->count();
+        $data         = [];
+        foreach ($configs as $config) {
+            $tempdata = [];
+            $tempdata['op']             = '<a class="btn btn-brand" href="/admin/config/update/' . $config->key . '/edit">编辑</a>';
+            $tempdata['name']           = $config->name;
+            $tempdata['key']            = $config->key;
+            $tempdata['value']          = $config->getValue();
+            $tempdata['operator_id']    = $config->operator_id;
+            $tempdata['operator_name']  = $config->operator_name;
+            $tempdata['operator_email'] = $config->operator_email;
+            $tempdata['last_update']    = date('Y-m-d H:i:s', $config->last_update);
+            if (strpos($config->key, '.bool.')) {
+                $tempdata['value'] = ($config->getValue() ? '开启' : '关闭');
+            } else {
+                $tempdata['value'] = '(请在编辑页面查看)';
+            }
+            $data[] = $tempdata;
+        }
+        $info = [
+            'draw'            => $request->getParam('draw'),
+            'recordsTotal'    => $total_conut,
+            'recordsFiltered' => $total_conut,
+            'data'            => $data
+        ];
+
+        return $response->write(
+            json_encode($info)
+        );
+    }
+
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function telegram($request, $response, $args): ResponseInterface
+    {
+        $table_config['total_column'] = array(
+            'op'             => '操作',
+            'name'           => '配置名称',
+            'key'            => '配置名',
+            'value'          => '配置值',
+            'operator_id'    => '操作员 ID',
+            'operator_name'  => '操作员名称',
+            'operator_email' => '操作员邮箱',
+            'last_update'    => '修改时间'
+        );
+        $table_config['default_show_column'] = array('op', 'name', 'value', 'last_update');
+        foreach ($table_config['total_column'] as $column => $value) {
+            $table_config['default_show_column'][] = $column;
+        }
+        $table_config['ajax_url'] = 'telegram/ajax';
+        return $response->write(
+            $this->view()
+                ->assign('table_config', $table_config)
+                ->fetch('admin/config/telegram/index.tpl')
+        );
+    }
+
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function telegram_ajax($request, $response, $args): ResponseInterface
+    {
+        $start        = $request->getParam("start");
+        $limit_length = $request->getParam('length');
+        $configs      = GConfig::skip($start)->where('key', 'LIKE', "%Telegram%")->limit($limit_length)->get();
+        $total_conut  = GConfig::where('key', 'LIKE', "%Telegram%")->count();
+        $data         = [];
+        foreach ($configs as $config) {
+            $tempdata = [];
+            $tempdata['op']             = '<a class="btn btn-brand" href="/admin/config/update/' . $config->key . '/edit">编辑</a>';
+            $tempdata['name']           = $config->name;
+            $tempdata['key']            = $config->key;
+            $tempdata['value']          = $config->value;
+            $tempdata['operator_id']    = $config->operator_id;
+            $tempdata['operator_name']  = $config->operator_name;
+            $tempdata['operator_email'] = $config->operator_email;
+            $tempdata['last_update']    = date('Y-m-d H:i:s', $config->last_update);
+            if (strpos($config->key, '.bool.')) {
+                $tempdata['value'] = ($config->getValue() ? '开启' : '关闭');
+            } else {
+                $tempdata['value'] = '(请在编辑页面查看)';
+            }
+            $data[] = $tempdata;
+        }
+        $info = [
+            'draw'            => $request->getParam('draw'),
+            'recordsTotal'    => $total_conut,
+            'recordsFiltered' => $total_conut,
+            'data'            => $data
+        ];
+
+        return $response->write(
+            json_encode($info, true)
+        );
+    }
+}

+ 26 - 18
src/Controllers/Admin/IpController.php

@@ -2,24 +2,29 @@
 
 
 namespace App\Controllers\Admin;
 namespace App\Controllers\Admin;
 
 
-use App\Models\BlockIp;
-use App\Models\UnblockIp;
-use App\Models\Node;
 use App\Controllers\AdminController;
 use App\Controllers\AdminController;
-use App\Utils\QQWry;
-use App\Utils\Tools;
+use App\Models\{
+    Node,
+    BlockIp,
+    UnblockIp
+};
+use App\Utils\{
+    QQWry,
+    Tools,
+    DatatablesHelper
+};
 use App\Services\Auth;
 use App\Services\Auth;
-
 use Ozdemir\Datatables\Datatables;
 use Ozdemir\Datatables\Datatables;
-use App\Utils\DatatablesHelper;
 
 
 class IpController extends AdminController
 class IpController extends AdminController
 {
 {
     public function index($request, $response, $args)
     public function index($request, $response, $args)
     {
     {
-        $table_config['total_column'] = array('id' => 'ID', 'userid' => '用户ID',
+        $table_config['total_column'] = array(
+            'id' => 'ID', 'userid' => '用户ID',
             'user_name' => '用户名', 'ip' => 'IP',
             'user_name' => '用户名', 'ip' => 'IP',
-            'location' => '归属地', 'datetime' => '时间', 'type' => '类型');
+            'location' => '归属地', 'datetime' => '时间', 'type' => '类型'
+        );
         $table_config['default_show_column'] = array();
         $table_config['default_show_column'] = array();
         foreach ($table_config['total_column'] as $column => $value) {
         foreach ($table_config['total_column'] as $column => $value) {
             $table_config['default_show_column'][] = $column;
             $table_config['default_show_column'][] = $column;
@@ -30,10 +35,12 @@ class IpController extends AdminController
 
 
     public function alive($request, $response, $args)
     public function alive($request, $response, $args)
     {
     {
-        $table_config['total_column'] = array('id' => 'ID', 'userid' => '用户ID',
+        $table_config['total_column'] = array(
+            'id' => 'ID', 'userid' => '用户ID',
             'user_name' => '用户名', 'nodeid' => '节点ID',
             'user_name' => '用户名', 'nodeid' => '节点ID',
             'node_name' => '节点名', 'ip' => 'IP',
             'node_name' => '节点名', 'ip' => 'IP',
-            'location' => '归属地', 'datetime' => '时间', 'is_node' => '是否为中转连接');
+            'location' => '归属地', 'datetime' => '时间', 'is_node' => '是否为中转连接'
+        );
         $table_config['default_show_column'] = array();
         $table_config['default_show_column'] = array();
         foreach ($table_config['total_column'] as $column => $value) {
         foreach ($table_config['total_column'] as $column => $value) {
             $table_config['default_show_column'][] = $column;
             $table_config['default_show_column'][] = $column;
@@ -44,9 +51,11 @@ class IpController extends AdminController
 
 
     public function block($request, $response, $args)
     public function block($request, $response, $args)
     {
     {
-        $table_config['total_column'] = array('id' => 'ID',
+        $table_config['total_column'] = array(
+            'id' => 'ID',
             'name' => '节点名称', 'ip' => 'IP',
             'name' => '节点名称', 'ip' => 'IP',
-            'location' => '归属地', 'datetime' => '时间');
+            'location' => '归属地', 'datetime' => '时间'
+        );
         $table_config['default_show_column'] = array();
         $table_config['default_show_column'] = array();
         foreach ($table_config['total_column'] as $column => $value) {
         foreach ($table_config['total_column'] as $column => $value) {
             $table_config['default_show_column'][] = $column;
             $table_config['default_show_column'][] = $column;
@@ -57,9 +66,11 @@ class IpController extends AdminController
 
 
     public function unblock($request, $response, $args)
     public function unblock($request, $response, $args)
     {
     {
-        $table_config['total_column'] = array('id' => 'ID', 'userid' => '用户ID',
+        $table_config['total_column'] = array(
+            'id' => 'ID', 'userid' => '用户ID',
             'user_name' => '用户名', 'ip' => 'IP',
             'user_name' => '用户名', 'ip' => 'IP',
-            'location' => '归属地', 'datetime' => '时间');
+            'location' => '归属地', 'datetime' => '时间'
+        );
         $table_config['default_show_column'] = array();
         $table_config['default_show_column'] = array();
         foreach ($table_config['total_column'] as $column => $value) {
         foreach ($table_config['total_column'] as $column => $value) {
             $table_config['default_show_column'][] = $column;
             $table_config['default_show_column'][] = $column;
@@ -84,7 +95,6 @@ class IpController extends AdminController
         $UIP->datetime = time();
         $UIP->datetime = time();
         $UIP->save();
         $UIP->save();
 
 
-
         $res['ret'] = 1;
         $res['ret'] = 1;
         $res['msg'] = '发送解封命令解封 ' . $ip . ' 成功';
         $res['msg'] = '发送解封命令解封 ' . $ip . ' 成功';
         return $this->echoJson($response, $res);
         return $this->echoJson($response, $res);
@@ -139,7 +149,6 @@ class IpController extends AdminController
             return date('Y-m-d H:i:s', $data['datetime']);
             return date('Y-m-d H:i:s', $data['datetime']);
         });
         });
 
 
-
         $iplocation = new QQWry();
         $iplocation = new QQWry();
         $datatables->edit('location', static function ($data) use ($iplocation) {
         $datatables->edit('location', static function ($data) use ($iplocation) {
             $location = $iplocation->getlocation($data['location']);
             $location = $iplocation->getlocation($data['location']);
@@ -154,7 +163,6 @@ class IpController extends AdminController
         $body->write($datatables->generate());
         $body->write($datatables->generate());
     }
     }
 
 
-
     public function ajax_alive($request, $response, $args)
     public function ajax_alive($request, $response, $args)
     {
     {
         $datatables = new Datatables(new DatatablesHelper());
         $datatables = new Datatables(new DatatablesHelper());

+ 53 - 19
src/Controllers/Admin/NodeController.php

@@ -2,30 +2,34 @@
 
 
 namespace App\Controllers\Admin;
 namespace App\Controllers\Admin;
 
 
-use App\Models\Node;
-use App\Utils\Radius;
-use App\Utils\Telegram;
-use App\Utils\Tools;
 use App\Controllers\AdminController;
 use App\Controllers\AdminController;
-use App\Utils\CloudflareDriver;
+use App\Models\Node;
+use App\Utils\{
+    Tools,
+    Radius,
+    Telegram,
+    CloudflareDriver,
+    DatatablesHelper
+};
 use App\Services\Config;
 use App\Services\Config;
 use Ozdemir\Datatables\Datatables;
 use Ozdemir\Datatables\Datatables;
-use App\Utils\DatatablesHelper;
 
 
 class NodeController extends AdminController
 class NodeController extends AdminController
 {
 {
     public function index($request, $response, $args)
     public function index($request, $response, $args)
     {
     {
-        $table_config['total_column'] = array('op' => '操作', 'id' => 'ID', 'name' => '节点名称',
+        $table_config['total_column'] = array(
+            'op' => '操作', 'id' => 'ID', 'name' => '节点名称',
             'type' => '显示与隐藏', 'sort' => '类型',
             'type' => '显示与隐藏', 'sort' => '类型',
-            'server' => '节点地址', 'node_ip' => '节点IP',
+            'server' => '节点地址', 'outaddress' => '出口地址', 'node_ip' => '节点IP',
             'info' => '节点信息',
             'info' => '节点信息',
             'status' => '状态', 'traffic_rate' => '流量比率', 'node_group' => '节点群组',
             'status' => '状态', 'traffic_rate' => '流量比率', 'node_group' => '节点群组',
             'node_class' => '节点等级', 'node_speedlimit' => '节点限速/Mbps',
             'node_class' => '节点等级', 'node_speedlimit' => '节点限速/Mbps',
             'node_bandwidth' => '已走流量/GB', 'node_bandwidth_limit' => '流量限制/GB',
             'node_bandwidth' => '已走流量/GB', 'node_bandwidth_limit' => '流量限制/GB',
             'bandwidthlimit_resetday' => '流量重置日', 'node_heartbeat' => '上一次活跃时间',
             'bandwidthlimit_resetday' => '流量重置日', 'node_heartbeat' => '上一次活跃时间',
             'custom_method' => '自定义加密', 'custom_rss' => '自定义协议以及混淆',
             'custom_method' => '自定义加密', 'custom_rss' => '自定义协议以及混淆',
-            'mu_only' => '只启用单端口多用户');
+            'mu_only' => '只启用单端口多用户'
+        );
         $table_config['default_show_column'] = array('op', 'id', 'name', 'sort');
         $table_config['default_show_column'] = array('op', 'id', 'name', 'sort');
         $table_config['ajax_url'] = 'node/ajax';
         $table_config['ajax_url'] = 'node/ajax';
 
 
@@ -89,7 +93,15 @@ class NodeController extends AdminController
             CloudflareDriver::updateRecord($domain_name[0], $node->node_ip);
             CloudflareDriver::updateRecord($domain_name[0], $node->node_ip);
         }
         }
 
 
-        Telegram::Send('新节点添加~' . $request->getParam('name'));
+        if (Config::getconfig('Telegram.bool.AddNode')) {
+            Telegram::Send(
+                str_replace(
+                    '%node_name%',
+                    $request->getParam('name'),
+                    Config::getconfig('Telegram.string.AddNode')
+                )
+            );
+        }
 
 
         $rs['ret'] = 1;
         $rs['ret'] = 1;
         $rs['msg'] = '节点添加成功';
         $rs['msg'] = '节点添加成功';
@@ -166,14 +178,21 @@ class NodeController extends AdminController
 
 
         $node->save();
         $node->save();
 
 
-        Telegram::Send('节点信息被修改~' . $request->getParam('name'));
+        if (Config::getconfig('Telegram.bool.UpdateNode')) {
+            Telegram::Send(
+                str_replace(
+                    '%node_name%',
+                    $request->getParam('name'),
+                    Config::getconfig('Telegram.string.UpdateNode')
+                )
+            );
+        }
 
 
         $rs['ret'] = 1;
         $rs['ret'] = 1;
         $rs['msg'] = '修改成功';
         $rs['msg'] = '修改成功';
         return $response->getBody()->write(json_encode($rs));
         return $response->getBody()->write(json_encode($rs));
     }
     }
 
 
-
     public function delete($request, $response, $args)
     public function delete($request, $response, $args)
     {
     {
         $id = $request->getParam('id');
         $id = $request->getParam('id');
@@ -182,15 +201,21 @@ class NodeController extends AdminController
             Radius::DelNas($node->node_ip);
             Radius::DelNas($node->node_ip);
         }
         }
 
 
-        $name = $node->name;
-
         if (!$node->delete()) {
         if (!$node->delete()) {
             $rs['ret'] = 0;
             $rs['ret'] = 0;
             $rs['msg'] = '删除失败';
             $rs['msg'] = '删除失败';
             return $response->getBody()->write(json_encode($rs));
             return $response->getBody()->write(json_encode($rs));
         }
         }
 
 
-        Telegram::Send('节点被删除~' . $name);
+        if (Config::getconfig('Telegram.bool.DeleteNode')) {
+            Telegram::Send(
+                str_replace(
+                    '%node_name%',
+                    $node->name,
+                    Config::getconfig('Telegram.string.DeleteNode')
+                )
+            );
+        }
 
 
         $rs['ret'] = 1;
         $rs['ret'] = 1;
         $rs['msg'] = '删除成功';
         $rs['msg'] = '删除成功';
@@ -201,23 +226,28 @@ class NodeController extends AdminController
     {
     {
         $datatables = new Datatables(new DatatablesHelper());
         $datatables = new Datatables(new DatatablesHelper());
 
 
-
-        $total_column = array('op' => '操作', 'id' => 'ID', 'name' => '节点名称',
+        $total_column = array(
+            'op' => '操作', 'id' => 'ID', 'name' => '节点名称',
             'type' => '显示与隐藏', 'sort' => '类型',
             'type' => '显示与隐藏', 'sort' => '类型',
-            'server' => '节点地址', 'node_ip' => '节点IP',
+            'server' => '节点地址', 'outaddress' => '出口地址', 'node_ip' => '节点IP',
             'info' => '节点信息',
             'info' => '节点信息',
             'status' => '状态', 'traffic_rate' => '流量比率', 'node_group' => '节点群组',
             'status' => '状态', 'traffic_rate' => '流量比率', 'node_group' => '节点群组',
             'node_class' => '节点等级', 'node_speedlimit' => '节点限速/Mbps',
             'node_class' => '节点等级', 'node_speedlimit' => '节点限速/Mbps',
             'node_bandwidth' => '已走流量/GB', 'node_bandwidth_limit' => '流量限制/GB',
             'node_bandwidth' => '已走流量/GB', 'node_bandwidth_limit' => '流量限制/GB',
             'bandwidthlimit_resetday' => '流量重置日', 'node_heartbeat' => '上一次活跃时间',
             'bandwidthlimit_resetday' => '流量重置日', 'node_heartbeat' => '上一次活跃时间',
             'custom_method' => '自定义加密', 'custom_rss' => '自定义协议以及混淆',
             'custom_method' => '自定义加密', 'custom_rss' => '自定义协议以及混淆',
-            'mu_only' => '只启用单端口多用户');
+            'mu_only' => '只启用单端口多用户'
+        );
         $key_str = '';
         $key_str = '';
         foreach ($total_column as $single_key => $single_value) {
         foreach ($total_column as $single_key => $single_value) {
             if ($single_key == 'op') {
             if ($single_key == 'op') {
                 $key_str .= 'id as op';
                 $key_str .= 'id as op';
                 continue;
                 continue;
             }
             }
+            if ($single_key == 'outaddress') {
+                $key_str .= ',server as ' . $single_key;
+                continue;
+            }
 
 
             $key_str .= ',' . $single_key;
             $key_str .= ',' . $single_key;
         }
         }
@@ -228,6 +258,10 @@ class NodeController extends AdminController
                     <a class="btn btn-brand-accent" ' . ($data['sort'] == 999 ? 'disabled' : 'id="delete" value="' . $data['id'] . '" href="javascript:void(0);" onClick="delete_modal_show(\'' . $data['id'] . '\')"') . '>删除</a>';
                     <a class="btn btn-brand-accent" ' . ($data['sort'] == 999 ? 'disabled' : 'id="delete" value="' . $data['id'] . '" href="javascript:void(0);" onClick="delete_modal_show(\'' . $data['id'] . '\')"') . '>删除</a>';
         });
         });
 
 
+        $datatables->edit('outaddress', static function ($data) {
+            return (in_array($data['sort'], [0, 10, 11, 12, 13]) ? explode(';', $data['server'])[0] : '');
+        });
+
         $datatables->edit('node_bandwidth', static function ($data) {
         $datatables->edit('node_bandwidth', static function ($data) {
             return Tools::flowToGB($data['node_bandwidth']);
             return Tools::flowToGB($data['node_bandwidth']);
         });
         });

+ 23 - 19
src/Controllers/Admin/RelayController.php

@@ -2,23 +2,29 @@
 
 
 namespace App\Controllers\Admin;
 namespace App\Controllers\Admin;
 
 
-use App\Models\Relay;
-use App\Models\Node;
-use App\Models\User;
-use App\Utils\Tools;
-use App\Services\Auth;
 use App\Controllers\AdminController;
 use App\Controllers\AdminController;
-use ArrayObject;
+use App\Models\{
+    Node,
+    User,
+    Relay
+};
+use App\Utils\{
+    Tools,
+    DatatablesHelper
+};
+use App\Services\Auth;
 use Ozdemir\Datatables\Datatables;
 use Ozdemir\Datatables\Datatables;
-use App\Utils\DatatablesHelper;
+use ArrayObject;
 
 
 class RelayController extends AdminController
 class RelayController extends AdminController
 {
 {
     public function index($request, $response, $args)
     public function index($request, $response, $args)
     {
     {
-        $table_config['total_column'] = array('op' => '操作', 'id' => 'ID', 'user_id' => '用户ID',
+        $table_config['total_column'] = array(
+            'op' => '操作', 'id' => 'ID', 'user_id' => '用户ID',
             'user_name' => '用户名', 'source_node_name' => '起源节点',
             'user_name' => '用户名', 'source_node_name' => '起源节点',
-            'dist_node_name' => '目标节点', 'port' => '端口', 'priority' => '优先级');
+            'dist_node_name' => '目标节点', 'port' => '端口', 'priority' => '优先级'
+        );
         $table_config['default_show_column'] = array();
         $table_config['default_show_column'] = array();
         foreach ($table_config['total_column'] as $column => $value) {
         foreach ($table_config['total_column'] as $column => $value) {
             $table_config['default_show_column'][] = $column;
             $table_config['default_show_column'][] = $column;
@@ -38,7 +44,7 @@ class RelayController extends AdminController
         )->orderBy('name')->get();
         )->orderBy('name')->get();
         foreach ($source_nodes as $node) {
         foreach ($source_nodes as $node) {
             if ($node->sort == 12) {
             if ($node->sort == 12) {
-                $node->name .= ' 正在使用V2ray后端 ';
+                $node->name .= 'V2Ray 中转,Port 代表中转监听端口';
             }
             }
         }
         }
         $dist_nodes = Node::where(
         $dist_nodes = Node::where(
@@ -52,10 +58,9 @@ class RelayController extends AdminController
 
 
         foreach ($dist_nodes as $node) {
         foreach ($dist_nodes as $node) {
             if ($node->sort == 11 || $node->sort == 12) {
             if ($node->sort == 11 || $node->sort == 12) {
-                $node_explode = Tools::ssv2Array($node->server);
-                $node->name = $node->name . ' 如果是V2ray后端 请设置成 ' . $node_explode['port'];
+                $node->name = $node->name;
             } else {
             } else {
-                $node->name .= ' 如果是V2ray后端 请不要设置,用户页面设置 ';
+                $node->name .= ' 如果是 V2Ray 中转,无法食用';
             }
             }
         }
         }
 
 
@@ -79,9 +84,9 @@ class RelayController extends AdminController
 
 
         if ($source_node->sort == 12) {
         if ($source_node->sort == 12) {
             $rules = Relay::Where('source_node_id', $source_node_id)->get();
             $rules = Relay::Where('source_node_id', $source_node_id)->get();
-            if (count($rules) > 0) {
+            if (!Tools::relayRulePortCheck($rules)) {
                 $rs['ret'] = 0;
                 $rs['ret'] = 0;
-                $rs['msg'] = 'v2ray中转一个起点一个rule';
+                $rs['msg'] = '端口冲突请,请更换一个';
                 return $response->getBody()->write(json_encode($rs));
                 return $response->getBody()->write(json_encode($rs));
             }
             }
         }
         }
@@ -148,7 +153,7 @@ class RelayController extends AdminController
         )->orderBy('name')->get();
         )->orderBy('name')->get();
         foreach ($source_nodes as $node) {
         foreach ($source_nodes as $node) {
             if ($node->sort == 12) {
             if ($node->sort == 12) {
-                $node->name .= ' 正在使用V2ray后端 ';
+                $node->name .= ' 正在使用 V2Ray 后端 ';
             }
             }
         }
         }
 
 
@@ -163,10 +168,9 @@ class RelayController extends AdminController
 
 
         foreach ($dist_nodes as $node) {
         foreach ($dist_nodes as $node) {
             if ($node->sort == 11 || $node->sort == 12) {
             if ($node->sort == 11 || $node->sort == 12) {
-                $node_explode = Tools::ssv2Array($node->server);
-                $node->name = $node->name . ' 如果是V2ray后端 请设置成' . $node_explode['port'];
+                $node->name = $node->name . ' V2Ray 中转,Port 代表中转监听端口';
             } else {
             } else {
-                $node->name .= ' 如果是V2ray后端 请不要设置,用户页面设置 ';
+                $node->name .= ' 如果是 V2Ray 中转,无法食用';
             }
             }
         }
         }
 
 

+ 13 - 10
src/Controllers/Admin/ShopController.php

@@ -2,21 +2,24 @@
 
 
 namespace App\Controllers\Admin;
 namespace App\Controllers\Admin;
 
 
-use App\Models\Shop;
-use App\Models\Bought;
 use App\Controllers\AdminController;
 use App\Controllers\AdminController;
-use App\Services\Config;
-use Ozdemir\Datatables\Datatables;
+use App\Models\{
+    Shop,
+    Bought
+};
 use App\Utils\DatatablesHelper;
 use App\Utils\DatatablesHelper;
+use Ozdemir\Datatables\Datatables;
 
 
 class ShopController extends AdminController
 class ShopController extends AdminController
 {
 {
     public function index($request, $response, $args)
     public function index($request, $response, $args)
     {
     {
-        $table_config['total_column'] = array('op' => '操作', 'id' => 'ID', 'name' => '商品名称',
+        $table_config['total_column'] = array(
+            'op' => '操作', 'id' => 'ID', 'name' => '商品名称',
             'price' => '价格', 'content' => '商品内容',
             'price' => '价格', 'content' => '商品内容',
             'auto_renew' => '自动续费', 'auto_reset_bandwidth' => '续费时是否重置流量',
             'auto_renew' => '自动续费', 'auto_reset_bandwidth' => '续费时是否重置流量',
-            'status' => '状态', 'period_sales' => '周期销量');
+            'status' => '状态', 'period_sales' => '周期销量'
+        );
         $table_config['default_show_column'] = array();
         $table_config['default_show_column'] = array();
         foreach ($table_config['total_column'] as $column => $value) {
         foreach ($table_config['total_column'] as $column => $value) {
             $table_config['default_show_column'][] = $column;
             $table_config['default_show_column'][] = $column;
@@ -81,7 +84,6 @@ class ShopController extends AdminController
 
 
         $shop->content = json_encode($content);
         $shop->content = json_encode($content);
 
 
-
         if (!$shop->save()) {
         if (!$shop->save()) {
             $rs['ret'] = 0;
             $rs['ret'] = 0;
             $rs['msg'] = '添加失败';
             $rs['msg'] = '添加失败';
@@ -173,7 +175,6 @@ class ShopController extends AdminController
         return $response->getBody()->write(json_encode($rs));
         return $response->getBody()->write(json_encode($rs));
     }
     }
 
 
-
     public function deleteGet($request, $response, $args)
     public function deleteGet($request, $response, $args)
     {
     {
         $id = $request->getParam('id');
         $id = $request->getParam('id');
@@ -199,11 +200,13 @@ class ShopController extends AdminController
 
 
     public function bought($request, $response, $args)
     public function bought($request, $response, $args)
     {
     {
-        $table_config['total_column'] = array('op' => '操作', 'id' => 'ID',
+        $table_config['total_column'] = array(
+            'op' => '操作', 'id' => 'ID',
             'datetime' => '购买日期', 'content' => '内容',
             'datetime' => '购买日期', 'content' => '内容',
             'price' => '价格', 'user_id' => '用户ID',
             'price' => '价格', 'user_id' => '用户ID',
             'user_name' => '用户名', 'renew' => '自动续费时间',
             'user_name' => '用户名', 'renew' => '自动续费时间',
-            'auto_reset_bandwidth' => '续费时是否重置流量');
+            'auto_reset_bandwidth' => '续费时是否重置流量'
+        );
         $table_config['default_show_column'] = array();
         $table_config['default_show_column'] = array();
         foreach ($table_config['total_column'] as $column => $value) {
         foreach ($table_config['total_column'] as $column => $value) {
             $table_config['default_show_column'][] = $column;
             $table_config['default_show_column'][] = $column;

+ 65 - 0
src/Controllers/Admin/SubscribeLogController.php

@@ -0,0 +1,65 @@
+<?php
+
+namespace App\Controllers\Admin;
+
+use App\Controllers\AdminController;
+use App\Utils\{
+    QQWry,
+    DatatablesHelper
+};
+use Ozdemir\Datatables\Datatables;
+use Psr\Http\Message\ResponseInterface;
+
+class SubscribeLogController extends AdminController
+{
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function index($request, $response, $args): ResponseInterface
+    {
+        $table_config['total_column'] = array(
+            'id'                  => 'ID',
+            'user_name'           => '用户名',
+            'user_id'             => '用户ID',
+            'email'               => '用户邮箱',
+            'subscribe_type'      => '类型',
+            'request_ip'          => 'IP',
+            'location'            => '归属地',
+            'request_time'        => '时间',
+            'request_user_agent'  => 'User-Agent'
+        );
+        $table_config['default_show_column'] = array();
+        foreach ($table_config['total_column'] as $column => $value) {
+            $table_config['default_show_column'][] = $column;
+        }
+        $table_config['ajax_url'] = 'subscribe/ajax';
+        return $response->write(
+            $this->view()
+                ->assign('table_config', $table_config)
+                ->display('admin/subscribe.tpl')
+        );
+    }
+
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function ajax_subscribe_log($request, $response, $args): ResponseInterface
+    {
+        $datatables = new Datatables(new DatatablesHelper());
+        $datatables->query('Select user_subscribe_log.id,user_subscribe_log.user_name,user_subscribe_log.user_id,user_subscribe_log.email,user_subscribe_log.subscribe_type,user_subscribe_log.request_ip,user_subscribe_log.request_ip as location,user_subscribe_log.request_time,user_subscribe_log.request_user_agent from user_subscribe_log');
+
+        $iplocation = new QQWry();
+        $datatables->edit('location', static function ($data) use ($iplocation) {
+            $location = $iplocation->getlocation($data['location']);
+            return iconv('gbk', 'utf-8//IGNORE', $location['country'] . $location['area']);
+        });
+
+        return $response->write(
+            $datatables->generate()
+        );
+    }
+}

+ 30 - 31
src/Controllers/Admin/TicketController.php

@@ -2,42 +2,43 @@
 
 
 namespace App\Controllers\Admin;
 namespace App\Controllers\Admin;
 
 
-use App\Models\Ticket;
-use App\Models\User;
-
-use Exception;
+use App\Controllers\AdminController;
+use App\Models\{
+    User,
+    Ticket
+};
+use App\Services\{
+    Auth,
+    Mail
+};
+use App\Utils\DatatablesHelper;
 use voku\helper\AntiXSS;
 use voku\helper\AntiXSS;
-use App\Services\Auth;
-
-use App\Services\Mail;
-use App\Services\Config;
-
 use Ozdemir\Datatables\Datatables;
 use Ozdemir\Datatables\Datatables;
-use App\Utils\DatatablesHelper;
-
-use App\Controllers\AdminController;
+use Exception;
 
 
 class TicketController extends AdminController
 class TicketController extends AdminController
 {
 {
     public function index($request, $response, $args)
     public function index($request, $response, $args)
     {
     {
-        $table_config['total_column'] = array('op' => '操作', 'id' => 'ID',
+        $table_config['total_column'] = array(
+            'op' => '操作', 'id' => 'ID',
             'datetime' => '时间', 'title' => '标题', 'userid' => '用户ID',
             'datetime' => '时间', 'title' => '标题', 'userid' => '用户ID',
-            'user_name' => '用户名', 'status' => '状态');
-        $table_config['default_show_column'] = array('op', 'id',
-            'datetime', 'title', 'userid', 'user_name', 'status');
+            'user_name' => '用户名', 'status' => '状态'
+        );
+        $table_config['default_show_column'] = array(
+            'op', 'id',
+            'datetime', 'title', 'userid', 'user_name', 'status'
+        );
         $table_config['ajax_url'] = 'ticket/ajax';
         $table_config['ajax_url'] = 'ticket/ajax';
         return $this->view()->assign('table_config', $table_config)->display('admin/ticket/index.tpl');
         return $this->view()->assign('table_config', $table_config)->display('admin/ticket/index.tpl');
     }
     }
 
 
-
     public function update($request, $response, $args)
     public function update($request, $response, $args)
     {
     {
         $id = $args['id'];
         $id = $args['id'];
         $content = $request->getParam('content');
         $content = $request->getParam('content');
         $status = $request->getParam('status');
         $status = $request->getParam('status');
 
 
-
         if ($content == '' || $status == '') {
         if ($content == '' || $status == '') {
             $res['ret'] = 0;
             $res['ret'] = 0;
             $res['msg'] = '请填全';
             $res['msg'] = '请填全';
@@ -50,26 +51,24 @@ class TicketController extends AdminController
             return $this->echoJson($response, $res);
             return $this->echoJson($response, $res);
         }
         }
 
 
-
         $ticket_main = Ticket::where('id', '=', $id)->where('rootid', '=', 0)->first();
         $ticket_main = Ticket::where('id', '=', $id)->where('rootid', '=', 0)->first();
 
 
         //if($status==1&&$ticket_main->status!=$status)
         //if($status==1&&$ticket_main->status!=$status)
         {
         {
             $adminUser = User::where('id', '=', $ticket_main->userid)->get();
             $adminUser = User::where('id', '=', $ticket_main->userid)->get();
-        foreach ($adminUser as $user) {
-            $subject = $_ENV['appName'] . '-工单被回复';
-            $to = $user->email;
-            $text = '您好,有人回复了<a href="' . $_ENV['baseUrl'] . '/user/ticket/' . $ticket_main->id . '/view">工单</a>,请您查看。';
-            try {
-                Mail::send($to, $subject, 'news/warn.tpl', [
-                    'user' => $user, 'text' => $text
-                ], [
-                ]);
-            } catch (Exception $e) {
-                echo $e->getMessage();
+            foreach ($adminUser as $user) {
+                $subject = $_ENV['appName'] . '-工单被回复';
+                $to = $user->email;
+                $text = '您好,有人回复了<a href="' . $_ENV['baseUrl'] . '/user/ticket/' . $ticket_main->id . '/view">工单</a>,请您查看。';
+                try {
+                    Mail::send($to, $subject, 'news/warn.tpl', [
+                        'user' => $user, 'text' => $text
+                    ], []);
+                } catch (Exception $e) {
+                    echo $e->getMessage();
+                }
             }
             }
         }
         }
-        }
 
 
         $antiXss = new AntiXSS();
         $antiXss = new AntiXSS();
 
 

+ 234 - 174
src/Controllers/Admin/UserController.php

@@ -3,19 +3,27 @@
 namespace App\Controllers\Admin;
 namespace App\Controllers\Admin;
 
 
 use App\Controllers\AdminController;
 use App\Controllers\AdminController;
-use App\Models\Bought;
-use App\Models\Ip;
-use App\Models\Relay;
-use App\Models\User;
-use App\Services\Auth;
-use App\Services\Config;
-use App\Services\Mail;
-use App\Utils;
-use App\Utils\GA;
-use App\Utils\Hash;
-use App\Utils\QQWry;
-use App\Utils\Radius;
-use App\Utils\Tools;
+use App\Models\{
+    Ip,
+    User,
+    Shop,
+    Relay,
+    Bought,
+    DetectBanLog
+};
+use App\Services\{
+    Auth,
+    Mail,
+    Config
+};
+use App\Utils\{
+    GA,
+    Hash,
+    Tools,
+    QQWry,
+    Radius,
+    Cookie
+};
 use Exception;
 use Exception;
 
 
 class UserController extends AdminController
 class UserController extends AdminController
@@ -23,41 +31,47 @@ class UserController extends AdminController
     public function index($request, $response, $args)
     public function index($request, $response, $args)
     {
     {
         $table_config['total_column'] = array(
         $table_config['total_column'] = array(
-            'op' => '操作',
-            'id' => 'ID',
-            'user_name' => '用户名',
-            'remark' => '备注',
-            'email' => '邮箱',
-            'money' => '金钱',
-            'im_type' => '联络方式类型',
-            'im_value' => '联络方式详情',
-            'node_group' => '群组',
-            'expire_in' => '账户过期时间',
-            'class' => '等级',
-            'class_expire' => '等级过期时间',
-            'passwd' => '连接密码',
-            'port' => '连接端口',
-            'method' => '加密方式',
-            'protocol' => '连接协议',
-            'obfs' => '混淆方式',
-            'obfs_param' => '混淆参数',
-            'online_ip_count' => '在线IP数',
-            'last_ss_time' => '上次使用时间',
-            'used_traffic' => '已用流量/GB',
-            'enable_traffic' => '总流量/GB',
-            'last_checkin_time' => '上次签到时间',
-            'today_traffic' => '今日流量/MB',
-            'enable' => '是否启用',
-            'reg_date' => '注册时间',
-            'reg_ip' => '注册IP',
-            'auto_reset_day' => '自动重置流量日',
-            'auto_reset_bandwidth' => '自动重置流量/GB',
-            'ref_by' => '邀请人ID',
-            'ref_by_user_name' => '邀请人用户名',
-            'top_up' => '累计充值');
+            'op'                    => '操作',
+            'querys'                => '查询',
+            'id'                    => 'ID',
+            'user_name'             => '用户名',
+            'remark'                => '备注',
+            'email'                 => '邮箱',
+            'money'                 => '金钱',
+            'im_type'               => '联络方式类型',
+            'im_value'              => '联络方式详情',
+            'node_group'            => '群组',
+            'expire_in'             => '账户过期时间',
+            'class'                 => '等级',
+            'class_expire'          => '等级过期时间',
+            'passwd'                => '连接密码',
+            'port'                  => '连接端口',
+            'method'                => '加密方式',
+            'protocol'              => '连接协议',
+            'obfs'                  => '混淆方式',
+            'obfs_param'            => '混淆参数',
+            'online_ip_count'       => '在线IP数',
+            'last_ss_time'          => '上次使用时间',
+            'used_traffic'          => '已用流量/GB',
+            'enable_traffic'        => '总流量/GB',
+            'last_checkin_time'     => '上次签到时间',
+            'today_traffic'         => '今日流量/MB',
+            'enable'                => '是否启用',
+            'reg_date'              => '注册时间',
+            'reg_ip'                => '注册IP',
+            'auto_reset_day'        => '自动重置流量日',
+            'auto_reset_bandwidth'  => '自动重置流量/GB',
+            'ref_by'                => '邀请人ID',
+            'ref_by_user_name'      => '邀请人用户名',
+            'top_up'                => '累计充值'
+        );
         $table_config['default_show_column'] = array('op', 'id', 'user_name', 'remark', 'email');
         $table_config['default_show_column'] = array('op', 'id', 'user_name', 'remark', 'email');
         $table_config['ajax_url'] = 'user/ajax';
         $table_config['ajax_url'] = 'user/ajax';
-        return $this->view()->assign('table_config', $table_config)->display('admin/user/index.tpl');
+        $shops = Shop::where('status', 1)->orderBy('name')->get();
+        return $this->view()
+            ->assign('shops', $shops)
+            ->assign('table_config', $table_config)
+            ->display('admin/user/index.tpl');
     }
     }
 
 
     public function createNewUser($request, $response, $args)
     public function createNewUser($request, $response, $args)
@@ -66,6 +80,10 @@ class UserController extends AdminController
         $email = $request->getParam('userEmail');
         $email = $request->getParam('userEmail');
         $email = trim($email);
         $email = trim($email);
         $email = strtolower($email);
         $email = strtolower($email);
+
+        $money   = (int) trim($request->getParam('userMoney'));
+        $shop_id = (int) $request->getParam('userShop');
+
         // not really user input
         // not really user input
         //if (!Check::isEmailLegal($email)) {
         //if (!Check::isEmailLegal($email)) {
         //    $res['ret'] = 0;
         //    $res['ret'] = 0;
@@ -80,39 +98,39 @@ class UserController extends AdminController
             return $response->getBody()->write(json_encode($res));
             return $response->getBody()->write(json_encode($res));
         }
         }
         // do reg user
         // do reg user
-        $user = new User();
-        $pass = Tools::genRandomChar();
-        $user->user_name = $email;
-        $user->email = $email;
-        $user->pass = Hash::passwordHash($pass);
-        $user->passwd = Tools::genRandomChar(6);
-        $user->port = Tools::getAvPort();
-        $user->t = 0;
-        $user->u = 0;
-        $user->d = 0;
-        $user->method = $_ENV['reg_method'];
-        $user->protocol = $_ENV['reg_protocol'];
-        $user->protocol_param = $_ENV['reg_protocol_param'];
-        $user->obfs = $_ENV['reg_obfs'];
-        $user->obfs_param = $_ENV['reg_obfs_param'];
-        $user->forbidden_ip = $_ENV['reg_forbidden_ip'];
-        $user->forbidden_port = $_ENV['reg_forbidden_port'];
-        $user->im_type = 2;
-        $user->im_value = $email;
-        $user->transfer_enable = Tools::toGB($_ENV['defaultTraffic']);
-        $user->invite_num = $_ENV['inviteNum'];
-        $user->auto_reset_day = $_ENV['reg_auto_reset_day'];
+        $user                       = new User();
+        $pass                       = Tools::genRandomChar();
+        $user->user_name            = $email;
+        $user->email                = $email;
+        $user->pass                 = Hash::passwordHash($pass);
+        $user->passwd               = Tools::genRandomChar(6);
+        $user->port                 = Tools::getAvPort();
+        $user->t                    = 0;
+        $user->u                    = 0;
+        $user->d                    = 0;
+        $user->method               = Config::getconfig('Register.string.defaultMethod');
+        $user->protocol             = Config::getconfig('Register.string.defaultProtocol');
+        $user->protocol_param       = Config::getconfig('Register.string.defaultProtocol_param');
+        $user->obfs                 = Config::getconfig('Register.string.defaultObfs');
+        $user->obfs_param           = Config::getconfig('Register.string.defaultObfs_param');
+        $user->forbidden_ip         = $_ENV['reg_forbidden_ip'];
+        $user->forbidden_port       = $_ENV['reg_forbidden_port'];
+        $user->im_type              = 2;
+        $user->im_value             = $email;
+        $user->transfer_enable      = Tools::toGB((int) Config::getconfig('Register.string.defaultTraffic'));
+        $user->invite_num           = (int) Config::getconfig('Register.string.defaultInviteNum');
+        $user->auto_reset_day       = $_ENV['reg_auto_reset_day'];
         $user->auto_reset_bandwidth = $_ENV['reg_auto_reset_bandwidth'];
         $user->auto_reset_bandwidth = $_ENV['reg_auto_reset_bandwidth'];
-        $user->money = 0;
-        $user->class_expire = date('Y-m-d H:i:s', time() + $_ENV['user_class_expire_default'] * 3600);
-        $user->class = $_ENV['user_class_default'];
-        $user->node_connector = $_ENV['user_conn'];
-        $user->node_speedlimit = $_ENV['user_speedlimit'];
-        $user->expire_in = date('Y-m-d H:i:s', time() + $_ENV['user_expire_in_default'] * 86400);
-        $user->reg_date = date('Y-m-d H:i:s');
-        $user->reg_ip = $_SERVER['REMOTE_ADDR'];
-        $user->plan = 'A';
-        $user->theme = $_ENV['theme'];
+        $user->money                = ($money != -1 ? $money : 0);
+        $user->class_expire         = date('Y-m-d H:i:s', time() + (int) Config::getconfig('Register.string.defaultClass_expire') * 3600);
+        $user->class                = (int) Config::getconfig('Register.string.defaultClass');
+        $user->node_connector       = (int) Config::getconfig('Register.string.defaultConn');
+        $user->node_speedlimit      = (int) Config::getconfig('Register.string.defaultSpeedlimit');
+        $user->expire_in            = date('Y-m-d H:i:s', time() + (int) Config::getconfig('Register.string.defaultExpire_in') * 86400);
+        $user->reg_date             = date('Y-m-d H:i:s');
+        $user->reg_ip               = $_SERVER['REMOTE_ADDR'];
+        $user->plan                 = 'A';
+        $user->theme                = $_ENV['theme'];
 
 
         $groups = explode(',', $_ENV['ramdom_group']);
         $groups = explode(',', $_ENV['ramdom_group']);
 
 
@@ -124,17 +142,33 @@ class UserController extends AdminController
         $user->ga_token = $secret;
         $user->ga_token = $secret;
         $user->ga_enable = 0;
         $user->ga_enable = 0;
         if ($user->save()) {
         if ($user->save()) {
-            $res['ret'] = 1;
-            $res['msg'] = '新用户注册成功 用户名: ' . $email . ' 随机初始密码: ' . $pass;
+            $res['ret']         = 1;
+            $res['msg']         = '新用户注册成功 用户名: ' . $email . ' 随机初始密码: ' . $pass;
             $res['email_error'] = 'success';
             $res['email_error'] = 'success';
-            $subject = $_ENV['appName'] . '-新用户注册通知';
-            $to = $user->email;
-            $text = '您好,管理员已经为您生成账户,用户名: ' . $email . ',登录密码为:' . $pass . ',感谢您的支持。 ';
+            if ($shop_id > 0) {
+                $shop = Shop::find($shop_id);
+                if ($shop != null) {
+                    $bought           = new Bought();
+                    $bought->userid   = $user->id;
+                    $bought->shopid   = $shop->id;
+                    $bought->datetime = time();
+                    $bought->renew    = 0;
+                    $bought->coupon   = '';
+                    $bought->price    = $shop->price;
+                    $bought->save();
+                    $shop->buy($user);
+                } else {
+                    $res['msg'] .= '<br/>但是套餐添加失败了,原因是套餐不存在';
+                }
+            }
+            $user->addMoneyLog($user->money);
+            $subject            = $_ENV['appName'] . '-新用户注册通知';
+            $to                 = $user->email;
+            $text               = '您好,管理员已经为您生成账户,用户名: ' . $email . ',登录密码为:' . $pass . ',感谢您的支持。 ';
             try {
             try {
                 Mail::send($to, $subject, 'newuser.tpl', [
                 Mail::send($to, $subject, 'newuser.tpl', [
                     'user' => $user, 'text' => $text,
                     'user' => $user, 'text' => $text,
-                ], [
-                ]);
+                ], []);
             } catch (Exception $e) {
             } catch (Exception $e) {
                 $res['email_error'] = $e->getMessage();
                 $res['email_error'] = $e->getMessage();
             }
             }
@@ -150,12 +184,12 @@ class UserController extends AdminController
         #shop 信息可以通过 App\Controllers\UserController:shop 获得
         #shop 信息可以通过 App\Controllers\UserController:shop 获得
         # 需要shopId,disableothers,autorenew,userEmail
         # 需要shopId,disableothers,autorenew,userEmail
 
 
-        $shopId = $request->getParam('shopId');
-        $shop = Shop::where('id', $shopId)->where('status', 1)->first();
-        $disableothers = $request->getParam('disableothers');
-        $autorenew = $request->getParam('autorenew');
-        $email = $request->getParam('userEmail');
-        $user = User::where('email', '=', $email)->first();
+        $shopId         = $request->getParam('shopId');
+        $shop           = Shop::where('id', $shopId)->where('status', 1)->first();
+        $disableothers  = $request->getParam('disableothers');
+        $autorenew      = $request->getParam('autorenew');
+        $email          = $request->getParam('userEmail');
+        $user           = User::where('email', '=', $email)->first();
         if ($user == null) {
         if ($user == null) {
             $result['ret'] = 0;
             $result['ret'] = 0;
             $result['msg'] = '未找到该用户';
             $result['msg'] = '未找到该用户';
@@ -173,9 +207,9 @@ class UserController extends AdminController
                 $disable_bought->save();
                 $disable_bought->save();
             }
             }
         }
         }
-        $bought = new Bought();
-        $bought->userid = $user->id;
-        $bought->shopid = $shop->id;
+        $bought           = new Bought();
+        $bought->userid   = $user->id;
+        $bought->shopid   = $shop->id;
         $bought->datetime = time();
         $bought->datetime = time();
         if ($autorenew == 0 || $shop->auto_renew == 0) {
         if ($autorenew == 0 || $shop->auto_renew == 0) {
             $bought->renew = 0;
             $bought->renew = 0;
@@ -202,7 +236,6 @@ class UserController extends AdminController
         }
         }
 
 
         $users = User::where('email', 'LIKE', '%' . $text . '%')->orWhere('user_name', 'LIKE', '%' . $text . '%')->orWhere('im_value', 'LIKE', '%' . $text . '%')->orWhere('port', 'LIKE', '%' . $text . '%')->orWhere('remark', 'LIKE', '%' . $text . '%')->paginate(20, ['*'], 'page', $pageNum);
         $users = User::where('email', 'LIKE', '%' . $text . '%')->orWhere('user_name', 'LIKE', '%' . $text . '%')->orWhere('im_value', 'LIKE', '%' . $text . '%')->orWhere('port', 'LIKE', '%' . $text . '%')->orWhere('remark', 'LIKE', '%' . $text . '%')->paginate(20, ['*'], 'page', $pageNum);
-        $users->setPath('/admin/user/search/' . $text);
 
 
         //Ip::where("datetime","<",time()-90)->get()->delete();
         //Ip::where("datetime","<",time()-90)->get()->delete();
         $total = Ip::where('datetime', '>=', time() - 90)->orderBy('userid', 'desc')->get();
         $total = Ip::where('datetime', '>=', time() - 90)->orderBy('userid', 'desc')->get();
@@ -307,30 +340,50 @@ class UserController extends AdminController
             $rule->save();
             $rule->save();
         }
         }
 
 
-        $user->passwd = $request->getParam('passwd');
-        $user->protocol = $request->getParam('protocol');
-        $user->protocol_param = $request->getParam('protocol_param');
-        $user->obfs = $request->getParam('obfs');
-        $user->obfs_param = $request->getParam('obfs_param');
-        $user->is_multi_user = $request->getParam('is_multi_user');
-        $user->transfer_enable = Tools::toGB($request->getParam('transfer_enable'));
-        $user->invite_num = $request->getParam('invite_num');
-        $user->method = $request->getParam('method');
-        $user->node_speedlimit = $request->getParam('node_speedlimit');
-        $user->node_connector = $request->getParam('node_connector');
-        $user->enable = $request->getParam('enable');
-        $user->is_admin = $request->getParam('is_admin');
-        $user->ga_enable = $request->getParam('ga_enable');
-        $user->node_group = $request->getParam('group');
-        $user->ref_by = $request->getParam('ref_by');
-        $user->remark = $request->getParam('remark');
-        $user->money = $request->getParam('money');
-        $user->class = $request->getParam('class');
-        $user->class_expire = $request->getParam('class_expire');
-        $user->expire_in = $request->getParam('expire_in');
-
-        $user->forbidden_ip = str_replace(PHP_EOL, ',', $request->getParam('forbidden_ip'));
-        $user->forbidden_port = str_replace(PHP_EOL, ',', $request->getParam('forbidden_port'));
+        $user->addMoneyLog($request->getParam('money') - $user->money);
+
+        $user->passwd           = $request->getParam('passwd');
+        $user->protocol         = $request->getParam('protocol');
+        $user->protocol_param   = $request->getParam('protocol_param');
+        $user->obfs             = $request->getParam('obfs');
+        $user->obfs_param       = $request->getParam('obfs_param');
+        $user->is_multi_user    = $request->getParam('is_multi_user');
+        $user->transfer_enable  = Tools::toGB($request->getParam('transfer_enable'));
+        $user->invite_num       = $request->getParam('invite_num');
+        $user->method           = $request->getParam('method');
+        $user->node_speedlimit  = $request->getParam('node_speedlimit');
+        $user->node_connector   = $request->getParam('node_connector');
+        $user->enable           = $request->getParam('enable');
+        $user->is_admin         = $request->getParam('is_admin');
+        $user->ga_enable        = $request->getParam('ga_enable');
+        $user->node_group       = $request->getParam('group');
+        $user->ref_by           = $request->getParam('ref_by');
+        $user->remark           = $request->getParam('remark');
+        $user->money            = $request->getParam('money');
+        $user->class            = $request->getParam('class');
+        $user->class_expire     = $request->getParam('class_expire');
+        $user->expire_in        = $request->getParam('expire_in');
+
+        $user->forbidden_ip     = str_replace(PHP_EOL, ',', $request->getParam('forbidden_ip'));
+        $user->forbidden_port   = str_replace(PHP_EOL, ',', $request->getParam('forbidden_port'));
+
+        // 手动封禁
+        $ban_time = (int) $request->getParam('ban_time');
+        if ($ban_time > 0) {
+            $user->enable                       = 0;
+            $end_time                           = date('Y-m-d H:i:s');
+            $user->last_detect_ban_time         = $end_time;
+            $DetectBanLog                       = new DetectBanLog();
+            $DetectBanLog->user_name            = $user->user_name;
+            $DetectBanLog->user_id              = $user->id;
+            $DetectBanLog->email                = $user->email;
+            $DetectBanLog->detect_number        = '0';
+            $DetectBanLog->ban_time             = $ban_time;
+            $DetectBanLog->start_time           = strtotime('1989-06-04 00:05:00');
+            $DetectBanLog->end_time             = strtotime($end_time);
+            $DetectBanLog->all_detect_number    = $user->all_detect_number;
+            $DetectBanLog->save();
+        }
 
 
         if (!$user->save()) {
         if (!$user->save()) {
             $rs['ret'] = 0;
             $rs['ret'] = 0;
@@ -346,9 +399,6 @@ class UserController extends AdminController
     {
     {
         $id = $request->getParam('id');
         $id = $request->getParam('id');
         $user = User::find($id);
         $user = User::find($id);
-
-        $email1 = $user->email;
-
         if (!$user->kill_user()) {
         if (!$user->kill_user()) {
             $rs['ret'] = 0;
             $rs['ret'] = 0;
             $rs['msg'] = '删除失败';
             $rs['msg'] = '删除失败';
@@ -361,11 +411,11 @@ class UserController extends AdminController
 
 
     public function changetouser($request, $response, $args)
     public function changetouser($request, $response, $args)
     {
     {
-        $userid = $request->getParam('userid');
-        $adminid = $request->getParam('adminid');
-        $user = User::find($userid);
-        $admin = User::find($adminid);
-        $expire_in = time() + 60 * 60;
+        $userid     = $request->getParam('userid');
+        $adminid    = $request->getParam('adminid');
+        $user       = User::find($userid);
+        $admin      = User::find($adminid);
+        $expire_in  = time() + 60 * 60;
 
 
         if (!$admin->is_admin || !$user || !Auth::getUser()->isLogin) {
         if (!$admin->is_admin || !$user || !Auth::getUser()->isLogin) {
             $rs['ret'] = 0;
             $rs['ret'] = 0;
@@ -373,18 +423,18 @@ class UserController extends AdminController
             return $response->getBody()->write(json_encode($rs));
             return $response->getBody()->write(json_encode($rs));
         }
         }
 
 
-        Utils\Cookie::set([
-            'uid' => $user->id,
-            'email' => $user->email,
-            'key' => Hash::cookieHash($user->pass, $expire_in),
-            'ip' => md5($_SERVER['REMOTE_ADDR'] . $_ENV['key'] . $user->id . $expire_in),
-            'expire_in' => $expire_in,
-            'old_uid' => Utils\Cookie::get('uid'),
-            'old_email' => Utils\Cookie::get('email'),
-            'old_key' => Utils\Cookie::get('key'),
-            'old_ip' => Utils\Cookie::get('ip'),
-            'old_expire_in' => Utils\Cookie::get('expire_in'),
-            'old_local' => $request->getParam('local'),
+        Cookie::set([
+            'uid'           => $user->id,
+            'email'         => $user->email,
+            'key'           => Hash::cookieHash($user->pass, $expire_in),
+            'ip'            => md5($_SERVER['REMOTE_ADDR'] . $_ENV['key'] . $user->id . $expire_in),
+            'expire_in'     => $expire_in,
+            'old_uid'       => Cookie::get('uid'),
+            'old_email'     => Cookie::get('email'),
+            'old_key'       => Cookie::get('key'),
+            'old_ip'        => Cookie::get('ip'),
+            'old_expire_in' => Cookie::get('expire_in'),
+            'old_local'     => $request->getParam('local'),
         ], $expire_in);
         ], $expire_in);
         $rs['ret'] = 1;
         $rs['ret'] = 1;
         $rs['msg'] = '切换成功';
         $rs['msg'] = '切换成功';
@@ -394,14 +444,14 @@ class UserController extends AdminController
     public function ajax($request, $response, $args)
     public function ajax($request, $response, $args)
     {
     {
         //得到排序的方式
         //得到排序的方式
-        $order = $request->getParam('order')[0]['dir'];
+        $order        = $request->getParam('order')[0]['dir'];
         //得到排序字段的下标
         //得到排序字段的下标
         $order_column = $request->getParam('order')[0]['column'];
         $order_column = $request->getParam('order')[0]['column'];
         //根据排序字段的下标得到排序字段
         //根据排序字段的下标得到排序字段
-        $order_field = $request->getParam('columns')[$order_column]['data'];
-        $limit_start = $request->getParam('start');
+        $order_field  = $request->getParam('columns')[$order_column]['data'];
+        $limit_start  = $request->getParam('start');
         $limit_length = $request->getParam('length');
         $limit_length = $request->getParam('length');
-        $search = $request->getParam('search')['value'];
+        $search       = $request->getParam('search')['value'];
 
 
         if ($order_field == 'used_traffic') {
         if ($order_field == 'used_traffic') {
             $order_field = 'u + d';
             $order_field = 'u + d';
@@ -409,6 +459,8 @@ class UserController extends AdminController
             $order_field = 'transfer_enable';
             $order_field = 'transfer_enable';
         } elseif ($order_field == 'today_traffic') {
         } elseif ($order_field == 'today_traffic') {
             $order_field = 'u +d - last_day_t';
             $order_field = 'u +d - last_day_t';
+        } elseif ($order_field == 'querys') {
+            $order_field = 'id';
         }
         }
 
 
         $users = array();
         $users = array();
@@ -485,15 +537,23 @@ class UserController extends AdminController
         foreach ($users as $user) {
         foreach ($users as $user) {
             $tempdata = array();
             $tempdata = array();
             //model里是casts所以没法直接 $tempdata=(array)$user
             //model里是casts所以没法直接 $tempdata=(array)$user
-            $tempdata['op'] = '<a class="btn btn-brand" href="/admin/user/' . $user->id . '/edit">编辑</a>
+            $tempdata['op']         = '<a class="btn btn-brand" href="/admin/user/' . $user->id . '/edit">编辑</a>
                     <a class="btn btn-brand-accent" id="delete" href="javascript:void(0);" onClick="delete_modal_show(\'' . $user->id . '\')">删除</a>
                     <a class="btn btn-brand-accent" id="delete" href="javascript:void(0);" onClick="delete_modal_show(\'' . $user->id . '\')">删除</a>
                     <a class="btn btn-brand" id="changetouser" href="javascript:void(0);" onClick="changetouser_modal_show(\'' . $user->id . '\')">切换为该用户</a>';
                     <a class="btn btn-brand" id="changetouser" href="javascript:void(0);" onClick="changetouser_modal_show(\'' . $user->id . '\')">切换为该用户</a>';
-            $tempdata['id'] = $user->id;
-            $tempdata['user_name'] = $user->user_name;
-            $tempdata['remark'] = $user->remark;
-            $tempdata['email'] = $user->email;
-            $tempdata['money'] = $user->money;
-            $tempdata['im_value'] = $user->im_value;
+
+            $tempdata['querys']     = '<a class="btn btn-brand" href="/admin/user/' . $user->id . '/bought">套餐</a>
+                    <a class="btn btn-brand" href="/admin/user/' . $user->id . '/code">充值</a>
+                    <a class="btn btn-brand" href="/admin/user/' . $user->id . '/sublog">订阅</a>
+                    <a class="btn btn-brand" href="/admin/user/' . $user->id . '/detect">审计</a>
+                    <a class="btn btn-brand" href="/admin/user/' . $user->id . '/traffic">流量</a>
+                    <a class="btn btn-brand" href="/admin/user/' . $user->id . '/login">登录</a>';
+
+            $tempdata['id']         = $user->id;
+            $tempdata['user_name']  = $user->user_name;
+            $tempdata['remark']     = $user->remark;
+            $tempdata['email']      = $user->email;
+            $tempdata['money']      = $user->money;
+            $tempdata['im_value']   = $user->im_value;
             switch ($user->im_type) {
             switch ($user->im_type) {
                 case 1:
                 case 1:
                     $tempdata['im_type'] = '微信';
                     $tempdata['im_type'] = '微信';
@@ -508,28 +568,28 @@ class UserController extends AdminController
                     $tempdata['im_type'] = 'Telegram';
                     $tempdata['im_type'] = 'Telegram';
                     $tempdata['im_value'] = '<a href="https://telegram.me/' . $user->im_value . '">' . $user->im_value . '</a>';
                     $tempdata['im_value'] = '<a href="https://telegram.me/' . $user->im_value . '">' . $user->im_value . '</a>';
             }
             }
-            $tempdata['node_group'] = $user->node_group;
-            $tempdata['expire_in'] = $user->expire_in;
-            $tempdata['class'] = $user->class;
-            $tempdata['class_expire'] = $user->class_expire;
-            $tempdata['passwd'] = $user->passwd;
-            $tempdata['port'] = $user->port;
-            $tempdata['method'] = $user->method;
-            $tempdata['protocol'] = $user->protocol;
-            $tempdata['obfs'] = $user->obfs;
-            $tempdata['obfs_param'] = $user->obfs_param;
-            $tempdata['online_ip_count'] = $user->online_ip_count();
-            $tempdata['last_ss_time'] = $user->lastSsTime();
-            $tempdata['used_traffic'] = Tools::flowToGB($user->u + $user->d);
-            $tempdata['enable_traffic'] = Tools::flowToGB($user->transfer_enable);
-            $tempdata['last_checkin_time'] = $user->lastCheckInTime();
-            $tempdata['today_traffic'] = Tools::flowToMB($user->u + $user->d - $user->last_day_t);
-            $tempdata['enable'] = $user->enable == 1 ? '可用' : '禁用';
-            $tempdata['reg_date'] = $user->reg_date;
-            $tempdata['reg_ip'] = $user->reg_ip;
-            $tempdata['auto_reset_day'] = $user->auto_reset_day;
+            $tempdata['node_group']           = $user->node_group;
+            $tempdata['expire_in']            = $user->expire_in;
+            $tempdata['class']                = $user->class;
+            $tempdata['class_expire']         = $user->class_expire;
+            $tempdata['passwd']               = $user->passwd;
+            $tempdata['port']                 = $user->port;
+            $tempdata['method']               = $user->method;
+            $tempdata['protocol']             = $user->protocol;
+            $tempdata['obfs']                 = $user->obfs;
+            $tempdata['obfs_param']           = $user->obfs_param;
+            $tempdata['online_ip_count']      = $user->online_ip_count();
+            $tempdata['last_ss_time']         = $user->lastSsTime();
+            $tempdata['used_traffic']         = Tools::flowToGB($user->u + $user->d);
+            $tempdata['enable_traffic']       = Tools::flowToGB($user->transfer_enable);
+            $tempdata['last_checkin_time']    = $user->lastCheckInTime();
+            $tempdata['today_traffic']        = Tools::flowToMB($user->u + $user->d - $user->last_day_t);
+            $tempdata['enable']               = $user->enable == 1 ? '可用' : '禁用';
+            $tempdata['reg_date']             = $user->reg_date;
+            $tempdata['reg_ip']               = $user->reg_ip;
+            $tempdata['auto_reset_day']       = $user->auto_reset_day;
             $tempdata['auto_reset_bandwidth'] = $user->auto_reset_bandwidth;
             $tempdata['auto_reset_bandwidth'] = $user->auto_reset_bandwidth;
-            $tempdata['ref_by'] = $user->ref_by;
+            $tempdata['ref_by']               = $user->ref_by;
             if ($user->ref_by == 0) {
             if ($user->ref_by == 0) {
                 $tempdata['ref_by_user_name'] = '系统邀请';
                 $tempdata['ref_by_user_name'] = '系统邀请';
             } else {
             } else {
@@ -546,10 +606,10 @@ class UserController extends AdminController
             $data[] = $tempdata;
             $data[] = $tempdata;
         }
         }
         $info = [
         $info = [
-            'draw' => $request->getParam('draw'), // ajax请求次数,作为标识符
-            'recordsTotal' => User::count(),
+            'draw'            => $request->getParam('draw'), // ajax请求次数,作为标识符
+            'recordsTotal'    => User::count(),
             'recordsFiltered' => $count_filtered,
             'recordsFiltered' => $count_filtered,
-            'data' => $data,
+            'data'            => $data,
         ];
         ];
         return json_encode($info, true);
         return json_encode($info, true);
     }
     }

+ 174 - 0
src/Controllers/Admin/UserLog/BoughtLogController.php

@@ -0,0 +1,174 @@
+<?php
+
+namespace App\Controllers\Admin\UserLog;
+
+use App\Controllers\AdminController;
+use App\Models\{
+    User,
+    Shop,
+    Bought
+};
+use Slim\Http\{
+    Request,
+    Response
+};
+use Psr\Http\Message\ResponseInterface;
+
+class BoughtLogController extends AdminController
+{
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function bought($request, $response, $args): ResponseInterface
+    {
+        $id = $args['id'];
+        $user = User::find($id);
+        $table_config['total_column'] = array(
+            'op'         => '操作',
+            'id'         => 'ID',
+            'name'       => '商品名称',
+            'valid'      => '是否有效期内',
+            'auto_renew' => '自动续费时间',
+            'reset_time' => '流量重置时间',
+            'buy_time'   => '套餐购买时间',
+            'exp_time'   => '套餐过期时间',
+            'content'    => '商品详细内容',
+        );
+        $table_config['default_show_column'] = array('op', 'name', 'valid', 'reset_time');
+        $table_config['ajax_url'] = 'bought/ajax';
+        $shops = Shop::where('status', 1)->orderBy('name')->get();
+
+        return $response->write(
+            $this->view()
+                ->assign('table_config', $table_config)
+                ->assign('shops', $shops)
+                ->assign('user', $user)
+                ->display('admin/user/bought.tpl')
+        );
+    }
+
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function bought_ajax($request, $response, $args): ResponseInterface
+    {
+        $start        = $request->getParam("start");
+        $limit_length = $request->getParam('length');
+        $id           = $args['id'];
+        $user         = User::find($id);
+        $boughts      = Bought::where('userid', $user->id)->skip($start)->limit($limit_length)->orderBy('id', 'desc')->get();
+        $total_conut  = Bought::where('userid', $user->id)->count();
+        $data         = [];
+        foreach ($boughts as $bought) {
+            $shop = $bought->shop();
+            if ($shop == null) {
+                $bought->delete();
+                continue;
+            }
+            $tempdata = [];
+            $tempdata['op']          = '<a class="btn btn-brand-accent" id="delete" href="javascript:void(0);" onClick="delete_modal_show(\'' . $bought->id . '\')">删除</a>';
+            $tempdata['id']          = $bought->id;
+            $tempdata['name']        = $shop->name;
+            $tempdata['content']     = $shop->content();
+            $tempdata['auto_renew']  = ($bought->renew == 0 ? '不自动续费' : $bought->renew_date());
+            $tempdata['buy_time']    = $bought->datetime();
+            if ($bought->use_loop()) {
+                $tempdata['valid'] = ($bought->valid() ? '有效' : '已过期');
+            } else {
+                $tempdata['valid'] = '-';
+            }
+            $tempdata['reset_time']  = $bought->reset_time();
+            $tempdata['exp_time']    = $bought->exp_time();
+            $data[] = $tempdata;
+        }
+        $info = [
+            'draw'              => $request->getParam('draw'),
+            'recordsTotal'      => $total_conut,
+            'recordsFiltered'   => $total_conut,
+            'data'              => $data
+        ];
+
+        return $response->write(
+            json_encode($info)
+        );
+    }
+
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function bought_delete($request, $response, $args): ResponseInterface
+    {
+        $id = $request->getParam('id');
+        $Bought = Bought::find($id);
+        if (!$Bought->delete()) {
+            $rs['ret'] = 0;
+            $rs['msg'] = '删除失败';
+            return $response->getBody()->write(json_encode($rs));
+        }
+        $rs['ret'] = 1;
+        $rs['msg'] = '删除成功';
+
+        return $response->write(
+            json_encode($rs)
+        );
+    }
+
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function bought_add($request, $response, $args): ResponseInterface
+    {
+        $id = $args['id'];
+        $user = User::find($id);
+        $shop_id  = (int) $request->getParam('buy_shop');
+        $buy_type = (int) $request->getParam('buy_type');
+        if ($shop_id == '') {
+            $rs['ret'] = 0;
+            $rs['msg'] = '请选择套餐';
+            return $response->getBody()->write(json_encode($rs));
+        }
+        $shop = Shop::find($shop_id);
+        if ($shop == null) {
+            $rs['ret'] = 0;
+            $rs['msg'] = '套餐不存在';
+            return $response->getBody()->write(json_encode($rs));
+        }
+        if ($buy_type != 0) {
+            if (bccomp($user->money, $shop->price, 2) == -1) {
+                $res['ret'] = 0;
+                $res['msg'] = '喵喵喵~ 该用户余额不足。';
+                return $response->getBody()->write(json_encode($res));
+            }
+            $user->money = bcsub($user->money, $shop->price, 2);
+            $user->save();
+        }
+        $boughts = Bought::where('userid', $user->id)->get();
+        foreach ($boughts as $disable_bought) {
+            $disable_bought->renew = 0;
+            $disable_bought->save();
+        }
+        $bought           = new Bought();
+        $bought->userid   = $user->id;
+        $bought->shopid   = $shop->id;
+        $bought->datetime = time();
+        $bought->renew    = 0;
+        $bought->coupon   = '';
+        $bought->price    = $shop->price;
+        $bought->save();
+        $shop->buy($user);
+        $rs['msg']        = ($buy_type != 0 ? '套餐购买成功' : '套餐添加成功');
+        $rs['ret']        = 1;
+
+        return $response->write(
+            json_encode($rs)
+        );
+    }
+}

+ 92 - 0
src/Controllers/Admin/UserLog/CodeLogController.php

@@ -0,0 +1,92 @@
+<?php
+
+namespace App\Controllers\Admin\UserLog;
+
+use App\Controllers\AdminController;
+use App\Models\{
+    Code,
+    User,
+};
+use Slim\Http\{
+    Request,
+    Response
+};
+use Psr\Http\Message\ResponseInterface;
+
+class CodeLogController extends AdminController
+{
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function index($request, $response, $args): ResponseInterface
+    {
+        $id = $args['id'];
+        $user = User::find($id);
+        $table_config['total_column'] = array(
+            'id'          => 'ID',
+            'code'        => '内容',
+            'type'        => '类型',
+            'number'      => '操作',
+            'usedatetime' => '时间'
+        );
+        $table_config['default_show_column'] = array();
+        foreach ($table_config['total_column'] as $column => $value) {
+            $table_config['default_show_column'][] = $column;
+        }
+        $table_config['ajax_url'] = 'code/ajax';
+        return $response->write(
+            $this->view()
+                ->assign('table_config', $table_config)
+                ->assign('user', $user)
+                ->display('admin/user/code.tpl')
+        );
+    }
+
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function ajax($request, $response, $args): ResponseInterface
+    {
+        $start        = $request->getParam("start");
+        $limit_length = $request->getParam('length');
+        $id           = $args['id'];
+        $user         = User::find($id);
+        $datas        = Code::where('userid', $user->id)->skip($start)->limit($limit_length)->orderBy('id', 'desc')->get();
+        $total_conut  = Code::where('userid', $user->id)->count();
+        $out_data         = [];
+        foreach ($datas as $data) {
+            $tempdata                = [];
+            $tempdata['id']          = $data->id;
+            $tempdata['code']        = $data->code;
+            switch ($data->type) {
+                case -1:
+                    $type = '充值金额';
+                    break;
+                case -2:
+                    $type = '财务支出';
+                    break;
+                default:
+                    $type = '已经废弃';
+                    break;
+            }
+            $tempdata['type']        = $type;
+            $tempdata['number']      = $data->number;
+            $tempdata['usedatetime'] = $data->usedatetime;
+            $out_data[]              = $tempdata;
+        }
+        $info = [
+            'draw'              => $request->getParam('draw'),
+            'recordsTotal'      => $total_conut,
+            'recordsFiltered'   => $total_conut,
+            'data'              => $out_data
+        ];
+
+        return $response->write(
+            json_encode($info)
+        );
+    }
+}

+ 94 - 0
src/Controllers/Admin/UserLog/DetectLogController.php

@@ -0,0 +1,94 @@
+<?php
+
+namespace App\Controllers\Admin\UserLog;
+
+use App\Controllers\AdminController;
+use App\Models\{
+    User,
+    Node,
+    DetectLog,
+    DetectRule
+};
+use Slim\Http\{
+    Request,
+    Response
+};
+use Psr\Http\Message\ResponseInterface;
+
+class DetectLogController extends AdminController
+{
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function index($request, $response, $args): ResponseInterface
+    {
+        $id = $args['id'];
+        $user = User::find($id);
+        $table_config['total_column'] = array(
+            'id'          => 'ID',
+            'node_id'     => '节点ID',
+            'node_name'   => '节点名',
+            'rule_id'     => '规则ID',
+            'rule_name'   => '规则名',
+            'rule_text'   => '规则描述',
+            'rule_regex'  => '规则正则表达式',
+            'rule_type'   => '规则类型',
+            'datetime'    => '时间'
+        );
+        $table_config['default_show_column'] = array();
+        foreach ($table_config['total_column'] as $column => $value) {
+            $table_config['default_show_column'][] = $column;
+        }
+        $table_config['ajax_url'] = 'detect/ajax';
+
+        return $response->write(
+            $this->view()
+                ->assign('table_config', $table_config)
+                ->assign('user', $user)
+                ->display('admin/user/detect.tpl')
+        );
+    }
+
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function ajax($request, $response, $args): ResponseInterface
+    {
+        $start        = $request->getParam("start");
+        $limit_length = $request->getParam('length');
+        $id           = $args['id'];
+        $user         = User::find($id);
+        $datas        = DetectLog::where('user_id', $user->id)->skip($start)->limit($limit_length)->orderBy('id', 'desc')->get();
+        $total_conut  = DetectLog::where('user_id', $user->id)->count();
+        $out_data     = [];
+        foreach ($datas as $data) {
+            $tempdata               = [];
+            $tempdata['id']         = $data->id;
+            $node                   = Node::where('id', $data->node_id)->first();
+            $tempdata['node_id']    = $data->node_id;
+            $tempdata['node_name']  = $node->name;
+            $rule                   = DetectRule::where('id', $data->list_id)->first();
+            $tempdata['rule_id']    = $rule->id;
+            $tempdata['rule_name']  = $rule->name;
+            $tempdata['rule_text']  = $rule->text;
+            $tempdata['rule_regex'] = $rule->regex;
+            $tempdata['rule_type']  = ($rule->type == 1 ? '数据包明文匹配' : '数据包十六进制匹配');
+            $tempdata['datetime']   = date('Y-m-d H:i:s', $data->datetime);
+            $out_data[]             = $tempdata;
+        }
+        $info = [
+            'draw'              => $request->getParam('draw'),
+            'recordsTotal'      => $total_conut,
+            'recordsFiltered'   => $total_conut,
+            'data'              => $out_data
+        ];
+
+        return $response->write(
+            json_encode($info)
+        );
+    }
+}

+ 85 - 0
src/Controllers/Admin/UserLog/LoginLogController.php

@@ -0,0 +1,85 @@
+<?php
+
+namespace App\Controllers\Admin\UserLog;
+
+use App\Controllers\AdminController;
+use App\Models\{
+    User,
+    LoginIp
+};
+use App\Utils\QQWry;
+use Slim\Http\{
+    Request,
+    Response
+};
+use Psr\Http\Message\ResponseInterface;
+
+class LoginLogController extends AdminController
+{
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function index($request, $response, $args): ResponseInterface
+    {
+        $id = $args['id'];
+        $user = User::find($id);
+        $table_config['total_column'] = array(
+            'id'        => 'ID',
+            'ip'        => 'IP',
+            'location'  => '归属地',
+            'datetime'  => '时间',
+            'type'      => '类型'
+        );
+        $table_config['default_show_column'] = array();
+        foreach ($table_config['total_column'] as $column => $value) {
+            $table_config['default_show_column'][] = $column;
+        }
+        $table_config['ajax_url'] = 'login/ajax';
+
+        return $response->write(
+            $this->view()
+                ->assign('table_config', $table_config)
+                ->assign('user', $user)
+                ->display('admin/user/login.tpl')
+        );
+    }
+
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function ajax($request, $response, $args): ResponseInterface
+    {
+        $start        = $request->getParam("start");
+        $limit_length = $request->getParam('length');
+        $id           = $args['id'];
+        $user         = User::find($id);
+        $datas        = LoginIp::where('userid', $user->id)->skip($start)->limit($limit_length)->orderBy('id', 'desc')->get();
+        $total_conut  = LoginIp::where('userid', $user->id)->count();
+        $iplocation   = new QQWry();
+        $out_data     = [];
+        foreach ($datas as $data) {
+            $tempdata             = [];
+            $tempdata['id']       = $data->id;
+            $tempdata['ip']       = $data->ip;
+            $location             = $iplocation->getlocation($data->ip);
+            $tempdata['location'] = iconv('gbk', 'utf-8//IGNORE', $location['country'] . $location['area']);
+            $tempdata['datetime'] = date('Y-m-d H:i:s', $data->datetime);
+            $tempdata['type']     = ($data->type == 0 ? '成功' : '失败');
+            $out_data[]           = $tempdata;
+        }
+        $info = [
+            'draw'              => $request->getParam('draw'),
+            'recordsTotal'      => $total_conut,
+            'recordsFiltered'   => $total_conut,
+            'data'              => $out_data
+        ];
+
+        return $response->write(
+            json_encode($info)
+        );
+    }
+}

+ 87 - 0
src/Controllers/Admin/UserLog/SubLogController.php

@@ -0,0 +1,87 @@
+<?php
+
+namespace App\Controllers\Admin\UserLog;
+
+use App\Controllers\AdminController;
+use App\Models\{
+    User,
+    UserSubscribeLog
+};
+use App\Utils\QQWry;
+use Slim\Http\{
+    Request,
+    Response
+};
+use Psr\Http\Message\ResponseInterface;
+
+class SubLogController extends AdminController
+{
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function index($request, $response, $args): ResponseInterface
+    {
+        $id = $args['id'];
+        $user = User::find($id);
+        $table_config['total_column'] = array(
+            'id'                  => 'ID',
+            'subscribe_type'      => '类型',
+            'request_ip'          => 'IP',
+            'location'            => '归属地',
+            'request_time'        => '时间',
+            'request_user_agent'  => 'User-Agent'
+        );
+        $table_config['default_show_column'] = array();
+        foreach ($table_config['total_column'] as $column => $value) {
+            $table_config['default_show_column'][] = $column;
+        }
+        $table_config['ajax_url'] = 'sublog/ajax';
+
+        return $response->write(
+            $this->view()
+                ->assign('table_config', $table_config)
+                ->assign('user', $user)
+                ->display('admin/user/sublog.tpl')
+        );
+    }
+
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function ajax($request, $response, $args): ResponseInterface
+    {
+        $start        = $request->getParam("start");
+        $limit_length = $request->getParam('length');
+        $id           = $args['id'];
+        $user         = User::find($id);
+        $datas        = UserSubscribeLog::where('user_id', $user->id)->skip($start)->limit($limit_length)->orderBy('id', 'desc')->get();
+        $total_conut  = UserSubscribeLog::where('user_id', $user->id)->count();
+        $iplocation   = new QQWry();
+        $out_data     = [];
+        foreach ($datas as $data) {
+            $tempdata                       = [];
+            $tempdata['id']                 = $data->id;
+            $tempdata['subscribe_type']     = $data->subscribe_type;
+            $tempdata['request_ip']         = $data->request_ip;
+            $location                       = $iplocation->getlocation($data->request_ip);
+            $tempdata['location']           = iconv('gbk', 'utf-8//IGNORE', $location['country'] . $location['area']);
+            $tempdata['request_time']       = $data->request_time;
+            $tempdata['request_user_agent'] = $data->request_user_agent;
+            $out_data[]                     = $tempdata;
+        }
+        $info = [
+            'draw'              => $request->getParam('draw'),
+            'recordsTotal'      => $total_conut,
+            'recordsFiltered'   => $total_conut,
+            'data'              => $out_data
+        ];
+
+        return $response->write(
+            json_encode($info)
+        );
+    }
+}

+ 87 - 0
src/Controllers/Admin/UserLog/TrafficLogController.php

@@ -0,0 +1,87 @@
+<?php
+
+namespace App\Controllers\Admin\UserLog;
+
+use App\Controllers\AdminController;
+use App\Models\{
+    User,
+    Node,
+    TrafficLog
+};
+use App\Utils\Tools;
+use Slim\Http\{
+    Request,
+    Response
+};
+use Psr\Http\Message\ResponseInterface;
+
+class TrafficLogController extends AdminController
+{
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function index($request, $response, $args): ResponseInterface
+    {
+        $id = $args['id'];
+        $user = User::find($id);
+        $table_config['total_column'] = array(
+            'id'              => 'ID',
+            'node_name'       => '使用节点',
+            'rate'            => '倍率',
+            'origin_traffic'  => '实际使用流量',
+            'traffic'         => '结算流量',
+            'log_time'        => '记录时间'
+        );
+        $table_config['default_show_column'] = array();
+        foreach ($table_config['total_column'] as $column => $value) {
+            $table_config['default_show_column'][] = $column;
+        }
+        $table_config['ajax_url'] = 'traffic/ajax';
+
+        return $response->write(
+            $this->view()
+                ->assign('table_config', $table_config)
+                ->assign('user', $user)
+                ->display('admin/user/traffic.tpl')
+        );
+    }
+
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function ajax($request, $response, $args): ResponseInterface
+    {
+        $start        = $request->getParam("start");
+        $limit_length = $request->getParam('length');
+        $id           = $args['id'];
+        $user         = User::find($id);
+        $datas        = TrafficLog::where('user_id', $user->id)->skip($start)->limit($limit_length)->orderBy('id', 'desc')->get();
+        $total_conut  = TrafficLog::where('user_id', $user->id)->count();
+        $out_data     = [];
+        foreach ($datas as $data) {
+            $tempdata                   = [];
+            $tempdata['id']             = $data->id;
+            $node                       = Node::where('id', $data->node_id)->first();
+            $tempdata['node_name']      = $node->name;
+            $tempdata['rate']           = $data->rate;
+            $tempdata['origin_traffic'] = Tools::flowAutoShow($data->u + $data->d);
+            $tempdata['traffic']        = $data->traffic;
+            $tempdata['log_time']       = date('Y-m-d H:i:s', $data->log_time);
+            $out_data[]                 = $tempdata;
+        }
+        $info = [
+            'draw'              => $request->getParam('draw'),
+            'recordsTotal'      => $total_conut,
+            'recordsFiltered'   => $total_conut,
+            'data'              => $out_data
+        ];
+
+        return $response->write(
+            json_encode($info)
+        );
+    }
+}

+ 41 - 31
src/Controllers/AdminController.php

@@ -2,16 +2,20 @@
 
 
 namespace App\Controllers;
 namespace App\Controllers;
 
 
-use App\Models\Node;
-use App\Models\Coupon;
-use App\Models\User;
-use App\Services\Gateway\ChenPay;
-use App\Utils\AliPay;
-use App\Utils\Tools;
-use App\Services\Analytics;
-
+use App\Models\{
+    Node,
+    User,
+    Coupon
+};
+use App\Utils\{
+    Tools,
+    DatatablesHelper
+};
+use App\Services\{
+    Analytics,
+    Gateway\ChenPay
+};
 use Ozdemir\Datatables\Datatables;
 use Ozdemir\Datatables\Datatables;
-use App\Utils\DatatablesHelper;
 
 
 /**
 /**
  *  Admin Controller
  *  Admin Controller
@@ -30,7 +34,6 @@ class AdminController extends UserController
         return $this->view()->assign('nodes', $nodes)->display('admin/node.tpl');
         return $this->view()->assign('nodes', $nodes)->display('admin/node.tpl');
     }
     }
 
 
-
     public function editConfig($request, $response, $args)
     public function editConfig($request, $response, $args)
     {
     {
         return (new ChenPay())->editConfig();
         return (new ChenPay())->editConfig();
@@ -48,11 +51,13 @@ class AdminController extends UserController
 
 
     public function invite($request, $response, $args)
     public function invite($request, $response, $args)
     {
     {
-        $table_config['total_column'] = array('id' => 'ID',
+        $table_config['total_column'] = array(
+            'id' => 'ID',
             'total' => '原始金额', 'event_user_id' => '发起用户ID',
             'total' => '原始金额', 'event_user_id' => '发起用户ID',
             'event_user_name' => '发起用户名', 'ref_user_id' => '获利用户ID',
             'event_user_name' => '发起用户名', 'ref_user_id' => '获利用户ID',
             'ref_user_name' => '获利用户名', 'ref_get' => '获利金额',
             'ref_user_name' => '获利用户名', 'ref_get' => '获利金额',
-            'datetime' => '时间');
+            'datetime' => '时间'
+        );
         $table_config['default_show_column'] = array();
         $table_config['default_show_column'] = array();
         foreach ($table_config['total_column'] as $column => $value) {
         foreach ($table_config['total_column'] as $column => $value) {
             $table_config['default_show_column'][] = $column;
             $table_config['default_show_column'][] = $column;
@@ -60,34 +65,34 @@ class AdminController extends UserController
         $table_config['ajax_url'] = 'payback/ajax';
         $table_config['ajax_url'] = 'payback/ajax';
         return $this->view()->assign('table_config', $table_config)->display('admin/invite.tpl');
         return $this->view()->assign('table_config', $table_config)->display('admin/invite.tpl');
     }
     }
-    
+
     public function chgInvite($request, $response, $args)
     public function chgInvite($request, $response, $args)
     {
     {
         $prefix = $request->getParam('prefix');
         $prefix = $request->getParam('prefix');
 
 
-        if ($request->getParam('userid')!=NULL && $request->getParam('refid')!=NULL) {
-            if (strpos($request->getParam('userid'), "@")!=false) {
-                $user=User::where("email", "=", $request->getParam('userid'))->first();
+        if ($request->getParam('userid') != NULL && $request->getParam('refid') != NULL) {
+            if (strpos($request->getParam('userid'), '@') != false) {
+                $user = User::where('email', '=', $request->getParam('userid'))->first();
             } else {
             } else {
-                $user=User::Where("id", "=", $request->getParam('userid'))->first();
+                $user = User::Where('id', '=', $request->getParam('userid'))->first();
             }
             }
 
 
-            if ($user==null) {
+            if ($user == null) {
                 $res['ret'] = 0;
                 $res['ret'] = 0;
-                $res['msg'] = "邀请者更改失败,检查用户id是否输入正确";
+                $res['msg'] = '邀请者更改失败,检查用户id是否输入正确';
                 return $response->getBody()->write(json_encode($res));
                 return $response->getBody()->write(json_encode($res));
             }
             }
             $uid = $user->id;
             $uid = $user->id;
         } else {
         } else {
-            $uid=0;
+            $uid = 0;
         }
         }
-		$user->ref_by = $request->getParam('refid');
-		$user->save();
+        $user->ref_by = $request->getParam('refid');
+        $user->save();
         $res['ret'] = 1;
         $res['ret'] = 1;
-        $res['msg'] = "邀请者更改成功";
+        $res['msg'] = '邀请者更改成功';
         return $response->getBody()->write(json_encode($res));
         return $response->getBody()->write(json_encode($res));
     }
     }
-    
+
     public function addInvite($request, $response, $args)
     public function addInvite($request, $response, $args)
     {
     {
         $num = $request->getParam('num');
         $num = $request->getParam('num');
@@ -122,12 +127,13 @@ class AdminController extends UserController
         return $response->getBody()->write(json_encode($res));
         return $response->getBody()->write(json_encode($res));
     }
     }
 
 
-
     public function coupon($request, $response, $args)
     public function coupon($request, $response, $args)
     {
     {
-        $table_config['total_column'] = array('id' => 'ID', 'code' => '优惠码',
+        $table_config['total_column'] = array(
+            'id' => 'ID', 'code' => '优惠码',
             'expire' => '过期时间', 'shop' => '限定商品ID',
             'expire' => '过期时间', 'shop' => '限定商品ID',
-            'credit' => '额度', 'onetime' => '次数');
+            'credit' => '额度', 'onetime' => '次数'
+        );
         $table_config['default_show_column'] = array();
         $table_config['default_show_column'] = array();
         foreach ($table_config['total_column'] as $column => $value) {
         foreach ($table_config['total_column'] as $column => $value) {
             $table_config['default_show_column'][] = $column;
             $table_config['default_show_column'][] = $column;
@@ -184,15 +190,19 @@ class AdminController extends UserController
 
 
     public function trafficLog($request, $response, $args)
     public function trafficLog($request, $response, $args)
     {
     {
-        $table_config['total_column'] = array('id' => 'ID', 'user_id' => '用户ID',
+        $table_config['total_column'] = array(
+            'id' => 'ID', 'user_id' => '用户ID',
             'user_name' => '用户名', 'node_name' => '使用节点',
             'user_name' => '用户名', 'node_name' => '使用节点',
             'rate' => '倍率', 'origin_traffic' => '实际使用流量',
             'rate' => '倍率', 'origin_traffic' => '实际使用流量',
             'traffic' => '结算流量',
             'traffic' => '结算流量',
-            'log_time' => '记录时间');
-        $table_config['default_show_column'] = array('id', 'user_id',
+            'log_time' => '记录时间'
+        );
+        $table_config['default_show_column'] = array(
+            'id', 'user_id',
             'user_name', 'node_name',
             'user_name', 'node_name',
             'rate', 'origin_traffic',
             'rate', 'origin_traffic',
-            'traffic', 'log_time');
+            'traffic', 'log_time'
+        );
         $table_config['ajax_url'] = 'trafficlog/ajax';
         $table_config['ajax_url'] = 'trafficlog/ajax';
         return $this->view()->assign('table_config', $table_config)->display('admin/trafficlog.tpl');
         return $this->view()->assign('table_config', $table_config)->display('admin/trafficlog.tpl');
     }
     }

+ 69 - 65
src/Controllers/AuthController.php

@@ -2,23 +2,28 @@
 
 
 namespace App\Controllers;
 namespace App\Controllers;
 
 
-use App\Models\InviteCode;
-use App\Services\Config;
-use App\Utils\Check;
-use App\Utils\Tools;
-use App\Utils\Radius;
-use Exception;
+use App\Models\{
+    User,
+    LoginIp,
+    InviteCode,
+    EmailVerify
+};
+use App\Utils\{
+    GA,
+    Hash,
+    Check,
+    Tools,
+    Radius,
+    Geetest,
+    TelegramSessionManager
+};
+use App\Services\{
+    Auth,
+    Mail,
+    Config
+};
 use voku\helper\AntiXSS;
 use voku\helper\AntiXSS;
-use App\Utils\Hash;
-use App\Utils\Da;
-use App\Services\Auth;
-use App\Services\Mail;
-use App\Models\User;
-use App\Models\LoginIp;
-use App\Models\EmailVerify;
-use App\Utils\GA;
-use App\Utils\Geetest;
-use App\Utils\TelegramSessionManager;
+use Exception;
 
 
 /**
 /**
  *  AuthController
  *  AuthController
@@ -242,7 +247,7 @@ class AuthController extends BaseController
 
 
         return $this->view()
         return $this->view()
             ->assign('geetest_html', $GtSdk)
             ->assign('geetest_html', $GtSdk)
-            ->assign('enable_email_verify', $_ENV['enable_email_verify'])
+            ->assign('enable_email_verify', Config::getconfig('Register.bool.Enable_email_verify'))
             ->assign('code', $code)
             ->assign('code', $code)
             ->assign('recaptcha_sitekey', $recaptcha_sitekey)
             ->assign('recaptcha_sitekey', $recaptcha_sitekey)
             ->assign('telegram_bot', $_ENV['telegram_bot'])
             ->assign('telegram_bot', $_ENV['telegram_bot'])
@@ -252,10 +257,9 @@ class AuthController extends BaseController
             ->display('auth/register.tpl');
             ->display('auth/register.tpl');
     }
     }
 
 
-
     public function sendVerify($request, $response, $next)
     public function sendVerify($request, $response, $next)
     {
     {
-        if ($_ENV['enable_email_verify'] == true) {
+        if (Config::getconfig('Register.bool.Enable_email_verify')) {
             $email = $request->getParam('email');
             $email = $request->getParam('email');
             $email = trim($email);
             $email = trim($email);
 
 
@@ -280,7 +284,7 @@ class AuthController extends BaseController
             }
             }
 
 
             $ipcount = EmailVerify::where('ip', '=', $_SERVER['REMOTE_ADDR'])->where('expire_in', '>', time())->count();
             $ipcount = EmailVerify::where('ip', '=', $_SERVER['REMOTE_ADDR'])->where('expire_in', '>', time())->count();
-            if ($ipcount >= (int)$_ENV['email_verify_iplimit']) {
+            if ($ipcount >= (int) Config::getconfig('Register.string.Email_verify_iplimit')) {
                 $res['ret'] = 0;
                 $res['ret'] = 0;
                 $res['msg'] = '此IP请求次数过多';
                 $res['msg'] = '此IP请求次数过多';
                 return $response->getBody()->write(json_encode($res));
                 return $response->getBody()->write(json_encode($res));
@@ -297,7 +301,7 @@ class AuthController extends BaseController
             $code = Tools::genRandomNum(6);
             $code = Tools::genRandomNum(6);
 
 
             $ev = new EmailVerify();
             $ev = new EmailVerify();
-            $ev->expire_in = time() + $_ENV['email_verify_ttl'];
+            $ev->expire_in = time() + (int) Config::getconfig('Register.string.Email_verify_ttl');
             $ev->ip = $_SERVER['REMOTE_ADDR'];
             $ev->ip = $_SERVER['REMOTE_ADDR'];
             $ev->email = $email;
             $ev->email = $email;
             $ev->code = $code;
             $ev->code = $code;
@@ -307,7 +311,7 @@ class AuthController extends BaseController
 
 
             try {
             try {
                 Mail::send($email, $subject, 'auth/verify.tpl', [
                 Mail::send($email, $subject, 'auth/verify.tpl', [
-                    'code' => $code, 'expire' => date('Y-m-d H:i:s', time() + $_ENV['email_verify_ttl'])
+                    'code' => $code, 'expire' => date('Y-m-d H:i:s', time() + (int) Config::getconfig('Register.string.Email_verify_ttl'))
                 ], [
                 ], [
                     //BASE_PATH.'/public/assets/email/styles.css'
                     //BASE_PATH.'/public/assets/email/styles.css'
                 ]);
                 ]);
@@ -327,7 +331,7 @@ class AuthController extends BaseController
 
 
     public function register_helper($name, $email, $passwd, $code, $imtype, $imvalue, $telegram_id)
     public function register_helper($name, $email, $passwd, $code, $imtype, $imvalue, $telegram_id)
     {
     {
-        if ($_ENV['register_mode'] === 'close') {
+        if (Config::getconfig('Register.string.Mode') === 'close') {
             $res['ret'] = 0;
             $res['ret'] = 0;
             $res['msg'] = '未开放注册。';
             $res['msg'] = '未开放注册。';
             return $res;
             return $res;
@@ -336,7 +340,7 @@ class AuthController extends BaseController
         //dumplin:1、邀请人等级为0则邀请码不可用;2、邀请人invite_num为可邀请次数,填负数则为无限
         //dumplin:1、邀请人等级为0则邀请码不可用;2、邀请人invite_num为可邀请次数,填负数则为无限
         $c = InviteCode::where('code', $code)->first();
         $c = InviteCode::where('code', $code)->first();
         if ($c == null) {
         if ($c == null) {
-            if ($_ENV['register_mode'] === 'invite') {
+            if (Config::getconfig('Register.string.Mode') === 'invite') {
                 $res['ret'] = 0;
                 $res['ret'] = 0;
                 $res['msg'] = '邀请码无效';
                 $res['msg'] = '邀请码无效';
                 return $res;
                 return $res;
@@ -363,60 +367,60 @@ class AuthController extends BaseController
         }
         }
 
 
         // do reg user
         // do reg user
-        $user = new User();
-
-        $antiXss = new AntiXSS();
-
-        $user->user_name = $antiXss->xss_clean($name);
-        $user->email = $email;
-        $user->pass = Hash::passwordHash($passwd);
-        $user->passwd = Tools::genRandomChar(6);
-        $user->port = Tools::getAvPort();
-        $user->t = 0;
-        $user->u = 0;
-        $user->d = 0;
-        $user->method = $_ENV['reg_method'];
-        $user->protocol = $_ENV['reg_protocol'];
-        $user->protocol_param = $_ENV['reg_protocol_param'];
-        $user->obfs = $_ENV['reg_obfs'];
-        $user->obfs_param = $_ENV['reg_obfs_param'];
-        $user->forbidden_ip = $_ENV['reg_forbidden_ip'];
-        $user->forbidden_port = $_ENV['reg_forbidden_port'];
-        $user->im_type = $imtype;
-        $user->im_value = $antiXss->xss_clean($imvalue);
-        $user->transfer_enable = Tools::toGB($_ENV['defaultTraffic']);
-        $user->invite_num = $_ENV['inviteNum'];
-        $user->auto_reset_day = $_ENV['reg_auto_reset_day'];
+        $user                       = new User();
+
+        $antiXss                    = new AntiXSS();
+
+        $user->user_name            = $antiXss->xss_clean($name);
+        $user->email                = $email;
+        $user->pass                 = Hash::passwordHash($passwd);
+        $user->passwd               = Tools::genRandomChar(6);
+        $user->port                 = Tools::getAvPort();
+        $user->t                    = 0;
+        $user->u                    = 0;
+        $user->d                    = 0;
+        $user->method               = Config::getconfig('Register.string.defaultMethod');
+        $user->protocol             = Config::getconfig('Register.string.defaultProtocol');
+        $user->protocol_param       = Config::getconfig('Register.string.defaultProtocol_param');
+        $user->obfs                 = Config::getconfig('Register.string.defaultObfs');
+        $user->obfs_param           = Config::getconfig('Register.string.defaultObfs_param');
+        $user->forbidden_ip         = $_ENV['reg_forbidden_ip'];
+        $user->forbidden_port       = $_ENV['reg_forbidden_port'];
+        $user->im_type              = $imtype;
+        $user->im_value             = $antiXss->xss_clean($imvalue);
+        $user->transfer_enable      = Tools::toGB((int) Config::getconfig('Register.string.defaultTraffic'));
+        $user->invite_num           = (int) Config::getconfig('Register.string.defaultInviteNum');
+        $user->auto_reset_day       = $_ENV['reg_auto_reset_day'];
         $user->auto_reset_bandwidth = $_ENV['reg_auto_reset_bandwidth'];
         $user->auto_reset_bandwidth = $_ENV['reg_auto_reset_bandwidth'];
-        $user->money = 0;
+        $user->money                = 0;
 
 
         //dumplin:填写邀请人,写入邀请奖励
         //dumplin:填写邀请人,写入邀请奖励
         $user->ref_by = 0;
         $user->ref_by = 0;
         if (($c != null) && $c->user_id != 0) {
         if (($c != null) && $c->user_id != 0) {
             $gift_user = User::where('id', '=', $c->user_id)->first();
             $gift_user = User::where('id', '=', $c->user_id)->first();
             $user->ref_by = $c->user_id;
             $user->ref_by = $c->user_id;
-            $user->money = $_ENV['invite_get_money'];
+            $user->money = (int) Config::getconfig('Register.string.defaultInvite_get_money');
             $gift_user->transfer_enable += $_ENV['invite_gift'] * 1024 * 1024 * 1024;
             $gift_user->transfer_enable += $_ENV['invite_gift'] * 1024 * 1024 * 1024;
             --$gift_user->invite_num;
             --$gift_user->invite_num;
             $gift_user->save();
             $gift_user->save();
         }
         }
-        if ( $telegram_id ) {
+        if ($telegram_id) {
             $user->telegram_id = $telegram_id;
             $user->telegram_id = $telegram_id;
         }
         }
 
 
-        $user->class_expire = date('Y-m-d H:i:s', time() + $_ENV['user_class_expire_default'] * 3600);
-        $user->class = $_ENV['user_class_default'];
-        $user->node_connector = $_ENV['user_conn'];
-        $user->node_speedlimit = $_ENV['user_speedlimit'];
-        $user->expire_in = date('Y-m-d H:i:s', time() + $_ENV['user_expire_in_default'] * 86400);
-        $user->reg_date = date('Y-m-d H:i:s');
-        $user->reg_ip = $_SERVER['REMOTE_ADDR'];
-        $user->plan = 'A';
-        $user->theme = $_ENV['theme'];
+        $user->class_expire     = date('Y-m-d H:i:s', time() + (int) Config::getconfig('Register.string.defaultClass_expire') * 3600);
+        $user->class            = (int) Config::getconfig('Register.string.defaultClass');
+        $user->node_connector   = (int) Config::getconfig('Register.string.defaultConn');
+        $user->node_speedlimit  = (int) Config::getconfig('Register.string.defaultSpeedlimit');
+        $user->expire_in        = date('Y-m-d H:i:s', time() + (int) Config::getconfig('Register.string.defaultExpire_in') * 86400);
+        $user->reg_date         = date('Y-m-d H:i:s');
+        $user->reg_ip           = $_SERVER['REMOTE_ADDR'];
+        $user->plan             = 'A';
+        $user->theme            = $_ENV['theme'];
 
 
-        $groups = explode(',', $_ENV['ramdom_group']);
+        $groups                 = explode(',', $_ENV['ramdom_group']);
 
 
-        $user->node_group = $groups[array_rand($groups)];
+        $user->node_group       = $groups[array_rand($groups)];
 
 
         $ga = new GA();
         $ga = new GA();
         $secret = $ga->createSecret();
         $secret = $ga->createSecret();
@@ -441,7 +445,7 @@ class AuthController extends BaseController
 
 
     public function registerHandle($request, $response)
     public function registerHandle($request, $response)
     {
     {
-        if ($_ENV['register_mode'] === 'close') {
+        if (Config::getconfig('Register.string.Mode') === 'close') {
             $res['ret'] = 0;
             $res['ret'] = 0;
             $res['msg'] = '未开放注册。';
             $res['msg'] = '未开放注册。';
             return $response->getBody()->write(json_encode($res));
             return $response->getBody()->write(json_encode($res));
@@ -499,7 +503,7 @@ class AuthController extends BaseController
             return $response->getBody()->write(json_encode($res));
             return $response->getBody()->write(json_encode($res));
         }
         }
 
 
-        if ($_ENV['enable_email_verify'] == true) {
+        if (Config::getconfig('Register.bool.Enable_email_verify')) {
             $mailcount = EmailVerify::where('email', '=', $email)->where('code', '=', $emailcode)->where('expire_in', '>', time())->first();
             $mailcount = EmailVerify::where('email', '=', $email)->where('code', '=', $emailcode)->where('expire_in', '>', time())->first();
             if ($mailcount == null) {
             if ($mailcount == null) {
                 $res['ret'] = 0;
                 $res['ret'] = 0;
@@ -534,7 +538,7 @@ class AuthController extends BaseController
             $res['msg'] = '此联络方式已注册';
             $res['msg'] = '此联络方式已注册';
             return $response->getBody()->write(json_encode($res));
             return $response->getBody()->write(json_encode($res));
         }
         }
-        if ($_ENV['enable_email_verify'] == true) {
+        if (Config::getconfig('Register.bool.Enable_email_verify')) {
             EmailVerify::where('email', '=', $email)->delete();
             EmailVerify::where('email', '=', $email)->delete();
         }
         }
         $res = $this->register_helper($name, $email, $passwd, $code, $imtype, $imvalue, 0);
         $res = $this->register_helper($name, $email, $passwd, $code, $imtype, $imvalue, 0);

+ 4 - 2
src/Controllers/BaseController.php

@@ -3,8 +3,10 @@
 namespace App\Controllers;
 namespace App\Controllers;
 
 
 use App\Models\User;
 use App\Models\User;
-use App\Services\View;
-use App\Services\Auth;
+use App\Services\{
+    Auth,
+    View
+};
 use Slim\Http\Response;
 use Slim\Http\Response;
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ResponseInterface;
 use Smarty;
 use Smarty;

+ 455 - 0
src/Controllers/ConfController.php

@@ -0,0 +1,455 @@
+<?php
+
+/**
+ * 应用自定义配置
+ *
+ * PHP version 7.2+
+ */
+
+namespace App\Controllers;
+
+use App\Utils\ConfRender;
+use Symfony\Component\Yaml\Yaml;
+use Symfony\Component\Yaml\Exception\ParseException;
+
+/**
+ * ConfController
+ *
+ * @category GeekQu
+ * @package  App/Controllers/ConfController
+ */
+class ConfController extends BaseController
+{
+    /**
+     * 获取匹配的节点
+     *
+     * @param array $Proxy 节点
+     * @param array $Rule  匹配规则
+     *
+     * @return array|null
+     */
+    public static function getMatchProxy($Proxy, $Rule)
+    {
+        $return = null;
+        switch (true) {
+            case (isset($Rule['content']['class'])):
+                if (in_array($Proxy['class'], $Rule['content']['class'])) {
+                    if (isset($Rule['content']['regex'])) {
+                        if (preg_match('/' . $Rule['content']['regex'] . '/i', $Proxy['remark'])) {
+                            $return = $Proxy;
+                        }
+                    } else {
+                        $return = $Proxy;
+                    }
+                }
+                break;
+            case (isset($Rule['content']['noclass'])):
+                if (!in_array($Proxy['class'], $Rule['content']['noclass'])) {
+                    if (isset($Rule['content']['regex'])) {
+                        if (preg_match('/' . $Rule['content']['regex'] . '/i', $Proxy['remark'])) {
+                            $return = $Proxy;
+                        }
+                    } else {
+                        $return = $Proxy;
+                    }
+                }
+                break;
+            case (!isset($Rule['content']['class'])
+                && !isset($Rule['content']['noclass'])
+                && isset($Rule['content']['regex'])
+                && preg_match('/' . $Rule['content']['regex'] . '/i', $Proxy['remark'])
+            ):
+                $return = $Proxy;
+                break;
+        }
+
+        return $return;
+    }
+
+    /**
+     * YAML 转数组
+     *
+     * @param string $Content YAML 字符串
+     *
+     * @return array|string
+     */
+    public static function YAML2Array($Content)
+    {
+        try {
+            return Yaml::parse($Content);
+        } catch (ParseException $exception) {
+            return printf('无法解析 YAML 字符串: %s', $exception->getMessage());
+        }
+    }
+
+    /**
+     * 自定义配置文件生成 Surge 托管配置
+     *
+     * @param User   $User          用户
+     * @param string $AllProxys     Surge 格式的全部节点
+     * @param array  $Nodes         节点数组
+     * @param string $SourceContent 配置内容
+     *
+     * @return string
+     */
+    public static function getSurgeConfs($User, $AllProxys, $Nodes, $Configs)
+    {
+        $General = (isset($Configs['General']) ? self::getSurgeConfGeneral($Configs['General']) : '');
+
+        $Proxys = (isset($Configs['Proxy']) ? self::getSurgeConfProxy($Configs['Proxy']) : '');
+
+        if (isset($Configs['Proxy Group'])) {
+            //兼容
+            $Configs['ProxyGroup'] = $Configs['Proxy Group'];
+        }
+        $ProxyGroups = self::getSurgeConfProxyGroup(
+            $Nodes,
+            $Configs['ProxyGroup']
+        );
+        $ProxyGroup = self::fixSurgeProxyGroup($ProxyGroups, $Configs['Checks']);
+        $ProxyGroup = self::getSurgeProxyGroup2String($ProxyGroups);
+
+        $Rule = self::getRule($Configs['Rule']);
+
+        $Conf = [
+            '#!MANAGED-CONFIG ' . $_ENV['baseUrl'] . $_SERVER['REQUEST_URI'],
+            '',
+            '#---------------------------------------------------#',
+            '## 上次更新于:' . date("Y-m-d h:i:s"),
+            '#---------------------------------------------------#',
+            '',
+            '[General]',
+            $General,
+            '',
+            '[Proxy]',
+            $Proxys,
+            $AllProxys,
+            '',
+            '[Proxy Group]',
+            $ProxyGroup,
+            '',
+            '[Rule]',
+            $Rule
+        ];
+
+        return implode(PHP_EOL, $Conf);
+    }
+
+    /**
+     * Surge 配置中的 General
+     *
+     * @param array $General Surge General 定义
+     *
+     * @return string
+     */
+    public static function getSurgeConfGeneral($General)
+    {
+        $return = '';
+        if (count($General) != 0) {
+            foreach ($General as $key => $value) {
+                $return .= $key . ' = ' . $value . PHP_EOL;
+            }
+        }
+        return $return;
+    }
+
+    /**
+     * Surge 配置中的 Proxy
+     *
+     * @param array $Proxys 自定义配置中的额外 Proxy
+     *
+     * @return string
+     */
+    public static function getSurgeConfProxy($Proxys)
+    {
+        $return = '';
+        if (count($Proxys) != 0) {
+            foreach ($Proxys as $value) {
+                if (!preg_match('/(\[General|Replica|Proxy|Proxy\sGroup|Rule|Host|URL\sRewrite|Header\sRewrite|MITM|Script\])/', $value)) {
+                    $return .= $value . PHP_EOL;
+                }
+            }
+        }
+        return $return;
+    }
+
+    /**
+     * Surge 配置中的 ProxyGroup
+     *
+     * @param array $Nodes       全部节点数组
+     * @param array $ProxyGroups Surge 策略组定义
+     *
+     * @return array
+     */
+    public static function getSurgeConfProxyGroup($Nodes, $ProxyGroups)
+    {
+        $return = [];
+        foreach ($ProxyGroups as $ProxyGroup) {
+            if (in_array($ProxyGroup['type'], ['select', 'url-test', 'fallback', 'load-balance'])) {
+                $proxies = [];
+                if (
+                    isset($ProxyGroup['content']['left-proxies'])
+                    && count($ProxyGroup['content']['left-proxies']) != 0
+                ) {
+                    $proxies = $ProxyGroup['content']['left-proxies'];
+                }
+                foreach ($Nodes as $item) {
+                    $item = self::getMatchProxy($item, $ProxyGroup);
+                    if ($item !== null && !in_array($item['remark'], $proxies)) {
+                        $proxies[] = $item['remark'];
+                    }
+                }
+                if (isset($ProxyGroup['content']['right-proxies'])) {
+                    $proxies = array_merge($proxies, $ProxyGroup['content']['right-proxies']);
+                }
+                $ProxyGroup['proxies'] = $proxies;
+            }
+            $return[] = $ProxyGroup;
+        }
+
+        return $return;
+    }
+
+    /**
+     * Surge ProxyGroup 去除无用策略组
+     *
+     * @param array $ProxyGroups 策略组
+     * @param array $checks      要检查的策略组名
+     *
+     * @return array
+     */
+    public static function fixSurgeProxyGroup($ProxyGroups, $checks)
+    {
+        if (count($checks) == 0) {
+            return $ProxyGroups;
+        }
+        $clean_names = [];
+        $newProxyGroups = [];
+        foreach ($ProxyGroups as $ProxyGroup) {
+            if (in_array($ProxyGroup['name'], $checks) && count($ProxyGroup['proxies']) == 0) {
+                $clean_names[] = $ProxyGroup['name'];
+                continue;
+            }
+            $newProxyGroups[] = $ProxyGroup;
+        }
+        if (count($clean_names) >= 1) {
+            $ProxyGroups = $newProxyGroups;
+            $newProxyGroups = [];
+            foreach ($ProxyGroups as $ProxyGroup) {
+                if (!in_array($ProxyGroup['name'], $checks) && $ProxyGroup['type'] != 'ssid') {
+                    $newProxies = [];
+                    foreach ($ProxyGroup['proxies'] as $proxie) {
+                        if (!in_array($proxie, $clean_names)) {
+                            $newProxies[] = $proxie;
+                        }
+                    }
+                    $ProxyGroup['proxies'] = $newProxies;
+                }
+                $newProxyGroups[] = $ProxyGroup;
+            }
+        }
+
+        return $newProxyGroups;
+    }
+
+    /**
+     * Surge ProxyGroup 转字符串
+     *
+     * @param array $ProxyGroups Surge 策略组定义
+     *
+     * @return string
+     */
+    public static function getSurgeProxyGroup2String($ProxyGroups)
+    {
+        $return = '';
+        foreach ($ProxyGroups as $ProxyGroup) {
+            $str = '';
+            if (in_array($ProxyGroup['type'], ['select', 'url-test', 'fallback', 'load-balance'])) {
+                $proxies = implode(', ', $ProxyGroup['proxies']);
+                if (in_array($ProxyGroup['type'], ['url-test', 'fallback', 'load-balance'])) {
+                    $str .= ($ProxyGroup['name']
+                        . ' = '
+                        . $ProxyGroup['type']
+                        . ', '
+                        . $proxies
+                        . ', url = ' . $ProxyGroup['url']
+                        . ', interval = ' . $ProxyGroup['interval']);
+                } else {
+                    $str .= ($ProxyGroup['name']
+                        . ' = '
+                        . $ProxyGroup['type']
+                        . ', '
+                        . $proxies);
+                }
+            } elseif ($ProxyGroup['type'] == 'ssid') {
+                $wifi = '';
+                foreach ($ProxyGroup['content'] as $key => $value) {
+                    $wifi .= ', "' . $key . '" = ' . $value;
+                }
+                $cellular = (isset($ProxyGroup['cellular'])
+                    ? ', cellular = ' . $ProxyGroup['cellular']
+                    : '');
+                $str .= ($ProxyGroup['name']
+                    . ' = '
+                    . $ProxyGroup['type']
+                    . ', default = '
+                    . $ProxyGroup['default']
+                    . $cellular
+                    . $wifi);
+            } else {
+                $str .= '';
+            }
+            $return .= $str . PHP_EOL;
+        }
+        return $return;
+    }
+
+    /**
+     * 自定义配置文件生成 Clash 配置
+     *
+     * @param object $User          用户
+     * @param array  $AllProxys     全部节点数组
+     * @param string $SourceContent 远程配置内容
+     *
+     * @return string
+     */
+    public static function getClashConfs($User, $AllProxys, $Configs)
+    {
+        if (isset($Configs['Proxy']) && count($Configs['Proxy']) != 0) {
+            $tmpProxys = array_merge($AllProxys, $Configs['Proxy']);
+        } else {
+            $tmpProxys = $AllProxys;
+        }
+        $Proxys = [];
+        foreach ($tmpProxys as $Proxy) {
+            unset($Proxy['class']);
+            $Proxys[] = $Proxy;
+        }
+
+        $tmp = $Configs['General'];
+        $tmp['Proxy'] = $Proxys;
+        if (isset($Configs['Proxy Group'])) {
+            $Configs['ProxyGroup'] = $Configs['Proxy Group'];
+        }
+        $tmp['Proxy Group'] = self::getClashConfProxyGroup(
+            $AllProxys,
+            $Configs['ProxyGroup']
+        );
+
+        $Conf = [
+            '#!MANAGED-CONFIG ' . $_ENV['baseUrl'] . $_SERVER['REQUEST_URI'],
+            '',
+            '#---------------------------------------------------#',
+            '## 上次更新于:' . date("Y-m-d h:i:s"),
+            '#---------------------------------------------------#',
+            '',
+            Yaml::dump($tmp, 4, 2),
+            '',
+            'Rule:',
+            self::getRule($Configs['Rule'])
+        ];
+
+        return implode(PHP_EOL, $Conf);
+    }
+
+    /**
+     * Clash 配置中的 ProxyGroup
+     *
+     * @param array $Nodes       全部节点数组
+     * @param array $ProxyGroups Clash 策略组定义
+     *
+     * @return array
+     */
+    public static function getClashConfProxyGroup($Nodes, $ProxyGroups)
+    {
+        $return = [];
+        foreach ($ProxyGroups as $ProxyGroup) {
+            $tmp = [];
+            if (in_array($ProxyGroup['type'], ['select', 'url-test', 'fallback', 'load-balance'])) {
+                $proxies = [];
+                if (
+                    isset($ProxyGroup['content']['left-proxies'])
+                    && count($ProxyGroup['content']['left-proxies']) != 0
+                ) {
+                    $proxies = $ProxyGroup['content']['left-proxies'];
+                }
+                foreach ($Nodes as $item) {
+                    $item['remark'] = $item['name'];
+                    $item = self::getMatchProxy($item, $ProxyGroup);
+                    if ($item !== null && !in_array($item['name'], $proxies)) {
+                        $proxies[] = $item['name'];
+                    }
+                }
+                if (isset($ProxyGroup['content']['right-proxies'])) {
+                    $proxies = array_merge($proxies, $ProxyGroup['content']['right-proxies']);
+                }
+                $tmp = [
+                    'name' => $ProxyGroup['name'],
+                    'type' => $ProxyGroup['type'],
+                    'proxies' => $proxies
+                ];
+                if ($ProxyGroup['type'] != 'select') {
+                    $tmp['url'] = $ProxyGroup['url'];
+                    $tmp['interval'] = $ProxyGroup['interval'];
+                }
+                $return[] = $tmp;
+            }
+        }
+        return $return;
+    }
+
+    /**
+     * Clash ProxyGroup 去除无用策略组
+     *
+     * @param array $ProxyGroups 策略组
+     * @param array $checks      要检查的策略组名
+     *
+     * @return array
+     */
+    public static function fixClashProxyGroup($ProxyGroups, $checks)
+    {
+        if (count($checks) == 0) {
+            return $ProxyGroups;
+        }
+        $clean_names = [];
+        $newProxyGroups = [];
+        foreach ($ProxyGroups as $ProxyGroup) {
+            if (in_array($ProxyGroup['name'], $checks) && count($ProxyGroup['proxies']) == 0) {
+                $clean_names[] = $ProxyGroup['name'];
+                continue;
+            }
+            $newProxyGroups[] = $ProxyGroup;
+        }
+        if (count($clean_names) >= 1) {
+            $ProxyGroups = $newProxyGroups;
+            $newProxyGroups = [];
+            foreach ($ProxyGroups as $ProxyGroup) {
+                if (!in_array($ProxyGroup['name'], $checks)) {
+                    $newProxies = [];
+                    foreach ($ProxyGroup['proxies'] as $proxie) {
+                        if (!in_array($proxie, $clean_names)) {
+                            $newProxies[] = $proxie;
+                        }
+                    }
+                    $ProxyGroup['proxies'] = $newProxies;
+                }
+                $newProxyGroups[] = $ProxyGroup;
+            }
+        }
+
+        return $newProxyGroups;
+    }
+
+    /**
+     * 规则加载
+     *
+     * @param array $Rules 规则加载地址
+     *
+     * @return string
+     */
+    public static function getRule($Rules)
+    {
+        $render = ConfRender::getTemplateRender();
+        return $render->fetch($Rules['source']);
+    }
+}

+ 160 - 7
src/Controllers/HomeController.php

@@ -3,12 +3,18 @@
 namespace App\Controllers;
 namespace App\Controllers;
 
 
 use App\Models\InviteCode;
 use App\Models\InviteCode;
-use App\Services\Config;
-use App\Utils\AliPay;
-use App\Utils\TelegramSessionManager;
-use App\Utils\TelegramProcess;
-use App\Utils\Geetest;
-use Slim\Http\{Request, Response};
+use App\Utils\{
+    Tools,
+    Geetest,
+    TelegramProcess,
+    TelegramSessionManager,
+    Telegram\Process
+};
+use App\Services\Auth;
+use Slim\Http\{
+    Request,
+    Response
+};
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ResponseInterface;
 
 
 /**
 /**
@@ -23,6 +29,10 @@ class HomeController extends BaseController
      */
      */
     public function index($request, $response, $args): ResponseInterface
     public function index($request, $response, $args): ResponseInterface
     {
     {
+        if ($_ENV['newIndex'] === false && $_ENV['theme'] == 'material') {
+            return $response->write($this->view()->fetch('indexold.tpl'));
+        }
+
         $GtSdk = null;
         $GtSdk = null;
         $recaptcha_sitekey = null;
         $recaptcha_sitekey = null;
         if ($_ENV['captcha_provider'] != '') {
         if ($_ENV['captcha_provider'] != '') {
@@ -109,7 +119,11 @@ class HomeController extends BaseController
     {
     {
         $token = $request->getQueryParam('token');
         $token = $request->getQueryParam('token');
         if ($token == $_ENV['telegram_request_token']) {
         if ($token == $_ENV['telegram_request_token']) {
-            TelegramProcess::process();
+            if ($_ENV['use_new_telegram_bot']) {
+                Process::index();
+            } else {
+                TelegramProcess::process();
+            }
             $result = '1';
             $result = '1';
         } else {
         } else {
             $result = '0';
             $result = '0';
@@ -180,4 +194,143 @@ class HomeController extends BaseController
         }
         }
         return $response->write(json_encode(['res' => AliPay::setOrder($sn, $url)]));
         return $response->write(json_encode(['res' => AliPay::setOrder($sn, $url)]));
     }
     }
+
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function getDocCenter($request, $response, $args): ResponseInterface
+    {
+        $user = Auth::getUser();
+        if (!$user->isLogin && $_ENV['enable_documents'] === false) {
+            $response = $response->withStatus(302)->withHeader('Location', '/');
+            return $response;
+        }
+        return $response->write($this->view()->fetch('doc/index.tpl'));
+    }
+
+    /**
+     * @param Request   $request
+     * @param Response  $response
+     * @param array     $args
+     */
+    public function getSubLink($request, $response, $args): string
+    {
+        $type = trim($request->getParam('type'));
+        $user = Auth::getUser();
+        if (!$user->isLogin) {
+            return $msg = '!> ₍₍ ◝(・ω・)◟ ⁾⁾ 您没有登录噢,[点击此处登录](/auth/login \':ignore target=_blank\') 之后再刷新就阔以了啦';
+        } else {
+            $subInfo = LinkController::getSubinfo($user, 0);
+            switch ($type) {
+                case 'ssr':
+                    $msg = [
+                        '**订阅链接:**',
+                        '```',
+                        $subInfo['ssr'],
+                        '```'
+                    ];
+                    break;
+                case 'v2ray':
+                    $msg = [
+                        '**订阅链接:**',
+                        '```',
+                        $subInfo['v2ray'],
+                        '```'
+                    ];
+                    break;
+                case 'ssd':
+                    $msg = [
+                        '**订阅链接:**',
+                        '```',
+                        $subInfo['ssd'],
+                        '```'
+                    ];
+                    break;
+                case 'clash':
+                    $msg = [
+                        '**订阅链接:**[[点击下载配置]](' . $subInfo['clash'] . ')',
+                        '```',
+                        $subInfo['clash'],
+                        '```'
+                    ];
+                    break;
+                case 'surge':
+                    $msg = [
+                        '**Surge Version 2.x 托管配置链接:**[[iOS 点击此处一键添加]](surge:///install-config?url=' . urlencode($subInfo['surge2']) . ')',
+                        '```',
+                        $subInfo['surge2'],
+                        '```',
+                        '**Surge Version 3.x 托管配置链接:**[[iOS 点击此处一键添加]](surge3:///install-config?url=' . urlencode($subInfo['surge3']) . ')',
+                        '```',
+                        $subInfo['surge3'],
+                        '```'
+                    ];
+                    break;
+                case 'kitsunebi':
+                    $msg = [
+                        '**包含 ss、v2ray 的合并订阅链接:**',
+                        '```',
+                        $subInfo['kitsunebi'],
+                        '```'
+                    ];
+                    break;
+                case 'surfboard':
+                    $msg = [
+                        '**托管配置链接:**',
+                        '```',
+                        $subInfo['surfboard'],
+                        '```'
+                    ];
+                    break;
+                case 'quantumult_sub':
+                    $msg = [
+                        '**ssr 订阅链接:**[[iOS 点击此处一键添加]](quantumult://configuration?server=' . Tools::base64_url_encode($subInfo['ssr']) . ')',
+                        '```',
+                        $subInfo['ssr'],
+                        '```',
+                        '**V2ray 订阅链接:**[[iOS 点击此处一键添加]](quantumult://configuration?server=' . Tools::base64_url_encode($subInfo['quantumult_v2']) . ')',
+                        '```',
+                        $subInfo['quantumult_v2'],
+                        '```'
+                    ];
+                    break;
+                case 'quantumult_conf':
+                    $msg = [
+                        '**导入 ss、ssr、v2ray 以及分流规则的配置链接:**',
+                        '```',
+                        $subInfo['quantumult_sub'],
+                        '```',
+                        '**导入类似 Surge、Clash 使用自定义策略组的配置链接:**',
+                        '```',
+                        $subInfo['quantumult_conf'],
+                        '```'
+                    ];
+                    break;
+                case 'shadowrocket':
+                    $msg = [
+                        '**包含 ss、ssr、v2ray 的合并订阅链接:**[[iOS 点击此处一键添加]](sub://' . base64_encode($subInfo['shadowrocket']) . ')',
+                        '```',
+                        $subInfo['shadowrocket'],
+                        '```'
+                    ];
+                    break;
+                default:
+                    if (in_array($type, $subInfo)) {
+                        $msg = [
+                            '```',
+                            $subInfo[$type],
+                            '```'
+                        ];
+                    } else {
+                        $msg = [
+                            '获取失败了呢...,请联系管理员。'
+                        ];
+                    }
+                    break;
+            }
+        }
+        return implode(PHP_EOL, $msg);
+    }
 }
 }

+ 805 - 363
src/Controllers/LinkController.php

@@ -4,16 +4,22 @@
 
 
 namespace App\Controllers;
 namespace App\Controllers;
 
 
-use App\Models\Link;
-use App\Models\User;
-use App\Models\Smartline;
-use App\Utils\ConfRender;
-use App\Utils\Tools;
-use App\Utils\URL;
-use App\Services\Config;
+use App\Models\{
+    Link,
+    User,
+    UserSubscribeLog
+};
+use App\Utils\{
+    URL,
+    Tools,
+    AppURI,
+    ConfRender
+};
+use voku\helper\AntiXSS;
+use Psr\Http\Message\ResponseInterface;
 
 
 /**
 /**
- *  HomeController
+ *  LinkController
  */
  */
 class LinkController extends BaseController
 class LinkController extends BaseController
 {
 {
@@ -21,7 +27,7 @@ class LinkController extends BaseController
     {
     {
         for ($i = 0; $i < 10; $i++) {
         for ($i = 0; $i < 10; $i++) {
             $token = Tools::genRandomChar(16);
             $token = Tools::genRandomChar(16);
-            $Elink = Link::where('token', '=', $token)->first();
+            $Elink = Link::where('token', $token)->first();
             if ($Elink == null) {
             if ($Elink == null) {
                 return $token;
                 return $token;
             }
             }
@@ -32,7 +38,7 @@ class LinkController extends BaseController
 
 
     public static function GenerateSSRSubCode($userid, $without_mu)
     public static function GenerateSSRSubCode($userid, $without_mu)
     {
     {
-        $Elink = Link::where('type', '=', 11)->where('userid', '=', $userid)->where('geo', $without_mu)->first();
+        $Elink = Link::where('type', 11)->where('userid', $userid)->where('geo', $without_mu)->first();
         if ($Elink != null) {
         if ($Elink != null) {
             return $Elink->token;
             return $Elink->token;
         }
         }
@@ -52,417 +58,853 @@ class LinkController extends BaseController
 
 
     public static function GetContent($request, $response, $args)
     public static function GetContent($request, $response, $args)
     {
     {
+        if (!$_ENV['Subscribe']) {
+            return null;
+        }
+
         $token = $args['token'];
         $token = $args['token'];
 
 
         //$builder->getPhrase();
         //$builder->getPhrase();
-        $Elink = Link::where('token', '=', $token)->first();
+        $Elink = Link::where('type', 11)->where('token', $token)->first();
         if ($Elink == null) {
         if ($Elink == null) {
             return null;
             return null;
         }
         }
 
 
-        if ($Elink->type != 11) {
-            return null;
-        }
-
         $user = User::where('id', $Elink->userid)->first();
         $user = User::where('id', $Elink->userid)->first();
         if ($user == null) {
         if ($user == null) {
             return null;
             return null;
         }
         }
 
 
-        $mu = 0;
-        if (isset($request->getQueryParams()['mu'])) {
-            $mu = (int)$request->getQueryParams()['mu'];
+        $opts = $request->getQueryParams();
+
+        // 筛选节点部分
+        $Rule['type'] = (isset($opts['type']) ? trim($opts['type']) : 'all');
+        $Rule['is_mu'] = ($_ENV['mergeSub'] === true ? 1 : 0);
+        if (isset($opts['mu'])) $Rule['is_mu'] = (int) $opts['mu'];
+
+        if (isset($opts['class'])) {
+            $class = trim(urldecode($opts['class']));
+            $Rule['content']['class'] = array_map(
+                function ($item) {
+                    return (int) $item;
+                },
+                explode('-', $class)
+            );
         }
         }
 
 
-        $newResponse = $response->withHeader('Content-type', ' application/octet-stream; charset=utf-8')->withHeader('Cache-Control', 'no-store, no-cache, must-revalidate')->withHeader('Content-Disposition', ' attachment; filename=' . $token . '.txt');
-        $newResponse->getBody()->write(self::GetSSRSub(User::where('id', '=', $Elink->userid)->first(), $mu));
-        return $newResponse;
-    }
+        if (isset($opts['noclass'])) {
+            $noclass = trim(urldecode($opts['noclass']));
+            $Rule['content']['noclass'] = array_map(
+                function ($item) {
+                    return (int) $item;
+                },
+                explode('-', $noclass)
+            );
+        }
 
 
-    public const V2RYA_MU = 2;
-    public const SSD_MU = 3;
-    public const CLASH_MU = 4;
+        if (isset($opts['regex'])) {
+            $Rule['content']['regex'] = trim(urldecode($opts['regex']));
+        }
 
 
-    public static function GetSSRSub($user, $mu = 0)
-    {
-        if ($mu == 0 || $mu == 1) {
-            return Tools::base64_url_encode(URL::getAllUrl($user, $mu, 0));
+        // Emoji
+        $Rule['emoji'] = $_ENV['add_emoji_to_node_name'];
+        if (isset($opts['emoji'])) {
+            $Rule['emoji'] = (bool) $opts['emoji'];
         }
         }
 
 
-        if ($mu == self::V2RYA_MU) {
-            return Tools::base64_url_encode(URL::getAllVMessUrl($user));
+        // 显示流量以及到期时间等
+        $Rule['extend'] = $_ENV['enable_sub_extend'];
+        if (isset($opts['extend'])) {
+            $Rule['extend'] = (bool) $opts['extend'];
         }
         }
 
 
-        if ($mu == self::SSD_MU) {
-            return URL::getAllSSDUrl($user);
+        // 兼容原版
+        if (isset($opts['mu'])) {
+            $mu = (int) $opts['mu'];
+            switch ($mu) {
+                case 0:
+                    $opts['sub'] = 1;
+                    break;
+                case 1:
+                    $opts['sub'] = 1;
+                    break;
+                case 2:
+                    $opts['sub'] = 3;
+                    break;
+                case 3:
+                    $opts['ssd'] = 1;
+                    break;
+                case 4:
+                    $opts['clash'] = 1;
+                    break;
+            }
         }
         }
 
 
-        if ($mu == self::CLASH_MU) {
-            // Clash
-            return self::GetClash($user);
+        // 订阅类型
+        $subscribe_type = '';
+
+        $getBody = '';
+
+        $sub_type_array = ['list', 'ssd', 'clash', 'surge', 'surfboard', 'quantumult', 'quantumultx', 'sub'];
+        foreach ($sub_type_array as $key) {
+            if (isset($opts[$key])) {
+                $query_value = $opts[$key];
+                if ($query_value != '0' && $query_value != '') {
+
+                    // 兼容代码开始
+                    if ($key == 'sub' && $query_value > 3) {
+                        $query_value = 1;
+                    }
+                    // 兼容代码结束
+
+                    if ($key == 'list') {
+                        $SubscribeExtend = self::getSubscribeExtend($query_value);
+                    } else {
+                        $SubscribeExtend = self::getSubscribeExtend($key, $query_value);
+                    }
+                    $filename = $SubscribeExtend['filename'] . '_' . time() . '.' . $SubscribeExtend['suffix'];
+                    $subscribe_type = $SubscribeExtend['filename'];
+
+                    $class = ('get' . $SubscribeExtend['class']);
+                    $content = self::$class($user, $query_value, $opts, $Rule);
+                    $getBody = self::getBody(
+                        $user,
+                        $response,
+                        $content,
+                        $filename
+                    );
+                    break;
+                }
+                continue;
+            }
+        }
+
+        // 记录订阅日志
+        if ($_ENV['subscribeLog'] === true) {
+            self::Subscribe_log($user, $subscribe_type, $request->getHeaderLine('User-Agent'));
         }
         }
+
+        return $getBody;
     }
     }
 
 
-    public static function GetClash($user)
+    /**
+     * 获取订阅类型的文件名
+     *
+     * @param string      $type  订阅类型
+     * @param string|null $value 值
+     *
+     * @return array
+     */
+    public static function getSubscribeExtend($type, $value = null)
     {
     {
-        $confs = [];
-        $proxy_confs = [];
-        // ss
-        $items = array_merge(URL::getAllItems($user, 0, 1), URL::getAllItems($user, 1, 1));
-        foreach ($items as $item) {
-            $sss = [
-                'name' => $item['remark'],
-                'type' => 'ss',
-                'server' => $item['address'],
-                'port' => $item['port'],
-                'cipher' => $item['method'],
-                'password' => $item['passwd'],
-            ];
-            if ($item['obfs'] != 'plain') {
-                switch ($item['obfs']) {
-                    case 'simple_obfs_http':
-                        $sss['plugin'] = 'obfs';
-                        $sss['plugin-opts']['mode'] = 'http';
-                        break;
-                    case 'simple_obfs_tls':
-                        $sss['plugin'] = 'obfs';
-                        $sss['plugin-opts']['mode'] = 'tls';
-                        break;
-                    case 'v2ray':
-                        $sss['plugin'] = 'v2ray-plugin';
-                        $sss['plugin-opts']['mode'] = 'websocket';
-                        if (strpos($item['obfs_param'], 'security=tls')) {
-                            $sss['plugin-opts']['tls'] = true;
-                        }
-                        $sss['plugin-opts']['host'] = $user->getMuMd5();
-                        $sss['plugin-opts']['path'] = $item['path'];
-                        break;
+        switch ($type) {
+            case 'ss':
+                $return = [
+                    'filename' => 'SS',
+                    'suffix'   => 'txt',
+                    'class'    => 'Sub'
+                ];
+                break;
+            case 'ssa':
+                $return = [
+                    'filename' => 'SSA',
+                    'suffix'   => 'json',
+                    'class'    => 'Lists'
+                ];
+                break;
+            case 'ssd':
+                $return = [
+                    'filename' => 'SSD',
+                    'suffix'   => 'txt',
+                    'class'    => 'SSD'
+                ];
+                break;
+            case 'ssr':
+                $return = [
+                    'filename' => 'SSR',
+                    'suffix'   => 'txt',
+                    'class'    => 'Sub'
+                ];
+                break;
+            case 'sub':
+                if ($value == 3) {
+                    $return = self::getSubscribeExtend('v2rayn');
+                } elseif ($value == 2) {
+                    $return = self::getSubscribeExtend('ss');
+                } else {
+                    $return = self::getSubscribeExtend('ssr');
+                }
+                break;
+            case 'clash':
+                if ($value !== null) {
+                    if ((int) $value == 2) {
+                        $return = self::getSubscribeExtend('clashr');
+                        $return['class'] = 'Clash';
+                    } else {
+                        $return = self::getSubscribeExtend('clash');
+                        $return['class'] = 'Clash';
+                    }
+                } else {
+                    $return = [
+                        'filename' => 'Clash',
+                        'suffix'   => 'yaml',
+                        'class'    => 'Lists'
+                    ];
                 }
                 }
-                if ($item['obfs'] != 'v2ray') {
-                    if ($item['obfs_param'] != '') {
-                        $sss['plugin-opts']['host'] = $item['obfs_param'];
-                    } elseif ($user->obfs_param != '') {
-                        $sss['plugin-opts']['host'] = $user->obfs_param;
+                break;
+            case 'surge':
+                if ($value !== null) {
+                    $return = [
+                        'filename' => 'Surge',
+                        'suffix'   => 'conf',
+                        'class'    => 'Surge'
+                    ];
+                    $return['filename'] .= $value;
+                } else {
+                    $return = [
+                        'filename' => 'SurgeList',
+                        'suffix'   => 'list',
+                        'class'    => 'Lists'
+                    ];
+                }
+                break;
+            case 'clashr':
+                $return = [
+                    'filename' => 'ClashR',
+                    'suffix'   => 'yaml',
+                    'class'    => 'Lists'
+                ];
+                break;
+            case 'v2rayn':
+                $return = [
+                    'filename' => 'V2RayN',
+                    'suffix'   => 'txt',
+                    'class'    => 'Sub'
+                ];
+                break;
+            case 'kitsunebi':
+                $return = [
+                    'filename' => 'Kitsunebi',
+                    'suffix'   => 'txt',
+                    'class'    => 'Lists'
+                ];
+                break;
+            case 'surfboard':
+                $return = [
+                    'filename' => 'Surfboard',
+                    'suffix'   => 'conf',
+                    'class'    => 'Surfboard'
+                ];
+                break;
+            case 'quantumult':
+                if ($value !== null) {
+                    if ((int) $value == 2) {
+                        $return = self::getSubscribeExtend('quantumult_sub');
                     } else {
                     } else {
-                        $sss['plugin-opts']['host'] = 'wns.windows.com';
+                        $return = self::getSubscribeExtend('quantumult_conf');
                     }
                     }
+                } else {
+                    $return = [
+                        'filename' => 'Quantumult',
+                        'suffix'   => 'conf',
+                        'class'    => 'Lists'
+                    ];
                 }
                 }
+                break;
+            case 'quantumultx':
+                $return = [
+                    'filename' => 'QuantumultX',
+                    'suffix'   => 'txt',
+                    'class'    => 'Lists'
+                ];
+                if ($value !== null) {
+                    $return['class'] = 'QuantumultX';
+                }
+                break;
+            case 'shadowrocket':
+                $return = [
+                    'filename' => 'Shadowrocket',
+                    'suffix'   => 'txt',
+                    'class'    => 'Lists'
+                ];
+                break;
+            case 'clash_provider':
+                $return = [
+                    'filename' => 'ClashProvider',
+                    'suffix'   => 'yaml',
+                    'class'    => 'Lists'
+                ];
+                break;
+            case 'clashr_provider':
+                $return = [
+                    'filename' => 'ClashRProvider',
+                    'suffix'   => 'yaml',
+                    'class'    => 'Lists'
+                ];
+                break;
+            case 'quantumult_sub':
+                $return = [
+                    'filename' => 'QuantumultSub',
+                    'suffix'   => 'conf',
+                    'class'    => 'Quantumult'
+                ];
+                break;
+            case 'quantumult_conf':
+                $return = [
+                    'filename' => 'QuantumultConf',
+                    'suffix'   => 'conf',
+                    'class'    => 'Quantumult'
+                ];
+                break;
+            default:
+                $return = [
+                    'filename' => 'UndefinedNode',
+                    'suffix'   => 'txt',
+                    'class'    => 'Sub'
+                ];
+                break;
+        }
+        return $return;
+    }
+
+    /**
+     * 记录订阅日志
+     *
+     * @param User   $user 用户
+     * @param string $type 订阅类型
+     * @param string $ua   UA
+     *
+     * @return void
+     */
+    private static function Subscribe_log($user, $type, $ua)
+    {
+        $log                     = new UserSubscribeLog();
+        $log->user_name          = $user->user_name;
+        $log->user_id            = $user->id;
+        $log->email              = $user->email;
+        $log->subscribe_type     = $type;
+        $log->request_ip         = $_SERVER['REMOTE_ADDR'];
+        $log->request_time       = date('Y-m-d H:i:s');
+        $antiXss                 = new AntiXSS();
+        $log->request_user_agent = $antiXss->xss_clean($ua);
+        $log->save();
+    }
+
+    /**
+     * 响应内容
+     *
+     * @param User   $user
+     * @param array  $response
+     * @param string $content  订阅内容
+     * @param string $filename 文件名
+     */
+    public static function getBody($user, $response, $content, $filename): ResponseInterface
+    {
+        $response = $response
+            ->withHeader(
+                'Content-type',
+                ' application/octet-stream; charset=utf-8'
+            )
+            ->withHeader(
+                'Cache-Control',
+                'no-store, no-cache, must-revalidate'
+            )
+            ->withHeader(
+                'Content-Disposition',
+                ' attachment; filename=' . $filename
+            )
+            ->withHeader(
+                'Subscription-Userinfo',
+                (' upload=' . $user->u
+                    . '; download=' . $user->d
+                    . '; total=' . $user->transfer_enable
+                    . '; expire=' . strtotime($user->class_expire))
+            );
+
+        return $response->write($content);
+    }
+
+    /**
+     * 订阅链接汇总
+     *
+     * @param User $user 用户
+     * @param int  $int  当前用户访问的订阅类型
+     *
+     * @return array
+     */
+    public static function getSubinfo($user, $int = 0)
+    {
+        if ($int == 0) {
+            $int = '';
+        }
+        $userapiUrl = $_ENV['subUrl'] . self::GenerateSSRSubCode($user->id, 0);
+        $return_info = [
+            'link'            => '',
+            // sub
+            'ss'              => '?sub=2',
+            'ssr'             => '?sub=1',
+            'v2ray'           => '?sub=3',
+            // apps
+            'ssa'             => '?list=ssa',
+            'ssd'             => '?ssd=1',
+            'clash'           => '?clash=1',
+            'clash_provider'  => '?list=clash',
+            'clashr'          => '?clash=2',
+            'clashr_provider' => '?list=clashr',
+            'surge'           => '?surge=' . $int,
+            'surge_node'      => '?list=surge',
+            'surge2'          => '?surge=2',
+            'surge3'          => '?surge=3',
+            'surge4'          => '?surge=4',
+            'surfboard'       => '?surfboard=1',
+            'quantumult'      => '?quantumult=' . $int,
+            'quantumult_v2'   => '?list=quantumult',
+            'quantumult_sub'  => '?quantumult=2',
+            'quantumult_conf' => '?quantumult=3',
+            'quantumultx'     => '?list=quantumultx',
+            'shadowrocket'    => '?list=shadowrocket',
+            'kitsunebi'       => '?list=kitsunebi'
+        ];
+
+        return array_map(
+            function ($item) use ($userapiUrl) {
+                return ($userapiUrl . $item);
+            },
+            $return_info
+        );
+    }
+
+    public static function getListItem($item, $list)
+    {
+        $return = null;
+        switch ($list) {
+            case 'ss':
+                $return = AppURI::getItemUrl($item, 1);
+                break;
+            case 'ssr':
+                $return = AppURI::getItemUrl($item, 0);
+                break;
+            case 'ssa':
+                $return = AppURI::getSSJSON($item);
+                break;
+            case 'surge':
+                $return = AppURI::getSurgeURI($item, 3);
+                break;
+            case 'clash':
+                $return = AppURI::getClashURI($item);
+                break;
+            case 'clashr':
+                $return = AppURI::getClashURI($item, true);
+                break;
+            case 'v2rayn':
+                $item['ps'] = $item['remark'];
+                $item['type'] = $item['headerType'];
+                $return = 'vmess://' . base64_encode(json_encode($item, 320));
+                break;
+            case 'kitsunebi':
+                $return = AppURI::getKitsunebiURI($item);
+                break;
+            case 'quantumult':
+                $return = AppURI::getQuantumultURI($item, true);
+                break;
+            case 'quantumultx':
+                $return = AppURI::getQuantumultXURI($item);
+                break;
+            case 'shadowrocket':
+                $return = AppURI::getShadowrocketURI($item);
+                break;
+        }
+        return $return;
+    }
+
+    public static function getLists($user, $list, $opts, $Rule)
+    {
+        $list = strtolower($list);
+        if ($list == 'ssa') {
+            $Rule['type'] = 'ss';
+        }
+        if ($list == 'quantumult') {
+            $Rule['type'] = 'vmess';
+        }
+        if ($list == 'shadowrocket') {
+            // Shadowrocket 自带 emoji
+            $Rule['emoji'] = false;
+        }
+        $items = URL::getNew_AllItems($user, $Rule);
+        $return = [];
+        if ($Rule['extend'] === true) {
+            switch ($list) {
+                case 'ssa':
+                case 'clash':
+                case 'clashr':
+                    $return = array_merge($return, self::getListExtend($user, $list));
+                    break;
+                default:
+                    $return[] = implode(PHP_EOL, self::getListExtend($user, $list));
+                    break;
             }
             }
-            $proxy_confs[] = $sss;
-            $confs[] = $sss;
         }
         }
-        // v2
-        $items = URL::getAllVMessUrl($user, 1);
         foreach ($items as $item) {
         foreach ($items as $item) {
-            if (in_array($item['net'], array('kcp', 'http', 'quic'))) {
-                continue;
+            $out = self::getListItem($item, $list);
+            if ($out != null) {
+                $return[] = $out;
             }
             }
-            $v2rays = [
-                'name' => $item['ps'],
-                'type' => 'vmess',
-                'server' => $item['add'],
-                'port' => $item['port'],
-                'uuid' => $item['id'],
-                'alterId' => $item['aid'],
-                'cipher' => 'auto',
-            ];
-            if ($item['net'] == 'ws') {
-                $v2rays['network'] = 'ws';
-                $v2rays['ws-path'] = $item['path'];
-                if ($item['tls'] == 'tls') {
-                    $v2rays['tls'] = true;
-                }
-                if ($item['host'] != '') {
-                    $v2rays['ws-headers']['Host'] = $item['host'];
-                }
-            } elseif ($item['net'] == 'tls') {
-                $v2rays['tls'] = true;
+        }
+        switch ($list) {
+            case 'ssa':
+                return json_encode($return, 320);
+                break;
+            case 'clash':
+            case 'clashr':
+                return \Symfony\Component\Yaml\Yaml::dump(['proxies' => $return], 4, 2);
+            case 'kitsunebi':
+            case 'quantumult':
+            case 'shadowrocket':
+                return base64_encode(implode(PHP_EOL, $return));
+            default:
+                return implode(PHP_EOL, $return);
+        }
+    }
+
+    public static function getListExtend($user, $list)
+    {
+        $return = [];
+        $info_array = (count($_ENV['sub_message']) != 0 ? (array) $_ENV['sub_message'] : []);
+        if (strtotime($user->expire_in) > time()) {
+            if ($user->transfer_enable == 0) {
+                $unusedTraffic = '剩余流量:0';
+            } else {
+                $unusedTraffic = '剩余流量:' . $user->unusedTraffic();
+            }
+            $expire_in = '过期时间:';
+            if ($user->class_expire != '1989-06-04 00:05:00') {
+                $userClassExpire = explode(' ', $user->class_expire);
+                $expire_in .= $userClassExpire[0];
+            } else {
+                $expire_in .= '无限期';
             }
             }
-            $proxy_confs[] = $v2rays;
-            $confs[] = $v2rays;
+        } else {
+            $unusedTraffic  = '账户已过期,请续费后使用';
+            $expire_in      = '账户已过期,请续费后使用';
         }
         }
-        $render = ConfRender::getTemplateRender();
-        $render->assign('user', $user)
-            ->assign('confs', $confs)
-            ->assign(
-                'proxies',
-                array_map(
-                    static function ($conf) {
-                        return $conf['name'];
-                    },
-                    $proxy_confs
-                )
-            );
-        return $render->fetch('clash.tpl');
+        if (!in_array($list, ['quantumult', 'quantumultx', 'shadowrocket'])) {
+            $info_array[] = $unusedTraffic;
+            $info_array[] = $expire_in;
+        }
+        $baseUrl = explode('//', $_ENV['baseUrl'])[1];
+        $Extend = [
+            'remark'          => '',
+            'type'            => '',
+            'add'             => $baseUrl,
+            'address'         => $baseUrl,
+            'port'            => 10086,
+            'method'          => 'chacha20-ietf',
+            'passwd'          => $user->passwd,
+            'id'              => $user->getUuid(),
+            'aid'             => 0,
+            'net'             => 'tcp',
+            'protocol'        => 'origin',
+            'protocol_param'  => '',
+            'obfs'            => 'plain',
+            'obfs_param'      => '',
+            'group'           => $_ENV['appName']
+        ];
+        if ($list == 'shadowrocket') {
+            $return[] = ('STATUS=' . $unusedTraffic . '.♥.' . $expire_in . PHP_EOL . 'REMARKS=' . $_ENV['appName']);
+        }
+        foreach ($info_array as $remark) {
+            $Extend['remark'] = $remark;
+            if (in_array($list, ['kitsunebi', 'quantumult', 'v2rayn'])) {
+                $Extend['type'] = 'vmess';
+                $out = self::getListItem($Extend, $list);
+            } elseif ($list == 'ssr') {
+                $Extend['type'] = 'ssr';
+                $out = self::getListItem($Extend, $list);
+            } else {
+                $Extend['type'] = 'ss';
+                $out = self::getListItem($Extend, $list);
+            }
+            if ($out !== null) $return[] = $out;
+        }
+        return $return;
     }
     }
 
 
-    public static function getSSPcConf($user)
+    /**
+     * Surge 配置
+     *
+     * @param User  $user  用户
+     * @param int   $surge 订阅类型
+     * @param array $opts  request
+     * @param array $Rule  节点筛选规则
+     *
+     * @return string
+     */
+    public static function getSurge($user, $surge, $opts, $Rule)
     {
     {
-        $proxy = [];
-        $items = URL::getAllItems($user, 0, 1);
+        $subInfo = self::getSubinfo($user, $surge);
+        $userapiUrl = $subInfo['surge'];
+        if ($surge != 4) {
+            $Rule['type'] = 'ss';
+        }
+        $items = URL::getNew_AllItems($user, $Rule);
+        $Nodes = [];
+        $All_Proxy = '';
         foreach ($items as $item) {
         foreach ($items as $item) {
-            $proxy_plugin = '';
-            $proxy_plugin_opts = '';
-            if ($item['obfs'] == 'v2ray' || in_array($item['obfs'], Config::getSupportParam('ss_obfs'))) {
-                if ($item['obfs'] == 'v2ray') {
-                    $proxy_plugin .= 'v2ray';
-                } else {
-                    $proxy_plugin .= 'obfs-local';
-                }
-                if (strpos($item['obfs'], 'http') !== false) {
-                    $proxy_plugin_opts .= 'obfs=http';
-                } elseif (strpos($item['obfs'], 'tls') !== false) {
-                    $proxy_plugin_opts .= 'obfs=tls';
+            $out = AppURI::getSurgeURI($item, $surge);
+            if ($out !== null) {
+                $Nodes[] = $item;
+                $All_Proxy .= $out . PHP_EOL;
+            }
+        }
+        $variable = ($surge == 2 ? 'Surge2_Profiles' : 'Surge_Profiles');
+        if (isset($opts['profiles']) && in_array($opts['profiles'], array_keys($_ENV[$variable]))) {
+            $Profiles = $opts['profiles'];
+            $userapiUrl .= ('&profiles=' . $Profiles);
+        } else {
+            $Profiles = ($surge == 2 ? $_ENV['Surge2_DefaultProfiles'] : $_ENV['Surge_DefaultProfiles']);
+        }
+
+        return ConfController::getSurgeConfs($user, $All_Proxy, $Nodes, $_ENV[$variable][$Profiles]);
+    }
+
+    /**
+     * Quantumult 配置
+     *
+     * @param User  $user       用户
+     * @param int   $quantumult 订阅类型
+     * @param array $opts       request
+     * @param array $Rule       节点筛选规则
+     *
+     * @return string
+     */
+    public static function getQuantumult($user, $quantumult, $opts, $Rule)
+    {
+        switch ($quantumult) {
+            case 2:
+                $subUrl = self::getSubinfo($user, 0);
+                $str = [
+                    '[SERVER]',
+                    '',
+                    '[SOURCE]',
+                    $_ENV['appName'] . ', server ,' . $subUrl['ssr'] . ', false, true, false',
+                    $_ENV['appName'] . '_ss, server ,' . $subUrl['ss'] . ', false, true, false',
+                    $_ENV['appName'] . '_VMess, server ,' . $subUrl['quantumult_v2'] . ', false, true, false',
+                    'Hackl0us Rules, filter, https://raw.githubusercontent.com/Hackl0us/Surge-Rule-Snippets/master/LAZY_RULES/Quantumult.conf, true',
+                    '',
+                    '[DNS]',
+                    'system, 119.29.29.29, 223.6.6.6, 114.114.114.114',
+                    '',
+                    '[STATE]',
+                    'STATE,AUTO'
+                ];
+                return implode(PHP_EOL, $str);
+                break;
+            case 3:
+                $items = URL::getNew_AllItems($user, $Rule);
+                break;
+            default:
+                return self::getLists($user, 'quantumult', $opts, $Rule);
+                break;
+        }
+
+        $All_Proxy          = '';
+        $All_Proxy_name     = '';
+        $BackChina_name     = '';
+        foreach ($items as $item) {
+            $out = AppURI::getQuantumultURI($item);
+            if ($out !== null) {
+                $All_Proxy .= $out . PHP_EOL;
+                if (strpos($item['remark'], '回国') || strpos($item['remark'], 'China')) {
+                    $BackChina_name .= "\n" . $item['remark'];
                 } else {
                 } else {
-                    $proxy_plugin_opts .= 'v2ray;' . $item['obfs_param'];
-                }
-                if ($item['obfs_param'] != '' && $item['obfs'] != 'v2ray') {
-                    $proxy_plugin_opts .= ';obfs-host=' . $item['obfs_param'];
+                    $All_Proxy_name .= "\n" . $item['remark'];
                 }
                 }
             }
             }
-            $proxy[] = [
-                'remarks' => $item['remark'],
-                'server' => $item['address'],
-                'server_port' => $item['port'],
-                'method' => $item['method'],
-                'password' => $item['passwd'],
-                'timeout' => 5,
-                'plugin' => $proxy_plugin,
-                'plugin_opts' => $proxy_plugin_opts
-            ];
-        }
-        $config = [
-            'configs' => $proxy,
-            'strategy' => null,
-            'index' => 0,
-            'global' => false,
-            'enabled' => true,
-            'shareOverLan' => false,
-            'isDefault' => false,
-            'localPort' => 1080,
-            'portableMode' => true,
-            'pacUrl' => null,
-            'useOnlinePac' => false,
-            'secureLocalPac' => true,
-            'availabilityStatistics' => false,
-            'autoCheckUpdate' => true,
-            'checkPreRelease' => false,
-            'isVerboseLogging' => false,
-            'logViewer' => [
-              'topMost' => false,
-              'wrapText' => false,
-              'toolbarShown' => false,
-              'Font' => 'Consolas, 8pt',
-              'BackgroundColor' => 'Black',
-              'TextColor' => 'White'
-            ],
-            'proxy' => [
-              'useProxy' => false,
-              'proxyType' => 0,
-              'proxyServer' => '',
-              'proxyPort' => 0,
-              'proxyTimeout' => 3
-            ],
-            'hotkey' => [
-              'SwitchSystemProxy' => '',
-              'SwitchSystemProxyMode' => '',
-              'SwitchAllowLan' => '',
-              'ShowLogs' => '',
-              'ServerMoveUp' => '',
-              'ServerMoveDown' => '',
-              'RegHotkeysAtStartup' => false
-            ]
+        }
+        $ProxyGroups = [
+            'proxy_group'       => base64_encode("🍃 Proxy  :  static, 🏃 Auto\n🏃 Auto\n🚀 Direct\n" . $All_Proxy_name),
+            'domestic_group'    => base64_encode("🍂 Domestic  :  static, 🚀 Direct\n🚀 Direct\n🍃 Proxy\n" . $BackChina_name),
+            'others_group'      => base64_encode("☁️ Others  :   static, 🍃 Proxy\n🚀 Direct\n🍃 Proxy"),
+            'direct_group'      => base64_encode("🚀 Direct : static, DIRECT\nDIRECT"),
+            'apple_group'       => base64_encode("🍎 Only  :  static, 🚀 Direct\n🚀 Direct\n🍃 Proxy"),
+            'auto_group'        => base64_encode("🏃 Auto  :  auto\n" . $All_Proxy_name),
         ];
         ];
+        $render = ConfRender::getTemplateRender();
+        $render->assign('All_Proxy', $All_Proxy)->assign('ProxyGroups', $ProxyGroups);
 
 
-        return json_encode($config, JSON_PRETTY_PRINT);
+        return $render->fetch('quantumult/quantumult.tpl');
     }
     }
 
 
-    public static function getSSRPcConf($user)
+    /**
+     * QuantumultX 配置
+     *
+     * @param User  $user        用户
+     * @param int   $quantumultx 订阅类型
+     * @param array $opts        request
+     * @param array $Rule        节点筛选规则
+     *
+     * @return string
+     */
+    public static function getQuantumultX($user, $quantumultx, $opts, $Rule)
     {
     {
-        $proxy = [];
-        $items = URL::getAllItems($user, 0, 0);
+        return '';
+    }
+
+    /**
+     * Surfboard 配置
+     *
+     * @param User  $user      用户
+     * @param int   $surfboard 订阅类型
+     * @param array $opts      request
+     * @param array $Rule      节点筛选规则
+     *
+     * @return string
+     */
+    public static function getSurfboard($user, $surfboard, $opts, $Rule)
+    {
+        $subInfo = self::getSubinfo($user, 0);
+        $userapiUrl = $subInfo['surfboard'];
+        $Nodes = [];
+        $All_Proxy = '';
+        $items = URL::getNew_AllItems($user, $Rule);
         foreach ($items as $item) {
         foreach ($items as $item) {
-            $proxy[] = [
-                'remarks' => $item['remark'],
-                'server' => $item['address'],
-                'server_port' => $item['port'],
-                'method' => $item['method'],
-                'obfs' => $item['obfs'],
-                'obfsparam' => $item['obfs_param'],
-                'remarks_base64' => base64_encode($item['remark']),
-                'password' => $item['passwd'],
-                'tcp_over_udp' => false,
-                'udp_over_tcp' => false,
-                'group' => $_ENV['appName'],
-                'protocol' => $item['protocol'],
-                'protocolparam' => $item['protocol_param'],
-                'obfs_udp' => false,
-                'enable' => true
-            ];
-        }
-        $config = [
-            'configs' => $proxy,
-            'index' => 0,
-            'random' => true,
-            'sysProxyMode' => 1,
-            'shareOverLan' => false,
-            'localPort' => 1080,
-            'localAuthPassword' => Tools::genRandomChar(26),
-            'dnsServer' => '',
-            'reconnectTimes' => 2,
-            'balanceAlgorithm' => 'LowException',
-            'randomInGroup' => false,
-            'TTL' => 0,
-            'connectTimeout' => 5,
-            'proxyRuleMode' => 2,
-            'proxyEnable' => false,
-            'pacDirectGoProxy' => false,
-            'proxyType' => 0,
-            'proxyHost' => '',
-            'proxyPort' => 0,
-            'proxyAuthUser' => '',
-            'proxyAuthPass' => '',
-            'proxyUserAgent' => '',
-            'authUser' => '',
-            'authPass' => '',
-            'autoBan' => false,
-            'sameHostForSameTarget' => false,
-            'keepVisitTime' => 180,
-            'isHideTips' => false,
-            'nodeFeedAutoUpdate' => true,
-            'serverSubscribes' => [
-                [
-                    'URL' => ($_ENV['subUrl'] . self::GenerateSSRSubCode($user->id, 0) . '?mu=0'),
-                    'Group' => $_ENV['appName'],
-                    'LastUpdateTime' => 0
-                ]
-            ],
-            'token' => [],
-            'portMap' => []
-        ];
+            $out = AppURI::getSurfboardURI($item);
+            if ($out !== null) {
+                $Nodes[] = $item;
+                $All_Proxy .= $out . PHP_EOL;
+            }
+        }
+        if (isset($opts['profiles']) && in_array($opts['profiles'], array_keys($_ENV['Surfboard_Profiles']))) {
+            $Profiles = $opts['profiles'];
+            $userapiUrl .= ('&profiles=' . $Profiles);
+        } else {
+            $Profiles = $_ENV['Surfboard_DefaultProfiles']; // 默认策略组
+        }
 
 
-        return json_encode($config, JSON_PRETTY_PRINT);
+        return ConfController::getSurgeConfs($user, $All_Proxy, $Nodes, $_ENV['Surfboard_Profiles'][$Profiles]);
     }
     }
 
 
-    public static function getSSDPcConf($user)
+    /**
+     * Clash 配置
+     *
+     * @param User  $user  用户
+     * @param int   $clash 订阅类型
+     * @param array $opts  request
+     * @param array $Rule  节点筛选规则
+     *
+     * @return string
+     */
+    public static function getClash($user, $clash, $opts, $Rule)
     {
     {
-        $id = 1;
-        $proxy = [];
-        $items = URL::getAllItems($user, 0, 1);
+        $subInfo = self::getSubinfo($user, $clash);
+        $userapiUrl = $subInfo['clash'];
+        $ssr_support = ($clash == 2 ? true : false);
+        $items = URL::getNew_AllItems($user, $Rule);
+        $Proxys = [];
         foreach ($items as $item) {
         foreach ($items as $item) {
-            $proxy_plugin = '';
-            $proxy_plugin_opts = '';
-            if ($item['obfs'] == 'v2ray' || in_array($item['obfs'], Config::getSupportParam('ss_obfs'))) {
-                if ($item['obfs'] == 'v2ray') {
-                    $proxy_plugin .= 'v2ray';
-                } else {
-                    $proxy_plugin .= 'simple-obfs';
-                }
-                if (strpos($item['obfs'], 'http') !== false) {
-                    $proxy_plugin_opts .= 'obfs=http';
-                } elseif (strpos($item['obfs'], 'tls') !== false) {
-                    $proxy_plugin_opts .= 'obfs=tls';
-                } else {
-                    $proxy_plugin_opts .= 'v2ray;' . $item['obfs_param'];
-                }
-                if ($item['obfs_param'] != '' && $item['obfs'] != 'v2ray') {
-                    $proxy_plugin_opts .= ';obfs-host=' . $item['obfs_param'];
-                }
+            $Proxy = AppURI::getClashURI($item, $ssr_support);
+            if ($Proxy !== null) {
+                $Proxys[] = $Proxy;
             }
             }
-            $proxy[] = [
-                'remarks' => $item['remark'],
-                'server' => $item['address'],
-                'server_port' => $item['port'],
-                'password' => $item['passwd'],
-                'method' => $item['method'],
-                'plugin' => $proxy_plugin,
-                'plugin_opts' => $proxy_plugin_opts,
-                'plugin_args' => '',
-                'timeout' => 5,
-                'id' => $id,
-                'ratio' => $item['ratio'],
-                'subscription_url' => ($_ENV['subUrl'] . self::GenerateSSRSubCode($user->id, 0) . '?mu=3')
-            ];
-            $id++;
-        }
-        $plugin = '';
-        $plugin_opts = '';
-        if ($user->obfs == 'v2ray' || in_array($user->obfs, Config::getSupportParam('ss_obfs'))) {
-            if ($user->obfs == 'v2ray') {
-                $plugin .= 'v2ray';
-            } else {
-                $plugin .= 'simple-obfs';
-            }
-            if (strpos($user->obfs, 'http') !== false) {
-                $plugin_opts .= 'obfs=http';
-            } elseif (strpos($user->obfs, 'tls') !== false) {
-                $plugin_opts .= 'obfs=tls';
-            } else {
-                $plugin_opts .= 'v2ray;' . $user->obfs_param;
+        }
+        if (isset($opts['profiles']) && in_array($opts['profiles'], array_keys($_ENV['Clash_Profiles']))) {
+            $Profiles = $opts['profiles'];
+            $userapiUrl .= ('&profiles=' . $Profiles);
+        } else {
+            $Profiles = $_ENV['Clash_DefaultProfiles']; // 默认策略组
+        }
+
+        return ConfController::getClashConfs($user, $Proxys, $_ENV['Clash_Profiles'][$Profiles]);
+    }
+
+    /**
+     * SSD 订阅
+     *
+     * @param User  $user 用户
+     * @param int   $ssd  订阅类型
+     * @param array $opts request
+     * @param array $Rule 节点筛选规则
+     *
+     * @return string
+     */
+    public static function getSSD($user, $ssd, $opts, $Rule)
+    {
+        if (!URL::SSCanConnect($user)) {
+            return null;
+        }
+        $array_all                  = [];
+        $array_all['airport']       = $_ENV['appName'];
+        $array_all['port']          = $user->port;
+        $array_all['encryption']    = $user->method;
+        $array_all['password']      = $user->passwd;
+        $array_all['traffic_used']  = Tools::flowToGB($user->u + $user->d);
+        $array_all['traffic_total'] = Tools::flowToGB($user->transfer_enable);
+        $array_all['expiry']        = $user->class_expire;
+        $array_all['url']           = self::getSubinfo($user, 0)['ssd'];
+        $plugin_options             = '';
+        if (strpos($user->obfs, 'http') != false) {
+            $plugin_options = 'obfs=http';
+        }
+        if (strpos($user->obfs, 'tls') != false) {
+            $plugin_options = 'obfs=tls';
+        }
+        if ($plugin_options != '') {
+            $array_all['plugin'] = 'simple-obfs';
+            $array_all['plugin_options'] = $plugin_options;
+            if ($user->obfs_param != '') {
+                $array_all['plugin_options'] .= ';obfs-host=' . $user->obfs_param;
             }
             }
-            if ($user->obfs_param != '' && $user->obfs != 'v2ray') {
-                $plugin_opts .= ';obfs-host=' . $user->obfs_param;
+        }
+        $array_server = [];
+        $server_index = 1;
+        $Rule['type'] = 'ss';
+        $nodes = URL::getNew_AllItems($user, $Rule);
+        foreach ($nodes as $item) {
+            if ($item['type'] != 'ss') continue;
+            $server = AppURI::getSSDURI($item);
+            if ($server !== null) {
+                $server['id'] = $server_index;
+                $array_server[] = $server;
+                $server_index++;
             }
             }
         }
         }
-        $config = [
-            'configs' => $proxy,
-            'strategy' => null,
-            'index' => 0,
-            'global' => false,
-            'enabled' => true,
-            'shareOverLan' => false,
-            'isDefault' => false,
-            'localPort' => 1080,
-            'portableMode' => true,
-            'pacUrl' => null,
-            'useOnlinePac' => false,
-            'secureLocalPac' => true,
-            'availabilityStatistics' => false,
-            'autoCheckUpdate' => true,
-            'checkPreRelease' => false,
-            'isVerboseLogging' => false,
-            'logViewer' => [
-              'topMost' => false,
-              'wrapText' => false,
-              'toolbarShown' => false,
-              'Font' => 'Consolas, 8pt',
-              'BackgroundColor' => 'Black',
-              'TextColor' => 'White'
-            ],
-            'proxy' => [
-              'useProxy' => false,
-              'proxyType' => 0,
-              'proxyServer' => '',
-              'proxyPort' => 0,
-              'proxyTimeout' => 3
-            ],
-            'hotkey' => [
-              'SwitchSystemProxy' => '',
-              'SwitchSystemProxyMode' => '',
-              'SwitchAllowLan' => '',
-              'ShowLogs' => '',
-              'ServerMoveUp' => '',
-              'ServerMoveDown' => '',
-              'RegHotkeysAtStartup' => false
-            ],
-            'subscriptions' => [
-              [
-                'airport' => $_ENV['appName'],
-                'encryption' => $user->method,
-                'password' => $user->passwd,
-                'port' => $user->port,
-                'expiry' => $user->class_expire,
-                'traffic_used' => Tools::flowToGB($user->u + $user->d),
-                'traffic_total' => Tools::flowToGB($user->transfer_enable),
-                'url' => ($_ENV['subUrl'] . self::GenerateSSRSubCode($user->id, 0) . '?mu=3'),
-                'plugin' => $plugin,
-                'plugin_options' => $plugin_opts,
-                'plugin_arguments' => '',
-                'use_proxy' => false
-              ]
-            ]
-        ];
+        $array_all['servers'] = $array_server;
+        $json_all = json_encode($array_all, 320);
+
+        return 'ssd://' . base64_encode($json_all);
+    }
 
 
-        return json_encode($config, JSON_PRETTY_PRINT);
+    /**
+     * 通用订阅,ssr & v2rayn
+     *
+     * @param User   $user 用户
+     * @param int    $sub  订阅类型
+     * @param array  $opts request
+     * @param array  $Rule 节点筛选规则
+     *
+     * @return string
+     */
+    public static function getSub($user, $sub, $opts, $Rule)
+    {
+        $return_url = '';
+        switch ($sub) {
+            case 2: // SS
+                $Rule['type'] = 'ss';
+                $getListExtend = $Rule['extend'] ? self::getListExtend($user, 'ss') : [];
+                break;
+            case 3: // V2
+                $Rule['type'] = 'vmess';
+                $getListExtend = $Rule['extend'] ? self::getListExtend($user, 'v2rayn') : [];
+                break;
+            default: // SSR
+                $Rule['type'] = 'ssr';
+                $getListExtend = $Rule['extend'] ? self::getListExtend($user, 'ssr') : [];
+                break;
+        }
+        if ($Rule['extend']) {
+            $return_url .= implode(PHP_EOL, $getListExtend) . PHP_EOL;
+        }
+        $return_url .= URL::get_NewAllUrl($user, $Rule);
+        return base64_encode($return_url);
     }
     }
 }
 }

+ 9 - 7
src/Controllers/Mod_Mu/FuncController.php

@@ -2,14 +2,16 @@
 
 
 namespace App\Controllers\Mod_Mu;
 namespace App\Controllers\Mod_Mu;
 
 
-use App\Models\DetectRule;
-use App\Models\Relay;
-use App\Models\BlockIp;
-use App\Models\UnblockIp;
-use App\Models\Speedtest;
-use App\Models\Node;
-use App\Models\Auto;
 use App\Controllers\BaseController;
 use App\Controllers\BaseController;
+use App\Models\{
+    Auto,
+    Node,
+    Relay,
+    BlockIp,
+    UnblockIp,
+    Speedtest,
+    DetectRule
+};
 
 
 class FuncController extends BaseController
 class FuncController extends BaseController
 {
 {

+ 13 - 4
src/Controllers/Mod_Mu/NodeController.php

@@ -4,8 +4,10 @@
 namespace App\Controllers\Mod_Mu;
 namespace App\Controllers\Mod_Mu;
 
 
 use App\Controllers\BaseController;
 use App\Controllers\BaseController;
-use App\Models\NodeInfoLog;
-use App\Models\Node;
+use App\Models\{
+    Node,
+    NodeInfoLog
+};
 use App\Services\Config;
 use App\Services\Config;
 
 
 class NodeController extends BaseController
 class NodeController extends BaseController
@@ -52,6 +54,12 @@ class NodeController extends BaseController
             ];
             ];
             return $this->echoJson($response, $res);
             return $this->echoJson($response, $res);
         }
         }
+        if (in_array($node->sort, [0, 10])) {
+            $node_explode = explode(';', $node->server);
+            $node_server = $node_explode[0];
+        } else {
+            $node_server = $node->server;
+        }
         $res = [
         $res = [
             'ret' => 1,
             'ret' => 1,
             'data' => [
             'data' => [
@@ -61,7 +69,7 @@ class NodeController extends BaseController
                 'traffic_rate' => $node->traffic_rate,
                 'traffic_rate' => $node->traffic_rate,
                 'mu_only' => $node->mu_only,
                 'mu_only' => $node->mu_only,
                 'sort' => $node->sort,
                 'sort' => $node->sort,
-                'server' => $node->server,
+                'server' => $node_server,
                 'type' => 'ss-panel-v3-mod_Uim'
                 'type' => 'ss-panel-v3-mod_Uim'
             ],
             ],
         ];
         ];
@@ -74,7 +82,8 @@ class NodeController extends BaseController
             static function ($query) {
             static function ($query) {
                 $query->where('sort', '=', 0)
                 $query->where('sort', '=', 0)
                     ->orWhere('sort', '=', 10)
                     ->orWhere('sort', '=', 10)
-                    ->orWhere('sort', '=', 12);
+                    ->orWhere('sort', '=', 12)
+                    ->orWhere('sort', '=', 13);
             }
             }
         )->get();
         )->get();
         $res = [
         $res = [

+ 60 - 35
src/Controllers/Mod_Mu/UserController.php

@@ -2,13 +2,15 @@
 
 
 namespace App\Controllers\Mod_Mu;
 namespace App\Controllers\Mod_Mu;
 
 
-use App\Models\Node;
-use App\Models\TrafficLog;
-use App\Models\User;
-use App\Models\NodeOnlineLog;
-use App\Models\Ip;
-use App\Models\DetectLog;
 use App\Controllers\BaseController;
 use App\Controllers\BaseController;
+use App\Models\{
+    Ip,
+    Node,
+    User,
+    DetectLog,
+    TrafficLog,
+    NodeOnlineLog
+};
 use App\Utils\Tools;
 use App\Utils\Tools;
 
 
 class UserController extends BaseController
 class UserController extends BaseController
@@ -35,29 +37,7 @@ class UserController extends BaseController
         $node->node_heartbeat = time();
         $node->node_heartbeat = time();
         $node->save();
         $node->save();
 
 
-        if ($node->node_group != 0) {
-            $users_raw = User::where(
-                static function ($query) use ($node) {
-                    $query->where(
-                        static function ($query1) use ($node) {
-                            $query1->where('class', '>=', $node->node_class)
-                                ->where('node_group', '=', $node->node_group);
-                        }
-                    )->orwhere('is_admin', 1);
-                }
-            )
-                ->where('enable', 1)->where('expire_in', '>', date('Y-m-d H:i:s'))->get();
-        } else {
-            $users_raw = User::where(
-                static function ($query) use ($node) {
-                    $query->where(
-                        static function ($query1) use ($node) {
-                            $query1->where('class', '>=', $node->node_class);
-                        }
-                    )->orwhere('is_admin', 1);
-                }
-            )->where('enable', 1)->where('expire_in', '>', date('Y-m-d H:i:s'))->get();
-        }
+        // 节点流量耗尽则返回 null
         if (($node->node_bandwidth_limit != 0) && $node->node_bandwidth_limit < $node->node_bandwidth) {
         if (($node->node_bandwidth_limit != 0) && $node->node_bandwidth_limit < $node->node_bandwidth) {
             $users = null;
             $users = null;
 
 
@@ -68,18 +48,63 @@ class UserController extends BaseController
             return $this->echoJson($response, $res);
             return $this->echoJson($response, $res);
         }
         }
 
 
+        if (in_array($node->sort, [0, 10]) && $node->mu_only != -1) {
+            $mu_port_migration = $_ENV['mu_port_migration'];
+            $muPort = Tools::get_MuOutPortArray($node->server);
+        } else {
+            $mu_port_migration = false;
+        }
+
+        /*
+         * 1. 请不要把管理员作为单端口承载用户
+         * 2. 请不要把真实用户作为单端口承载用户
+         */
+        $users_raw = User::where(
+            static function ($query) use ($node) {
+                $query->where(
+                    static function ($query1) use ($node) {
+                        if ($node->node_group != 0) {
+                            $query1->where('class', '>=', $node->node_class)
+                                ->where('node_group', '=', $node->node_group);
+                        } else {
+                            $query1->where('class', '>=', $node->node_class);
+                        }
+                    }
+                )->orwhere('is_admin', 1);
+            }
+        )
+            ->where('enable', 1)->where('expire_in', '>', date('Y-m-d H:i:s'))->get();
+
         $users = array();
         $users = array();
 
 
-        $key_list = array('email', 'method', 'obfs', 'obfs_param', 'protocol', 'protocol_param',
+        $key_list = array(
+            'email', 'method', 'obfs', 'obfs_param', 'protocol', 'protocol_param',
             'forbidden_ip', 'forbidden_port', 'node_speedlimit', 'disconnect_ip',
             'forbidden_ip', 'forbidden_port', 'node_speedlimit', 'disconnect_ip',
-            'is_multi_user', 'id', 'port', 'passwd', 'u', 'd', 'node_connector');
+            'is_multi_user', 'id', 'port', 'passwd', 'u', 'd', 'node_connector'
+        );
 
 
         foreach ($users_raw as $user_raw) {
         foreach ($users_raw as $user_raw) {
-            if ($user_raw->transfer_enable > $user_raw->u + $user_raw->d) {
-                $user_raw = Tools::keyFilter($user_raw, $key_list);
-                $user_raw->uuid = $user_raw->getUuid();
-                $users[] = $user_raw;
+            if ($user_raw->transfer_enable <= $user_raw->u + $user_raw->d) {
+                if ($_ENV['keep_connect'] === true) {
+                    // 流量耗尽用户限速至 1Mbps
+                    $user_raw->node_speedlimit = 1;
+                } else {
+                    continue;
+                }
+            }
+            if ($mu_port_migration === true && $user_raw->is_multi_user != 0) {
+                // 下发偏移后端口
+                if ($muPort['type'] == 0) {
+                    if (in_array($user_raw->port, array_keys($muPort['port']))) {
+                        $user_raw->port = $muPort['port'][$user_raw->port];
+                    }
+                } else {
+                    $user_raw->port = ($user_raw->port + $muPort['type']);
+                }
             }
             }
+            $user_raw = Tools::keyFilter($user_raw, $key_list);
+            $user_raw->uuid = $user_raw->getUuid();
+            $users[] = $user_raw;
         }
         }
 
 
         $res = [
         $res = [

+ 20 - 14
src/Controllers/PasswordController.php

@@ -2,10 +2,12 @@
 
 
 namespace App\Controllers;
 namespace App\Controllers;
 
 
-use App\Models\User;
-use App\Models\PasswordReset;
-use App\Services\Password;
+use App\Models\{
+    User,
+    PasswordReset
+};
 use App\Utils\Hash;
 use App\Utils\Hash;
+use App\Services\Password;
 
 
 /***
 /***
  * Class Password
  * Class Password
@@ -65,17 +67,17 @@ class PasswordController extends BaseController
         }
         }
 
 
         // check token
         // check token
-        $token = PasswordReset::where('token', $tokenStr)->orderBy('id', 'desc')->first();
-        if ($token == null || $token->expire_time < time()) {
+        $token = PasswordReset::where('token', $tokenStr)->where('expire_time', '>', time())->orderBy('id', 'desc')->first();
+        if ($token == null) {
             $rs['ret'] = 0;
             $rs['ret'] = 0;
-            $rs['msg'] = '链接已经失效,请重新获取';
+            $rs['msg'] = '链接已经失效请重新获取';
             return $response->getBody()->write(json_encode($rs));
             return $response->getBody()->write(json_encode($rs));
         }
         }
 
 
         $user = User::where('email', $token->email)->first();
         $user = User::where('email', $token->email)->first();
         if ($user == null) {
         if ($user == null) {
             $rs['ret'] = 0;
             $rs['ret'] = 0;
-            $rs['msg'] = '链接已经失效,请重新获取';
+            $rs['msg'] = '链接已经失效请重新获取';
             return $response->getBody()->write(json_encode($rs));
             return $response->getBody()->write(json_encode($rs));
         }
         }
 
 
@@ -83,16 +85,20 @@ class PasswordController extends BaseController
         $hashPassword = Hash::passwordHash($password);
         $hashPassword = Hash::passwordHash($password);
         $user->pass = $hashPassword;
         $user->pass = $hashPassword;
         $user->ga_enable = 0;
         $user->ga_enable = 0;
+
         if (!$user->save()) {
         if (!$user->save()) {
             $rs['ret'] = 0;
             $rs['ret'] = 0;
-            $rs['msg'] = '重置失败,请重试';
-            return $response->getBody()->write(json_encode($rs));
-        }
-        $rs['ret'] = 1;
-        $rs['msg'] = '重置成功';
+            $rs['msg'] = '重置失败请重试';
+        } else {
+            $rs['ret'] = 1;
+            $rs['msg'] = '重置成功';
+            $user->clean_link();
 
 
-        $user->clean_link();
+            // 禁止链接多次使用
+            $token->expire_time = time();
+            $token->save();
+        }
 
 
-        return $response->getBody()->write(json_encode($rs));
+        return $response->write(json_encode($rs));
     }
     }
 }
 }

+ 23 - 61
src/Controllers/RelayController.php

@@ -2,12 +2,16 @@
 
 
 namespace App\Controllers;
 namespace App\Controllers;
 
 
-use App\Models\Relay;
-use App\Models\Node;
-use App\Models\User;
-use App\Services\Auth;
+use App\Models\{
+    Node,
+    User,
+    Relay
+};
+use App\Services\{
+    Auth,
+    Config
+};
 use App\Utils\Tools;
 use App\Utils\Tools;
-use App\Services\Config;
 use ArrayObject;
 use ArrayObject;
 
 
 class RelayController extends UserController
 class RelayController extends UserController
@@ -20,7 +24,6 @@ class RelayController extends UserController
             $pageNum = $request->getQueryParams()['page'];
             $pageNum = $request->getQueryParams()['page'];
         }
         }
         $logs = Relay::where('user_id', $user->id)->orwhere('user_id', 0)->paginate(15, ['*'], 'page', $pageNum);
         $logs = Relay::where('user_id', $user->id)->orwhere('user_id', 0)->paginate(15, ['*'], 'page', $pageNum);
-        $logs->setPath('/user/relay');
 
 
         $is_relay_able = Tools::is_protocol_relay($user);
         $is_relay_able = Tools::is_protocol_relay($user);
 
 
@@ -126,15 +129,10 @@ class RelayController extends UserController
             }
             }
         )->where('type', 1)->where(
         )->where('type', 1)->where(
             static function ($query) {
             static function ($query) {
-                $query->Where('sort', 10)
-                    ->orWhere('sort', 12);
+                $query->Where('sort', 10);
             }
             }
         )->where('node_class', '<=', $user->class)->orderBy('name')->get();
         )->where('node_class', '<=', $user->class)->orderBy('name')->get();
-        foreach ($source_nodes as $node) {
-            if ($node->sort == 12) {
-                $node->name .= ' 正在使用V2ray后端 ';
-            }
-        }
+
         $dist_nodes = Node::where(
         $dist_nodes = Node::where(
             static function ($query) use ($user) {
             static function ($query) use ($user) {
                 $query->Where('node_group', '=', $user->node_group)
                 $query->Where('node_group', '=', $user->node_group)
@@ -143,9 +141,7 @@ class RelayController extends UserController
         )->where('type', 1)->where(
         )->where('type', 1)->where(
             static function ($query) {
             static function ($query) {
                 $query->Where('sort', 0)
                 $query->Where('sort', 0)
-                    ->orWhere('sort', 10)
-                    ->orWhere('sort', 11)
-                    ->orWhere('sort', 12);
+                    ->orWhere('sort', 10);
             }
             }
         )->where('node_class', '<=', $user->class)->orderBy('name')->get();
         )->where('node_class', '<=', $user->class)->orderBy('name')->get();
 
 
@@ -164,16 +160,6 @@ class RelayController extends UserController
             }
             }
         }
         }
 
 
-        foreach ($dist_nodes as $node) {
-            if ($node->sort == 11 || $node->sort == 12) {
-                $node_explode = Tools::ssv2Array($node->server);
-                $ports[] = $node_explode['port'];
-                $node->name = $node->name . ' 如果是V2ray后端 请设置成 ' . $node_explode['port'];
-            } else {
-                $node->name = $node->name . ' 如果是V2ray后端 请设置成 ' . $user->port;
-            }
-        }
-
         $ports[] = $user->port;
         $ports[] = $user->port;
         $ports = array_unique($ports);
         $ports = array_unique($ports);
         return $this->view()->assign('source_nodes', $source_nodes)->assign('dist_nodes', $dist_nodes)->assign('ports', $ports)->display('user/relay/add.tpl');
         return $this->view()->assign('source_nodes', $source_nodes)->assign('dist_nodes', $dist_nodes)->assign('ports', $ports)->display('user/relay/add.tpl');
@@ -195,8 +181,7 @@ class RelayController extends UserController
             }
             }
         )->where('type', 1)->where(
         )->where('type', 1)->where(
             static function ($query) {
             static function ($query) {
-                $query->Where('sort', 10)
-                    ->orWhere('sort', 12);
+                $query->Where('sort', 10);
             }
             }
         )->where('node_class', '<=', $user->class)->first();
         )->where('node_class', '<=', $user->class)->first();
         if ($source_node == null) {
         if ($source_node == null) {
@@ -209,7 +194,7 @@ class RelayController extends UserController
             foreach ($rules as $rule) {
             foreach ($rules as $rule) {
                 if ($rule['user_id'] == 0 || $rule['user_id'] = $user->id) {
                 if ($rule['user_id'] == 0 || $rule['user_id'] = $user->id) {
                     $rs['ret'] = 0;
                     $rs['ret'] = 0;
-                    $rs['msg'] = 'v2ray中转一个起点一个rule';
+                    $rs['msg'] = 'V2Ray 中转一个起点一个 Rule';
                     return $response->getBody()->write(json_encode($rs));
                     return $response->getBody()->write(json_encode($rs));
                 }
                 }
             }
             }
@@ -223,8 +208,7 @@ class RelayController extends UserController
             static function ($query) {
             static function ($query) {
                 $query->Where('sort', 0)
                 $query->Where('sort', 0)
                     ->orWhere('sort', 10)
                     ->orWhere('sort', 10)
-                    ->orWhere('sort', 11)
-                    ->orWhere('sort', 12);
+                    ->orWhere('sort', 11);
             }
             }
         )->where('node_class', '<=', $user->class)->first();
         )->where('node_class', '<=', $user->class)->first();
 
 
@@ -247,12 +231,7 @@ class RelayController extends UserController
                     ->orWhere('node_group', '=', 0);
                     ->orWhere('node_group', '=', 0);
             }
             }
         )->where('type', 1)->where('sort', 9)->where('node_class', '<=', $user->class)->first();
         )->where('type', 1)->where('sort', 9)->where('node_class', '<=', $user->class)->first();
-        $v2ray_port_raw = '';
-        if ($dist_node->sort == 12 || $dist_node->sort == 11) {
-            $node_explode = Tools::ssv2Array($dist_node->server);
-            $v2ray_port_raw = $node_explode['port'];
-        }
-        if (($port_raw == null && $port != $user->port && $v2ray_port_raw == '') || ($v2ray_port_raw != '' && ($port != $user->port && $port != $v2ray_port_raw))) {
+        if (($port_raw == null && $port != $user->port)) {
             $rs['ret'] = 0;
             $rs['ret'] = 0;
             $rs['msg'] = '端口错误';
             $rs['msg'] = '端口错误';
             return $response->getBody()->write(json_encode($rs));
             return $response->getBody()->write(json_encode($rs));
@@ -260,7 +239,7 @@ class RelayController extends UserController
 
 
         if (!Tools::is_protocol_relay($user)) {
         if (!Tools::is_protocol_relay($user)) {
             $rs['ret'] = 0;
             $rs['ret'] = 0;
-            $rs['msg'] = "为了中转的稳定,您需要在<a href='/user/edit'>资料编辑</a>处设置协议为 auth_aes128_md5 或 auth_aes128_sha1 后方可设置中转规则!";
+            $rs['msg'] = '为了中转的稳定,您需要在<a href="/user/edit">资料编辑</a>处设置协议为 auth_aes128_md5 或 auth_aes128_sha1 后方可设置中转规则!';
             return $response->getBody()->write(json_encode($rs));
             return $response->getBody()->write(json_encode($rs));
         }
         }
 
 
@@ -316,15 +295,10 @@ class RelayController extends UserController
             }
             }
         )->where('type', 1)->where(
         )->where('type', 1)->where(
             static function ($query) {
             static function ($query) {
-                $query->Where('sort', 10)
-                    ->orWhere('sort', 12);
+                $query->Where('sort', 10);
             }
             }
         )->where('node_class', '<=', $user->class)->orderBy('name')->get();
         )->where('node_class', '<=', $user->class)->orderBy('name')->get();
-        foreach ($source_nodes as $node) {
-            if ($node->sort == 12) {
-                $node->name .= ' 正在使用V2ray后端 ';
-            }
-        }
+
         $dist_nodes = Node::where(
         $dist_nodes = Node::where(
             static function ($query) use ($user) {
             static function ($query) use ($user) {
                 $query->Where('node_group', '=', $user->node_group)
                 $query->Where('node_group', '=', $user->node_group)
@@ -334,8 +308,7 @@ class RelayController extends UserController
             static function ($query) {
             static function ($query) {
                 $query->Where('sort', 0)
                 $query->Where('sort', 0)
                     ->orWhere('sort', 10)
                     ->orWhere('sort', 10)
-                    ->orWhere('sort', 11)
-                    ->orWhere('sort', 12);
+                    ->orWhere('sort', 11);
             }
             }
         )->where('node_class', '<=', $user->class)->orderBy('name')->get();
         )->where('node_class', '<=', $user->class)->orderBy('name')->get();
 
 
@@ -353,15 +326,6 @@ class RelayController extends UserController
                 $ports[] = $port_raw->server;
                 $ports[] = $port_raw->server;
             }
             }
         }
         }
-        foreach ($dist_nodes as $node) {
-            if ($node->sort == 11 || $node->sort == 12) {
-                $node_explode = Tools::ssv2Array($node->server);
-                $ports[] = $node_explode['port'];
-                $node->name = $node->name . ' 如果是V2ray后端 请设置成: ' . $node_explode['port'];
-            } else {
-                $node->name = $node->name . ' 如果是V2ray后端 请设置成 ' . $user->port;
-            }
-        }
 
 
         $ports[] = $user->port;
         $ports[] = $user->port;
         $ports = array_unique($ports);
         $ports = array_unique($ports);
@@ -390,8 +354,7 @@ class RelayController extends UserController
             }
             }
         )->where('type', 1)->where(
         )->where('type', 1)->where(
             static function ($query) {
             static function ($query) {
-                $query->Where('sort', 10)
-                    ->orWhere('sort', 12);
+                $query->Where('sort', 10);
             }
             }
         )->where('node_class', '<=', $user->class)->first();
         )->where('node_class', '<=', $user->class)->first();
         if ($source_node == null) {
         if ($source_node == null) {
@@ -409,8 +372,7 @@ class RelayController extends UserController
             static function ($query) {
             static function ($query) {
                 $query->Where('sort', 0)
                 $query->Where('sort', 0)
                     ->orWhere('sort', 10)
                     ->orWhere('sort', 10)
-                    ->orWhere('sort', 11)
-                    ->orWhere('sort', 12);
+                    ->orWhere('sort', 11);
             }
             }
         )->where('node_class', '<=', $user->class)->first();
         )->where('node_class', '<=', $user->class)->first();
 
 
@@ -446,7 +408,7 @@ class RelayController extends UserController
 
 
         if (!Tools::is_protocol_relay($user)) {
         if (!Tools::is_protocol_relay($user)) {
             $rs['ret'] = 0;
             $rs['ret'] = 0;
-            $rs['msg'] = "为了中转的稳定,您需要在<a href='/user/edit'>资料编辑</a>处设置协议为 auth_aes128_md5 或 auth_aes128_sha1 后方可设置中转规则!";
+            $rs['msg'] = '为了中转的稳定,您需要在<a href="/user/edit">资料编辑</a>处设置协议为 auth_aes128_md5 或 auth_aes128_sha1 后方可设置中转规则!';
             return $response->getBody()->write(json_encode($rs));
             return $response->getBody()->write(json_encode($rs));
         }
         }
 
 

+ 1 - 1
src/Controllers/ResController.php

@@ -13,7 +13,7 @@ class ResController
         $builder = new CaptchaBuilder();
         $builder = new CaptchaBuilder();
         $builder->build();
         $builder->build();
         //$builder->getPhrase();
         //$builder->getPhrase();
-        $newResponse = $response->withHeader('Content-type', ' image/jpeg');//->getBody()->write($builder->output());
+        $newResponse = $response->withHeader('Content-type', ' image/jpeg'); //->getBody()->write($builder->output());
         $newResponse->getBody()->write($builder->output());
         $newResponse->getBody()->write($builder->output());
         return $newResponse;
         return $newResponse;
     }
     }

+ 231 - 218
src/Controllers/UserController.php

@@ -2,50 +2,54 @@
 
 
 namespace App\Controllers;
 namespace App\Controllers;
 
 
-use App\Services\Auth;
-use App\Models\Node;
-use App\Models\TrafficLog;
-use App\Models\InviteCode;
-use App\Models\Ann;
-use App\Models\Speedtest;
-use App\Models\Shop;
-use App\Models\Coupon;
-use App\Models\Bought;
-use App\Models\Ticket;
-use App\Services\Config;
-use App\Services\Gateway\ChenPay;
-use App\Services\BitPayment;
-use App\Services\Payment;
-use App\Utils;
-use App\Utils\AliPay;
-use App\Utils\Hash;
-use App\Utils\Tools;
-use App\Utils\Radius;
-use App\Models\DetectLog;
-use App\Models\DetectRule;
-use App\Models\NodeOnlineLog;
-use App\Models\NodeInfoLog;
-
-use Exception;
+use App\Services\{
+    Auth,
+    Mail,
+    Config,
+    Payment,
+    BitPayment,
+    Gateway\ChenPay,
+};
+use App\Models\{
+    Ip,
+    Ann,
+    Code,
+    Node,
+    Shop,
+    User,
+    Token,
+    Relay,
+    Bought,
+    Coupon,
+    Ticket,
+    Payback,
+    BlockIp,
+    LoginIp,
+    UnblockIp,
+    Speedtest,
+    DetectLog,
+    DetectRule,
+    TrafficLog,
+    InviteCode,
+    UserSubscribeLog
+};
+use App\Utils\{
+    GA,
+    Pay,
+    URL,
+    Hash,
+    QQWry,
+    Tools,
+    Radius,
+    Cookie,
+    Geetest,
+    Telegram,
+    ClientProfiles,
+    DatatablesHelper,
+    TelegramSessionManager
+};
 use voku\helper\AntiXSS;
 use voku\helper\AntiXSS;
-
-use App\Models\User;
-use App\Models\Code;
-use App\Models\Ip;
-use App\Models\LoginIp;
-use App\Models\BlockIp;
-use App\Models\UnblockIp;
-use App\Models\Payback;
-use App\Models\Relay;
-use App\Utils\QQWry;
-use App\Utils\GA;
-use App\Utils\Geetest;
-use App\Utils\Telegram;
-use App\Utils\TelegramSessionManager;
-use App\Utils\Pay;
-use App\Utils\URL;
-use App\Utils\DatatablesHelper;
-use App\Services\Mail;
+use Exception;
 
 
 /**
 /**
  *  HomeController
  *  HomeController
@@ -72,6 +76,23 @@ class UserController extends BaseController
 
 
         $Ann = Ann::orderBy('date', 'desc')->first();
         $Ann = Ann::orderBy('date', 'desc')->first();
 
 
+        if ($_ENV['subscribe_client_url'] != '') {
+            $getClient = new Token();
+            for ($i = 0; $i < 10; $i++) {
+                $token = $this->user->id . Tools::genRandomChar(16);
+                $Elink = Token::where('token', '=', $token)->first();
+                if ($Elink == null) {
+                    $getClient->token = $token;
+                    break;
+                }
+            }
+            $getClient->user_id     = $this->user->id;
+            $getClient->create_time = time();
+            $getClient->expire_time = time() + 10 * 60;
+            $getClient->save();
+        } else {
+            $token = '';
+        }
 
 
         return $this->view()
         return $this->view()
             ->assign('ssr_sub_token', $ssr_sub_token)
             ->assign('ssr_sub_token', $ssr_sub_token)
@@ -83,10 +104,10 @@ class UserController extends BaseController
             ->assign('geetest_html', $GtSdk)
             ->assign('geetest_html', $GtSdk)
             ->assign('mergeSub', $_ENV['mergeSub'])
             ->assign('mergeSub', $_ENV['mergeSub'])
             ->assign('subUrl', $_ENV['subUrl'])
             ->assign('subUrl', $_ENV['subUrl'])
-            ->assign('user', $this->user)
             ->registerClass('URL', URL::class)
             ->registerClass('URL', URL::class)
-            ->assign('baseUrl', $_ENV['baseUrl'])
             ->assign('recaptcha_sitekey', $recaptcha_sitekey)
             ->assign('recaptcha_sitekey', $recaptcha_sitekey)
+            ->assign('subInfo', LinkController::getSubinfo($this->user, 0))
+            ->assign('getClient', $token)
             ->display('user/index.tpl');
             ->display('user/index.tpl');
     }
     }
 
 
@@ -153,7 +174,6 @@ class UserController extends BaseController
         return false;
         return false;
     }
     }
 
 
-
     public function code_check($request, $response, $args)
     public function code_check($request, $response, $args)
     {
     {
         $time = $request->getQueryParams()['time'];
         $time = $request->getQueryParams()['time'];
@@ -222,7 +242,6 @@ class UserController extends BaseController
         Pay::getGen($this->user, $amount);
         Pay::getGen($this->user, $amount);
     }
     }
 
 
-
     public function codepost($request, $response, $args)
     public function codepost($request, $response, $args)
     {
     {
         $code = $request->getParam('code');
         $code = $request->getParam('code');
@@ -304,7 +323,6 @@ class UserController extends BaseController
         }
         }
     }
     }
 
 
-
     public function GaCheck($request, $response, $args)
     public function GaCheck($request, $response, $args)
     {
     {
         $code = $request->getParam('code');
         $code = $request->getParam('code');
@@ -331,7 +349,6 @@ class UserController extends BaseController
         return $response->getBody()->write(json_encode($res));
         return $response->getBody()->write(json_encode($res));
     }
     }
 
 
-
     public function GaSet($request, $response, $args)
     public function GaSet($request, $response, $args)
     {
     {
         $enable = $request->getParam('enable');
         $enable = $request->getParam('enable');
@@ -354,77 +371,20 @@ class UserController extends BaseController
 
 
     public function ResetPort($request, $response, $args)
     public function ResetPort($request, $response, $args)
     {
     {
-        $price = $_ENV['port_price'];
         $user = $this->user;
         $user = $this->user;
-
-        if ($user->money < $price) {
-            $res['ret'] = 0;
-            $res['msg'] = '余额不足';
-            return $response->getBody()->write(json_encode($res));
-        }
-
-        $origin_port = $user->port;
-
-        $user->port = Tools::getAvPort();
-
-
-        $relay_rules = Relay::where('user_id', $user->id)->where('port', $origin_port)->get();
-        foreach ($relay_rules as $rule) {
-            $rule->port = $user->port;
-            $rule->save();
-        }
-
-        $user->money -= $price;
-        $user->save();
-
-        $res['ret'] = 1;
-        $res['msg'] = $user->port;
+        $temp = $user->ResetPort();
+        $res['msg'] = $temp['msg'];
+        $res['ret'] = ($temp['ok'] === true ? 1 : 0);
         return $response->getBody()->write(json_encode($res));
         return $response->getBody()->write(json_encode($res));
     }
     }
 
 
     public function SpecifyPort($request, $response, $args)
     public function SpecifyPort($request, $response, $args)
     {
     {
-        $price = $_ENV['port_price_specify'];
         $user = $this->user;
         $user = $this->user;
-
-        if ($user->money < $price) {
-            $res['ret'] = 0;
-            $res['msg'] = '余额不足';
-            return $response->getBody()->write(json_encode($res));
-        }
-
         $port = $request->getParam('port');
         $port = $request->getParam('port');
-
-        if ($port < $_ENV['min_port'] || $port > $_ENV['max_port'] || Tools::isInt($port) == false) {
-            $res['ret'] = 0;
-            $res['msg'] = '端口不在要求范围内';
-            return $response->getBody()->write(json_encode($res));
-        }
-
-        $port_occupied = User::pluck('port')->toArray();
-
-        if (in_array($port, $port_occupied) == true) {
-            $res['ret'] = 0;
-            $res['msg'] = '端口已被占用';
-            return $response->getBody()->write(json_encode($res));
-        }
-
-        $origin_port = $user->port;
-
-        $user->port = $port;
-
-
-        $relay_rules = Relay::where('user_id', $user->id)->where('port', $origin_port)->get();
-        foreach ($relay_rules as $rule) {
-            $rule->port = $user->port;
-            $rule->save();
-        }
-
-        $user->money -= $price;
-        $user->save();
-
-        $res['ret'] = 1;
-        $res['msg'] = '钦定成功';
+        $temp = $user->SpecifyPort($port);
+        $res['msg'] = $temp['msg'];
+        $res['ret'] = ($temp['ok'] === true ? 1 : 0);
         return $response->getBody()->write(json_encode($res));
         return $response->getBody()->write(json_encode($res));
     }
     }
 
 
@@ -439,7 +399,6 @@ class UserController extends BaseController
         return $response->withStatus(302)->withHeader('Location', '/user/edit');
         return $response->withStatus(302)->withHeader('Location', '/user/edit');
     }
     }
 
 
-
     public function nodeAjax($request, $response, $args)
     public function nodeAjax($request, $response, $args)
     {
     {
         $id = $args['id'];
         $id = $args['id'];
@@ -482,7 +441,7 @@ class UserController extends BaseController
                 $server = Tools::ssv2Array($node->server);
                 $server = Tools::ssv2Array($node->server);
                 $array_node['server'] = $server['add'];
                 $array_node['server'] = $server['add'];
             } else {
             } else {
-                $array_node['server'] = $node->server;
+                $array_node['server'] = $node->getServer();
             }
             }
             $array_node['sort'] = $node->sort;
             $array_node['sort'] = $node->sort;
             $array_node['info'] = $node->info;
             $array_node['info'] = $node->info;
@@ -501,7 +460,7 @@ class UserController extends BaseController
 
 
             $sort = $array_node['sort'];
             $sort = $array_node['sort'];
             $array_node['online_user'] = 0;
             $array_node['online_user'] = 0;
-            
+
             foreach ($onlineLogs as $log) {
             foreach ($onlineLogs as $log) {
                 if ($log['node_id'] != $node->id) {
                 if ($log['node_id'] != $node->id) {
                     continue;
                     continue;
@@ -513,12 +472,12 @@ class UserController extends BaseController
                 }
                 }
                 break;
                 break;
             }
             }
-            
-            // check node status 
+
+            // check node status
             // 0: new node; -1: offline; 1: online
             // 0: new node; -1: offline; 1: online
             $node_heartbeat = $node->node_heartbeat + 300;
             $node_heartbeat = $node->node_heartbeat + 300;
             $array_node['online'] = -1;
             $array_node['online'] = -1;
-            if (!in_array($sort, array(0, 7, 8, 10, 11, 12, 13)) || $node_heartbeat == 300 ) {
+            if (!in_array($sort, array(0, 7, 8, 10, 11, 12, 13)) || $node_heartbeat == 300) {
                 $array_node['online'] = 0;
                 $array_node['online'] = 0;
             } elseif ($node_heartbeat > time()) {
             } elseif ($node_heartbeat > time()) {
                 $array_node['online'] = 1;
                 $array_node['online'] = 1;
@@ -532,8 +491,8 @@ class UserController extends BaseController
                 }
                 }
             }
             }
 
 
-            $array_node['traffic_used'] = (int)Tools::flowToGB($node->node_bandwidth);
-            $array_node['traffic_limit'] = (int)Tools::flowToGB($node->node_bandwidth_limit);
+            $array_node['traffic_used'] = (int) Tools::flowToGB($node->node_bandwidth);
+            $array_node['traffic_limit'] = (int) Tools::flowToGB($node->node_bandwidth_limit);
             if ($node->node_speedlimit == 0.0) {
             if ($node->node_speedlimit == 0.0) {
                 $array_node['bandwidth'] = 0;
                 $array_node['bandwidth'] = 0;
             } elseif ($node->node_speedlimit >= 1024.00) {
             } elseif ($node->node_speedlimit >= 1024.00) {
@@ -550,7 +509,6 @@ class UserController extends BaseController
         return $this->view()->assign('nodes', $array_nodes)->assign('nodes_muport', $nodes_muport)->assign('relay_rules', $relay_rules)->assign('tools', new Tools())->assign('user', $user)->registerClass('URL', URL::class)->display('user/node.tpl');
         return $this->view()->assign('nodes', $array_nodes)->assign('nodes_muport', $nodes_muport)->assign('relay_rules', $relay_rules)->assign('tools', new Tools())->assign('user', $user)->registerClass('URL', URL::class)->display('user/node.tpl');
     }
     }
 
 
-
     public function node_old($request, $response, $args)
     public function node_old($request, $response, $args)
     {
     {
         $user = Auth::getUser();
         $user = Auth::getUser();
@@ -564,7 +522,7 @@ class UserController extends BaseController
         $node_prefix = array();
         $node_prefix = array();
         $node_flag_file = array();
         $node_flag_file = array();
         $node_method = array();
         $node_method = array();
-        $a = 0;//命名的什么JB变量
+        $a = 0; //命名的什么JB变量
         $node_order = array();
         $node_order = array();
         $node_alive = array();
         $node_alive = array();
         $node_prealive = array();
         $node_prealive = array();
@@ -620,9 +578,9 @@ class UserController extends BaseController
                     }
                     }
 
 
                     if ($node->node_bandwidth_limit == 0) {
                     if ($node->node_bandwidth_limit == 0) {
-                        $node_bandwidth[$name_cheif] = (int)($node->node_bandwidth / 1024 / 1024 / 1024) . ' GB 已用';
+                        $node_bandwidth[$name_cheif] = (int) ($node->node_bandwidth / 1024 / 1024 / 1024) . ' GB 已用';
                     } else {
                     } else {
-                        $node_bandwidth[$name_cheif] = (int)($node->node_bandwidth / 1024 / 1024 / 1024) . ' GB / ' . (int)($node->node_bandwidth_limit / 1024 / 1024 / 1024) . ' GB - ' . $node->bandwidthlimit_resetday . ' 日重置';
+                        $node_bandwidth[$name_cheif] = (int) ($node->node_bandwidth / 1024 / 1024 / 1024) . ' GB / ' . (int) ($node->node_bandwidth_limit / 1024 / 1024 / 1024) . ' GB - ' . $node->bandwidthlimit_resetday . ' 日重置';
                     }
                     }
 
 
                     if ($node_tempalive != '暂无数据') {
                     if ($node_tempalive != '暂无数据') {
@@ -641,7 +599,7 @@ class UserController extends BaseController
 
 
                 $nodeLoad = $node->getNodeLoad();
                 $nodeLoad = $node->getNodeLoad();
                 if (isset($nodeLoad[0]['load'])) {
                 if (isset($nodeLoad[0]['load'])) {
-                    $node_latestload[$name_cheif] = ((float)(explode(' ', $nodeLoad[0]['load']))[0]) * 100;
+                    $node_latestload[$name_cheif] = ((float) (explode(' ', $nodeLoad[0]['load']))[0]) * 100;
                 } else {
                 } else {
                     $node_latestload[$name_cheif] = null;
                     $node_latestload[$name_cheif] = null;
                 }
                 }
@@ -656,13 +614,12 @@ class UserController extends BaseController
                 }
                 }
             }
             }
         }
         }
-        $node_prefix = (object)$node_prefix;
-        $node_order = (object)$node_order;
+        $node_prefix = (object) $node_prefix;
+        $node_order = (object) $node_order;
         $tools = new Tools();
         $tools = new Tools();
         return $this->view()->assign('relay_rules', $relay_rules)->assign('node_class', $node_class)->assign('node_isv6', $node_isv6)->assign('tools', $tools)->assign('node_method', $node_method)->assign('node_muport', $node_muport)->assign('node_bandwidth', $node_bandwidth)->assign('node_heartbeat', $node_heartbeat)->assign('node_prefix', $node_prefix)->assign('node_flag_file', $node_flag_file)->assign('node_prealive', $node_prealive)->assign('node_order', $node_order)->assign('user', $user)->assign('node_alive', $node_alive)->assign('node_latestload', $node_latestload)->registerClass('URL', URL::class)->display('user/node.tpl');
         return $this->view()->assign('relay_rules', $relay_rules)->assign('node_class', $node_class)->assign('node_isv6', $node_isv6)->assign('tools', $tools)->assign('node_method', $node_method)->assign('node_muport', $node_muport)->assign('node_bandwidth', $node_bandwidth)->assign('node_heartbeat', $node_heartbeat)->assign('node_prefix', $node_prefix)->assign('node_flag_file', $node_flag_file)->assign('node_prealive', $node_prealive)->assign('node_order', $node_order)->assign('user', $user)->assign('node_alive', $node_alive)->assign('node_latestload', $node_latestload)->registerClass('URL', URL::class)->display('user/node.tpl');
     }
     }
 
 
-
     public function nodeInfo($request, $response, $args)
     public function nodeInfo($request, $response, $args)
     {
     {
         $user = Auth::getUser();
         $user = Auth::getUser();
@@ -675,7 +632,6 @@ class UserController extends BaseController
             return null;
             return null;
         }
         }
 
 
-
         switch ($node->sort) {
         switch ($node->sort) {
             case 0:
             case 0:
                 if ((($user->class >= $node->node_class && ($user->node_group == $node->node_group || $node->node_group == 0)) || $user->is_admin) && ($node->node_bandwidth_limit == 0 || $node->node_bandwidth < $node->node_bandwidth_limit)) {
                 if ((($user->class >= $node->node_class && ($user->node_group == $node->node_group || $node->node_group == 0)) || $user->is_admin) && ($node->node_bandwidth_limit == 0 || $node->node_bandwidth < $node->node_bandwidth_limit)) {
@@ -744,11 +700,11 @@ class UserController extends BaseController
         foreach ($totallogin as $single) {
         foreach ($totallogin as $single) {
             //if(isset($useripcount[$single->userid]))
             //if(isset($useripcount[$single->userid]))
             {
             {
-            if (!isset($userloginip[$single->ip])) {
-                //$useripcount[$single->userid]=$useripcount[$single->userid]+1;
-                $location = $iplocation->getlocation($single->ip);
-                $userloginip[$single->ip] = iconv('gbk', 'utf-8//IGNORE', $location['country'] . $location['area']);
-            }
+                if (!isset($userloginip[$single->ip])) {
+                    //$useripcount[$single->userid]=$useripcount[$single->userid]+1;
+                    $location = $iplocation->getlocation($single->ip);
+                    $userloginip[$single->ip] = iconv('gbk', 'utf-8//IGNORE', $location['country'] . $location['area']);
+                }
             }
             }
         }
         }
 
 
@@ -757,29 +713,28 @@ class UserController extends BaseController
             {
             {
                 $single->ip = Tools::getRealIp($single->ip);
                 $single->ip = Tools::getRealIp($single->ip);
                 $is_node = Node::where('node_ip', $single->ip)->first();
                 $is_node = Node::where('node_ip', $single->ip)->first();
-            if ($is_node) {
-                continue;
-            }
+                if ($is_node) {
+                    continue;
+                }
 
 
 
 
-            if (!isset($userip[$single->ip])) {
-                //$useripcount[$single->userid]=$useripcount[$single->userid]+1;
-                $location = $iplocation->getlocation($single->ip);
-                $userip[$single->ip] = iconv('gbk', 'utf-8//IGNORE', $location['country'] . $location['area']);
-            }
+                if (!isset($userip[$single->ip])) {
+                    //$useripcount[$single->userid]=$useripcount[$single->userid]+1;
+                    $location = $iplocation->getlocation($single->ip);
+                    $userip[$single->ip] = iconv('gbk', 'utf-8//IGNORE', $location['country'] . $location['area']);
+                }
             }
             }
         }
         }
 
 
+        $boughts = Bought::where('userid', $this->user->id)->orderBy('id', 'desc')->get();
 
 
-        return $this->view()->assign('userip', $userip)->assign('userloginip', $userloginip)->assign('paybacks', $paybacks)->display('user/profile.tpl');
+        return $this->view()->assign('boughts', $boughts)->assign('userip', $userip)->assign('userloginip', $userloginip)->assign('paybacks', $paybacks)->display('user/profile.tpl');
     }
     }
 
 
-
     public function announcement($request, $response, $args)
     public function announcement($request, $response, $args)
     {
     {
         $Anns = Ann::orderBy('date', 'desc')->get();
         $Anns = Ann::orderBy('date', 'desc')->get();
 
 
-
         return $this->view()->assign('anns', $Anns)->display('user/announcement.tpl');
         return $this->view()->assign('anns', $Anns)->display('user/announcement.tpl');
     }
     }
 
 
@@ -788,7 +743,6 @@ class UserController extends BaseController
         return $this->view()->display('user/tutorial.tpl');
         return $this->view()->display('user/tutorial.tpl');
     }
     }
 
 
-
     public function edit($request, $response, $args)
     public function edit($request, $response, $args)
     {
     {
         $themes = Tools::getDir(BASE_PATH . '/resources/views');
         $themes = Tools::getDir(BASE_PATH . '/resources/views');
@@ -806,11 +760,19 @@ class UserController extends BaseController
 
 
         $config_service = new Config();
         $config_service = new Config();
 
 
-        return $this->view()->assign('user', $this->user)->assign('themes', $themes)->assign('isBlock', $isBlock)->assign('Block', $Block)->assign('bind_token', $bind_token)->assign('telegram_bot', $_ENV['telegram_bot'])->assign('config_service', $config_service)
-            ->registerClass('URL', URL::class)->display('user/edit.tpl');
+        return $this->view()
+            ->assign('user', $this->user)
+            ->assign('schemes', $_ENV['user_agreement_scheme'])
+            ->assign('themes', $themes)
+            ->assign('isBlock', $isBlock)
+            ->assign('Block', $Block)
+            ->assign('bind_token', $bind_token)
+            ->assign('telegram_bot', $_ENV['telegram_bot'])
+            ->assign('config_service', $config_service)
+            ->registerClass('URL', URL::class)
+            ->display('user/edit.tpl');
     }
     }
 
 
-
     public function invite($request, $response, $args)
     public function invite($request, $response, $args)
     {
     {
         $code = InviteCode::where('user_id', $this->user->id)->first();
         $code = InviteCode::where('user_id', $this->user->id)->first();
@@ -968,7 +930,6 @@ class UserController extends BaseController
         $UIP->datetime = time();
         $UIP->datetime = time();
         $UIP->save();
         $UIP->save();
 
 
-
         $res['ret'] = 1;
         $res['ret'] = 1;
         $res['msg'] = $_SERVER['REMOTE_ADDR'];
         $res['msg'] = $_SERVER['REMOTE_ADDR'];
         return $this->echoJson($response, $res);
         return $this->echoJson($response, $res);
@@ -1228,8 +1189,7 @@ class UserController extends BaseController
                 try {
                 try {
                     Mail::send($to, $subject, 'news/warn.tpl', [
                     Mail::send($to, $subject, 'news/warn.tpl', [
                         'user' => $user, 'text' => $text
                         'user' => $user, 'text' => $text
-                    ], [
-                    ]);
+                    ], []);
                 } catch (Exception $e) {
                 } catch (Exception $e) {
                     echo $e->getMessage();
                     echo $e->getMessage();
                 }
                 }
@@ -1245,11 +1205,11 @@ class UserController extends BaseController
                 )
                 )
             );
             );
             $opts = array('http' =>
             $opts = array('http' =>
-                array(
-                    'method' => 'POST',
-                    'header' => 'Content-type: application/x-www-form-urlencoded',
-                    'content' => $postdata
-                ));
+            array(
+                'method' => 'POST',
+                'header' => 'Content-type: application/x-www-form-urlencoded',
+                'content' => $postdata
+            ));
             $context = stream_context_create($opts);
             $context = stream_context_create($opts);
             file_get_contents('https://sc.ftqq.com/' . $ScFtqq_SCKEY . '.send', false, $context);
             file_get_contents('https://sc.ftqq.com/' . $ScFtqq_SCKEY . '.send', false, $context);
         }
         }
@@ -1295,8 +1255,7 @@ class UserController extends BaseController
                     try {
                     try {
                         Mail::send($to, $subject, 'news/warn.tpl', [
                         Mail::send($to, $subject, 'news/warn.tpl', [
                             'user' => $user, 'text' => $text
                             'user' => $user, 'text' => $text
-                        ], [
-                        ]);
+                        ], []);
                     } catch (Exception $e) {
                     } catch (Exception $e) {
                         echo $e->getMessage();
                         echo $e->getMessage();
                     }
                     }
@@ -1311,11 +1270,11 @@ class UserController extends BaseController
                     )
                     )
                 );
                 );
                 $opts = array('http' =>
                 $opts = array('http' =>
-                    array(
-                        'method' => 'POST',
-                        'header' => 'Content-type: application/x-www-form-urlencoded',
-                        'content' => $postdata
-                    ));
+                array(
+                    'method' => 'POST',
+                    'header' => 'Content-type: application/x-www-form-urlencoded',
+                    'content' => $postdata
+                ));
                 $context = stream_context_create($opts);
                 $context = stream_context_create($opts);
                 file_get_contents('https://sc.ftqq.com/' . $ScFtqq_SCKEY . '.send', false, $context);
                 file_get_contents('https://sc.ftqq.com/' . $ScFtqq_SCKEY . '.send', false, $context);
                 $useScFtqq = $_ENV['ScFtqq_SCKEY'];
                 $useScFtqq = $_ENV['ScFtqq_SCKEY'];
@@ -1330,8 +1289,7 @@ class UserController extends BaseController
                     try {
                     try {
                         Mail::send($to, $subject, 'news/warn.tpl', [
                         Mail::send($to, $subject, 'news/warn.tpl', [
                             'user' => $user, 'text' => $text
                             'user' => $user, 'text' => $text
-                        ], [
-                        ]);
+                        ], []);
                     } catch (Exception $e) {
                     } catch (Exception $e) {
                         echo $e->getMessage();
                         echo $e->getMessage();
                     }
                     }
@@ -1346,11 +1304,11 @@ class UserController extends BaseController
                     )
                     )
                 );
                 );
                 $opts = array('http' =>
                 $opts = array('http' =>
-                    array(
-                        'method' => 'POST',
-                        'header' => 'Content-type: application/x-www-form-urlencoded',
-                        'content' => $postdata
-                    ));
+                array(
+                    'method' => 'POST',
+                    'header' => 'Content-type: application/x-www-form-urlencoded',
+                    'content' => $postdata
+                ));
                 $context = stream_context_create($opts);
                 $context = stream_context_create($opts);
                 file_get_contents('https://sc.ftqq.com/' . $ScFtqq_SCKEY . '.send', false, $context);
                 file_get_contents('https://sc.ftqq.com/' . $ScFtqq_SCKEY . '.send', false, $context);
             }
             }
@@ -1394,7 +1352,6 @@ class UserController extends BaseController
         return $this->view()->assign('ticketset', $ticketset)->assign('id', $id)->display('user/ticket_view.tpl');
         return $this->view()->assign('ticketset', $ticketset)->assign('id', $id)->display('user/ticket_view.tpl');
     }
     }
 
 
-
     public function updateWechat($request, $response, $args)
     public function updateWechat($request, $response, $args)
     {
     {
         $type = $request->getParam('imtype');
         $type = $request->getParam('imtype');
@@ -1432,7 +1389,6 @@ class UserController extends BaseController
         return $this->echoJson($response, $res);
         return $this->echoJson($response, $res);
     }
     }
 
 
-
     public function updateSSR($request, $response, $args)
     public function updateSSR($request, $response, $args)
     {
     {
         $protocol = $request->getParam('protocol');
         $protocol = $request->getParam('protocol');
@@ -1509,7 +1465,6 @@ class UserController extends BaseController
             return $response->getBody()->write(json_encode($res));
             return $response->getBody()->write(json_encode($res));
         }
         }
 
 
-
         $user->theme = filter_var($theme, FILTER_SANITIZE_STRING);
         $user->theme = filter_var($theme, FILTER_SANITIZE_STRING);
         $user->save();
         $user->save();
 
 
@@ -1518,7 +1473,6 @@ class UserController extends BaseController
         return $this->echoJson($response, $res);
         return $this->echoJson($response, $res);
     }
     }
 
 
-
     public function updateMail($request, $response, $args)
     public function updateMail($request, $response, $args)
     {
     {
         $mail = $request->getParam('mail');
         $mail = $request->getParam('mail');
@@ -1531,7 +1485,6 @@ class UserController extends BaseController
             return $response->getBody()->write(json_encode($res));
             return $response->getBody()->write(json_encode($res));
         }
         }
 
 
-
         $user->sendDailyMail = $mail;
         $user->sendDailyMail = $mail;
         $user->save();
         $user->save();
 
 
@@ -1552,7 +1505,6 @@ class UserController extends BaseController
             return $response->getBody()->write(json_encode($res));
             return $response->getBody()->write(json_encode($res));
         }
         }
 
 
-
         $user->pac = $pac;
         $user->pac = $pac;
         $user->save();
         $user->save();
 
 
@@ -1561,7 +1513,6 @@ class UserController extends BaseController
         return $this->echoJson($response, $res);
         return $this->echoJson($response, $res);
     }
     }
 
 
-
     public function updateSsPwd($request, $response, $args)
     public function updateSsPwd($request, $response, $args)
     {
     {
         $user = Auth::getUser();
         $user = Auth::getUser();
@@ -1583,10 +1534,8 @@ class UserController extends BaseController
         $user->updateSsPwd($pwd);
         $user->updateSsPwd($pwd);
         $res['ret'] = 1;
         $res['ret'] = 1;
 
 
-
         Radius::Add($user, $pwd);
         Radius::Add($user, $pwd);
 
 
-
         return $this->echoJson($response, $res);
         return $this->echoJson($response, $res);
     }
     }
 
 
@@ -1677,16 +1626,14 @@ class UserController extends BaseController
             return $response->getBody()->write(json_encode($res));
             return $response->getBody()->write(json_encode($res));
         }
         }
 
 
-        if (!$this->user->isAbleToCheckin()) {
+        $checkin = $this->user->checkin();
+        if ($checkin['ok'] === false) {
             $res['ret'] = 0;
             $res['ret'] = 0;
-            $res['msg'] = '您似乎已经签到过了...';
-            return $response->getBody()->write(json_encode($res));
+            $res['msg'] = $checkin['msg'];
+            return $this->echoJson($response, $res);
         }
         }
-        $traffic = random_int($_ENV['checkinMin'], $_ENV['checkinMax']);
-        $this->user->transfer_enable += Tools::toMB($traffic);
-        $this->user->last_check_in_time = time();
-        $this->user->save();
-        $res['msg'] = sprintf('获得了 %d MB流量.', $traffic);
+
+        $res['msg'] = $checkin['msg'];
         $res['unflowtraffic'] = $this->user->transfer_enable;
         $res['unflowtraffic'] = $this->user->transfer_enable;
         $res['traffic'] = Tools::flowAutoShow($this->user->transfer_enable);
         $res['traffic'] = Tools::flowAutoShow($this->user->transfer_enable);
         $res['trafficInfo'] = array(
         $res['trafficInfo'] = array(
@@ -1736,12 +1683,10 @@ class UserController extends BaseController
         return $this->view()->assign('logs', $traffic)->display('user/trafficlog.tpl');
         return $this->view()->assign('logs', $traffic)->display('user/trafficlog.tpl');
     }
     }
 
 
-
     public function detect_index($request, $response, $args)
     public function detect_index($request, $response, $args)
     {
     {
         $pageNum = $request->getQueryParams()['page'] ?? 1;
         $pageNum = $request->getQueryParams()['page'] ?? 1;
         $logs = DetectRule::paginate(15, ['*'], 'page', $pageNum);
         $logs = DetectRule::paginate(15, ['*'], 'page', $pageNum);
-        $logs->setPath('/user/detect');
         return $this->view()->assign('rules', $logs)->display('user/detect_index.tpl');
         return $this->view()->assign('rules', $logs)->display('user/detect_index.tpl');
     }
     }
 
 
@@ -1749,7 +1694,6 @@ class UserController extends BaseController
     {
     {
         $pageNum = $request->getQueryParams()['page'] ?? 1;
         $pageNum = $request->getQueryParams()['page'] ?? 1;
         $logs = DetectLog::orderBy('id', 'desc')->where('user_id', $this->user->id)->paginate(15, ['*'], 'page', $pageNum);
         $logs = DetectLog::orderBy('id', 'desc')->where('user_id', $this->user->id)->paginate(15, ['*'], 'page', $pageNum);
-        $logs->setPath('/user/detect/log');
         return $this->view()->assign('logs', $logs)->display('user/detect_log.tpl');
         return $this->view()->assign('logs', $logs)->display('user/detect_log.tpl');
     }
     }
 
 
@@ -1761,8 +1705,7 @@ class UserController extends BaseController
     public function telegram_reset($request, $response, $args)
     public function telegram_reset($request, $response, $args)
     {
     {
         $user = $this->user;
         $user = $this->user;
-        $user->telegram_id = 0;
-        $user->save();
+        $user->TelegramReset();
         return $response->withStatus(302)->withHeader('Location', '/user/edit');
         return $response->withStatus(302)->withHeader('Location', '/user/edit');
     }
     }
 
 
@@ -1782,13 +1725,13 @@ class UserController extends BaseController
 
 
     public function backtoadmin($request, $response, $args)
     public function backtoadmin($request, $response, $args)
     {
     {
-        $userid = Utils\Cookie::get('uid');
-        $adminid = Utils\Cookie::get('old_uid');
+        $userid = Cookie::get('uid');
+        $adminid = Cookie::get('old_uid');
         $user = User::find($userid);
         $user = User::find($userid);
         $admin = User::find($adminid);
         $admin = User::find($adminid);
 
 
         if (!$admin->is_admin || !$user) {
         if (!$admin->is_admin || !$user) {
-            Utils\Cookie::set([
+            Cookie::set([
                 'uid' => null,
                 'uid' => null,
                 'email' => null,
                 'email' => null,
                 'key' => null,
                 'key' => null,
@@ -1802,13 +1745,13 @@ class UserController extends BaseController
                 'old_local' => null
                 'old_local' => null
             ], time() - 1000);
             ], time() - 1000);
         }
         }
-        $expire_in = Utils\Cookie::get('old_expire_in');
-        $local = Utils\Cookie::get('old_local');
-        Utils\Cookie::set([
-            'uid' => Utils\Cookie::get('old_uid'),
-            'email' => Utils\Cookie::get('old_email'),
-            'key' => Utils\Cookie::get('old_key'),
-            'ip' => Utils\Cookie::get('old_ip'),
+        $expire_in = Cookie::get('old_expire_in');
+        $local = Cookie::get('old_local');
+        Cookie::set([
+            'uid' => Cookie::get('old_uid'),
+            'email' => Cookie::get('old_email'),
+            'key' => Cookie::get('old_key'),
+            'ip' => Cookie::get('old_ip'),
             'expire_in' => $expire_in,
             'expire_in' => $expire_in,
             'old_uid' => null,
             'old_uid' => null,
             'old_email' => null,
             'old_email' => null,
@@ -1820,11 +1763,59 @@ class UserController extends BaseController
         return $response->withStatus(302)->withHeader('Location', $local);
         return $response->withStatus(302)->withHeader('Location', $local);
     }
     }
 
 
-    /** 
+    public function getUserAllURL($request, $response, $args)
+    {
+        $user = $this->user;
+        $type = $request->getQueryParams()["type"];
+        $return = '';
+        switch ($type) {
+            case 'ss':
+                $return .= URL::get_NewAllUrl($user, ['type' => 'ss']) . PHP_EOL;
+                break;
+            case 'ssr':
+                $return .= URL::get_NewAllUrl($user, ['type' => 'ssr']) . PHP_EOL;
+                break;
+            case 'ssd':
+                $return .= LinkController::getSSD($user, 1, [], ['type' => 'ss']) . PHP_EOL;
+                break;
+            case 'v2ray':
+                $return .= URL::get_NewAllUrl($user, ['type' => 'vmess']) . PHP_EOL;
+                break;
+            default:
+                $return .= '悟空别闹!';
+                break;
+        }
+        $response = $response->withHeader('Content-type', ' application/octet-stream; charset=utf-8')
+            ->withHeader('Cache-Control', 'no-store, no-cache, must-revalidate')
+            ->withHeader('Content-Disposition', ' attachment; filename=node.txt');
+
+        return $response->write($return);
+    }
+
+    /**
+     * 订阅记录
+     *
+     * @param Request  $request
+     * @param Response $response
+     * @param array    $args
+     */
+    public function subscribe_log($request, $response, $args)
+    {
+        if ($_ENV['subscribeLog_show'] === false) {
+            return $response->withStatus(302)->withHeader('Location', '/user');
+        }
+        $pageNum = $request->getQueryParams()['page'] ?? 1;
+        $logs = UserSubscribeLog::orderBy('id', 'desc')->where('user_id', $this->user->id)->paginate(15, ['*'], 'page', $pageNum);
+        $iplocation = new QQWry();
+
+        return $this->view()->assign('logs', $logs)->assign('iplocation', $iplocation)->fetch('user/subscribe_log.tpl');
+    }
+
+    /**
      * 获取包含订阅信息的客户端压缩档
      * 获取包含订阅信息的客户端压缩档
-     * 
-     * @param Request  $request 
-     * @param Response $response 
+     *
+     * @param Request  $request
+     * @param Response $response
      * @param array    $args
      * @param array    $args
      */
      */
     public function getPcClient($request, $response, $args)
     public function getPcClient($request, $response, $args)
@@ -1833,31 +1824,31 @@ class UserController extends BaseController
         $user_token = LinkController::GenerateSSRSubCode($this->user->id, 0);
         $user_token = LinkController::GenerateSSRSubCode($this->user->id, 0);
         $type = trim($request->getQueryParams()['type']);
         $type = trim($request->getQueryParams()['type']);
         // 临时文件存放路径
         // 临时文件存放路径
-        $temp_file_path = '../storage/';
+        $temp_file_path = BASE_PATH . '/storage/';
         // 客户端文件存放路径
         // 客户端文件存放路径
-        $client_path = '../resources/clients/';
+        $client_path = BASE_PATH . '/resources/clients/';
         switch ($type) {
         switch ($type) {
             case 'ss-win':
             case 'ss-win':
-                $temp_file_path .= $type . '_' . $user_token . '.zip';
                 $user_config_file_name = 'gui-config.json';
                 $user_config_file_name = 'gui-config.json';
-                $content = LinkController::getSSPcConf($this->user);
-                $client_path .= $type . '/';
+                $content = ClientProfiles::getSSPcConf($this->user);
                 break;
                 break;
             case 'ssd-win':
             case 'ssd-win':
-                $temp_file_path .= $type . '_' . $user_token . '.zip';
                 $user_config_file_name = 'gui-config.json';
                 $user_config_file_name = 'gui-config.json';
-                $content = LinkController::getSSDPcConf($this->user);
-                $client_path .= $type . '/';
+                $content = ClientProfiles::getSSDPcConf($this->user);
                 break;
                 break;
             case 'ssr-win':
             case 'ssr-win':
-                $temp_file_path .= $type . '_' . $user_token . '.zip';
                 $user_config_file_name = 'gui-config.json';
                 $user_config_file_name = 'gui-config.json';
-                $content = LinkController::getSSRPcConf($this->user);
-                $client_path .= $type . '/';
+                $content = ClientProfiles::getSSRPcConf($this->user);
+                break;
+            case 'v2rayn-win':
+                $user_config_file_name = 'guiNConfig.json';
+                $content = ClientProfiles::getV2RayNPcConf($this->user);
                 break;
                 break;
             default:
             default:
                 return 'gg';
                 return 'gg';
         }
         }
+        $temp_file_path .= $type . '_' . $user_token . '.zip';
+        $client_path .= $type . '/';
         // 文件存在则先删除
         // 文件存在则先删除
         if (is_file($temp_file_path)) {
         if (is_file($temp_file_path)) {
             unlink($temp_file_path);
             unlink($temp_file_path);
@@ -1877,4 +1868,26 @@ class UserController extends BaseController
 
 
         return $newResponse;
         return $newResponse;
     }
     }
+
+    /**
+     * 从使用同数据库的其他面板下载客户端[内置节点]
+     *
+     * @param Request  $request
+     * @param Response $response
+     * @param array    $args
+     */
+    public function getClientfromToken($request, $response, $args)
+    {
+        $token = $args['token'];
+        $Etoken = Token::where('token', '=', $token)->where('create_time', '>', time() - 60 * 10)->first();
+        if ($Etoken == null) {
+            return '下载链接已失效,请刷新页面后重新点击.';
+        }
+        $user = User::find($Etoken->user_id);
+        if ($user == null) {
+            return null;
+        }
+        $this->user = $user;
+        return $this->getPcClient($request, $response, $args);
+    }
 }
 }

+ 69 - 57
src/Controllers/VueController.php

@@ -2,21 +2,26 @@
 
 
 namespace App\Controllers;
 namespace App\Controllers;
 
 
-use App\Models\InviteCode;
-use App\Models\User;
-use App\Models\Code;
-use App\Models\Payback;
-use App\Models\Ann;
-use App\Models\Shop;
-use App\Services\Auth;
-use App\Services\Config;
-use App\Utils\Tools;
-use App\Utils\TelegramSessionManager;
-use App\Utils\Geetest;
-
-use App\Utils\URL;
-use App\Models\Node;
-use App\Models\Relay;
+use App\Models\{
+    Ann,
+    Code,
+    Node,
+    User,
+    Shop,
+    Relay,
+    Payback,
+    InviteCode
+};
+use App\Utils\{
+    URL,
+    Tools,
+    Geetest,
+    TelegramSessionManager
+};
+use App\Services\{
+    Auth,
+    Config
+};
 use Slim\Http\{Request, Response};
 use Slim\Http\{Request, Response};
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ResponseInterface;
 
 
@@ -50,26 +55,26 @@ class VueController extends BaseController
         }
         }
 
 
         $res['globalConfig'] = array(
         $res['globalConfig'] = array(
-            'geetest_html' => $GtSdk,
-            'login_token' => $login_token,
-            'login_number' => $login_number,
-            'telegram_bot' => $_ENV['telegram_bot'],
-            'enable_logincaptcha' => $_ENV['enable_login_captcha'],
-            'enable_regcaptcha' => $_ENV['enable_reg_captcha'],
-            'enable_checkin_captcha' => $_ENV['enable_checkin_captcha'],
-            'base_url' => $_ENV['baseUrl'],
-            'recaptcha_sitekey' => $recaptcha_sitekey,
-            'captcha_provider' => $_ENV['captcha_provider'],
-            'jump_delay' => $_ENV['jump_delay'],
-            'register_mode' => $_ENV['register_mode'],
-            'enable_email_verify' => $_ENV['enable_email_verify'],
-            'appName' => $_ENV['appName'],
-            'dateY' => date('Y'),
-            'isLogin' => $user->isLogin,
-            'enable_telegram' => $_ENV['enable_telegram'],
-            'enable_mylivechat' => $_ENV['enable_mylivechat'],
-            'enable_flag' => $_ENV['enable_flag'],
-            'payment_type' => $_ENV['payment_system'],
+            'geetest_html'            => $GtSdk,
+            'login_token'             => $login_token,
+            'login_number'            => $login_number,
+            'telegram_bot'            => $_ENV['telegram_bot'],
+            'enable_logincaptcha'     => $_ENV['enable_login_captcha'],
+            'enable_regcaptcha'       => $_ENV['enable_reg_captcha'],
+            'enable_checkin_captcha'  => $_ENV['enable_checkin_captcha'],
+            'base_url'                => $_ENV['baseUrl'],
+            'recaptcha_sitekey'       => $recaptcha_sitekey,
+            'captcha_provider'        => $_ENV['captcha_provider'],
+            'jump_delay'              => $_ENV['jump_delay'],
+            'register_mode'           => Config::getconfig('Register.string.Mode'),
+            'enable_email_verify'     => Config::getconfig('Register.bool.Enable_email_verify'),
+            'appName'                 => $_ENV['appName'],
+            'dateY'                   => date('Y'),
+            'isLogin'                 => $user->isLogin,
+            'enable_telegram'         => $_ENV['enable_telegram'],
+            'enable_mylivechat'       => $_ENV['enable_mylivechat'],
+            'enable_flag'             => $_ENV['enable_flag'],
+            'payment_type'            => $_ENV['payment_system'],
         );
         );
 
 
         $res['ret'] = 1;
         $res['ret'] = 1;
@@ -94,11 +99,11 @@ class VueController extends BaseController
         }
         }
 
 
         $pre_user = URL::cloneUser($user);
         $pre_user = URL::cloneUser($user);
-        $user->ssr_url_all = URL::getAllUrl($pre_user, 0, 0);
-        $user->ssr_url_all_mu = URL::getAllUrl($pre_user, 1, 0);
-        $user->ss_url_all = URL::getAllUrl($pre_user, 0, 2);
+        $user->ssr_url_all = URL::get_NewAllUrl($pre_user, ['type' => 'ssr']);
+        $user->ssr_url_all_mu = URL::get_NewAllUrl($pre_user, ['type' => 'ssr', 'is_mu' => 1]);
+        $user->ss_url_all = URL::get_NewAllUrl($pre_user, ['type' => 'ss']);
         $ssinfo = URL::getSSConnectInfo($pre_user);
         $ssinfo = URL::getSSConnectInfo($pre_user);
-        $user->ssd_url_all = URL::getAllSSDUrl($ssinfo);
+        $user->ssd_url_all = LinkController::getSSD($ssinfo, 1, [], ['type' => 'ss']);
         $user->isAbleToCheckin = $user->isAbleToCheckin();
         $user->isAbleToCheckin = $user->isAbleToCheckin();
         $ssr_sub_token = LinkController::GenerateSSRSubCode($this->user->id, 0);
         $ssr_sub_token = LinkController::GenerateSSRSubCode($this->user->id, 0);
         $GtSdk = null;
         $GtSdk = null;
@@ -166,15 +171,15 @@ class VueController extends BaseController
         $paybacks->setPath('/#/user/panel');
         $paybacks->setPath('/#/user/panel');
 
 
         $res['inviteInfo'] = array(
         $res['inviteInfo'] = array(
-            'code' => $code,
-            'paybacks' => $paybacks,
-            'paybacks_sum' => $paybacks_sum,
-            'invite_num' => $user->invite_num,
-            'invitePrice' => $_ENV['invite_price'],
-            'customPrice' => $_ENV['custom_invite_price'],
-            'invite_gift' => $_ENV['invite_gift'],
-            'invite_get_money' => $_ENV['invite_get_money'],
-            'code_payback' => $_ENV['code_payback'],
+            'code'              => $code,
+            'paybacks'          => $paybacks,
+            'paybacks_sum'      => $paybacks_sum,
+            'invite_num'        => $user->invite_num,
+            'invitePrice'       => $_ENV['invite_price'],
+            'customPrice'       => $_ENV['custom_invite_price'],
+            'invite_gift'       => $_ENV['invite_gift'],
+            'invite_get_money'  => (int) Config::getconfig('Register.string.defaultInvite_get_money'),
+            'code_payback'      => $_ENV['code_payback'],
         );
         );
 
 
         $res['ret'] = 1;
         $res['ret'] = 1;
@@ -411,8 +416,8 @@ class VueController extends BaseController
                 $array_node['latest_load'] = -1;
                 $array_node['latest_load'] = -1;
             }
             }
 
 
-            $array_node['traffic_used'] = (int)Tools::flowToGB($node->node_bandwidth);
-            $array_node['traffic_limit'] = (int)Tools::flowToGB($node->node_bandwidth_limit);
+            $array_node['traffic_used'] = (int) Tools::flowToGB($node->node_bandwidth);
+            $array_node['traffic_limit'] = (int) Tools::flowToGB($node->node_bandwidth_limit);
             if ($node->node_speedlimit == 0.0) {
             if ($node->node_speedlimit == 0.0) {
                 $array_node['bandwidth'] = 0;
                 $array_node['bandwidth'] = 0;
             } elseif ($node->node_speedlimit >= 1024.00) {
             } elseif ($node->node_speedlimit >= 1024.00) {
@@ -475,7 +480,8 @@ class VueController extends BaseController
                 }
                 }
                 break;
                 break;
             case 1:
             case 1:
-                if ($user->class >= $node->node_class
+                if (
+                    $user->class >= $node->node_class
                     && ($user->node_group == $node->node_group || $node->node_group == 0)
                     && ($user->node_group == $node->node_group || $node->node_group == 0)
                 ) {
                 ) {
                     $email = $user->email;
                     $email = $user->email;
@@ -490,8 +496,10 @@ class VueController extends BaseController
                 }
                 }
                 break;
                 break;
             case 2:
             case 2:
-                if ($user->class >= $node->node_class
-                    && ($user->node_group == $node->node_group || $node->node_group == 0)) {
+                if (
+                    $user->class >= $node->node_class
+                    && ($user->node_group == $node->node_group || $node->node_group == 0)
+                ) {
                     $email = $user->email;
                     $email = $user->email;
                     $email = Radius::GetUserName($email);
                     $email = Radius::GetUserName($email);
                     $json_show = 'SSH 信息<br>地址:' . $node->server
                     $json_show = 'SSH 信息<br>地址:' . $node->server
@@ -504,8 +512,10 @@ class VueController extends BaseController
                 }
                 }
                 break;
                 break;
             case 5:
             case 5:
-                if ($user->class >= $node->node_class
-                    && ($user->node_group == $node->node_group || $node->node_group == 0)) {
+                if (
+                    $user->class >= $node->node_class
+                    && ($user->node_group == $node->node_group || $node->node_group == 0)
+                ) {
                     $email = $user->email;
                     $email = $user->email;
                     $email = Radius::GetUserName($email);
                     $email = Radius::GetUserName($email);
 
 
@@ -521,7 +531,8 @@ class VueController extends BaseController
             case 10:
             case 10:
                 if ((($user->class >= $node->node_class
                 if ((($user->class >= $node->node_class
                         && ($user->node_group == $node->node_group || $node->node_group == 0)) || $user->is_admin)
                         && ($user->node_group == $node->node_group || $node->node_group == 0)) || $user->is_admin)
-                    && ($node->node_bandwidth_limit == 0 || $node->node_bandwidth < $node->node_bandwidth_limit)) {
+                    && ($node->node_bandwidth_limit == 0 || $node->node_bandwidth < $node->node_bandwidth_limit)
+                ) {
                     return $response->withJson([
                     return $response->withJson([
                         'ret' => 1,
                         'ret' => 1,
                         'nodeInfo' => [
                         'nodeInfo' => [
@@ -537,7 +548,8 @@ class VueController extends BaseController
             case 13:
             case 13:
                 if ((($user->class >= $node->node_class
                 if ((($user->class >= $node->node_class
                         && ($user->node_group == $node->node_group || $node->node_group == 0)) || $user->is_admin)
                         && ($user->node_group == $node->node_group || $node->node_group == 0)) || $user->is_admin)
-                    && ($node->node_bandwidth_limit == 0 || $node->node_bandwidth < $node->node_bandwidth_limit)) {
+                    && ($node->node_bandwidth_limit == 0 || $node->node_bandwidth < $node->node_bandwidth_limit)
+                ) {
                     return $response->withJson([
                     return $response->withJson([
                         'ret' => 1,
                         'ret' => 1,
                         'nodeInfo' => [
                         'nodeInfo' => [

+ 25 - 9
src/Middleware/Mod_Mu.php

@@ -18,25 +18,41 @@ class Mod_Mu
     {
     {
         $key = $request->getQueryParam('key');
         $key = $request->getQueryParam('key');
         if ($key === null) {
         if ($key === null) {
+            // 未提供 key
             return $response->withjson([
             return $response->withjson([
-                'ret' => 0,
+                'ret'  => 0,
                 'data' => 'Your key is null.'
                 'data' => 'Your key is null.'
             ]);
             ]);
         }
         }
 
 
-        $keys = Config::getMuKey();
-        $auth = in_array($key, $keys);
+        if (!in_array($key, Config::getMuKey())) {
+            // key 不存在
+            return $response->withJson([
+                'ret'  => 0,
+                'data' => 'Token is invalid'
+            ]);
+        }
 
 
-        $node = Node::where('node_ip', 'LIKE', $_SERVER['REMOTE_ADDR'] . '%')->first();
-        if ($auth === false
-            || ($node === null && $_SERVER['REMOTE_ADDR'] != '127.0.0.1')
-            ) {
+        if ($_ENV['Webapi'] === false) {
+            // 主站不提供 Webapi
             return $response->withJson([
             return $response->withJson([
-                'ret' => 0,
-                'data' => 'Token or IP is invalid. Now, your IP address is ' . $_SERVER['REMOTE_ADDR']
+                'ret'  => 0,
+                'data' => 'We regret this service is temporarily unavailable'
             ]);
             ]);
         }
         }
 
 
+        if ($_ENV['checkNodeIp'] === true) {
+            if ($_SERVER['REMOTE_ADDR'] != '127.0.0.1') {
+                $node = Node::where('node_ip', 'LIKE', $_SERVER['REMOTE_ADDR'] . '%')->first();
+                if ($node === null) {
+                    return $response->withJson([
+                        'ret'  => 0,
+                        'data' => 'IP is invalid. Now, your IP address is ' . $_SERVER['REMOTE_ADDR']
+                    ]);
+                }
+            }
+        }
+
         return $next($request, $response);
         return $next($request, $response);
     }
     }
 }
 }

+ 0 - 1
src/Models/Auto.php

@@ -7,7 +7,6 @@ class Auto extends Model
     protected $connection = 'default';
     protected $connection = 'default';
     protected $table = 'auto';
     protected $table = 'auto';
 
 
-
     public function datetime()
     public function datetime()
     {
     {
         return date('Y-m-d H:i:s', $this->attributes['datetime']);
         return date('Y-m-d H:i:s', $this->attributes['datetime']);

+ 0 - 1
src/Models/BlockIp.php

@@ -8,7 +8,6 @@ class BlockIp extends Model
     protected $connection = 'default';
     protected $connection = 'default';
     protected $table = 'blockip';
     protected $table = 'blockip';
 
 
-
     public function node()
     public function node()
     {
     {
         return Node::where('id', $this->attributes['nodeid'])->first();
         return Node::where('id', $this->attributes['nodeid'])->first();

+ 56 - 0
src/Models/Bought.php

@@ -44,4 +44,60 @@ class Bought extends Model
     {
     {
         return Shop::where('id', $this->attributes['shopid'])->first();
         return Shop::where('id', $this->attributes['shopid'])->first();
     }
     }
+
+    /*
+     * 套餐已使用的天数
+     */
+    public function used_days()
+    {
+        return (int) ((time() - $this->datetime) / 86400);
+    }
+
+    /*
+     * 是否有效期内
+     */
+    public function valid()
+    {
+        $shop = $this->shop();
+        if ($this->use_loop()) {
+            return (time() - $shop->reset_exp() * 86400 < $this->datetime);
+        }
+        return false;
+    }
+
+    /*
+     * 是否周期内循环重置性商品
+     */
+    public function use_loop()
+    {
+        $shop = $this->shop();
+        return ($shop->reset() != 0 && $shop->reset_value() != 0 && $shop->reset_exp() != 0);
+    }
+
+    /*
+     * 下一次流量重置时间
+     */
+    public function reset_time($unix = false)
+    {
+        $shop = $this->shop();
+        if ($this->use_loop()) {
+            $day = $shop->reset() - ($this->used_days() % $shop->reset());
+            $time = time() + ($day * 86400);
+            return ($unix == false ? date('Y-m-d', $time) : $time);
+        }
+        return ($unix == false ? '-' : 0);
+    }
+
+    /*
+     * 过期时间
+     */
+    public function exp_time($unix = false)
+    {
+        $shop = $this->shop();
+        if ($this->use_loop()) {
+            $time = $this->datetime + ($shop->reset_exp() * 86400);
+            return ($unix == false ? date('Y-m-d H:i:s', $time) : $time);
+        }
+        return ($unix == false ? '-' : 0);
+    }
 }
 }

+ 0 - 1
src/Models/Code.php

@@ -10,7 +10,6 @@ class Code extends Model
     protected $connection = 'default';
     protected $connection = 'default';
     protected $table = 'code';
     protected $table = 'code';
 
 
-
     public function user()
     public function user()
     {
     {
         return User::where('id', $this->attributes['userid'])->first();
         return User::where('id', $this->attributes['userid'])->first();

+ 9 - 0
src/Models/DetectBanLog.php

@@ -0,0 +1,9 @@
+<?php
+
+namespace App\Models;
+
+class DetectBanLog extends Model
+{
+    protected $connection = "default";
+    protected $table = "detect_ban_log";
+}

+ 108 - 0
src/Models/GConfig.php

@@ -0,0 +1,108 @@
+<?php
+
+namespace App\Models;
+
+use App\Services\DefaultConfig;
+
+class GConfig extends Model
+{
+    /**
+     * The connection name for the model.
+     *
+     * @var string
+     */
+    protected $connection = 'default';
+
+    /**
+     * The table associated with the model.
+     *
+     * @var string
+     */
+    protected $table = 'gconfig';
+
+    /**
+     * 恢复默认配置
+     *
+     * @param User $user
+     *
+     * @return void
+     */
+    public function recover($user)
+    {
+        $this->oldvalue       = $this->value;
+        $this->value          = DefaultConfig::default_value($this->key)['value'];
+        $this->operator_id    = $user->id;
+        $this->operator_name  = ('[恢复默认] - ' . $user->user_name);
+        $this->operator_email = $user->email;
+        $this->last_update    = time();
+        $this->save();
+    }
+
+    /**
+     * 获取配置值
+     *
+     * @return mixed
+     */
+    public function getValue()
+    {
+        switch ($this->type) {
+            case 'bool':
+                return (bool)      $this->value;
+            case 'array':
+                return json_decode($this->value, true);
+            case 'string':
+                return (string)    $this->value;
+            default:
+                return (string)    $this->value;
+        }
+    }
+
+    /**
+     * 设定配置值
+     *
+     * @param mixed $value
+     * @param User  $user
+     *
+     * @return bool
+     */
+    public function setValue($value, $user = null)
+    {
+        $this->oldvalue = $this->value;
+        $this->value    = $this->typeConversion($value);
+        if ($user === null) {
+            $this->operator_id    = 0;
+            $this->operator_name  = '系统修改';
+            $this->operator_email = '[email protected]';
+        } else {
+            $this->operator_id    = $user->id;
+            $this->operator_name  = $user->user_name;
+            $this->operator_email = $user->email;
+        }
+        $this->last_update = time();
+        if (!$this->save()) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * 配置值得类型转换
+     *
+     * @param mixed $value
+     *
+     * @return mixed
+     */
+    public function typeConversion($value)
+    {
+        switch ($this->type) {
+            case 'bool':
+                return (string) $value;
+            case 'array':
+                return json_encode($value, 320);
+            case 'string':
+                return (string) $value;
+            default:
+                return (string) $value;
+        }
+    }
+}

+ 24 - 8
src/Models/Node.php

@@ -20,18 +20,19 @@ namespace App\Models;
  * @property        bool    $gfw_block  If node is blocked by GFW
  * @property        bool    $gfw_block  If node is blocked by GFW
  */
  */
 
 
-use App\Utils\Tools;
+use App\Utils\{Tools, URL};
 
 
 class Node extends Model
 class Node extends Model
 {
 {
     protected $connection = 'default';
     protected $connection = 'default';
+
     protected $table = 'ss_node';
     protected $table = 'ss_node';
 
 
     protected $casts = [
     protected $casts = [
         'node_speedlimit' => 'float',
         'node_speedlimit' => 'float',
-        'traffic_rate' => 'float',
-        'mu_only' => 'int',
-        'sort' => 'int',
+        'traffic_rate'    => 'float',
+        'mu_only'         => 'int',
+        'sort'            => 'int',
     ];
     ];
 
 
     public function getLastNodeInfoLog()
     public function getLastNodeInfoLog()
@@ -50,7 +51,7 @@ class Node extends Model
         if ($log == null) {
         if ($log == null) {
             return '暂无数据';
             return '暂无数据';
         }
         }
-        return Tools::secondsToTime((int)$log->uptime);
+        return Tools::secondsToTime((int) $log->uptime);
     }
     }
 
 
 
 
@@ -167,12 +168,9 @@ class Node extends Model
     public function changeNodeIp($server_name)
     public function changeNodeIp($server_name)
     {
     {
         $ip = gethostbyname($server_name);
         $ip = gethostbyname($server_name);
-        $node_id = $this->attributes['id'];
-
         if ($ip == '') {
         if ($ip == '') {
             return false;
             return false;
         }
         }
-
         $this->attributes['node_ip'] = $ip;
         $this->attributes['node_ip'] = $ip;
         return true;
         return true;
     }
     }
@@ -183,4 +181,22 @@ class Node extends Model
         $node_ip_array = explode(',', $node_ip_str);
         $node_ip_array = explode(',', $node_ip_str);
         return $node_ip_array[0];
         return $node_ip_array[0];
     }
     }
+
+
+    public function getServer()
+    {
+        $out = '';
+        $explode = explode(';', $this->attributes['server']);
+        if (in_array($this->attributes['sort'], [0, 10])) {
+            if (isset($explode[1]) && stripos($explode[1], 'server=') !== false) {
+                $out = URL::parse_args($explode[1])['server'];
+            }
+        }
+        return ($out != '' ? $out : $explode[0]);
+    }
+
+    public function getOffsetPort($port)
+    {
+        return Tools::OutPort($this->attributes['server'], $this->attributes['name'], $port)['port'];
+    }
 }
 }

+ 1 - 1
src/Models/Relay.php

@@ -3,7 +3,7 @@
 namespace App\Models;
 namespace App\Models;
 
 
 /**
 /**
- * DetectLog Model
+ * Relay Model
  */
  */
 class Relay extends Model
 class Relay extends Model
 {
 {

+ 0 - 2
src/Models/Shop.php

@@ -2,8 +2,6 @@
 
 
 namespace App\Models;
 namespace App\Models;
 
 
-use App\Services\Config;
-
 class Shop extends Model
 class Shop extends Model
 {
 {
     protected $connection = 'default';
     protected $connection = 'default';

Some files were not shown because too many files changed in this diff