URLSchemes.php 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <?php
  2. namespace App\Utils\Clients\Formatters;
  3. use App\Utils\Library\Templates\Formatter;
  4. class URLSchemes implements Formatter
  5. {
  6. public static function build(array $servers, bool $isEncode = true): string
  7. {
  8. $validTypes = ['shadowsocks', 'shadowsocksr', 'vmess', 'trojan', 'hysteria2'];
  9. $url = '';
  10. foreach ($servers as $server) {
  11. if (in_array($server['type'], $validTypes, true)) {
  12. $url .= call_user_func([self::class, 'build'.ucfirst($server['type'])], $server);
  13. }
  14. }
  15. return $isEncode ? base64_encode($url) : $url;
  16. }
  17. public static function buildShadowsocks(array $server): string
  18. { // https://shadowsocks.org/doc/sip002.html
  19. $name = rawurlencode($server['name']);
  20. $str = base64url_encode("{$server['method']}:{$server['passwd']}");
  21. return "ss://$str@{$server['host']}:{$server['port']}#$name".PHP_EOL;
  22. }
  23. public static function buildShadowsocksr(array $server): string
  24. {
  25. $setting = "{$server['host']}:{$server['port']}:{$server['protocol']}:{$server['method']}:{$server['obfs']}:";
  26. return 'ssr://'.base64url_encode($setting.base64url_encode($server['passwd']).'/?'.http_build_query([
  27. 'obfsparam' => base64url_encode($server['obfs_param'] ?? ''),
  28. 'protoparam' => base64url_encode($server['protocol_param'] ?? ''),
  29. 'remarks' => base64url_encode($server['name']),
  30. 'group' => base64url_encode($server['group'] ?? ''),
  31. 'udpport' => $server['udp'] ?? 0,
  32. 'uot' => 0,
  33. ])).PHP_EOL;
  34. }
  35. public static function buildVmess(array $server): string
  36. {
  37. $config = [
  38. 'v' => '2',
  39. 'ps' => $server['name'],
  40. 'add' => $server['host'],
  41. 'port' => $server['port'],
  42. 'id' => $server['uuid'],
  43. 'aid' => $server['v2_alter_id'],
  44. 'net' => $server['v2_net'] ?? '',
  45. 'type' => $server['v2_type'] ?? '',
  46. 'host' => $server['v2_host'] ?? '',
  47. 'path' => $server['v2_path'] ?? '',
  48. 'tls' => $server['v2_tls'] ?? '',
  49. 'sni' => $server['v2_sni'] ?? '',
  50. 'remark' => $server['name'],
  51. ];
  52. return 'vmess://'.base64_encode(json_encode($config)).PHP_EOL;
  53. }
  54. public static function buildTrojan(array $server): string
  55. { // https://p4gefau1t.github.io/trojan-go/developer/url/
  56. $name = rawurlencode($server['name']);
  57. $passwd = rawurlencode($server['passwd']);
  58. $query = '';
  59. if (array_key_exists('sni', $server)) {
  60. $query = "?sni={$server['sni']}";
  61. }
  62. return "trojan://$passwd@{$server['host']}:{$server['port']}$query#$name".PHP_EOL;
  63. }
  64. public static function buildHysteria2(array $server): string
  65. { // https://hysteria.network/zh/docs/developers/URI-Scheme/
  66. $name = rawurlencode($server['name']);
  67. $passwd = rawurlencode($server['passwd']);
  68. $params = [
  69. 'sni' => $server['host'],
  70. 'insecure' => $server['allow_insecure'] ? 1 : 0,
  71. ];
  72. if (isset($server['obfs']) && $server['obfs']) {
  73. $params['obfs'] = $server['obfs'];
  74. $params['obfs-password'] = $server['obfs_param'];
  75. }
  76. $query = empty($params) ? '' : '/?'.http_build_query($params);
  77. $port = $server['ports'] ?? $server['port'];
  78. return "hysteria2://$passwd@{$server['host']}:$port$query#$name".PHP_EOL;
  79. }
  80. }