Вход Регистрация

Прокси

Как задать прокси в Python Requests: подробное руководство

Узнайте, как настроить прокси в библиотеке requests для Python. Примеры кода, пошаговая инструкция и лучшие практики по ротации IP-адреса и обходу блокировок.

Команда Froxy 15 мая 2025 11 мин
Как задать прокси в Python Requests: подробное руководство

Для пары страниц хватит и ручного контроля капчи. Но на объемах без автоматических защит от ботов не обойтись. Самый простой и надежный путь: парсинг через прокси с ротацией. Разберем, как правильно связать прокси с библиотекой Python Requests, каких ошибок избегать и как не словить бан.

В гайде разобрано всё, что нужно для работы с прокси в Python Requests: базовая настройка, аутентификация, HTTP и SOCKS5, прокси на уровне сессии, ротация IP и разбор типичных ошибок. Подойдёт и для одного скрипта с одним прокси, и для полноценной схемы с пулом адресов и ротацией.

Вкратце, чтобы отправить запрос через прокси в Python Requests, передайте в requests.get() параметр proxies: словарь с ключами http и https, значения которых указывают на адрес прокси-сервера. После этого запрос идёт через прокси, и сайт видит его IP, а не ваш. Всё остальное (авторизация, SOCKS5, сессии, ротация) надстраивается над этой конструкцией.

Что такое Python Requests?

Python Requests — главная библиотека для работы с HTTP-запросами на Python. Она работает поверх urllib3, но дает разработчику понятный «человечный» синтаксис.

Основные возможности:

  • HTTP-методы: полная поддержка GET, POST, PUT, DELETE и др.
  • Управление сессиями: сохранение кук, заголовков и соединений через requests.Session.
  • Форматы данных: автоматическое кодирование в Unicode и встроенная обработка JSON.
  • Безопасность: проверка SSL/TLS-сертификатов и таймаутов.
  • Работа с прокси: поддержка HTTP/HTTPS из коробки, а также SOCKS4/SOCKS5 через пакет requests[socks].

Настройки прокси передаются прямо в запрос, отдельной обвязки для этого не нужно.

Типы прокси для Python Requests

Типы прокси для Python Requests

Requests из коробки работает с тремя схемами, и различаются они тем, что происходит с трафиком.

HTTP-прокси принимает обычный HTTP-запрос, читает его целиком и пересылает дальше от своего имени. Схема в URL — http://.

HTTPS через HTTP-прокси работает иначе: клиент отправляет прокси метод CONNECT, тот открывает TCP-туннель до целевого хоста, и внутри туннеля TLS устанавливается напрямую между вашим скриптом и сайтом. Прокси видит только домен и объём трафика, но не содержимое. Именно поэтому в словаре proxies для ключа https чаще всего указывают схему http:// — она описывает, как вы подключаетесь к прокси, а не то, каким протоколом идёт запрос к сайту.

SOCKS4/SOCKS5 — прокси уровня транспорта: он не разбирает HTTP вообще, а просто перекладывает TCP-поток. Поэтому меньше следов в заголовках. Требует пакета requests[socks], подробнее — в разделе про SOCKS5 ниже.

Конфигурация всегда одна и та же: словарь proxies с ключами http и https, в значениях — URL прокси. Меняется только схема в URL.

Python Requests + Proxy: пошаговый гайд

Python Requests + Proxy: пошаговый гайд

В Windows-системах позаботьтесь о том, чтобы Python добавился в переменные среды (Path). По аналогии нужно добавить вызов апплета pip (это менеджер пакетов для Python).

Пример того, как это может выглядеть:

Python

Установка библиотеки Python Requests

Ставим саму библиотеку requests, а если понадобится SOCKS5 или защита от TLS-фингерпринтинга — дополнительные пакеты.

pip install requests
pip install requests[socks]   # если нужен SOCKS5
pip install curl_cffi         # если понадобится обходить TLS-фингерпринтинг (см. ниже)

Если pip не находится в консоли — используйте python -m pip install requests, это обходит проблемы с PATH.

Базовый запрос через proxy

Проверяем самый простой случай: один GET-запрос идёт через прокси-сервер, и сайт увидит IP прокси, а не ваш.

