turns-00055.parquet:32375
dd0af81d230790e00a6a3aa9
turn 4/5gpt-4o-2024-11-20RussianRussia546 words
degenerate_repetitionAbsentFinal dense release
USER
преобразуй этот curl в питоновский request.
curl --location --request GET 'https://mc.api.sberbank.ru:443/prod/demo/json/v1/connectInfo?paramName=MaH98GFMaH98GFMaH98G' \
--header 'RqUID: <значение, удовлетворяющее паттерну ^[0-9a-fA-F]{32}$>' \
--header 'Authorization: Bearer <access_token> ' \
--cert-type P12 --cert {путь до контейнера p12}:{пароль от контейнера} \
--cacert russian-trusted-cacert.pem
ASSISTANT
Чтобы преобразовать данный `curl`-запрос в Python-скрипт с использованием библиотеки `requests`, учтем все параметры: метод `GET`, заголовки, клиентский сертификат в формате `.p12`, корневой сертификат (`cacert`), и точку API.
Для работы с клиентским сертификатом формата `P12` (pkcs12), мы будем использовать библиотеку `ssl` для предварительного преобразования, так как `requests` напрямую не поддерживает `.p12`. Мы преобразуем `.p12` в `.pem`, который уже поддерживается `requests`.
### Преобразованный `curl`-запрос в `requests`
```python
import requests
import ssl
import os
from OpenSSL import crypto
# Функция для преобразования P12 в PEM
def convert_p12_to_pem(p12_path: str, p12_password: str, output_cert_path: str, output_key_path: str):
"""
Конвертирует .p12 файл сертификата в .pem файлы (сертификат и ключ).
Args:
p12_path (str): Путь к файлу .p12.
p12_password (str): Пароль для .p12 файла.
output_cert_path (str): Путь для сохранения .pem файла.
output_key_path (str): Путь для сохранения ключа .pem.
"""
with open(p12_path, "rb") as p12_file:
# Загрузка p12-файла
p12 = crypto.load_pkcs12(p12_file.read(), p12_password.encode())
# Извлечение сертификата и ключа
cert = crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate())
key = crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey())
# Сохранение на диск
with open(output_cert_path, "wb") as cert_file:
cert_file.write(cert)
with open(output_key_path, "wb") as key_file:
key_file.write(key)
# Указываем пути до сертификатов
P12_PATH = "path/to/certificate.p12" # Замените на путь до вашего .p12 контейнера
P12_PASSWORD = "your_p12_password" # Пароль от контейнера .p12
PEM_CERT_PATH = "certificate.pem" # Здесь будет сохранен .pem сертификат
PEM_KEY_PATH = "key.pem" # Здесь будет сохранен .pem ключ
CA_CERT_PATH = "russian-trusted-cacert.pem" # Путь до корневого сертификата (CACERT)
# Выполняем конвертацию P12 в PEM
convert_p12_to_pem(P12_PATH, P12_PASSWORD, PEM_CERT_PATH, PEM_KEY_PATH)
# Указываем параметры запроса
url = "https://mc.api.sberbank.ru:443/prod/demo/json/v1/connectInfo"
params = {
"paramName": "MaH98GFMaH98GFMaH98G"
}
headers = {
"RqUID": "<значение, удовлетворяющее паттерну ^[0-9a-fA-F]{32}$>", # Укажите RqUID
"Authorization": "Bearer <access_token>", # Укажите ваш access_token
}
# Выполняем запрос
try:
response = requests.get(
url,
headers=headers,
params=params,
cert=(PEM_CERT_PATH, PEM_KEY_PATH),
verify=CA_CERT_PATH, # Указываем путь до корневого удостоверяющего центра
timeout=10, # Таймаут в секундах
)
# Логируем ответ
print("Статус ответа:", response.status_code)
try:
print("Тело ответа:", response.json())
except ValueError:
print("Некорректный JSON:", response.text)
except requests.exceptions.Timeout:
print("Превышено время ожидания ответа от сервера (таймаут).")
except requests.exceptions.RequestException as e:
print(f"Произошла ошибка при выполнении запроса: {e}")
# Очистка временных файлов PEM (по необходимости)
os.remove(PEM_CERT_PATH)
os.remove(PEM_KEY_PATH)
```
### Объяснение кода:
1. **Клиентский сертификат в формате `.p12`:**
- Так как `requests` не поддерживает `.p12` контейнеры, мы конвертируем его в `.pem` (сертификат и ключ) с помощью библиотеки `pyOpenSSL`.
- Сохраняем результат в файлы `certificate.pem` и `key.pem`.
2. **Корневой сертификат (`--cacert`):**
- `russian-trusted-cacert.pem` добавляется в параметр `verify`, чтобы библиотека `requests` правильно верифицировала SSL/TLS соединения.
3. **Заголовки:**
- Добавлены заголовки `RqUID` и `Authorization` согласно требованиям API.
4. **Параметры запроса:**
- Переменные в `params` используются для отправки GET-параметров.
5. **Таймаут на запрос:**
- Установлен через параметр `timeout=10`, чтобы предотвратить бесконечное ожидание ответа.
6. **Обработка ошибок:**
- Ошибки сети (`Timeout`, `RequestException`) и некорректных JSON-ответов обрабатываются отдельно, чтобы код был более устойчивым.
7. **Очистка временных файлов:**
- Временные `.pem` файлы удаляются после их использования (опционально, если не нужно сохранять их для других запросов).
### Зависимости:
- Убедитесь, что установлена библиотека `pyOpenSSL`:
```bash
pip install pyopenssl
```
### Итог:
Этот код полностью соответствует переданному `curl`-запросу и добавляет дополнительные удобства, такие как конвертация сертификатов и обработка ошибок. Не забудьте указать реальные значения `RqUID`, `access_token`, путь к сертификатам `.p12`, и корневой сертификат.