Выполнение и проект
Выполнение кода, ожидание и остановка, идентификаторы, прокси, время, вывод и сохранение файлов с точными побочными действиями.
Эти функции либо запускают другой код, либо меняют состояние текущего выполнения или всего проекта. Они используют , но результат у них бывает трёх разных видов: текст, пустая строка или побочное действие.
Пустая строка не подтверждает побочное действие
SLEEP, SCRIPTBOX, ADDID, DELPROXY, FREEZEPROXY, USEPROXY и PAUSEFOR при обычном завершении возвращают пустую строку. Проверяйте нужное состояние по следующему осмысленному действию, а не по тексту результата функции.
Что выбрать
Запустить другой код
SCRIPT делает запрос к настроенному серверу, EVAL выполняет JavaScript, SCRIPTBOX запускает код блока сценария, а DLL вызывает функцию внешней библиотеки.
Подождать или остановить
SLEEP задерживает только текущее выполнение. PAUSE, PAUSEFOR и STOP управляют всем проектом.
Изменить рабочее состояние
ADDID и DELID меняют список идентификаторов. Четыре функции прокси назначают, исключают, временно блокируют или выбирают адрес.
Получить или сохранить данные
PRINT пишет в журнал студии, UNIXTODATE преобразует время, а SAVEFILE сохраняет текст или байты.
Запрос к серверному сценарию: SCRIPT
SCRIPT отправляет запрос GET на сервер, чей адрес и порт заданы в настройках программы. Содержимое функции становится частью адреса после /.
Если сервер вернул:
функция вернёт ok. Конечные пробельные символы ответа удаляются, но реализация оставляет хотя бы один символ даже у ответа, состоящего только из пробелов.
Вложенные переменные и функции внутри аргумента выполняются до запроса. Так можно подставить, например, |LOGIN| или результат кодирования значения.
SCRIPT не преобразует специальные символы адреса автоматически. Значения параметров требуется кодировать до подстановки.
Не добавляйте начальный /: исполнитель уже вставляет его между адресом сервера и аргументом. Если соединение не удалось, функция возвращает строку, начинающуюся с Synapse System Error - , поэтому такой текст нужно считать ошибкой запроса, а не ответом прикладного сценария.
Выполнение JavaScript: EVAL
EVAL сначала подставляет вложенные значения, затем выполняет полученный JavaScript в общем контексте QuickJS без модулей ES. Результат последнего вычисленного выражения становится результатом функции.
Результат:
Полный состав объекта PK, правила общего контекста и ограничения среды находятся в .
Для принудительного запуска прежнего движка добавьте служебную метку |USEOLDJS| внутрь аргумента:
Перед выполнением метка удаляется. Используйте её только для кода, который действительно зависит от прежнего движка: без метки применяется QuickJS, а при недоступности QuickJS исполнитель сам обращается к прежнему движку.
Код выполняется с возможностями проекта
Не передавайте в EVAL текст из ответа сайта или пользовательского ввода как готовый код. Сначала создайте фиксированную программу, а внешние данные передавайте ей как данные с явным кодированием.
Выполнение блока сценария: SCRIPTBOX
SCRIPTBOX запускает содержимое по правилам блока сценария и возвращает пустую строку. Его удобно использовать как внешнюю функцию, когда требуется выполнить несколько строк, присваивания, условия или циклы.
После выполнения |DV|[state] равно ready, |DV|[attempt] равно 1, а сама функция ничего не вставляет в окружающий текст. Синтаксис строк, циклов, критической секции и результатов разобран в .
Содержимое является программой, а не одной строкой
Не оборачивайте весь внутренний блок в дополнительную функцию только ради получения текста. Значения сохраняйте в переменные или результаты блока; внешняя SCRIPTBOX по договору возвращает пустую строку.
Вызов внешней библиотеки: DLL
DLL находит уже загруженную библиотеку и вызывает экспортированную из неё функцию. Имя файла указывается без .dll, а параметры разделяются меткой |PDEL|.
Точные имена полей:
Имя библиотеки без расширения. Исполнитель сам добавляет .dll; библиотека должна быть заранее загружена в перечень DLL.
Точное имя экспортированной функции. Ошибка в регистре или имени не исправляется автоматически.
От нуля до семи строковых параметров. Между соседними значениями ставится |PDEL|.
Имя библиотеки и имя функции выбираются до подстановки вложенных значений. В самих параметрах переменные и функции выполняются после того, как библиотека и экспорт уже найдены.
Неверный двоичный договор может завершить программу
Библиотека должна содержать машинный код, совпадать с разрядностью процесса и экспортировать функцию с соглашением stdcall. Каждый из не более чем семи аргументов и возвращаемое значение должны соответствовать PChar или PWideChar так, как ожидает исполнитель. Дополнительные аргументы игнорируются, а несовместимый договор вызова не перехватывается как обычная ошибка.
Поле называется именно params. Запись parametrs из прежней справки не соответствует исполнителю.
Для отображения сведений о библиотеке в обзоре она может дополнительно экспортировать info_getAuthor, info_getVersion и info_getDescription. Эти функции не требуются для прямого вызова через DLL.
Ожидание текущего выполнения: SLEEP
SLEEP задерживает только текущее выполнение на указанное число миллисекунд и возвращает пустую строку. Другие параллельные выполнения проекта продолжают работать.
Этот вызов ждёт примерно половину секунды. Значение 0 допустимо и не создаёт задержки.
Передавайте только десятичные цифры. Текущий исполнитель удаляет из аргумента все остальные символы перед преобразованием: -100 фактически становится 100, а wait500ms — 500. Если после удаления не осталось цифр, преобразование завершается ошибкой. Такое исправление ввода не является частью надёжного договора, поэтому не полагайтесь на него.
Полная остановка: STOP
STOP останавливает весь проект и может показать переданное сообщение. Вложенные значения в сообщении подставляются до остановки.
Функция возвращает тот же текст, который передан внутрь, но её основное назначение — остановка проекта. Текст может успеть попасть в окружающее выражение, поэтому не используйте возвращаемое значение как признак того, что последующие действия будут выполнены.
STOP вводится вручную
STOP есть в открытой справке и исполнителе, но отсутствует в перечне автоматических подсказок. Это не отменяет поддержку функции: введите обе парные метки полностью.
Пауза до ручного продолжения: PAUSE
PAUSE переводит весь проект на паузу и может показать причину оператору. Продолжение выполняется вручную.
Как и STOP, функция возвращает переданное сообщение. Побочное действие ставится в очередь только один раз для текущего состояния проекта, поэтому повтор текста не означает повторного перехода на паузу.
PAUSE также вводится вручную
PAUSE присутствует в исполнителе и открытой справке, но её нет в автоматических подсказках. Не заменяйте её на SLEEP: задержка одного выполнения не приостанавливает весь проект.
Пауза на заданное время: PAUSEFOR
PAUSEFOR приостанавливает весь проект и автоматически продолжает его после заданного времени. Аргумент — целое число миллисекунд от 1 до 86400000.
Проект продолжит работу через 30 секунд после того, как все его потоки действительно остановятся. Функция доступна только во время выполнения проекта и возвращает пустую строку.
Ручное продолжение, остановка, закрытие проекта, сброс или новая PAUSEFOR отменяют прежнее автоматическое продолжение. Значение должно состоять только из цифр: пробелы, знак и дробная часть завершают вызов явной ошибкой.
SLEEP
Ждёт в текущем выполнении, принимает миллисекунды от нуля и не останавливает соседние потоки.
PAUSE
Ставит весь проект на паузу без срока; продолжение требует действия оператора.
PAUSEFOR
Ставит весь проект на паузу на срок от 1 миллисекунды до 24 часов.
STOP
Полностью останавливает проект; продолжить тот же ход выполнения нельзя.
Идентификаторы: ADDID и DELID
Идентификаторы участвуют в выборе результата текущего выполнения. Эти функции меняют рабочий список, не создавая отдельную копию для вызова.
ADDID
ADDID добавляет переданную строку в конец списка и возвращает пустую строку.
Одинаковый идентификатор можно добавить несколько раз. Функция не проверяет уникальность.
Управление прокси
Функции этого раздела работают с прокси текущего выполнения. Удаление или временная блокировка адреса не выбирает следующий адрес автоматически.
USEPROXY
USEPROXY добавляет указанный адрес в список, делает его текущим и применяет к следующим сетевым запросам. Функция возвращает пустую строку.
Последняя запятая отделяет необязательный тип. Допустимы HTTP, HTTPS, SOCKS4 и SOCKS5 без учёта регистра. Если тип не указан, используется тип из настроек проекта; для однозначного сценария указывайте его явно.
Адрес принимается в одной из трёх форм:
Пустой адрес, неверная форма или неизвестный тип завершают вызов явной ошибкой. Уже отправленный запрос не меняется: назначение действует со следующего запроса.
Обычная последовательность после запрета адреса выглядит так:
После FREEZEPROXY требуется отдельный NEXTPROXY; иначе текущий запросный узел продолжит хранить прежний адрес.
Вывод в студии: PRINT
PRINT подставляет вложенные значения, записывает сообщение в журнал студии и возвращает исходный текст без изменений.
В студии журнал получает сообщение Блок выполнен успешно, а результат функции также равен Блок выполнен успешно. В обычном запуске без журнала студии запись не создаётся, но текст всё равно возвращается.
Результат окружающего выражения — Статус: готово. Не выводите через PRINT пароли, ключи доступа и другие секреты: журнал предназначен для диагностики и может сохраняться вместе с рабочими материалами.
Время Unix в дату: UNIXTODATE
UNIXTODATE принимает целое число секунд от начала эпохи Unix и возвращает дату во времени UTC. Без второго поля используется вид dd/mm/yy.
Результат:
Собственный вид отделяется одной вертикальной чертой:
Результат:
Используйте nn для минут: mm обозначает месяц. Полный перечень обозначений приведён в .
Число должно быть десятичным целым типа Int64 без окружающих пробелов. Поддерживаемый промежуток — от -59011459200 до 253402300799, то есть даты с 0100 по 9999 год. Собственный вид не может быть пустым и не может содержать ещё одну вертикальную черту.
Сохранение файла: SAVEFILE
SAVEFILE сохраняет текст в UTF-8 или декодирует Base64 в байты. Обычный относительный путь отсчитывается от каталога результатов текущего сеанса.
Явное поле text делает назначение четвёртого поля однозначным. Текст записывается в UTF-8 без автоматического перевода строки.
Поля разделяются вертикальной чертой:
Только поле данных выполняется как in-Line. Имя файла, действие и тип являются статическими строками: переменная в имени файла не подставится.
Здесь вычисляется |RESPONSE|, а путь reports\response.json остаётся неизменным. Вертикальные черты внутри вычисленных данных сохраняются: после служебных полей исполнитель соединяет все оставшиеся части обратно.
Создаёт файл или полностью заменяет его содержимое. Успех возвращается строкой File saved successfully.
Создаёт отсутствующий файл или добавляет данные точно в конец существующего. Перевод строки не добавляется. Успех: Data appended successfully.
Использует исходное имя, если оно свободно. При совпадении создаёт name_1.ext, затем name_2.ext и возвращает File saved successfully as <имя>.
Названия действий и типов не зависят от регистра. Если третье поле равно text или bytes и после него есть ещё одно поле, оно считается типом. Поэтому данные, которые буквально начинаются с text|, записывайте в явной форме:
В файл попадёт text|continued.
Путь не должен поступать из недоверенного ввода
Исполнитель создаёт недостающие каталоги и не запрещает .. в относительном пути, поэтому такая запись способна выйти за каталог сеанса. Используйте фиксированный относительный путь внутри заранее выбранной папки. Не подставляйте в имя файла ответ сайта, входную строку или данные пользователя.
Косая черта / в имени заменяется на \. Абсолютный путь с буквой диска поддерживается, если в нём нет ..\, но привязывает сценарий к конкретному компьютеру. Сетевой путь вида \\server\share не принимается как допустимый абсолютный путь.
В студии каталог сеанса отсутствует: после проверки аргументов функция возвращает Success (in studio you can't save files) и не создаёт файл. Поэтому наличие этой строки в студии не является доказательством записи.
Ошибки создания каталога, записи и декодирования Base64 возвращаются как текст функции. Разветвляйте сценарий по ожидаемой строке успеха и сохраняйте сообщение ошибки для диагностики; не считайте любой непустой результат успешным.
Короткая проверка перед запуском
Путь фиксирован и не содержит ..; действие выбрано явно; тип указан явно; для append данные сами содержат нужный перевод строки; проверка записи выполняется в обычном сеансе, а не в студии.