package util import ( "crypto/tls" "encoding/json" "io" "net/http" "strings" "github.com/alireza0/s-ui/logger" "github.com/alireza0/s-ui/util/common" ) func GetExternalLink(url string) string { tr := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, } client := &http.Client{Transport: tr} response, err := client.Get(url) if err != nil { logger.Warning("sub: Error making HTTP request:", err) return "" } defer response.Body.Close() body, err := io.ReadAll(response.Body) if err != nil { logger.Warning("sub: Error reading response body:", err) return "" } data := StrOrBase64Encoded(string(body)) return data } func GetExternalSub(url string) ([]map[string]interface{}, error) { var err error var result []map[string]interface{} if len(url) == 0 { return nil, common.NewError("no url") } data := GetExternalLink(url) if len(data) == 0 { return nil, common.NewError("no result") } // if the data is a JSON object if strings.HasPrefix(data, "{") && strings.HasSuffix(data, "}") { var jsonData map[string]interface{} err = json.Unmarshal([]byte(data), &jsonData) if err != nil { logger.Warning("sub: Error unmarshalling JSON:", err) return nil, err } outbounds, ok := jsonData["outbounds"].([]any) if !ok { logger.Warning("sub: Error getting outbounds:", err) return nil, err } for _, outbound := range outbounds { outboundMap, ok := outbound.(map[string]interface{}) if ok && len(outboundMap) > 0 { oType, _ := outboundMap["type"].(string) switch oType { case "urltest": case "direct": case "selector": case "block": continue default: result = append(result, outboundMap) } } } if len(result) == 0 { return nil, common.NewError("no result") } return result, nil } else { // if data is a text links := strings.Split(data, "\n") for _, link := range links { linkToJson, _, err := GetOutbound(link, 0) if err == nil { result = append(result, *linkToJson) } } } if len(result) == 0 { return nil, common.NewError("no result") } return result, nil }