1
0

SubscribeController.php 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Http\Models\SsGroup;
  4. use App\Http\Models\SsGroupNode;
  5. use App\Http\Models\SsNode;
  6. use App\Http\Models\User;
  7. use App\Http\Models\UserSubscribe;
  8. use App\Http\Models\UserSubscribeLog;
  9. use Illuminate\Http\Request;
  10. use Redirect;
  11. /**
  12. * 订阅控制器
  13. * Class SubscribeController
  14. * @package App\Http\Controllers
  15. */
  16. class SubscribeController extends Controller
  17. {
  18. protected static $config;
  19. function __construct()
  20. {
  21. self::$config = $this->systemConfig();
  22. }
  23. // 登录页
  24. public function index(Request $request, $code)
  25. {
  26. if (empty($code)) {
  27. return Redirect::to('login');
  28. }
  29. // 校验合法性
  30. $subscribe = UserSubscribe::query()->where('code', $code)->where('status', 1)->with('user')->first();
  31. if (empty($subscribe)) {
  32. exit('非法请求或者被禁用,请联系管理员');
  33. }
  34. $user = User::query()->where('id', $subscribe->user_id)->whereIn('status', [0, 1])->where('enable', 1)->first();
  35. if (empty($user)) {
  36. exit('非法请求或者被禁用,请联系管理员');
  37. }
  38. // 更新访问次数
  39. $subscribe->increment('times', 1);
  40. // 记录每次请求
  41. $log = new UserSubscribeLog();
  42. $log->sid = $subscribe->id;
  43. $log->request_ip = $request->getClientIp();
  44. $log->request_time = date('Y-m-d H:i:s');
  45. $log->request_header = $request->headers;
  46. $log->save();
  47. // 获取这个账号可用节点
  48. $group_ids = SsGroup::query()->where('level', '<=', $user->level)->select(['id'])->get();
  49. if (empty($group_ids)) {
  50. exit();
  51. }
  52. $node_ids = SsGroupNode::query()->whereIn('group_id', $group_ids)->select(['node_id'])->get();
  53. $nodeList = SsNode::query()->where('status', 1)->whereIn('id', $node_ids)->get();
  54. $scheme = self::$config['subscribe_max'] > 0 ? 'MAX=' . self::$config['subscribe_max'] . "\n" : '';
  55. foreach ($nodeList as $node) {
  56. $obfs_param = $node->single ? '' : $user->obfs_param;
  57. $protocol_param = $node->single ? $user->port . ':' . $user->passwd : $user->protocol_param;
  58. // 生成ssr scheme
  59. $ssr_str = '';
  60. $ssr_str .= $node->server . ':' . ($node->single ? $node->single_port : $user->port);
  61. $ssr_str .= ':' . ($node->single ? $node->single_protocol : $user->protocol) . ':' . ($node->single ? $node->single_method : $user->method);
  62. $ssr_str .= ':' . ($node->single ? 'tls1.2_ticket_auth' : $user->obfs) . ':' . $this->base64url_encode($user->passwd);
  63. $ssr_str .= '/?obfsparam=' . $this->base64url_encode($obfs_param);
  64. $ssr_str .= '&protoparam=' . $this->base64url_encode($protocol_param);
  65. $ssr_str .= '&remarks=' . $this->base64url_encode($node->name);
  66. $ssr_str .= '&group=' . $this->base64url_encode('VPN');
  67. $ssr_str .= '&udpport=0';
  68. $ssr_str .= '&uot=0';
  69. $ssr_str = $this->base64url_encode($ssr_str);
  70. $scheme .= 'ssr://' . $ssr_str . "\n";
  71. }
  72. exit($this->base64url_encode($scheme));
  73. }
  74. }