Настройка работы API со space-track.org через прокси (или как задать нужный прокси и сертификат к нему)
Есть рабочая программа, которая получает данные с https://www.space-track.org/. Весь смысл заключается в строках:
session = requests.Session() #создание сессии
resp = session.post(urlLog, data=siteCred) #авторизация на сайте
resp = session.get(url) #уже непосредственное получение данных по нужным ссылкам (по номерам спутников)
На нормальном интернете, всё работает прекрасно. Но теперь нужно организовать работу проги через урезанный рабочий инет, имея данные прокси. Я предполагаю, что прокси и верификацию (или её отсутствие) нужно прописывать в post (при авторизации), а не в get (где уже идёт получение данных).
На данный момент метод resp = session.post(urlLog, data=siteCred, proxies=proxies, verify=False) не работает. Выдаёт предупреждение /usr/lib/python3/dist-packages/urllib3/connectionpool.py:845: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings InsecureRequestWarning)
Для примера, при попытке получить данные по спутнику LCS 1 (с номером 1361) выбрасывает ошибку HTTPSConnectionPool(host='www.space-track.org', port=443): Max retries exceeded with url: /basicspacedata/query/class/tle_latest/ORDINAL/1/NORAD_CAT_ID/1361/orderby/TLE_LINE1%20ASC/format/3le (Caused by NewConnectionError('<requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0xb6b47f0c>: Failed to establish a new connection: [Errno 111] Connection refused',))
Таймауты не помогают. Вариант через HTTPProxyAuth тоже. Способ с игнором ворнингов через urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) сам ворнинг убирает, но ошибка [Errno 111] остаётся.
Если аргумент verify= вообще убрать, получаю: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:720) Также вопрос, какой правильный формат у прокси? Логин:пасс@Прокси:порт?
Где искать источники ошибок?
Upd. Коллеги подсказали, что нужно прописывать местный файл сертификат. Он есть, в формате .cer. (Какой формат в принципе подходит? В сети видела примеры, где нужен формат .pem. Перевести из .cer в .pem с помощью openssl мне не удалось) Если в post указывать дополнительный пункт cert='самСертификат.cer', то выдаёт ошибку [SSL] PEM lib (_ssl.c:2964), если его указать в verify=, то та же самая [Errno 111] выходит. В чём может быть косяк?
Upd 2. Т.к. на работе много чего урезано, нет доступа ко многим полезным библиотекам питона. Например, я натыкаюсь на варианты с использованием SmartConnectNoSSL из pyVim.connect, но тоже не могу их проверить из-за отсутствия возможности поставить pyVim.
Буду рада, если подскажете, какие ещё варианты стоит проверить и попробовать. Или как корректно использовать уже найденные.
Ответы (1 шт):
Проблема решена. Прокси был прописан в неверном формате. ("https": "https://" и "ftp": "ftp://", вместо "https": "http://" и "ftp": "http://"). Закидывать нужно было не аргументами в post и get, а вообще задавать как session.proxies = . Сертификат не нужен. Верификацию убирать через verify=False, ворнинги через:
from urllib3 import disable_warnings, exceptions
disable_warnings(exceptions.InsecureRequestWarning)