---
name: for-ai-agent-ordering
description: Посредством безголового браузера открывает https://www.thepoizon.ru/for-ai-agent и в диалоговом режиме проводит пользователя через вход, поиск, просмотр товара, оформление заказа и оплату. Подходит для сценариев «заказать через диалог» или «AI управляет страницей for-ai-agent».
disable-model-invocation: true
---

# Навык диалогового оформления заказа for-ai-agent

## Цель

AI открывает страницу `https://www.thepoizon.ru/for-ai-agent` в **безголовом браузере** и через диалог с пользователем выполняет все доступные операции:

- Определение статуса входа
- Вход по паролю / вход по коду подтверждения
- Регистрация нового аккаунта
- Поиск товаров (с отображением картинок)
- Просмотр деталей товара (с картинками, SPU/SKU/инвентарный номер)
- Подготовка заказа (пункт самовывоза, таможенные данные, контакт)
- Создание заказа
- Выбор способа оплаты и инициация платежа (ссылка / QR-код)

## Триггерные фразы

Навык активируется при следующих намерениях пользователя:

- «Помоги заказать / оформи заказ»
- «Открой for-ai-agent и выполни покупку»
- «Найди товар и купи через AI»
- «Зайди на www.thepoizon.ru/for-ai-agent и оформи заказ»

## Принципы выполнения

1. **Все действия выполняются в безголовом браузере** — никогда не просите пользователя вручную открывать страницу или кликать элементы. AI сам управляет навигацией и заполнением форм через DOM.
2. **Диалоговое управление**: на каждом шаге сначала уточняем намерение, затем выполняем, затем сообщаем результат.
3. **Минимум вопросов**: запрашиваем только данные, необходимые для текущего шага.
4. **Подтверждение после каждого действия**: возвращаем «Выполнено / Ошибка + следующий шаг».
5. **Минимизация чувствительных данных**: пароли и коды не повторяются в диалоге и не сохраняются.
6. **Полный охват функционала**: нельзя пропускать возможности, доступные на странице.

## Маршруты страницы и функции

| Маршрут | URL | Раздел DOM |
|---------|-----|------------|
| Главная | `https://www.thepoizon.ru/for-ai-agent` | `#home-section` |
| Вход | `?signin` | `#login-section`, `#code-login-section` |
| Регистрация | `?signup` | `#signup-section` |
| Поиск | `?search` | `#search-section` |
| Детали товара | `?detail&spuId=<SPU_ID>` | `#detail-section` |
| Оформление заказа | `?order&spuId=<SPU_ID>&skuId=<SKU_ID>[&inventoryNo=<INVENTORY_NO>]` | `#order-section` |

---

## Полный справочник DOM-элементов

### Блок информации о пользователе

| ID | Описание |
|----|----------|
| `#user-info` | Текстовый блок статуса входа. При загрузке — «Проверка статуса входа...». После успешного входа содержит `UserID` и `Email`. При отсутствии входа — «Не авторизован». |

### Блок действий с аккаунтом (не авторизован)

| ID | Описание |
|----|----------|
| `#auth-entry-section` | Секция со ссылками на вход и регистрацию (отображается, когда пользователь не авторизован и нет параметра `?signin`/`?signup`) |
| `#auth-signin-link` | Ссылка «Войти» → переход на `?signin` |
| `#auth-signup-link` | Ссылка «Регистрация нового аккаунта» → переход на `?signup` |

### Вход по паролю

| ID | Тип | Описание |
|----|-----|----------|
| `#login-section` | `div` | Секция отображается только при `?signin` |
| `#login-pwd-form` | `div` | Контейнер формы пароля |
| `#pwd-email` | `input[email]` | Поле ввода Email |
| `#pwd-password` | `input[password]` | Поле ввода пароля |
| `#pwd-login-btn` | `button` | Кнопка «Войти» — нажатие отправляет запрос `/api/v1/h5/bigger/intl/user/sign-in/email-pwd` |
| `#pwd-login-msg` | `div` | Сообщение о результате. Класс `.success` — вход выполнен, `.error` — ошибка |

