Первый полный 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, проверяет повторы внутри запуска и делает остановку понятной. По своему источнику выберите, считать ли ошибочную цену критической или пропускать запись с предупреждением. Не меняйте это молча.
Проверка перед расписанием
- Проверка синтаксиса и разрешённых конструкций проходит без исполнения сайта.
- Проба на одной записи даёт ожидаемые ключи и типы. Пустой список даёт ноль записей, а неверная структура даёт ошибку.
- Повтор с тем же артикулом обновляет нужную запись по ключу.
- Опубликованная версия запускается вручную. Только после этого назначается расписание и часовой пояс.
- Выгрузка CSV/JSON/XML показывает те же поля после сопоставления. Токен HTTP endpoint проверяется отдельно с его областями доступа.
Для больших каталогов добавьте пагинацию. Не загружайте неограниченный объём в один список и не запускайте бесконечный цикл внутри сценария.