Командная строка и журнал приложения
Командная строка
CLI запускается через python -m duckonet. В окружении должен быть DUCKONET_API_KEY, либо передайте --key-file с закрытым файлом ключа. Значение API-ключа не передаётся отдельным аргументом командной строки.
python -m duckonet --help
python -m duckonet doctor
python -m duckonet profiles list --browser chrome
python -m duckonet request https://example.com/ --browser chrome --version last
python -m duckonet request https://example.com/api -X POST --json '{"name":"sample"}'
python -m duckonet request https://example.com/file --output response.bin
Правила кавычек зависят от оболочки. Не вводите секреты приложения через --json/--data/-H, если они не должны попадать в историю команд; для тела можно использовать --body-file.
| Команда / опция | Поведение |
|---|---|
request URL | Один запрос; по умолчанию GET, Chrome, version=last, protocol=h2. В stdout идут точные байты тела ответа. |
-X, --method | HTTP-метод; CONNECT запрещён. |
-H, --header | Name: value; допускаются повторяющиеся опции и заголовки. Служебные framing-заголовки определяет библиотека. |
--data / --json / --body-file | Взаимоисключающие варианты тела. JSON null остаётся null; файл отправляется потоково. |
--timeout | Общий таймаут, по умолчанию 30 секунд. |
--connect-timeout, --read-timeout | Отдельные таймауты; если не заданы, отдельное ограничение фазы не включается. Явные значения >0 и ≤300 секунд. |
--body-limit | Предел буферизованного ответа: по умолчанию 1048576, от 1 до 67108864 байт. |
-o, --output | Записать тело в файл. Существующий файл по умолчанию не изменяется. |
--overwrite | Разрешить атомарную замену --output после успешного получения ответа. При сетевой ошибке старое содержимое сохраняется. |
--fail | Код выхода 22 для HTTP-статуса ≥400; тело ответа при этом всё равно выводится или сохраняется. |
--browser, --version, --protocol | Выбор браузера, версии и режима. Режимы: h1, h2, h2_only, h3, h3_only. |
--state-dir | Каталог состояния установки, общий с соответствующим Python-клиентом. |
--key-file | Закрытый файл ключа; его права и отсутствие небезопасных ссылок проверяются существующим механизмом хранения. |
profiles list | JSON со списком версий выбранного браузера/протокола с учётом совместимости и прав аккаунта. Выполняет обычный запуск клиента. |
doctor | Локальный JSON: версия библиотеки, Python, платформа, разрядность и наличие cffi/cryptography. Не делает сетевых запросов и не подтверждает состояние аккаунта, TLS или доступность сайта. |
--help не открывает клиент и не запускает сетевую регистрацию. Сообщения об ошибках идут в stderr без исходного текста исключения и секретов. Коды выхода: 0 — успех, 2 — неверные аргументы, 1 — ошибка выполнения, 22 — HTTP-ошибка с --fail, 130 — прерывание. Содержимое целевого ответа является данными вашего приложения и выводится по вашему запросу, даже если оно содержит чувствительные поля.
Журнал приложения
Библиотека не меняет глобальные настройки logging и не подавляет предупреждения процесса. Для журнала завершённых запросов передайте diagnostic_hook. Уровни, обработчики и формат сообщений задаёт приложение обычными средствами Python.
import logging
import os
from duckonet import HttpClient
logger = logging.getLogger('myapp.http')
def log_response(event):
logger.info('HTTP status=%s protocol=%s attempts=%s',
event.status_code, event.protocol, event.attempt_count)
with HttpClient(api_key=os.environ['DUCKONET_API_KEY'],
diagnostic_hook=log_response) as client:
response = client.get('https://example.com/')
Событие не содержит тела и заголовков. request_info предназначен для отдельной диагностики: пользовательские имена заголовков и путь URL могут содержать данные приложения. Не записывайте его целиком без собственного контроля. Ошибки получения ответа передаются как исключения; hook не заменяет обработку ошибок.