### Вход по коду подтверждения

| ID | Тип | Описание |
|----|-----|----------|
| `#code-login-section` | `div` | Секция отображается только при `?signin` |
| `#login-code-form` | `div` | Контейнер формы кода |
| `#code-email` | `input[email]` | Поле ввода Email |
| `#code-value` | `input[text]` | Поле ввода кода подтверждения |
| `#send-code-btn` | `button` | Кнопка «Отправить код» — нажатие отправляет запрос `/api/v1/h5/bigger/intl/user/email/code/send` (captchaType=SIGNIN) |
| `#code-login-btn` | `button` | Кнопка «Войти» — нажатие отправляет запрос `/api/v1/h5/user-apps/intl/user/sign-in/email-code` |
| `#code-login-msg` | `div` | Сообщение о результате (`.success` / `.error`) |

### Регистрация

| ID | Тип | Описание |
|----|-----|----------|
| `#signup-section` | `div` | Секция отображается только при `?signup` |
| `#signup-form` | `div` | Контейнер формы регистрации |
| `#signup-email` | `input[email]` | Поле ввода Email |
| `#signup-code` | `input[text]` | Поле ввода кода подтверждения |
| `#signup-send-code-btn` | `button` | Кнопка «Отправить код» — сначала проверяет, не зарегистрирован ли email (`/api/v1/h5/bigger/intl/user/sign-up/check`), затем отправляет код (captchaType=SIGNUP) |
| `#signup-btn` | `button` | Кнопка «Зарегистрироваться» — нажатие отправляет запрос `/api/v1/h5/user-apps/intl/user/sign-in/email-code` (captchaType=SIGNUP) |
| `#signup-msg` | `div` | Сообщение о результате (`.success` / `.error`) |

### Поиск товаров

| ID | Тип | Описание |
|----|-----|----------|
| `#search-section` | `div` | Секция поиска, отображается при `?search` |
| `#search-keyword` | `input[text]` | Поле ввода ключевого слова |
| `#search-btn` | `button` | Кнопка «Найти» — нажатие отправляет запрос `/api/v1/h5/home-page/intl/landing/search/page` |
| `#search-result-list` | `ol` | Нумерованный список результатов. Каждый элемент имеет ID по индексу: |
| `#search-result-item-{N}` | `li` | N-й результат поиска (N = 0, 1, 2...) |
| `#search-result-img-{N}` | `img` | Картинка товара в N-м результате. URL обработан через Aliyun OSS (автоматическое сжатие + WebP). Отображается сразу после загрузки API-ответа. |
| `#search-result-title-{N}` | `div` | Название товара в N-м результате |
| `#search-result-price-{N}` | `div` | Цена товара в N-м результате |
| `#search-result-spu-{N}` | `div` | SPU ID товара в N-м результате (текст: «SPU ID: ...») |
| `#search-result-link-{N}` | `a` | Ссылка «Детали товара» → переход на `?detail&spuId=<SPU_ID>` |

### Детали товара

| ID | Тип | Описание |
|----|-----|----------|
| `#detail-section` | `div` | Секция деталей, отображается при `?detail` |
| `#detail-content` | `div` | Контейнер данных товара. Заполняется после ответа API `/api/v1/h5/goods-detail/intl/commodity/v2/get-index-spu-detail`. |
| `#detail-images` | `div` | Контейнер картинок товара (до 3 штук). Отображается сразу после получения ответа API. |
| `#detail-img-{N}` | `img` | N-я картинка товара (N = 0, 1, 2). URL обработан через Aliyun OSS (размер 360px + WebP). |
| `#sku-list` | `ul` | Список доступных SKU-вариантов |
| `#sku-item-{N}` | `li` | N-й SKU-вариант (N = 0, 1, 2...) |
| `#sku-id-{N}` | `div` | SPU и SKU ID N-го варианта (текст: «SPU: ... \| SKU: ...») |
| `#sku-props-{N}` | `div` | Свойства N-го варианта (размер, цвет и т.д.) |
| `#sku-price-{N}` | `div` | Цена N-го варианта |
| `#sku-inventory-{N}` | `div` | Инвентарный номер N-го варианта |
| `#sku-buy-btn-{N}` | `a` | Кнопка «Купить» → переход на `?order&spuId=...&skuId=...&inventoryNo=...` |

