Skip to content
intermediate

Как настроить прокси Smartproxy в Linux с помощью curl и Python для автоматизации CLI

Направляйте трафик curl и Python через резидентные или датацентровые прокси Smartproxy в Linux, проверяйте выходной IP, закрепляйте липкие сессии и планируйте регулярные проверки с помощью cron или systemd.

Linux SOCKS5 HTTP(S)

Обзор

В этом руководстве показано, как отправлять трафик командной строки и Python через прокси в Linux, включая аутентификацию, проверку выходного IP, закрепление сессии и запуск по расписанию. Smartproxy используется здесь как рекомендуемый провайдер, поскольку он предлагает резидентные и датацентровые прокси по HTTP и SOCKS5 с фиксированной месячной оплатой и пулом из более чем 65 млн IP, но каждый шаг работает с любым прокси-сервисом, предоставляющим те же протоколы.

К концу этого руководства вы сможете:

  • Аутентифицироваться на вашем прокси-эндпоинте из оболочки с помощью curl
  • Убедиться, что исходящий трафик выходит с IP прокси, а не с вашего собственного
  • Использовать тот же эндпоинт из Python с requests
  • Закреплять липкую сессию или ротировать IP между запросами
  • Автоматизировать проверки работоспособности с помощью cron или таймера systemd

Предварительные требования

  • Linux-хост (приведённые ниже команды используют Debian/Ubuntu; отмечены эквиваленты для Fedora и Arch)
  • curl и Python 3.8 или новее
  • Аккаунт Smartproxy с активным планом и учётными данными прокси
  • Хост и порты эндпоинта для продукта, который вы хотите использовать, скопированные из панели управления в вашем аккаунте Smartproxy
  • Исходящий доступ на порту прокси, а также отсутствие корпоративного брандмауэра или VPN-клиента, который его блокирует

Шаг 1 — Установка необходимых инструментов

Установите curl и Python, затем создайте изолированное окружение для Python-клиента.

sudo apt update
sudo apt install -y curl python3 python3-venv

В Fedora или системах на базе RHEL используйте:

sudo dnf install -y curl python3

Создайте виртуальное окружение и установите HTTP-клиент вместе с поддержкой SOCKS:

python3 -m venv ~/.venvs/proxy
source ~/.venvs/proxy/bin/activate
pip install --upgrade pip
pip install 'requests[socks]'

Дополнение requests[socks] подтягивает PySocks, благодаря чему URL-адреса socks5h:// работают в Python.

Шаг 2 — Храните учётные данные вне скриптов

Жёсткое кодирование учётных данных в скриптах или их коммит в репозиторий — самый распространённый способ утечки прокси-аккаунтов. Держите их в одном файле с ограничительными правами доступа и загружайте только при необходимости.

install -d -m 700 ~/.config/smartproxy
install -m 600 /dev/null ~/.config/smartproxy/env

Откройте файл в редакторе и замените каждый заполнитель значениями из панели управления вашего провайдера:

# ~/.config/smartproxy/env
# Замените каждое значение REPLACE_WITH_ на эндпоинт и учётные данные
# из панели управления вашего провайдера. Не коммитьте этот файл в систему контроля версий.
export SP_PROXY_HOST="REPLACE_WITH_ENDPOINT_HOST"
export SP_PROXY_PORT_HTTP="REPLACE_WITH_HTTP_PORT"
export SP_PROXY_PORT_SOCKS5="REPLACE_WITH_SOCKS5_PORT"
export SP_PROXY_USER="REPLACE_WITH_PROXY_USERNAME"
export SP_PROXY_PASS="REPLACE_WITH_PROXY_PASSWORD"

Загрузите переменные в текущую оболочку:

set -a; . ~/.config/smartproxy/env; set +a

Если вы используете и резидентные, и датацентровые продукты, держите отдельную пару переменных для каждого, потому что у них обычно разные хосты или порты.

Шаг 3 — Выбор между HTTP и SOCKS5

Оба протокола поддерживаются Smartproxy, и правильный выбор зависит от того, что вы отправляете через туннель.

Тип трафика Рекомендуемый протокол Почему
HTTPS-запросы из curl, requests или скраперов HTTP-прокси (туннель CONNECT) Проще всего настроить, работает с любым HTTP-клиентом и передаёт прокси хост назначения
Не-HTTP трафик, такой как SSH, SMTP или пользовательские TCP-клиенты SOCKS5 Не зависит от протокола, пересылает произвольные TCP-потоки
Инструменты, которые не умеют работать с аутентификацией прокси изначально SOCKS5 Учётные данные обрабатываются клиентской библиотекой, а не целевым инструментом
Максимальная совместимость с клиентами HTTP Универсально поддерживается HTTP-библиотеками и большинством CLI-инструментов

