clash.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package provider
  2. import (
  3. "strings"
  4. "github.com/zu1k/proxypool/pkg/tool"
  5. "github.com/zu1k/proxypool/pkg/proxy"
  6. )
  7. type Clash struct {
  8. Base
  9. }
  10. func (c Clash) CleanProxies() (proxies proxy.ProxyList) {
  11. proxies = make(proxy.ProxyList, 0)
  12. for _, p := range *c.Proxies {
  13. if checkClashSupport(p) {
  14. proxies = append(proxies, p)
  15. }
  16. }
  17. return
  18. }
  19. func (c Clash) Provide() string {
  20. c.preFilter()
  21. var resultBuilder strings.Builder
  22. resultBuilder.WriteString("proxies:\n")
  23. for _, p := range *c.Proxies {
  24. if checkClashSupport(p) {
  25. resultBuilder.WriteString(p.ToClash() + "\n")
  26. }
  27. }
  28. return resultBuilder.String()
  29. }
  30. func checkClashSupport(p proxy.Proxy) bool {
  31. switch p.TypeName() {
  32. case "ssr":
  33. ssr := p.(*proxy.ShadowsocksR)
  34. if tool.CheckInList(proxy.SSRCipherList, ssr.Cipher) && tool.CheckInList(ssrProtocolList, ssr.Protocol) && tool.CheckInList(ssrObfsList, ssr.Obfs) {
  35. return true
  36. }
  37. case "vmess":
  38. vmess := p.(*proxy.Vmess)
  39. if tool.CheckInList(vmessCipherList, vmess.Cipher) {
  40. return true
  41. }
  42. case "ss":
  43. ss := p.(*proxy.Shadowsocks)
  44. if tool.CheckInList(proxy.SSCipherList, ss.Cipher) {
  45. return true
  46. }
  47. case "trojan":
  48. return true
  49. default:
  50. return false
  51. }
  52. return false
  53. }
  54. var ssrObfsList = []string{
  55. "plain",
  56. "http_simple",
  57. "http_post",
  58. "random_head",
  59. "tls1.2_ticket_auth",
  60. "tls1.2_ticket_fastauth",
  61. }
  62. var ssrProtocolList = []string{
  63. "origin",
  64. "verify_deflate",
  65. "verify_sha1",
  66. "auth_sha1",
  67. "auth_sha1_v2",
  68. "auth_sha1_v4",
  69. "auth_aes128_md5",
  70. "auth_aes128_sha1",
  71. "auth_chain_a",
  72. "auth_chain_b",
  73. }
  74. var vmessCipherList = []string{
  75. "auto",
  76. "aes-128-gcm",
  77. "chacha20-poly1305",
  78. "none",
  79. }