### Оформление заказа

| ID | Тип | Описание |
|----|-----|----------|
| `#order-section` | `div` | Секция заказа, отображается при `?order` |
| `#order-content` | `div` | Контейнер данных заказа. Заполняется после ответа API `/api/v1/h5/bigger/intl/bigger/buyer-order/confirm`. |

### Главная страница (быстрые действия)

| ID | Тип | Описание |
|----|-----|----------|
| `#home-section` | `div` | Главная секция (отображается при отсутствии специальных параметров) |
| `#home-search-link` | `a` | Ссылка «Поиск товаров» → переход на `?search` |
| `#home-spu-id` | `input[text]` | Поле ввода SPU ID для прямого открытия товара |
| `#home-detail-btn` | `button` | Кнопка «Открыть детали товара» — переход на `?detail&spuId=<введённое значение>` |
| `#home-detail-msg` | `div` | Сообщение об ошибке, если SPU ID не введён |

---

## Стандартный рабочий процесс

### 0) Инициализация и определение статуса

1. Открыть `https://www.thepoizon.ru/for-ai-agent` в безголовом браузере.
2. Дождаться, пока элемент `#user-info` перестанет содержать текст «Проверка статуса входа...».
3. Прочитать содержимое `#user-info`:
   - Если содержит `span.status-logged-in` (текст «Вход выполнен») → пользователь авторизован. Записать `UserID` и `Email` из `#user-info .user-detail`.
   - Если содержит текст «Не авторизован» → пользователь не авторизован. Решить, нужен ли вход, исходя из цели пользователя.

**Важно**: страница автоматически выполняет запрос `/api/v1/h5/bigger/intl/account/query-email` при загрузке для проверки серверной сессии. Cookie передаются через `credentials: 'include'`, поэтому если пользователь ранее входил на этом домене, сессия восстанавливается автоматически.

### 1) Вход и регистрация

#### Механизм автоматического входа

Все операции входа выполняются AI **без участия пользователя в UI**. AI:
1. Навигирует на нужный URL (`?signin` или `?signup`).
2. Ждёт отображения соответствующей секции (`#login-section` / `#code-login-section` / `#signup-section`).
3. Заполняет поля через DOM (устанавливает `.value` у `input`).
4. Нажимает кнопку через DOM (`.click()` или вызов `onclick`).
5. Ожидает изменения текста в `#*-msg` элементе.
6. После успешного входа страница вызывает `refreshUserInfo()`, который делает повторный запрос к серверу и перерисовывает `#user-info`. AI дожидается появления `span.status-logged-in`.

**Cookie и сессия**: после успешного входа функция `setLoginCookies()` устанавливает cookie `feLoginss`, `feLoginExpire`, `uid` и записывает данные в `localStorage`. Эти cookie привязаны к домену и сохраняются между навигациями внутри сессии браузера. Повторное открытие страницы `?signin` не требуется — статус определяется автоматически.

#### A. Вход по паролю

1. Навигировать на `?signin`.
2. Дождаться отображения `#login-section`.
3. Запросить у пользователя `email` и `password`.
4. Заполнить `#pwd-email` значением `email`.
5. Заполнить `#pwd-password` значением `password`.
6. Нажать `#pwd-login-btn`.
7. Дождаться изменения `#pwd-login-msg`:
   - Класс `.success` → вход выполнен. Страница автоматически вызовет `refreshUserInfo()`, и `#user-info` обновится.
   - Класс `.error` → вход не выполнен, текст ошибки в `#pwd-login-msg.textContent`. Сообщить пользователю и предложить повторить.

