К содержимому

Документация

Первый полный Python-алгоритм

Задача: получить небольшой JSON-каталог, проверить артикул и цену, вывести записи с устойчивыми ключами. Создайте Python-сценарий сайта и параметр api_url; используйте адрес своего разрешённого источника.

def run(ctx):
    url = ctx.param('api_url', '')
    if not url:
        ctx.abort('Укажите api_url')
    ctx.log('Загружаем каталог')
    response = ctx.http().with_headers({'Accept': 'application/json'}).get(url)
    if not response.ok():
        ctx.fail('Каталог вернул HTTP ' + str(response.status))
    payload = response.json()
    if not isinstance(payload, dict) or not isinstance(payload.get('items'), list):
        ctx.fail('В ответе отсутствует массив items')
    seen = set()
    items = payload['items']
    for index, item in enumerate(items):
        if ctx.cancelled():
            ctx.abort('Сбор остановлен')
        if not isinstance(item, dict):
            ctx.fail('Неверная структура товара')
        sku = str(item.get('sku') or '').strip()
        if not sku or sku in seen:
            ctx.metric('skipped', 1)
            continue
        price = ctx.text().money(item.get('price'))
        if price is None or price < 0:
            ctx.fail('Некорректная цена у артикула ' + sku)
        seen.add(sku)
        ctx.emit({'sku': sku, 'name': str(item.get('name') or ''), 'price': price}, sku)
        ctx.progress(index + 1, len(items), 'Обработка каталога')
    ctx.log('Каталог обработан', {'records': len(seen)})

Ожидаемый ответ источника: {"items":[{"sku":"A-1","name":"Кабель","price":"1 250,50"}]}. Сценарий сохраняет цену числом 1250.5, проверяет повторы внутри запуска и делает остановку понятной. По своему источнику выберите, считать ли ошибочную цену критической или пропускать запись с предупреждением. Не меняйте это молча.

Проверка перед расписанием

  1. Проверка синтаксиса и разрешённых конструкций проходит без исполнения сайта.
  2. Проба на одной записи даёт ожидаемые ключи и типы. Пустой список даёт ноль записей, а неверная структура даёт ошибку.
  3. Повтор с тем же артикулом обновляет нужную запись по ключу.
  4. Опубликованная версия запускается вручную. Только после этого назначается расписание и часовой пояс.
  5. Выгрузка CSV/JSON/XML показывает те же поля после сопоставления. Токен HTTP endpoint проверяется отдельно с его областями доступа.

Для больших каталогов добавьте пагинацию. Не загружайте неограниченный объём в один список и не запускайте бесконечный цикл внутри сценария.