package parser import ( "fmt" "net/url" "strconv" "strings" "sub2clash/model" ) func ParseShadowsocksR(proxy string) (model.Proxy, error) { // 判断是否以 ssr:// 开头 if !strings.HasPrefix(proxy, "ssr://") { return model.Proxy{}, fmt.Errorf("无效的 ssr URL") } var err error if !strings.Contains(proxy, ":") { proxy, err = DecodeBase64(strings.TrimPrefix(proxy, "ssr://")) if err != nil { return model.Proxy{}, err } } // 分割 detailsAndParams := strings.SplitN(strings.TrimPrefix(proxy, "ssr://"), "/?", 2) parts := strings.Split(detailsAndParams[0], ":") params, err := url.ParseQuery(detailsAndParams[1]) if err != nil { return model.Proxy{}, err } // 处理端口 port, err := strconv.Atoi(parts[1]) if err != nil { return model.Proxy{}, err } result := model.Proxy{ Type: "ssr", Server: parts[0], Port: port, Protocol: parts[2], Cipher: parts[3], Obfs: parts[4], Password: parts[5], ObfsParam: params.Get("obfsparam"), ProtocolParam: params.Get("protoparam"), } return result, nil }