#### Б. Вход по коду подтверждения

1. Навигировать на `?signin`.
2. Дождаться отображения `#code-login-section`.
3. Запросить у пользователя `email`.
4. Заполнить `#code-email` значением `email`.
5. Нажать `#send-code-btn` — отправляется запрос на отправку кода.
6. Дождаться изменения `#code-login-msg` на «Код отправлен» (класс `.success`).
7. Запросить у пользователя код подтверждения.
8. Заполнить `#code-value` полученным кодом.
9. Нажать `#code-login-btn`.
10. Дождаться изменения `#code-login-msg`:
    - `.success` → вход выполнен, `#user-info` обновится автоматически.
    - `.error` → сообщить ошибку и предложить повторить.

#### В. Регистрация нового аккаунта

1. Навигировать на `?signup`.
2. Дождаться отображения `#signup-section`.
3. Запросить у пользователя `email`.
4. Заполнить `#signup-email` значением `email`.
5. Нажать `#signup-send-code-btn` — страница сначала проверяет, не зарегистрирован ли email. Если зарегистрирован, `#signup-msg` покажет ошибку. Если нет — отправляется код.
6. Дождаться `#signup-msg` с классом `.success` («Код отправлен»).
7. Запросить у пользователя код подтверждения.
8. Заполнить `#signup-code` полученным кодом.
9. Нажать `#signup-btn`.
10. Дождаться `#signup-msg`:
    - `.success` → регистрация выполнена, автоматический вход, `#user-info` обновится.
    - `.error` → сообщить ошибку.

### 2) Поиск товаров и просмотр деталей

#### A. Поиск товаров (с картинками)

1. Навигировать на `?search`.
2. Дождаться отображения `#search-section`.
3. Запросить у пользователя ключевое слово.
4. Заполнить `#search-keyword` ключевым словом.
5. Нажать `#search-btn`.
6. Дождаться заполнения `#search-result-list` (список перестанет содержать «Поиск...»).
7. Для каждого результата (индекс N = 0, 1, 2...) прочитать:
   - `#search-result-img-{N}` — **картинка товара** (img). URL уже обработан через Aliyun OSS: автоматически применено сжатие до 360px и конвертация в WebP. Картинка отображается сразу после получения ответа API, без дополнительных действий. Если `logoUrl` отсутствует в ответе API, картинка не отобразится.
   - `#search-result-title-{N}` — название товара.
   - `#search-result-price-{N}` — цена.
   - `#search-result-spu-{N}` — SPU ID (текст начинается с «SPU ID:»).
   - `#search-result-link-{N}` — ссылка «Детали товара» для перехода на страницу деталей.
8. Представить результаты пользователю в виде нумерованного списка с указанием названия, цены, SPU ID и картинки. Дождаться выбора товара.

**Примечание о картинках**: изображения товаров загружаются с CDN Alibaba OSS. Функция `processImageUrl()` автоматически добавляет параметры `x-oss-process=image/resize,s_{размер}/format,webp` для оптимизации. Для результатов поиска используется размер 360px. SVG-изображения и уже обработанные URL пропускаются.

#### Б. Детали товара (с картинками)

1. Перейти к деталям одним из способов:
   - Нажать `#search-result-link-{N}` из результатов поиска.
   - На главной странице заполнить `#home-spu-id` значением SPU ID и нажать `#home-detail-btn`.
   - Навигировать напрямую: `?detail&spuId=<SPU_ID>`.
