Как извлечь QR код СБП из SVG base64 после перевода счета в другой банк
При переводе расчетного счета в новый банк часто возникает задача автоматически прикреплять QR-код СБП к счету на оплату. После запроса по API банк возвращает ссылку на страницу оплаты, где QR-код представлен в формате data:image/svg+xml;base64. Проблема в том, что этот код не лежит в HTML-атрибутах или DOM-элементах - его можно увидеть только во вкладке "Источники" (Sources) браузера. В этой статье мы разберём, как программно извлечь такое изображение и использовать его в документе.
Почему QR-код не отображается в HTML
Многие банки генерируют QR-код динамически через JavaScript, встраивая его как data:URI (Base64) непосредственно в SVG-элемент. Это означает, что при простом парсинге HTML вы не найдёте ссылку на изображение - она появляется только после выполнения скриптов. Вкладка "Источники" в Chrome показывает все ресурсы, загруженные страницей, включая сгенерированные скриптами data:URI.
Методы извлечения QR-кода
1. Использование headless-браузера (рекомендуется)
Самый надёжный способ - эмулировать работу браузера с помощью инструментов вроде Puppeteer (Node.js), Selenium или Playwright. Вы открываете страницу оплаты, дожидаетесь полной загрузки всех скриптов, а затем извлекаете содержимое SVG-элемента или data:URI.
- Puppeteer (Node.js):
await page.goto(url); const qr = await page.evaluate(() => document.querySelector('img').src); - Python + Selenium:
driver.get(url); qr = driver.find_element_by_tag_name('img').get_attribute('src'); - Playwright (Python):
page.goto(url); qr = page.eval_on_selector('img', 'el => el.src');
После получения base64-строки вы можете декодировать её в PNG или сохранить как SVG-файл и вставить в счет.
2. Анализ сетевых запросов
Если headless-браузер недоступен, можно перехватить ответ от API, который содержит ссылку на страницу оплаты. Иногда банк возвращает не только URL, но и сам QR-код в виде base64 в теле ответа. Проверьте документацию вашего банка - возможно, достаточно просто распарсить JSON-ответ.
3. Прямое декодирование data:URI
Если вы уже получили data:image/svg+xml;base64, то извлечь его очень просто: отбросьте префикс data:image/svg+xml;base64, и декодируйте оставшуюся часть. На Python это делается так:
import base64
svg_data = qr.split(',')[1]
with open('qrcode.svg', 'wb') as f:
f.write(base64.b64decode(svg_data))На PHP: file_put_contents('qrcode.svg', base64_decode(explode(',', $qr)[1]));
Как прикрепить QR-код к документу счета
После извлечения SVG-файла вы можете вставить его в PDF-счет или HTML-шаблон. Для PDF используйте библиотеки вроде TCPDF (PHP) или ReportLab (Python). В HTML просто вставьте тег <img src="data:image/svg+xml;base64,..." />. Убедитесь, что QR-код имеет достаточный размер для сканирования (минимум 200×200 px).
Автоматизация процесса
Чтобы полностью автоматизировать прикрепление QR-кода, напишите скрипт, который:
- Запрашивает у банка ссылку на оплату по номеру заказа.
- Открывает страницу в headless-браузере и извлекает data:URI.
- Декодирует base64 в SVG.
- Встраивает изображение в шаблон счета.
- Генерирует итоговый документ (PDF/HTML) и отправляет клиенту.
Такой подход работает независимо от языка программирования - выберите тот, который вам удобнее (Python, Node.js, PHP).