Surge.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <?php
  2. namespace App\Utils\Clients\Formatters;
  3. use App\Utils\Library\Templates\Formatter;
  4. class Surge implements Formatter
  5. {
  6. // https://manual.nssurge.com/policy/proxy.html
  7. public static function build(array $servers): array
  8. {
  9. $validTypes = ['shadowsocks', 'vmess', 'trojan', 'hysteria2'];
  10. $names = '';
  11. $proxies = '';
  12. foreach ($servers as $server) {
  13. if (in_array($server['type'], $validTypes, true)) {
  14. $names .= $server['name'].', ';
  15. $proxies .= call_user_func([self::class, 'build'.ucfirst($server['type'])], $server);
  16. }
  17. }
  18. return ['name' => rtrim($names, ', '), 'proxies' => $proxies];
  19. }
  20. public static function buildShadowsocks(array $server): string
  21. {
  22. $config = array_filter([
  23. "{$server['name']}=ss",
  24. $server['host'],
  25. $server['port'],
  26. "encrypt-method={$server['method']}",
  27. "password={$server['passwd']}",
  28. 'tfo=true',
  29. "udp-relay={$server['udp']}",
  30. ]);
  31. return implode(',', $config).PHP_EOL;
  32. }
  33. public static function buildVmess(array $server): string
  34. {
  35. $config = [
  36. "{$server['name']}=vmess",
  37. $server['host'],
  38. $server['port'],
  39. "username={$server['uuid']}",
  40. 'vmess-aead=true',
  41. 'tfo=true',
  42. "udp-relay={$server['udp']}",
  43. ];
  44. if (isset($server['v2_tls']) && $server['v2_tls']) {
  45. array_push($config, 'tls=true', "sni={$server['v2_host']}");
  46. }
  47. if (isset($server['v2_net']) && $server['v2_net'] === 'ws') {
  48. array_push($config, 'ws=true', "ws-path={$server['v2_path']}", "ws-headers=Host:{$server['v2_host']}");
  49. }
  50. return implode(',', $config).PHP_EOL;
  51. }
  52. public static function buildTrojan(array $server): string
  53. {
  54. $config = array_filter([
  55. "{$server['name']}=trojan",
  56. $server['host'],
  57. $server['port'],
  58. "password={$server['passwd']}",
  59. isset($server['sni']) ? "sni={$server['sni']}" : '',
  60. 'tfo=true',
  61. "udp-relay={$server['udp']}",
  62. "skip-cert-verify={$server['allow_insecure']}",
  63. ]);
  64. return implode(',', $config).PHP_EOL;
  65. }
  66. public static function buildHysteria2(array $server): string
  67. {
  68. $config = array_filter([
  69. "{$server['name']}=hysteria2",
  70. $server['host'],
  71. $server['port'],
  72. "password={$server['passwd']}",
  73. isset($server['sni']) ? "sni={$server['sni']}" : '',
  74. "udp-relay={$server['udp']}",
  75. isset($server['ports']) && $server['ports'] ? 'port-hopping='.str_replace(',', ';', $server['ports']) : '',
  76. isset($server['allow_insecure']) && $server['allow_insecure'] ? 'skip-cert-verify=true' : '',
  77. // isset($server['upload_mbps']) ? "upload-bandwidth={$server['upload_mbps']}" : '',
  78. // isset($server['download_mbps']) ? "download-bandwidth={$server['download_mbps']}Mbps" : '',
  79. ]);
  80. return implode(',', $config).PHP_EOL;
  81. }
  82. public static function buildShadowsocksr(array $server): array|string
  83. {
  84. return '';
  85. }
  86. }