2. Дождаться заполнения `#detail-content` (исчезнет текст «Загрузка...»).
3. Страница выполнит запрос к API `/api/v1/h5/goods-detail/intl/commodity/v2/get-index-spu-detail`.
4. После загрузки данных прочитать из `#detail-content`:
   - **Картинки товара**: контейнер `#detail-images` содержит до 3 изображений (`#detail-img-0`, `#detail-img-1`, `#detail-img-2`). URL обработаны через Aliyun OSS (размер 360px + WebP). Картинки отображаются сразу после получения ответа API. Если `imageModels` отсутствует или пуст, блок картинок не отображается.
   - **Базовая информация**: таблица с названием, брендом, категорией, полом, ценой и т.д.
   - **Ключевые параметры заказа**: SPU ID товара.
   - **Список доступных SKU**: `#sku-list` — каждый вариант `#sku-item-{N}` содержит:
     - `#sku-id-{N}` — SPU и SKU ID.
     - `#sku-props-{N}` — свойства (размер, цвет и т.д. в формате «Уровень: значение»).
     - `#sku-price-{N}` — цена варианта.
     - `#sku-inventory-{N}` — инвентарный номер (или «Нет», если отсутствует).
     - `#sku-buy-btn-{N}` — кнопка «Купить» (ссылка), ведёт на `?order&spuId=...&skuId=...&inventoryNo=...`. Отображается только если инвентарный номер доступен.
5. Представить пользователю информацию о товаре, картинки и список доступных SKU. Попросить выбрать вариант.

**Примечание о картинках деталей**: для детальной страницы `processImageUrl()` использует размер 360px (ширина отображения 80px). До 3 первых изображений из `imageModels`. Картинки рендерятся в `<img>` теги внутри `#detail-images`.

### 3) Подготовка и подтверждение заказа

1. Перейти к заказу через `#sku-buy-btn-{N}` из деталей товара или напрямую: `?order&spuId=<SPU>&skuId=<SKU>[&inventoryNo=<INV>]`.
2. Дождаться заполнения `#order-content` (страница автоматически выполнит запрос `/api/v1/h5/bigger/intl/bigger/buyer-order/confirm`).
3. Если `inventoryNo` не передан, страница автоматически загрузит данные товара и подставит инвентарный номер.
4. Прочитать из `#order-content` статус готовности — список `order-checklist`:
   - ✓ / ✗ Пункт самовывоза
   - ✓ / ✗ Данные для таможни
   - ✓ / ✗ Контактные данные
5. Заполнить недостающие пункты по порядку.

#### A. Пункт самовывоза

Приоритет: использовать сохранённые пункты. Если список пуст — искать по адресу:

1. Нажать кнопку «Выбрать пункт самовывоза» (генерируется динамически в `#order-content`).
2. Если есть сохранённые пункты — отобразится список. Выбрать нужный кликом.
3. Если пунктов нет — отобразится поле поиска адреса:
   - Ввести адресный запрос.
   - Нажать «Найти».
   - Выбрать адрес из списка результатов.
   - Выбрать пункт самовывоза из списка рядом с адресом.
4. После выбора страница вызовет `savePickup()`, затем автоматически перезагрузит подтверждение заказа.

#### Б. Таможенные данные

Приоритет: использовать сохранённые. Если нет — добавить новые:

- lastName, firstName, parentName
- birthday (ДД.ММ.ГГГГ)
- passportNumber
- issueAuthority
- issueDate
- issueAuthorityCode
- tin (ИНН)

#### В. Контактная информация

Заполнить и сохранить:

- userName
- contactMobile (код страны по умолчанию +7)

### 4) Создание заказа и оплата