import requests

proxies = {
    'http': 'http://123.58.199.17:8168',
    'https': 'http://123.58.199.17:8168',
}

response = requests.get('https://example.com', proxies=proxies, timeout=5)
print(response.status_code)

В ответ возвращается обычный объект Response — с ним работаем как без прокси: status_code, text, json().

123.58.199.17:8168 — это просто пример-заглушка. Его нужно заменить на данные вашего реального прокси-сервера. Креды можно найти в личном аккаунте. Вот как это выглядит у Froxy:

Ключи 'http' и 'https' задаются отдельно — прокси может обрабатывать оба протокола одинаково, но библиотека всё равно требует разделения.

timeout=5 обязателен на практике: без него при недоступном прокси запрос может зависнуть на десятки секунд (зависит от TCP-стека ОС).

Проверка, что прокси реально применился — сравните exit IP с вашим собственным:

response = requests.get('https://httpbin.org/ip', proxies=proxies, timeout=5)
print(response.json()) # должен показать IP прокси, а не ваш

Парочка ошибок:

  • Если получаете 407 Proxy Authentication Required — нужна авторизация (см. раздел ниже).
  • Если ловите ConnectTimeout — прокси мёртв или не принимает соединения на этот порт.
  • Если SSLError при HTTPS через HTTP-прокси — часто помогает явно указать схему http:// для обоих ключей, даже для 'https'.

Полный разбор кодов и ошибок в разделе «Типичные ошибки и что с ними делать».

С User-Agent и обработкой ошибок

Дополняем базовый запрос двумя вещами: заголовком, который маскирует запрос под обычный браузер (по умолчанию requests честно сообщает сайту, что это скрипт), и блоком try/except, чтобы скрипт не падал целиком при сетевой ошибке.

import requests

proxies = {
    'http': 'http://198.49.68.80:80',
    'https': 'http://198.49.68.80:80',
}

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36'
}

try:
    response = requests.get('https://example.com', proxies=proxies, headers=headers, timeout=5)
    print(response.status_code)
except requests.exceptions.RequestException as e:
    print(f"Error: {e}")

requests.exceptions.RequestException — это базовый класс для всех ошибок библиотеки (ConnectionError, Timeout, TooManyRedirects и т.д.), поэтому except на нём ловит любую проблему сети/прокси разом.

User-Agent нужен, потому что многие сайты возвращают другой (упрощённый или блокирующий) контент, если видят дефолтный python-requests/x.x.x в заголовке.

Если сайт всё равно блокирует — добавьте ещё Accept-Language и Referer, некоторые анти-бот системы проверяют их согласованность с User-Agent.

Ограничение: TLS-фингерпринтинг (JA3/JA4)

У метода выше есть потолок: User-Agent — это просто заголовок, а вот сам TLS-хендшейк requests делает через urllib3/OpenSSL, и его «отпечаток» (набор шифров, порядок extensions) не совпадает с хендшейком настоящего браузера. Cloudflare, Akamai, DataDome и подобные системы сверяют этот отпечаток отдельно от IP и заголовков — то есть даже через идеальный прокси с правильным User-Agent запрос может блокироваться на уровне TLS, до того как сайт вообще посмотрит на заголовки.

Как понять, что дело в этом? блок стабилен независимо от смены прокси/User-Agent, часто 403 без внятного тела или JS-челлендж.

Что делать:

from curl_cffi import requests as cf_requests

response = cf_requests.get(
    'https://example.com',
    proxies={'https': 'http://user:pass@host:port'},
    impersonate='chrome124',   # подделывает TLS/HTTP2-отпечаток конкретного браузера
)
print(response.status_code)

Альтернатива — httpx с HTTP/2 (pip install httpx[http2]) ближе к браузеру по протоколу, но сам TLS-отпечаток не подделывает. Если блокировка именно по JA3/JA4, нужен curl_cffi или headless-браузер.

Proxy на уровне сессии

Если нужно сделать много запросов подряд, Session задаёт настройки прокси один раз и, что важнее, держит пул уже открытых TCP-соединений (urllib3.PoolManager) на каждый хост — новые запросы переиспользуют их вместо повторного TCP+TLS handshake на каждый вызов. Для одного запроса разницы нет, экономия заметна на десятках и сотнях запросов на один хост.