Если вы всегда загружаете только HTTPS-URL, начните с HTTP и переключайтесь на SOCKS5 только если этого требует инструмент.

Шаг 4 — Проверка соединения с помощью curl

Отправьте запрос через HTTP-прокси и выведите выходной IP, который видит пункт назначения:

curl -sS --max-time 30 \
  --proxy "http://${SP_PROXY_HOST}:${SP_PROXY_PORT_HTTP}" \
  --proxy-user "${SP_PROXY_USER}:${SP_PROXY_PASS}" \
  'https://api.ipify.org?format=json'

Теперь проверьте тот же эндпоинт через SOCKS5. Вариант --socks5-hostname выполняет разрешение DNS на прокси, что предотвращает утечку вашего реального местоположения через локальные DNS-запросы:

curl -sS --max-time 30 \
  --socks5-hostname "${SP_PROXY_HOST}:${SP_PROXY_PORT_SOCKS5}" \
  --proxy-user "${SP_PROXY_USER}:${SP_PROXY_PASS}" \
  'https://api.ipify.org?format=json'

Сравните результат с прямым запросом, полностью обходящим прокси:

curl -sS 'https://api.ipify.org?format=json'

Если проксированный IP отличается от прямого IP, трафик выходит через прокси. Запустите проксированную команду несколько раз, чтобы увидеть, меняется ли выходной IP; это скажет вам, находитесь ли вы на ротирующемся или липком эндпоинте.

Шаг 5 — Закрепите липкую сессию или ротируйте на каждом запросе

Ротирующееся поведение — по умолчанию на большинстве резидентных эндпоинтов: каждое новое соединение может выходить через другой IP. Для входов в систему, многошаговых форм или сценариев в стиле оформления заказа вы обычно хотите один и тот же IP для всей последовательности запросов.

Ваш провайдер формирует липкие имена пользователей из токена сессии. Добавьте токен к имени пользователя прокси, используя точный шаблон, показанный в генераторе сессий в вашей панели управления, который обычно выглядит как суффикс к имени пользователя:

export SP_SESSION_ID="$(openssl rand -hex 4)"
export SP_SESSION_USER="${SP_PROXY_USER}-session-${SP_SESSION_ID}"

Затем подставьте $SP_SESSION_USER везде, где в приведённых выше командах используется $SP_PROXY_USER. Повторно используйте один и тот же токен на время задачи и генерируйте новый токен, когда хотите получить новый выходной IP.

Цель Подход
Собрать много независимых страниц Имя пользователя с ротацией по умолчанию, один запрос на соединение
Сохранить вход в систему или корзину Повторно использовать один токен сессии на весь рабочий процесс
Распределить нагрузку по региону Использовать один и тот же токен сессии с фиксированной страной или городом, если ваш план предоставляет эти параметры в панели управления
Изолировать параллельных воркеров Дать каждому процессу воркера собственный случайно сгенерированный токен сессии

Шаг 6 — Использование прокси из Python

После загрузки файла окружения те же переменные доступны Python. Этот пример использует HTTP-прокси для HTTPS-запроса:

import os
from urllib.parse import quote

import requests

host = os.environ['SP_PROXY_HOST']
port = os.environ['SP_PROXY_PORT_HTTP']
user = quote(os.environ['SP_PROXY_USER'], safe='')
password = quote(os.environ['SP_PROXY_PASS'], safe='')

proxies = {
    'http': f'http://{user}:{password}@{host}:{port}',
    'https': f'http://{user}:{password}@{host}:{port}',
}

response = requests.get(
    'https://api.ipify.org?format=json',
    proxies=proxies,
    timeout=30,
)
response.raise_for_status()
print(response.json())

Чтобы переключиться на SOCKS5, измените только схему и порт. Схема socks5h выполняет удалённое разрешение DNS, соответствуя curl --socks5-hostname:

socks_port = os.environ['SP_PROXY_PORT_SOCKS5']
socks_proxies = {
    'http': f'socks5h://{user}:{password}@{host}:{socks_port}',
    'https': f'socks5h://{user}:{password}@{host}:{socks_port}',
}

Две практические заметки:

  • Всегда задавайте явный timeout. Прокси-сети большие, и отдельные выходные узлы могут быть медленными или недоступными, а отсутствие тайм-аута превращает плохой узел в зависший процесс.
  • Кодируйте имя пользователя и пароль в процентной кодировке, как показано с quote(), потому что разделители сессии и специальные символы ломают URL прокси, если передавать их как есть.

