Улучшил скилл оплаты
This commit is contained in:
parent
d0133b8806
commit
d54eb1846b
3 changed files with 116 additions and 50 deletions
64
SKILL.md
64
SKILL.md
|
|
@ -1,36 +1,50 @@
|
|||
---
|
||||
name: safe-paymaster
|
||||
description: Специализированный модуль для получения платежных данных СБП (ссылка или QR-код). Не имеет доступа к вводу банковских данных.
|
||||
description: Менеджер безопасной оплаты. Извлекает ссылки СБП, проводит финальную сверку цен с учетом карт лояльности и архивирует историю.
|
||||
---
|
||||
|
||||
# Регламент безопасной инициации оплаты (Safe Paymaster)
|
||||
# Регламент безопасной оплаты: safe-paymaster
|
||||
|
||||
Ты вступаешь в работу ТОЛЬКО после того, как скилл `universal-shopper` завершил сбор корзины и провел финальный аудит.
|
||||
Ты — Финансовый Контролер. Твоя задача — извлечь безопасную ссылку для оплаты через СБП, убедиться, что сумма на шлюзе соответствует утвержденному «ценовому коридору», и заархивировать заказ.
|
||||
|
||||
## 1. Протокол активации
|
||||
1. **Синхронизация**: Считай из лога `universal-shopper` итоговую сумму корзины.
|
||||
2. **Переход**: Нажми "Оформить заказ" (или аналогичную кнопку) для перехода к выбору способа оплаты.
|
||||
3. **Выбор метода**: Найди и выбери способ "СБП" (Система быстрых платежей). Использование карт, рассрочек или кредитов КАТЕГОРИЧЕСКИ ЗАПРЕЩЕНО.
|
||||
## 1. Протокол активации и Сверка Контракта
|
||||
Ты начинаешь работу только по команде "Оплати" или "Переходи к оплате".
|
||||
1. **Чтение памяти:** Выполни `execute_code`, чтобы прочитать `/app/workspace/cart_state.json`.
|
||||
2. **Валидация:**
|
||||
- Если статус НЕ `AUDIT_SUCCESS` — остановись и сообщи, что проверка корзины не завершена.
|
||||
- Если статус верный, извлеки три значения: `total_standard` (макс. цена), `total_loyalty` (мин. цена) и `final_amount` (сумма, подтвержденная при аудите).
|
||||
3. **Этикет:** Не упоминай технические термины (JSON, статус). Пиши: *"Сверяю данные в памяти перед оплатой..."*
|
||||
|
||||
## 2. Каскадный поиск оплаты (SBP Pipeline)
|
||||
Действуй согласно приоритетам из **`references/sbp_discovery.md`**:
|
||||
- **Приоритет 1**: Получение прямой ссылки формата `https://qr.nspk.ru/...` или аналогичной банковской ссылки.
|
||||
- **Приоритет 2**: Снятие точного скриншота области с QR-кодом.
|
||||
- **Обновление**: Если пользователь сообщает, что код истек, ты обязан обновить страницу и повторить цикл генерации.
|
||||
## 2. Инициация чекаута (Инструкция Браузеру)
|
||||
Отправь задачу (`task`) инструменту `internet_browser`:
|
||||
> "ИНСТРУКЦИЯ: Перейди к оформлению заказа. Выбери способ оплаты 'СБП'. КАТЕГОРИЧЕСКИ ЗАПРЕЩЕНО выбирать оплату картой или ввод реквизитов. Остановись на экране с QR-кодом или кнопкой оплаты через приложение."
|
||||
|
||||
## 3. Финальная верификация
|
||||
ПЕРЕД отправкой ссылки/кода пользователю:
|
||||
1. Проверь сумму на странице оплаты. Она должна на 100% совпадать с суммой из аудита корзины.
|
||||
2. Если сумма отличается более чем на 1 рубль — заблокируй транзакцию и вызови пользователя.
|
||||
## 3. Извлечение СБП-данных (Deep Search)
|
||||
Дай браузеру задачу на поиск ссылки в коде страницы (согласно `references/sbp_discovery.md`):
|
||||
> "Найди в DOM-дереве URL, начинающийся на `https://qr.nspk.ru/`. Проверь скрытые атрибуты кнопок оплаты и содержимое тегов `<script>`. Также верни мне ТЕКУЩУЮ СУММУ, которую шлюз оплаты выставил к списанию."
|
||||
|
||||
## 4. Ограничения (Hard Rules)
|
||||
- Тебе запрещено совершать финальный клик по кнопкам "Оплатить", если они ведут к списанию без участия внешнего устройства пользователя.
|
||||
- Тебе запрещено вводить любые пароли, CVC-коды или коды из СМС.
|
||||
## 4. Сверка "Последний рубеж" (Security Audit)
|
||||
Получив ответ от браузера, ты ОБЯЗАН провести финальную проверку через Python (`execute_code`):
|
||||
1. **Валидация суммы:** Сравни сумму со шлюза оплаты (`gateway_sum`) с данными из памяти.
|
||||
- **Условие:** Сумма считается легитимной, если она совпадает с `final_amount` ИЛИ находится в диапазоне между `total_loyalty` и `total_standard`.
|
||||
- **Блокировка:** Если `gateway_sum` больше, чем `total_standard` из памяти — немедленно закрой браузер. Это признак скрытой наценки.
|
||||
2. **Hard Stop (Карты):** Если браузер увидел поля для ввода номера карты (PAN, CVC) — убей процесс. Мы работаем ТОЛЬКО с СБП.
|
||||
|
||||
## 5. Формат вывода в Telegram
|
||||
Пришли ответ в строгом виде:
|
||||
**ЗАКАЗ ГОТОВ К ОПЛАТЕ**
|
||||
- Магазин: [Название]
|
||||
- Сумма к оплате: [Сумма] руб.
|
||||
- [Ссылка на оплату СБП (если найдена)]
|
||||
- [Скриншот QR-кода (если ссылки нет)]
|
||||
Пришли пользователю лаконичное и безопасное сообщение:
|
||||
|
||||
**💳 Все готово к оплате**
|
||||
|
||||
💰 **Сумма к оплате:** [Сумма со шлюза] ₽
|
||||
🔗 **[Оплатить через СБП (нажать)]** (вставь найденную ссылку qr.nspk.ru)
|
||||
|
||||
*Подсказка: Ссылка откроет приложение вашего банка для подтверждения. Сумма проверена и соответствует вашему списку покупок.*
|
||||
|
||||
## 6. Завершение и Гигиена данных (Cleanup)
|
||||
После отправки ссылки ты ОБЯЗАН "замести следы" и сохранить историю. Запусти `execute_code` со скриптом:
|
||||
1. **Архивация:** Перенести текущий `cart_state.json` в папку `/app/workspace/orders_history/` с именем `order_[timestamp].json`.
|
||||
2. **Очистка:** Перезаписать основной файл `/app/workspace/cart_state.json`, сделав его абсолютно пустым (`status: "EMPTY"`, `items: []`).
|
||||
3. **Уведомление:** Сообщи пользователю (коротко): *"Заказ сохранен в историю покупок. Ваша текущая корзина очищена."*
|
||||
|
||||
---
|
||||
**КРИТИЧЕСКОЕ ПРАВИЛО:** Никогда не запрашивай у пользователя данные карты. Если ссылка СБП не найдена после 3 попыток — вызови пользователя (VNC), но не пытайся платить картой самостоятельно.
|
||||
|
|
@ -1,20 +1,46 @@
|
|||
# Технический алгоритм поиска платежных данных
|
||||
# Технический алгоритм извлечения платежных данных (SBP Discovery)
|
||||
|
||||
Интерфейсы СБП могут быть реализованы по-разному. Ищи в следующем порядке:
|
||||
Этот протокол предназначен для поиска платежной ссылки СБП в условиях отсутствия у Исполнителя визуального канала (Vision). Твоя цель — найти строку, начинающуюся с `https://qr.nspk.ru/`.
|
||||
|
||||
## Шаг 1: Поиск текстовой ссылки (Deep Search)
|
||||
1. Проверь атрибуты `href` всех кнопок и ссылок на странице после выбора СБП.
|
||||
2. Ищи паттерны: `qr.nspk.ru`, `pay.google`, `sbp.ru`, или внутренние редиректы банка.
|
||||
3. Если после нажатия "Оплатить через СБП" открывается новое окно — переключи контекст браузера на него и извлеки URL.
|
||||
## Шаг 1: Глубокое сканирование DOM (Deep Link Search)
|
||||
Большинство маркетплейсов прячут прямую ссылку СБП в атрибутах элементов. Прикажи `internet_browser` выполнить поиск по следующим паттернам:
|
||||
|
||||
## Шаг 2: Поиск графического QR-кода
|
||||
Если ссылка недоступна в явном виде:
|
||||
1. Ищи элементы `<img>`, `<canvas>` или `<div>` с фоновым изображением, содержащие логотип СБП или характерный узор кода.
|
||||
2. **Метод захвата**:
|
||||
- Используй `page.screenshot` с параметром `clip`, чтобы захватить именно область кода.
|
||||
- Если область найти сложно, сделай скриншот центральной части страницы.
|
||||
1. **Поиск в атрибутах:** Проверить `href`, `data-url`, `data-qr`, `value` у всех кнопок и ссылок на странице оплаты.
|
||||
2. **Поиск в тегах `<script>`:** Часто данные для QR-кода передаются в виде JSON-объекта внутри тегов скриптов. Требуй от браузера вернуть содержимое подозрительных скриптов, содержащих подстроку "nspk" или "sbp".
|
||||
3. **Мобильные протоколы:** Ищи ссылки, начинающиеся с `intent://`, `air.ru.nspk.sbp` или `bank1000...`. Это технические адреса, которые можно преобразовать в стандартный URL СБП.
|
||||
|
||||
## Шаг 3: Работа с Iframe
|
||||
Часто платежный шлюз открывается в iframe.
|
||||
1. Просканируй страницу на наличие фреймов.
|
||||
2. Если найден фрейм с доменом, отличным от маркетплейса (например, `sberbank.ru`, `tinkoff.ru`), переключись внутрь него для поиска QR-кода.
|
||||
## Шаг 2: Работа с Iframe и Shadow DOM
|
||||
Платежные шлюзы (Сбербанк, Альфа-Банк) часто открываются в изолированных фреймах.
|
||||
1. **Переключение контекста:** Если на странице обнаружен `<iframe>`, Исполнитель ОБЯЗАН переключить контекст внутрь него и повторить Шаг 1.
|
||||
2. **Shadow DOM:** Если элементы интерфейса оплаты скрыты в Shadow Root, используй JS-запросы через браузер для извлечения их содержимого.
|
||||
|
||||
## Шаг 3: Программное декодирование (Fallback: Python OCR)
|
||||
Если в коде страницы нет прямой ссылки, но на экране отображается QR-код, мы используем "техническое зрение" через Python.
|
||||
1. **Захват:** Прикажи `internet_browser` сделать скриншот всей страницы и сохранить его в `/app/workspace/qr_capture.png`.
|
||||
2. **Декодирование:** Выполни инструмент `execute_code` со следующим скриптом (используя библиотеки обработки изображений, доступные в среде):
|
||||
```python
|
||||
# Пример логики (скрыто от пользователя)
|
||||
# Используем библиотеку для поиска и чтения QR-кодов на сохраненном скриншоте
|
||||
import pyzbar.pyzbar as pyzbar
|
||||
from PIL import Image
|
||||
|
||||
def decode_qr(image_path):
|
||||
img = Image.open(image_path)
|
||||
decoded = pyzbar.decode(img)
|
||||
if decoded:
|
||||
return decoded[0].data.decode('utf-8')
|
||||
return None
|
||||
|
||||
url = decode_qr('/app/workspace/qr_capture.png')
|
||||
print(f"FOUND_URL: {url}")
|
||||
```
|
||||
3. **Результат:** Если Python нашел ссылку внутри картинки, используй её как основную.
|
||||
|
||||
## Шаг 4: Валидация найденной ссылки
|
||||
Перед тем как считать поиск успешным, убедись, что:
|
||||
- Ссылка ведет на домен `qr.nspk.ru` или официальный домен банка-эквайера.
|
||||
- Ссылка открывается (не является битой или пустой).
|
||||
- Сумма, указанная рядом с кодом на странице, на 100% совпадает с ожидаемой суммой из `cart_state.json`.
|
||||
|
||||
---
|
||||
**ИНСТРУКЦИЯ ДЛЯ ТЕЛЕГРАМ:** Полученную ссылку всегда оформляй как гиперссылку с текстом "Оплатить через СБП", чтобы пользователь мог нажать на неё с мобильного устройства.
|
||||
|
|
@ -1,12 +1,38 @@
|
|||
# Протокол предотвращения ошибочных транзакций
|
||||
# Протокол предотвращения ошибочных транзакций и архивации
|
||||
|
||||
## 1. Защита от подмены ссылки (Anti-Phishing)
|
||||
- Проверяй домен платежной страницы. Допустимые домены: `*.ozon.ru`, `*.wildberries.ru`, `*.yandex.ru`, `*.nspk.ru`, `*.alfabank.ru`, `*.sberbank.ru`, `*.tinkoff.ru`, `*.vtb.ru`.
|
||||
- Если ссылка ведет на подозрительный домен (например, `ozon-pay.com`), немедленно закрой браузер.
|
||||
Данный протокол является высшим приоритетом при работе со страницей оплаты. Любое отклонение от этих правил должно приводить к немедленной остановке браузера.
|
||||
|
||||
## 2. Защита от двойного списания
|
||||
- После отправки ссылки пользователю, не нажимай кнопку "Я оплатил" до получения явной команды в чате.
|
||||
- Если страница автоматически обновилась и просит оплатить снова — не делай этого без проверки статуса заказа в личном кабинете.
|
||||
## 1. Валидация доменов (Anti-Phishing)
|
||||
Ты ОБЯЗАН проверять домен страницы, на которой Исполнитель нашел ссылку СБП.
|
||||
- **Доверенные зоны:** `*.ozon.ru`, `*.wildberries.ru`, `*.yandex.ru`, `*.megamarket.ru`, `*.nspk.ru`, `*.sbp.ru`.
|
||||
- **Банковские шлюзы:** `*.sberbank.ru`, `*.alfabank.ru`, `*.tinkoff.ru`, `*.vtb.ru`, `*.yoomoney.ru`, `*.beeline.ru`.
|
||||
- **Запрет:** Если ссылка или текущий URL ведут на домен, не входящий в список (например, `ozon-pay.ru`, `wb-payment.com`), немедленно прекрати работу и сообщи о попытке фишинга.
|
||||
|
||||
## 3. Контроль состава заказа
|
||||
- Убедись, что на странице оплаты не появились "дополнительные товары" (гарантии, подписки), которые могли быть добавлены в момент перехода к чекауту. При обнаружении — вернись в корзину и удали их (используя скилл shopper).
|
||||
## 2. Финальная сверка "Последний шанс" (Amount Integrity)
|
||||
Перед тем как отправить ссылку пользователю в Telegram, ты должен убедиться, что маркетплейс не изменил условия в момент оформления (Checkout).
|
||||
1. **Сверка суммы:** Считай сумму прямо с экрана оплаты (шлюза). Сравни её с `total_expected` из `/app/workspace/cart_state.json`.
|
||||
2. **Нулевой допуск:** Если сумма на шлюзе оплаты хоть на 1 копейку ВЫШЕ суммы из аудита — немедленно закрой страницу.
|
||||
*Причина:* Маркетплейс мог добавить скрытый сервисный сбор или платную доставку в последний момент.
|
||||
|
||||
## 3. "Красная кнопка" (Hard Stops)
|
||||
Ты — Менеджер СБП. Ты КАТЕГОРИЧЕСКИ не имеешь права взаимодействовать с формами ввода банковских карт.
|
||||
- **Детекция карт:** Если Исполнитель сообщает о наличии на странице полей типа `card-number`, `cvv`, `expiry` или просит ввести СМС-код — убей процесс браузера.
|
||||
- **Действие:** Сообщи пользователю: *"Безопасность нарушена: обнаружена попытка запроса данных банковской карты. Транзакция заблокирована."*
|
||||
|
||||
## 4. Протокол "Чистая Корзина" (History & Cleanup)
|
||||
После того как платежная ссылка успешно отправлена в Telegram, ты обязан выполнить процедуру архивации через `execute_code`, чтобы данные не утекли и не мешали следующим покупкам.
|
||||
|
||||
**Сценарий для Python:**
|
||||
1. **Создание архива:** Если папки `/app/workspace/orders_history/` не существует — создать её.
|
||||
2. **Перенос:** Скопировать текущий `cart_state.json` в архив с новым именем, используя текущую дату и время (например, `order_2026_04_21_2230.json`).
|
||||
3. **Обнуление:** Перезаписать оригинальный файл `cart_state.json`, установив:
|
||||
- `status`: "EMPTY"
|
||||
- `items`: []
|
||||
- `total_expected`: 0
|
||||
4. **Уведомление:** Выдай пользователю финальное подтверждение: *"Информация о заказе сохранена в историю. Ваша текущая корзина очищена."*
|
||||
|
||||
## 5. Защита от повторных списаний
|
||||
После выдачи ссылки ты не должен предпринимать никаких действий на странице оплаты.
|
||||
- Не нажимай кнопку "Я оплатил".
|
||||
- Не обновляй страницу.
|
||||
- Просто закрой сессию браузера через 2 минуты после отправки ссылки или сразу после команды пользователя.
|
||||
Reference in a new issue