import requests
from requests.adapters import HTTPAdapter

session = requests.Session()
session.trust_env = False   # см. пояснение ниже

session.proxies.update({
    'http': 'http://45.155.226.176:3128',
    'https': 'http://172.67.182.20:1080',
})

adapter = HTTPAdapter(pool_connections=10, pool_maxsize=10)  # размер пула соединений на хост
session.mount("https://", adapter)
session.mount("http://", adapter)

response = session.get('https://example.com', timeout=5)

Почему trust_env = False: по умолчанию Session подмешивает прокси из переменных окружения (HTTP_PROXY/HTTPS_PROXY) поверх того, что вы задали в коде через session.proxies. Это давняя особенность (issue в repo requests с 2014 года, актуальна до сих пор) — она путает, потому что поведение выглядит так, будто ваши настройки просто игнорируются. trust_env = False отключает это подмешивание, и session.proxies работает предсказуемо.

Как отключить прокси для одного запроса

Иногда прокси задан глобально (в сессии или в переменных окружения), а один конкретный запрос нужно отправить напрямую: проверить свой реальный IP, обратиться к внутреннему сервису, скачать что-то с локального хоста. Для этого нужно передать в запрос None вместо адресов:

response = session.get('https://httpbin.org/ip', proxies={'http': None, 'https': None}, timeout=5)

Ключи со значением None из итоговой конфигурации удаляются полностью, поэтому такой вызов перебивает и настройки сессии, и переменные окружения. Сравните IP из такого ответа с тем, что возвращается без None, чтобы проверить как вообще отрабатывают прокси.

Ретраи через HTTPAdapter + urllib3.Retry

Для одного прокси или сайта, который иногда просто флапает (таймауты, 502/503), ручной цикл не нужен: retry можно встроить прямо в транспорт сессии.

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

session = requests.Session()

retry_strategy = Retry(
    total=5,                                     # всего попыток
    backoff_factor=1,                            # пауза между попытками: 1s, 2s, 4s, 8s...
    status_forcelist=[429, 500, 502, 503, 504],  # какие HTTP-коды считать «повторить»
    allowed_methods=["GET", "POST"],
)

adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("https://", adapter)
session.mount("http://", adapter)

session.proxies.update({'http': 'http://host:port', 'https': 'http://host:port'})

response = session.get('https://example.com', timeout=5)

Это решает ту же задачу, что ручной for + sleep в разделе ротации ниже, но для одного прокси. Ручную ротацию из последнего раздела используйте, когда есть список из нескольких прокси и нужно переключаться между ними, а не повторять на том же самом.

Аутентификация

Если прокси требует логин и пароль, они передаются прямо в URL прокси — отдельного параметра для них в requests нет. Логин и пароль можно также найти в личном кабинете.

proxies = {
    'http': 'http://login:password@45.155.226.176:3128',
    'https': 'http://login:password@45.155.226.176:3128',
}

Формат user:pass@host:port одинаков и для HTTP, и для SOCKS5. Прокси проверяет креды у себя и только потом пересылает запрос дальше, поэтому на целевой сайт эти логин и пароль не попадают.

Если логин или пароль содержат спецсимволы (@, :, /) — их нужно URL-энкодить (urllib.parse.quote), иначе парсер URL сломается на границе логина/пароля/хоста:

from urllib.parse import quote

user = quote("my@login")
pwd = quote("p@ss:word")
proxy_url = f"http://{user}:{pwd}@45.155.226.176:3128"

Важно! Не коммитьте прокси с логином/паролем в открытый код или репозиторий — выносите в переменные окружения или .env-файл (смотрите гайд ниже).

Через переменные окружения

Чтобы не хранить адрес и пароль прокси прямо в коде, их можно задать в окружении ОС — requests подхватит их сам, без единого упоминания proxies= в скрипте.

export HTTP_PROXY="http://45.155.226.176:80"
export HTTPS_PROXY="http://45.155.226.176:8080"

Windows (PowerShell):