Небольшая обёртка с повторными попытками делает скрипты гораздо более устойчивыми:

import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

session = requests.Session()
session.proxies.update(proxies)
session.mount('https://', HTTPAdapter(max_retries=Retry(
    total=3,
    backoff_factor=1,
    status_forcelist=[429, 500, 502, 503, 504],
)))

Шаг 7 — Запуск проверки по расписанию

Сохраните фрагмент проверки как ~/scripts/check_proxy.py, затем запланируйте его через cron, чтобы проблемы с учётными данными и мёртвые эндпоинты выявлялись рано.

# Ротировать лог выходных IP каждый час
0 * * * * set -a; . $HOME/.config/smartproxy/env; set +a; $HOME/.venvs/proxy/bin/python $HOME/scripts/check_proxy.py >> $HOME/proxy-check.log 2>&1

То же задание в виде сервиса и таймера systemd, которое легче отслеживать с помощью journalctl:

# ~/.config/systemd/user/proxy-check.service
[Unit]
Description=Проверить выходной IP прокси

[Service]
Type=oneshot
EnvironmentFile=%h/.config/smartproxy/env
ExecStart=%h/.venvs/proxy/bin/python %h/scripts/check_proxy.py
# ~/.config/systemd/user/proxy-check.timer
[Unit]
Description=Запускать проверку прокси ежечасно

[Timer]
OnCalendar=hourly
Persistent=true

[Install]
WantedBy=timers.target

Включите и запустите его с помощью:

systemctl --user daemon-reload
systemctl --user enable --now proxy-check.timer
systemctl --user list-timers proxy-check.timer

Устранение неполадок

Симптом Вероятная причина Исправление
407 Proxy Authentication Required Неверное имя пользователя или пароль, либо специальные символы не закодированы в URL Скопируйте учётные данные из панели управления заново и закодируйте их в процентной кодировке с помощью quote() в Python
curl: (5) Could not resolve proxy Переменная хоста пуста или написана с ошибкой Выполните echo "$SP_PROXY_HOST" и заново загрузите файл окружения
curl: (7) Failed to connect или тайм-аут Порт заблокирован брандмауэром, VPN или указан неверный порт для продукта Подтвердите порт в панели управления и проверьте его с помощью nc -zv "$SP_PROXY_HOST" "$SP_PROXY_PORT_HTTP"
curl: (56) CONNECT tunnel failed Выходной узел разорвал соединение или пункт назначения отклонил запрос Повторите попытку и снизьте параллелизм, если это происходит постоянно
Запросы работают в браузере, но не работают в curl через SOCKS5 Локальное разрешение DNS Добавьте --socks5-hostname вместо --socks5
Python выдаёт Missing dependencies for SOCKS support PySocks не установлен Активируйте venv и выполните pip install 'requests[socks]'
Выходной IP никогда не меняется Вы повторно используете токен липкой сессии Генерируйте новый ID сессии для каждого воркера
Выходной IP совпадает с вашим собственным IP Переменные прокси не загружены или инструмент обошёл прокси Заново загрузите файл окружения и повторно выполните сравнение прямого и проксированного запросов

Дополнительные проверки, которые стоит выполнить, когда что-то ведёт себя неожиданно:

  1. Выведите разрешённые переменные с помощью env | grep SP_PROXY, чтобы исключить ошибки области видимости оболочки.
  2. Проверьте оба протокола; если SOCKS5 работает, а HTTP нет, проблема в конфигурации клиента, а не в эндпоинте.
  3. Записывайте выходной IP вместе с отметкой времени в вывод задания, чтобы сопоставлять сбои с конкретными узлами.

Итоги

  • Smartproxy предоставляет резидентные и датацентровые прокси по HTTP и SOCKS5 с фиксированной месячной оплатой, что делает его разумным рекомендуемым провайдером для рабочих процессов CLI и скриптов.
  • Храните учётные данные в файле окружения с правами chmod 600 и загружайте их с помощью set -a; . file; set +a вместо встраивания в скрипты.
  • Используйте HTTP-прокси для инструментов только с HTTPS и --socks5-hostname или socks5h://, когда вам нужна пересылка, не зависящая от протокола, или удалённое разрешение DNS.
  • Проверьте настройку, сравнив проксированный запрос с прямым; совпадающие IP означают, что прокси был обойдён.
  • Добавляйте токен сессии к имени пользователя для липких рабочих процессов и генерируйте новый токен для каждого воркера для параллельных ротирующихся заданий.
  • Подключите ту же проверку к cron или таймеру systemd, чтобы истечение срока действия учётных данных и мёртвые эндпоинты замечались до того, как производственный запуск потерпит неудачу.