Универсальный формат для преобразования прокси в единый формат Zennoposter/ Zennodroid

lutic

Client
Регистрация
20.01.2024
Сообщения
83
Благодарностей
77
Баллы
18
Добрый день, сервисов прокси очень много, и все они отдают формат по разному, а в кубике только один формат принимается, для этого было разработана функция на c# для преобразованию к общему виду
136315

C#:
string NormalizeProxy(string proxy)
{
    try
    {
        if (string.IsNullOrWhiteSpace(proxy))
        {
            return "";
        }

     
        proxy = proxy.Trim();

     
        string pattern = @"^(?:(?<scheme>https?|socks[45])://)?"
                        + @"(?:(?<username>[^:@\[\]]+):(?<password>[^@\[\]]+)@)?"
                        + @"(?<host>\[[^\]]+\]|[^:@]+)"
                        + @"(?::(?<port>\d+))"
                        + @"(?::(?<username2>[^:]+)(?::(?<password2>.+))?)?$";

        Match match = Regex.Match(proxy, pattern);
       
        if (!match.Success)
        {
            pattern = @"^(?<username>[^:@]+):(?<password>[^@]+)@(?<host>\[[^\]]+\]|[^:]+):(?<port>\d+)$";
            match = Regex.Match(proxy, pattern);
           
            if (!match.Success)
            {
                return "";
            }
        }

        string scheme = match.Groups["scheme"].Success ? match.Groups["scheme"].Value : "http";
       
        string username = match.Groups["username"].Success ? match.Groups["username"].Value
                        : (match.Groups["username2"].Success ? match.Groups["username2"].Value : "");
        string password = match.Groups["password"].Success ? match.Groups["password"].Value
                        : (match.Groups["password2"].Success ? match.Groups["password2"].Value : "");
       
        string host = match.Groups["host"].Value.Trim('[', ']'); 
        string port = match.Groups["port"].Value;

        if (string.IsNullOrEmpty(host) || string.IsNullOrEmpty(port))
        {
            return "";
        }

        string netloc;
        if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))
        {
            netloc = $"{username}:{password}@{host}:{port}";
        }
        else if (!string.IsNullOrEmpty(username)) 
        {
            netloc = $"{username}@{host}:{port}";
        }
        else
        {
            netloc = $"{host}:{port}";
        }

        return $"{scheme}://{netloc}";
    }
    catch
    {
        return "";
    }
}
   
   
   
     void info(string word){  project.SendInfoToLog(word.ToString(), "[CapGuru][PP]", true);  }


string[] proxies = {
            "http://user:pass@192.168.1.1:8080",
            "socks4://user:pass@192.168.1.1:8050",
            "socks5://user:pass@192.168.1.1:8090",
            "192.168.1.1:8080:user:pass",
            "192.168.1.1:8080",
            "[2001:db8::1]:8080:user:pass",
            "[2001:db8::1]:8080",
            "http://[2001:db8::1]:8080",
            "socks5://[2001:db8::1]:8050",
            "socks4://[2001:db8::1]:8090",
            "",
            "e6e0eae4e40085c9edb:97bdaebceb9f2a8616@de.op-proxy.com:15000"
        };

        foreach (var proxy in proxies)
        {
            try
            {
                string normalized = NormalizeProxy(proxy);
                info($"Original: {proxy} -> Normalized: {normalized}");
            }
            catch (ArgumentException e)
            {
                info($"Error: {e.Message}");
            }
        }
Спасибо за внимание
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)