$env:HTTP_PROXY="http://45.155.226.176:80"
$env:HTTPS_PROXY="http://45.155.226.176:8080"

Если не работает: переменные, заданные через export/$env:, живут только в текущей сессии терминала — если открыть новый терминал или перезапустить IDE, они пропадут. Для постоянного эффекта прописывайте в ~/.bashrc, ~/.zshrc или системные переменные Windows.

SOCKS5

SOCKS5 — отдельный тип прокси-протокола — часто быстрее и менее заметен для анти-бот систем, чем обычный HTTP-прокси. В коде отличается только префиксом схемы в URL.

proxies = {
    'http': 'socks5://user:pass@proxy-host:port',
    'https': 'socks5://user:pass@proxy-host:port',
}
export ALL_PROXY="socks5://45.155.226.176:3434"

SOCKS-поддержка работает через отдельный пакет PySocks, который подтягивается флагом requests[socks] при установке. Если поставить только requests, схема socks5:// вызовет ошибку вроде MissingSchema/InvalidSchema.

Совет: socks5h:// (вместо socks5://) заставляет резолвить DNS-имена через сам прокси, а не локально — полезно, если нужно скрыть DNS-запросы или прокси в другой сети видит хосты, недоступные вам напрямую.

SOCKS5 не разбирает HTTP, а просто проксирует TCP-поток, поэтому его используют не только для скрапинга, но и для любого другого трафика. В связке с Requests это остаётся TCP: SOCKS5 библиотека не задействует UDP-режим, так что выигрыш здесь только в меньшем количестве следов на уровне заголовков.

Ротация IP-адреса

По желанию, при каждом запросе можно брать случайный (или следующий по кругу) прокси из списка, чтобы не долбить сайт с одного и того же IP. Ниже рабочий код для такой схемы:

import requests
import random
import time

proxy_list = [
    "http://222.252.194.204:5000",
    "http://162.223.90.130:5100",
    "http://login:password@45.155.226.176:3128",
    "http://50.217.226.41:5050",
]

def proxy_request(request_type, url, max_attempts=5, **kwargs):
    for attempt in range(max_attempts):
        proxy = random.choice(proxy_list)
        current_proxies = {"http": proxy, "https": proxy}
        try:
            response = requests.request(request_type, url, proxies=current_proxies, timeout=5, **kwargs)
            print(f"Proxy used: {proxy}")
            return response
        except requests.exceptions.RequestException as e:
            print(f"Attempt {attempt + 1} failed via {proxy}: {e}")
            time.sleep(1)
    raise RuntimeError("All proxy attempts failed")

response = proxy_request('GET', 'https://example.com')

Если вместо случайного выбора нужен обход по кругу (round-robin):

from itertools import cycle

proxy_cycle = cycle(proxy_list)

def next_proxy():
    return next(proxy_cycle)

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

Residential Proxies

Резидентные прокси с ротацией для сбора данных по всему миру.

Попробовать $1.99, 100Mb

Типичные ошибки и что с ними делать

Типичные ошибки прокси в Python Requests

Все сетевые ошибки Requests наследуются от requests.exceptions.RequestException, поэтому в скрипте достаточно ловить его. Но полезно смотреть, какая конкретно ошибка вылезла.

Код/ошибка

Причина

Что делать

407 Proxy Authentication Required

Прокси не получил креды или не принял их

Добавить user:pass@ в URL прокси, спецсимволы надо URL-энкодить

401 Unauthorized

Ошибка авторизации на целевом сайте, а не на прокси

Проверять креды сайта

403 Forbidden

Прокси блокирует ваш IP или сам целевой сайт

Проверить IP в allowlist провайдера и разрешён ли таргет

Timeout / ProxyError

Прокси не работает, перегружен или таргет висит

Всегда ставить timeout=, делать fallback на следующий прокси из пула

SSLError

Прокси подменяет сертификат или HTTPS идёт не через CONNECT

Указать схему http:// для обоих ключей; в тестах — свой CA через verify='/path/ca.pem'

verify=False действительно снимает проверку сертификата и может починить SSLError, но вместе с ней снимает защиту от подмены трафика. В тестовом окружении можно попробовать, но точно не в рабочем скрипте. Безопаснее будет передать в verify= путь к сертификату прокси.

