Clash.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <?php
  2. namespace App\Utils\Clients\Protocols;
  3. use App\Utils\Library\Templates\Protocol;
  4. class Clash implements Protocol
  5. {
  6. public static function build(array $servers): array
  7. {
  8. $validTypes = ['shadowsocks', 'shadowsocksr', 'vmess', 'trojan'];
  9. $names = [];
  10. $proxies = [];
  11. foreach ($servers as $server) {
  12. if (in_array($server['type'], $validTypes, true)) {
  13. $names[] = $server['name'];
  14. $proxies[] = call_user_func([self::class, 'build'.ucfirst($server['type'])], $server);
  15. }
  16. }
  17. return ['name' => $names, 'proxies' => $proxies];
  18. }
  19. public static function buildShadowsocks(array $server): array
  20. {
  21. return [
  22. 'name' => $server['name'],
  23. 'type' => 'ss',
  24. 'server' => $server['host'],
  25. 'port' => $server['port'],
  26. 'cipher' => $server['method'],
  27. 'password' => $server['passwd'],
  28. 'udp' => $server['udp'],
  29. ];
  30. }
  31. public static function buildShadowsocksr(array $server): array
  32. {
  33. return [
  34. 'name' => $server['name'],
  35. 'type' => 'ssr',
  36. 'server' => $server['host'],
  37. 'port' => $server['port'],
  38. 'password' => $server['passwd'],
  39. 'cipher' => $server['method'],
  40. 'obfs' => $server['obfs'],
  41. 'obfs-param' => $server['obfs_param'] ?? '',
  42. 'protocol' => $server['protocol'],
  43. 'protocol-param' => $server['protocol_param'] ?? '',
  44. 'udp' => $server['udp'],
  45. ];
  46. }
  47. public static function buildVmess(array $server): array
  48. {
  49. $array = [
  50. 'name' => $server['name'],
  51. 'type' => 'vmess',
  52. 'server' => $server['host'],
  53. 'port' => $server['port'],
  54. 'uuid' => $server['uuid'],
  55. 'alterId' => $server['v2_alter_id'],
  56. 'cipher' => $server['method'],
  57. 'udp' => $server['udp'],
  58. ];
  59. if (isset($server['v2_tls']) && $server['v2_tls']) {
  60. $array['tls'] = true;
  61. $array['servername'] = $server['v2_host'];
  62. }
  63. $array['network'] = $server['v2_net'];
  64. if (isset($server['v2_net']) && $server['v2_net'] === 'ws') {
  65. $array['ws-opts'] = [];
  66. $array['ws-opts']['path'] = $server['v2_path'];
  67. if ($server['v2_host']) {
  68. $array['ws-opts']['headers'] = ['Host' => $server['v2_host']];
  69. }
  70. $array['ws-path'] = $server['v2_path'];
  71. if ($server['v2_host']) {
  72. $array['ws-headers'] = ['Host' => $server['v2_host']];
  73. }
  74. }
  75. return $array;
  76. }
  77. public static function buildTrojan(array $server): array
  78. {
  79. $array = [
  80. 'name' => $server['name'],
  81. 'type' => 'trojan',
  82. 'server' => $server['host'],
  83. 'port' => $server['port'],
  84. 'password' => $server['passwd'],
  85. 'udp' => $server['udp'],
  86. ];
  87. if (isset($server['sni'])) {
  88. $array['sni'] = $server['sni'];
  89. }
  90. return $array;
  91. }
  92. }