Перейти к содержимому

Подключение из Go ​

Пример отправляет запрос через выделенную статическую точку подключения. Данные берутся из окружения процесса; по умолчанию HTTP-прокси используется для HTTPS-адреса. Получения и ротации IP нет.

Подготовка ​

Задайте PROXY_HOST, PROXY_PORT, PROXY_USERNAME, PROXY_PASSWORD в терминале, контейнере или среде развёртывания программы. Используйте актуальные данные панели и порт выбранного протокола. Не помещайте реальные пароли в репозиторий, журналы или клиентский код.

Среда и зависимости ​

Используйте поддерживаемую версию Go; достаточно стандартной библиотеки. Сохраните как proxy_example.go.

sh
go run proxy_example.go

Настройка подключения ​

go
package main

import (
    "context"
    "fmt"
    "io"
    "net"
    "net/http"
    "net/url"
    "os"
    "strconv"
    "strings"
    "time"
)

func required(name string) string {
    value := os.Getenv(name)
    if value == "" {
        fmt.Fprintln(os.Stderr, "Missing environment variable:", name)
        os.Exit(1)
    }
    return value
}

func main() {
    host := strings.Trim(required("PROXY_HOST"), "[]")
    port := required("PROXY_PORT")
    number, err := strconv.Atoi(port)
    if err != nil || number < 1 || number > 65535 {
        fmt.Fprintln(os.Stderr, "Invalid PROXY_PORT")
        os.Exit(1)
    }
    scheme := os.Getenv("PROXY_SCHEME")
    if scheme == "" { scheme = "http" }
    if scheme != "http" && scheme != "socks5h" {
        fmt.Fprintln(os.Stderr, "PROXY_SCHEME must be http or socks5h")
        os.Exit(1)
    }
    endpoint := &url.URL{
        Scheme: scheme,
        Host: net.JoinHostPort(host, port),
        User: url.UserPassword(required("PROXY_USERNAME"), required("PROXY_PASSWORD")),
    }
    transport := http.DefaultTransport.(*http.Transport).Clone()
    transport.Proxy = http.ProxyURL(endpoint)
    defer transport.CloseIdleConnections()
    client := &http.Client{Transport: transport, Timeout: 30 * time.Second}
    ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
    defer cancel()
    request, err := http.NewRequestWithContext(ctx, http.MethodGet, "https://ip123.in/ip.json", nil)
    if err != nil { fmt.Fprintln(os.Stderr, "Invalid request"); os.Exit(1) }
    response, err := client.Do(request)
    if err != nil { fmt.Fprintln(os.Stderr, "Proxy request failed; check network and credentials"); os.Exit(1) }
    defer response.Body.Close()
    if response.StatusCode < 200 || response.StatusCode >= 300 {
        fmt.Fprintln(os.Stderr, "HTTP status:", response.StatusCode)
        os.Exit(1)
    }
    body, err := io.ReadAll(io.LimitReader(response.Body, 1<<20))
    if err != nil { fmt.Fprintln(os.Stderr, "Cannot read response"); os.Exit(1) }
    fmt.Println(string(body))
}

По умолчанию PROXY_SCHEME=http. Для SOCKS5 задайте socks5h и соответствующий SOCKS5-порт: имя назначения будет разрешаться удалённо. Смена протокола не меняет выделенный статический выход.

Если подключение не работает ​

Если пример работает, а приложение нет, проверьте процесс, реально выполняющий запрос, настройки SDK, тайм-ауты и повторы. Не отключайте проверку TLS-сертификатов. Пример не выводит ошибки с данными доступа; диагностические журналы тоже нужно очищать. См. FAQ.