Лучшие практики и соображения безопасности

Парсинг через прокси в Python Requests

Одного лишь прокси часто недостаточно: современные антибот-системы (Cloudflare, Akamai) анализируют не только IP, но и цифровой отпечаток.

  • Случайные задержки. Не отправляйте запросы с равными интервалами — добавляйте рандомные паузы между ними.
  • Ротация заголовков. Регулярно обновляйте User-Agent и заголовок Accept-Language.
  • TLS-отпечаток (JA3/JA4). Защиты видят отпечаток библиотеки Requests, который отличается от браузерного. Для защищенных ресурсов используйте Headless-браузеры (Playwright, Selenium) или специализированные библиотеки вроде curl_cffi.
  • Ловушки (Honeypot). Не переходите по скрытым ссылкам в коде страницы.
  • Авторазгадывание капчи. Подключайте сервисы решения капч для первой линии обороны.
  • Официальный API. Если у сайта есть открытый API, всегда используйте его — это быстрее и надежнее скрапинга.
  • Качество прокси. Бесплатные публичные прокси годятся только чтобы убедиться, что скрипт работает через прокси. Серверные прокси дают максимальную скорость и подходят, если таргет не проверяет происхождение IP. Резидентные и мобильные медленнее, но детектировать их сложнее.

Заключение и рекомендации

Прокси в Python Requests

Requests — удобный инструмент для базового парсинга. Однако успех работы на объемах зависят от качества прокси. Лучший выбор — анонимные ротируемые резидентные или мобильные IP.

Подключение прокси Froxy к Python Requests занимает несколько минут минут: пул из 120+ млн IP в 200+ локациях, таргетинг до города и провайдера, автоматическая ротация. Оценить сеть можно на триале — 3 дня полного доступа за $1.99.

FAQ

Как отправить запрос через прокси в Python Requests?

Передайте параметру proxies словарь с настройками для HTTP- и HTTPS-запросов:

import requests

proxies = {
    'http': 'http://host:port',
    'https': 'http://host:port',
}

response = requests.get(
    'https://example.com',
    proxies=proxies,
    timeout=(5, 20),
)

Ключ словаря соответствует протоколу целевого URL. Поэтому для ключа https допустимо значение, начинающееся с http://: HTTPS-запрос будет передан через HTTP-прокси с использованием метода CONNECT.

В кортеже timeout=(5, 20) первое значение определяет время ожидания подключения, второе — время ожидания данных. Это не общий лимит продолжительности запроса.

Как передать логин и пароль прокси?

Данные авторизации указываются в URL:

http://user:password@host:port

Если логин или пароль содержат @, :, /, #, % или другие специальные символы, их необходимо кодировать отдельно с помощью urllib.parse.quote и параметра safe=''.

URL с данными авторизации не следует хранить непосредственно в исходном коде или системе контроля версий.

Чем отличаются HTTP-, HTTPS- и SOCKS5-прокси?

HTTP-прокси принимает HTTP-запросы и передаёт их целевому серверу. Для HTTPS обычно используется метод CONNECT: прокси создаёт TCP-туннель, внутри которого клиент устанавливает TLS-соединение с сайтом.

HTTPS-прокси дополнительно использует TLS на участке между клиентом и самим прокси. Это защищает параметры подключения от перехвата в локальной сети.

SOCKS5 работает на транспортном уровне и передаёт TCP-трафик без анализа HTTP-запросов. Поэтому его можно использовать не только для HTTP и HTTPS, но и для других протоколов.

Как использовать SOCKS5 в Requests?

Сначала установите дополнительные зависимости командой python -m pip install "requests[socks]".

В адресе прокси укажите схему socks5:// или socks5h://. В первом случае DNS-разрешение выполняется на стороне клиента, во втором — через прокси.

Без дополнительных зависимостей Requests вернёт ошибку InvalidSchema.

Как задать прокси через переменные окружения?

Requests поддерживает переменные HTTP_PROXY, HTTPS_PROXY, ALL_PROXY и NO_PROXY. Допустимы имена как в верхнем, так и в нижнем регистре.

