Пачка документов
Счета за месяц, сертификаты участникам, договоры — когда документов сотни, важно не упереться в лимит частоты и не исчерпать квоту посреди пачки.
Проверка на доступность страниц#
Перед большой пачкой узнайте остаток, поможет запрос GET /v1/me. Если документов больше, чем страниц, пачка встанет с кодом ошибки 402.
me = client.me()
if me.pages_remaining < expected_pages:
raise SystemExit(f"Осталось {me.pages_remaining} страниц, нужно {expected_pages}")Отправляйте параллельно, но в пределах тарифа#
Лимит частоты действует на каждый ключ отдельно: на Premium это 10 запросов в секунду и до 30 подряд. Держите не больше нескольких запросов одновременно. 3–5 хватает, чтобы загрузить рендер и не получать код 429.
import asyncio
from pdfapi import AsyncPdfApi, PdfApiError
async def main(documents: dict[str, str]) -> None:
limit = asyncio.Semaphore(3)
async with AsyncPdfApi() as client:
async def render(name: str, html: str) -> None:
async with limit:
try:
pdf = await client.html(html)
except PdfApiError as e:
print(f"{name}: {e.code} — {e.message}")
return
pdf.save(name)
await asyncio.gather(*(render(n, h) for n, h in documents.items()))Обработайте каждую ошибку#
Ошибка одного документа не должна останавливать пачку. Записывайте, что не получилось, и повторяйте позже неудачные попытки. Библиотеки автоматически повторяют коды 429 и 503.
Один клиент на всю пачку#
Создавайте клиент один раз и переиспользуйте его. Он держит соединения открытыми, и каждый запрос не тратит время на новое подключение. Все библиотеки pdfapi безопасны и адаптированы для параллельного использования.