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

59 lines
No EOL
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Технический протокол извлечения 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` предустановлена в среде лаборатории):
```python
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 и последующей архивации заказа. Не оставляй сессию браузера открытой дольше необходимого.