В Linux и macOS переменные задаются через export, в PowerShell — через $env:. После этого указывать proxies в каждом запросе не требуется.

Параметр proxies, переданный непосредственно методу запроса, имеет приоритет над переменными окружения. При этом значения из session.proxies могут быть переопределены настройками окружения.

Как исключить отдельные адреса из проксирования?

Используйте переменную NO_PROXY. В ней через запятую перечисляются домены и IP-адреса, к которым Requests должен подключаться напрямую.

Например, значение localhost,127.0.0.1,.example.com исключает локальные адреса и поддомены example.com.

Как отключить прокси для одного запроса?

Для стандартной конфигурации можно передать словарь {'http': None, 'https': None, 'all': None}. Однако этот способ не учитывает отдельные правила, заданные для конкретных хостов.

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

import requests

with requests.Session() as session:
    session.trust_env = False
    response = session.get(url, timeout=(5, 20))

Параметр trust_env = False отключает использование прокси и некоторых других настроек из окружения.

Почему прокси не работает и сайт видит реальный IP?

Наиболее распространённые причины:

  • прокси указан только для HTTP, а запрос выполняется по HTTPS;
  • в URL прокси отсутствует схема;
  • неверно указан адрес, порт, логин или пароль;
  • специальные символы в данных авторизации не закодированы;
  • настройки окружения переопределяют session.proxies;
  • при использовании socks5:// DNS-запросы выполняются локально;
  • прокси передаёт исходный IP в служебных заголовках;
  • часть трафика отправляется другой библиотекой без настроек прокси.

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

Проверить выходной IP можно запросом к https://httpbin.org/ip или другому сервису определения IP.

Что означает ошибка 407 Proxy Authentication Required?

Код 407 означает, что прокси требует авторизацию или отклонил переданные данные.

Необходимо проверить формат URL, логин, пароль, кодирование специальных символов и поддерживаемый прокси способ авторизации.

Код 401 Unauthorized относится к авторизации на целевом сайте, а не на прокси.

Как организовать ротацию прокси в Python Requests?

Есть два основных варианта:

  • Хранить список прокси и выбирать следующий или случайный адрес для каждого запроса. При сетевой ошибке запрос повторяется с другим адресом.
  • Использовать ротацию на стороне провайдера. Приложение подключается к одному шлюзу, а сервис самостоятельно меняет выходной IP.

При самостоятельной ротации необходимо обрабатывать ProxyError, ConnectTimeout, ReadTimeout и ограничивать количество повторных попыток. Ротация на стороне провайдера обычно проще при работе с большим пулом адресов.

Замедляет ли прокси работу Requests?

Да. Прокси добавляет промежуточный узел в сетевой маршрут. Для HTTPS также требуется создание туннеля и установка TLS-соединения.

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

Для серии запросов рекомендуется использовать Session:

with requests.Session() as session:
    session.trust_env = False
    session.proxies.update(proxies)
    response = session.get(url, timeout=(5, 20))

Сессия переиспользует соединения и сокращает количество повторных TCP- и TLS-согласований. Эффект наиболее заметен при нескольких запросах к одному хосту через один прокси.

Получайте уведомления о новых функциях и обновлениях Froxy

Узнайте первыми о новых функциях Froxy, чтобы оставаться в курсе событий происходящих на рынке цифровых технологий и получать новости о новых функциях Froxy.

Статьи по Теме

Как сделать ваш скрипт веб-парсинга легальным в 2026

Парсинг

Как сделать ваш скрипт веб-парсинга легальным в 2026

Гид по легальному веб-скрейпингу в 2026 году. Как собирать данные в сети без нарушения авторских прав и судебных исков. Практические советы и...

Команда Froxy 1 июл. 2026 7 мин
Проблемы с ротацией: как обеспечить смену IP в нужный момент

Прокси

Проблемы с ротацией: как обеспечить смену IP в нужный момент

IP не меняется вовремя? Разбираем причины: правила, провайдер, сессии. Настройка ротации по времени, запросу и сессии, защита от блокировок и падений...

Команда Froxy 5 нояб. 2025 7 мин