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 · Лимиты