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

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

PHP SDK: Один сценарий, несколько источников

Да. Один сценарий может читать несколько сайтов и обработать входящее письмо в том же прогоне. Адреса сайтов не обязаны быть заведены отдельными карточками в разделе «Сайты».

Зачем при создании выбирать один сайт

Выбранный сайт определяет, куда попадут результаты, какие поля у записей, кто может видеть сценарий, какой агент его выполняет и какие настройки запросов применяются. Это место для результатов, а не список разрешённых доменов. Если вы уже создали десять сайтов, сценарий одного из них может обращаться к адресам остальных. Если тариф позволяет создать только один сайт, сценарий всё равно может запросить несколько публичных доменов: это не создаёт дополнительные карточки сайтов и не расходует их количественный лимит.

У этого подхода есть граница: записи одного прогона сохраняются у выбранного сайта. Система не распределяет их автоматически по таблицам других карточек сайтов. Для общей таблицы добавьте поля «Тип источника», «Идентификатор источника» и «Название» и передавайте в emit() ключ, который включает источник. Тогда одинаковый артикул на двух сайтах не затрёт сам себя.

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

Как добавить письмо

Опубликуйте сценарий и привяжите к нему входящий адрес в настройках почты. При поступлении письма система запускает этот же сценарий; тогда mail().available() вернёт true, а mail().current() отдаст именно письмо, вызвавшее запуск. В том же run можно обратиться к нескольким сайтам через http() или browser() и объединить результаты.

При ручном запуске, запуске по расписанию и пробе письма нет: mail().available() вернёт false. Сценарий продолжит работу с сайтами. Произвольно читать всю почту пространства из сценария нельзя — письмо доступно только в связанном с ним запуске. Если нужны уже собранные записи или письмо как именованный вход составного процесса, используйте источники процесса или PHP Sources.

Пример для PHP и JavaScript

Создайте у сайта для результатов строковые поля source_type, source_id и title. В параметрах запуска задайте source_urls — массив адресов. HTML-селектор title здесь читается для наглядности; в реальном каталоге замените его полями карточек. Ключ записи начинается с типа источника, поэтому сайты и письма не смешаются.

PHP

<?php
function run(\Sdk\Context $ctx): void
{
    $urls = $ctx->param('source_urls', []);
    if (!is_array($urls)) {
        $ctx->abort('Укажите список адресов');
    }
    foreach ($urls as $url) {
        $address = (string) $url;
        $response = $ctx->http()->get($address);
        if (!$response->ok()) {
            $ctx->log('Сайт не ответил', ['url' => $address], 'warning');
            continue;
        }
        $key = 'web:' . $address;
        $ctx->emit(['source_type' => 'web', 'source_id' => $key,
            'title' => $response->dom()->text('title', '')], $key);
    }
    if ($ctx->mail()->available()) {
        $letter = $ctx->mail()->current();
        $key = 'mail:' . $letter['id'];
        $ctx->emit(['source_type' => 'mail', 'source_id' => $key,
            'title' => $letter['subject'] ?? 'Письмо'], $key);
    }
}

JavaScript

async function run(ctx) {
  const urls = ctx.param('source_urls', []);
  if (!Array.isArray(urls)) ctx.abort('Укажите список адресов');
  for (const url of urls) {
    const address = String(url);
    const response = await ctx.http().get(address);
    if (!response.ok()) {
      ctx.log('Сайт не ответил', { url: address }, 'warning');
      continue;
    }
    const key = `web:${address}`;
    ctx.emit({ source_type: 'web', source_id: key,
      title: response.dom().text('title', '') }, key);
  }
  if (await ctx.mail().available()) {
    const letter = await ctx.mail().current();
    const key = `mail:${letter.id}`;
    ctx.emit({ source_type: 'mail', source_id: key,
      title: letter.subject ?? 'Письмо' }, key);
  }
}

Проверка кода не открывает сайты и не получает письма. Сначала проверьте короткий список адресов пробным прогоном, затем настройте почтовую привязку и проверьте реальное событие письма. Оплачивается фактическая работа сценария и используемые сервисы; число URL в коде не превращается в число созданных сайтов.

Сценарии и публикация · Почтовый SDK для PHP · Почтовый SDK для JavaScript · Лимиты