Как настроить прокси Smartproxy в Linux с помощью curl и Python для автоматизации CLI
Направляйте трафик curl и Python через резидентные или датацентровые прокси Smartproxy в Linux, проверяйте выходной IP, закрепляйте липкие сессии и планируйте регулярные проверки с помощью cron или systemd.
Обзор
В этом руководстве показано, как отправлять трафик командной строки и 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 | Переменные прокси не загружены или инструмент обошёл прокси | Заново загрузите файл окружения и повторно выполните сравнение прямого и проксированного запросов |
Дополнительные проверки, которые стоит выполнить, когда что-то ведёт себя неожиданно:
- Выведите разрешённые переменные с помощью
env | grep SP_PROXY, чтобы исключить ошибки области видимости оболочки. - Проверьте оба протокола; если SOCKS5 работает, а HTTP нет, проблема в конфигурации клиента, а не в эндпоинте.
- Записывайте выходной IP вместе с отметкой времени в вывод задания, чтобы сопоставлять сбои с конкретными узлами.
Итоги
- Smartproxy предоставляет резидентные и датацентровые прокси по HTTP и SOCKS5 с фиксированной месячной оплатой, что делает его разумным рекомендуемым провайдером для рабочих процессов CLI и скриптов.
- Храните учётные данные в файле окружения с правами
chmod 600и загружайте их с помощьюset -a; . file; set +aвместо встраивания в скрипты. - Используйте HTTP-прокси для инструментов только с HTTPS и
--socks5-hostnameилиsocks5h://, когда вам нужна пересылка, не зависящая от протокола, или удалённое разрешение DNS. - Проверьте настройку, сравнив проксированный запрос с прямым; совпадающие IP означают, что прокси был обойдён.
- Добавляйте токен сессии к имени пользователя для липких рабочих процессов и генерируйте новый токен для каждого воркера для параллельных ротирующихся заданий.
- Подключите ту же проверку к cron или таймеру systemd, чтобы истечение срока действия учётных данных и мёртвые эндпоинты замечались до того, как производственный запуск потерпит неудачу.