Подключение из Go
Пример отправляет запрос через выделенную статическую точку подключения. Данные берутся из окружения процесса; по умолчанию HTTP-прокси используется для HTTPS-адреса. Получения и ротации IP нет.
Подготовка
Задайте PROXY_HOST, PROXY_PORT, PROXY_USERNAME, PROXY_PASSWORD в терминале, контейнере или среде развёртывания программы. Используйте актуальные данные панели и порт выбранного протокола. Не помещайте реальные пароли в репозиторий, журналы или клиентский код.
Среда и зависимости
Используйте поддерживаемую версию Go; достаточно стандартной библиотеки. Сохраните как proxy_example.go.
go run proxy_example.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.