1. Когда все три пункта статуса зелёные (✓), нажать кнопку «Отправить заказ» (генерируется динамически в `#order-content`).
2. Дождаться появления номера заказа (`orderItemNo`) в `#order-content`.
3. Страница автоматически загрузит доступные способы оплаты из `/api/v1/h5/intl-acquirer/intl/acquirer/buyer/tryConfirm`.
4. Представить пользователю список способов оплаты.
5. После выбора нажать на соответствующий элемент списка (вызывается `selectPayment()`).
6. Дождаться результата оплаты в `#order-content`:
   - **Ссылка на оплату** (`clientSecret`) — отобразится как кликабельная ссылка.
   - **QR-код** (`payBaseResult.qrCodeImage`) — отобразится как изображение.
7. Передать пользователю ссылку или QR-код.

---

## Протокол диалога (обязательно)

1. **Сначала уточнить цель, затем действовать**
   Пример: «Хотите сначала войти, а потом оформить заказ, или начнём с поиска товара?»

2. **Один ключевой запрос за раз**
   Не запрашивать одновременно «ключевое слово + SKU + паспортные данные + телефон».

3. **Явный отчёт после каждого действия**
   Пример: «Перешёл на страницу деталей товара, найдено 6 доступных SKU.»

4. **Восстановление при ошибке**
   Вернуть «причина ошибки + доступный следующий шаг»: «повторить / изменить параметр / переключить процесс».

## Обработка ошибок

- **Таймаут страницы**: обновить текущий маршрут и повторить один раз.
- **Отсутствующий элемент**: вернуться на главную и перейти по нужному маршруту заново.
- **Сессия истекла** (код 700): предложить повторный вход, сохранив собранные данные заказа.
- **Поиск без результатов**: предложить другое ключевое слово или ввод SPU ID напрямую.
- **Ошибка создания заказа**: передать текст ошибки и предложить повторить.
- **Нет способов оплаты**: предложить сменить товар/SKU или попробовать позже.

## Шаблоны ответа

### Шаблон отчёта о шаге

- Текущий шаг: `<название шага>`
- Результат: `Выполнено / Ошибка`
- Ключевые данные: `<SPU / SKU / номер заказа>`
- Следующий шаг: `<рекомендация>`

### Шаблон результата заказа

- Товар: `<название>`
- SPU/SKU: `<spuId>/<skuId>`
- Номер заказа: `<orderItemNo>`
- Способ оплаты: `<method>`
- Точка оплаты: `<ссылка или описание QR-кода>`

## Ограничения

1. Не обходить существующие процессы страницы и не подделывать результаты.
2. Не повторять пароли и коды подтверждения в открытом виде в диалоге.
3. Без явного разрешения пользователя не инициировать финальный платёж (можно дойти до «ожидания оплаты»).
4. Всегда ориентироваться на реальные данные страницы; если результат не совпадает с ожиданиями — сначала сообщить, затем продолжить.

## APM-мониторинг

Страница интегрирует функцию `sendApmLog()` для отправки метрик производительности на `https://sgprd-plus-otel-h5-public.poizon.com/api/metrics`. Каждое ключевое действие пользователя автоматически отслеживается:

| Действие | Ключ метрики | Когда отправляется |
|----------|-------------|-------------------|
| Вход по паролю (успех) | `password_login` | После успешного ответа API |
| Вход по паролю (ошибка) | `password_login_fail` | При ошибке API |
| Отправка кода для входа | `send_login_code` | При нажатии «Отправить код» (вход) |
| Вход по коду (успех) | `code_login` | После успешного ответа API |
| Вход по коду (ошибка) | `code_login_fail` | При ошибке API |
| Отправка кода для регистрации | `send_signup_code` | При нажатии «Отправить код» (регистрация) |
| Регистрация (успех) | `signup` | После успешного ответа API |
| Регистрация (ошибка) | `signup_fail` | При ошибке API |
| Поиск товаров | `search` | При нажатии «Найти» |
| Создание заказа (успех) | `create_order` | После успешного создания заказа |
| Создание заказа (ошибка) | `create_order_fail` | При ошибке создания заказа |
| Выбор способа оплаты | `select_payment` | При выборе способа оплаты |

Мониторинг работает автоматически и не требует действий от AI.
