This repository has been archived on 2026-04-28. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
safe-paymaster/references/sbp_discovery.md

5.5 KiB
Raw Permalink Blame History

Технический протокол извлечения SBP-данных (Deep Discovery)

Твоя цель — получить текстовую ссылку формата https://qr.nspk.ru/.... Эта ссылка является универсальной: она позволяет пользователю оплатить заказ в один клик через банковское приложение на телефоне.

Шаг 1: Глубокий поиск в DOM (Инструкция для браузера)

Прикажи Исполнителю выполнить поиск по следующим техническим признакам. В параметре task для браузера укажи:

  1. Поиск по атрибутам: "Проверь все элементы <a>, <button> и <div> на наличие подстрок 'nspk', 'sbp', 'qr' в атрибутах href, data-url, data-qr, value или src."
  2. Поиск мобильных протоколов: "Ищи ссылки, начинающиеся с intent://, air.ru.nspk.sbp или bank1000.... Если найдешь — верни их полностью, Менеджер их конвертирует."
  3. Анализ скриптов: "Найди теги <script>, содержащие текст 'payload' или 'qr'. Извлеки содержимое этих скриптов, если там есть упоминание домена qr.nspk.ru."

Шаг 2: Работа с Iframe (Переключение контекста)

Платежные шлюзы (Сбербанк, ЮKassa, Альфа) часто изолируют QR-код во фрейме.

  • Инструкция: "Если на странице оплаты есть <iframe>, переключи контекст внутрь него и повтори поиск ссылки СБП. Обрати внимание на домены фрейма: *.sberbank.ru, *.yoomoney.ru, *.nspk.ru."

Шаг 3: Программное декодирование (Python OCR Fallback)

Если в коде страницы нет прямой ссылки (код отрисован через <canvas> или защищенную картинку), ты обязан использовать «техническое зрение» через Python.

Алгоритм действий:

  1. Захват: Прикажи браузеру: "Сделай скриншот области, где отображается QR-код, и сохрани его по пути /app/workspace/payment_qr.png".
  2. Распознавание: Используй execute_code для запуска следующего скрипта (библиотека pyzbar предустановлена в среде лаборатории):
import json
import os
from PIL import Image
from pyzbar.pyzbar import decode

def extract_sbp_url(image_path):
    if not os.path.exists(image_path):
        return {"error": "Файл скриншота не найден"}
    
    img = Image.open(image_path)
    # Попытка найти и декодировать QR-код
    decoded_objects = decode(img)
    
    for obj in decoded_objects:
        data = obj.data.decode('utf-8')
        if 'qr.nspk.ru' in data:
            return {"success": True, "url": data}
            
    return {"success": False, "error": "QR-код не найден или не распознан"}

result = extract_sbp_url('/app/workspace/payment_qr.png')
print(json.dumps(result))

Шаг 4: Конвертация и Валидация

Получив данные (из DOM или через Python), ты (Менеджер) должен убедиться в их корректности:

  1. Паттерн ссылки: Ссылка ОБЯЗАТЕЛЬНО должна содержать qr.nspk.ru.
  2. Конвертация мобильных ссылок: Если браузер нашел ссылку вида air.ru.nspk.sbp://qr.nspk.ru/AD1000..., очисти её от префикса протокола, превратив в стандартную https://qr.nspk.ru/AD1000....
  3. Сумма рядом с кодом: Попроси браузер подтвердить: "Какая сумма написана текстом непосредственно над или под QR-кодом?". Сверь её с утвержденным бюджетом.

Шаг 5: Обработка ошибок

  • Если ссылка не найдена: Сделай еще одну попытку, приказав браузеру нажать кнопку «Оплатить другим банком» или «Показать QR-код».
  • Критический отказ: Если после 3-х попыток ссылка не получена, вызови пользователя через сообщение: "Я вижу экран оплаты, но не могу извлечь цифровую ссылку. Пожалуйста, завершите оплату через VNC: [ссылка]".

ВАЖНО: Как только ссылка получена и валидирована, немедленно переходи к этапу выдачи ссылки в Telegram и последующей архивации заказа. Не оставляй сессию браузера открытой дольше необходимого.