Выполнение и проект
Выполнение кода, ожидание и остановка, идентификаторы, прокси, время, вывод и сохранение файлов с точными побочными действиями.
Эти функции либо запускают другой код, либо меняют состояние текущего выполнения или всего проекта. Они используют , но результат у них бывает трёх разных видов: текст, пустая строка или побочное действие.
Пустая строка не подтверждает побочное действие
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
Полностью останавливает проект; продолжить тот же ход выполнения нельзя.
Настройки работающего проекта
PROJECTSETTING читает текущее значение настройки того проекта, в котором выполняется
Скрипт-бокс. SETPROJECTSETTING изменяет поддерживаемую настройку этого же проекта.
Обе функции недоступны вне работающего проекта и не могут обращаться к другому
запуску или произвольному элементу формы.
Чтение настройки: PROJECTSETTING
Передайте точный идентификатор настройки между парными метками:
Результат всегда является строкой. Для примера выше это будет текущее число потоков,
например 50. Идентификаторы и имена динамических настроек чувствительны к регистру.
Изменение настройки: SETPROJECTSETTING
Аргументом служит JSON-объект ровно с двумя строковыми полями name и value:
После обычного изменения функция возвращает applied. Для threads она может
вернуть scheduled: Keeper ставит проект на штатную паузу, заново подготавливает
рабочую базу под выбранное число потоков и безопасно продолжает работу. Если ресурсов
недостаточно, изменение не применяется частично и возвращается ошибка.
Значения передаются строками
Даже число и логическое значение находятся внутри JSON-строки: правильно
{"name":"threads","value":"50"} и
{"name":"fast_proxy_change","value":"true"}. Значения true и false
пишутся строчными буквами. Лишнее или повторяющееся поле, неизвестное имя и значение
вне допустимого диапазона завершаются ошибкой.
Встроенные настройки
| Идентификатор | Допустимое значение | Что изменяет |
|---|---|---|
threads | Целое 1..2147483647 | Число потоков; фактическая верхняя граница зависит от доступных ресурсов компьютера. |
timeout_seconds | Целое 0..2147483 | Тайм-аут запроса в секундах. |
proxy_type | Точно HTTP(S), SOCKS4, SOCKS5, AUTO или NONE | Тип прокси. NONE недоступен, если проект требует прокси. |
proxy_login | Любая строка, включая пустую | Общий логин прокси. |
proxy_password | Любая строка, включая пустую | Общий пароль прокси. |
proxy_max_errors | Целое 0..2147483647 | Максимальное число ошибок одной прокси. |
optimized_connection | true или false | Оптимизированное соединение. |
fast_proxy_change | true или false | Быструю смену прокси. |
fast_proxy_change_attempts | Целое 1..2147483647 | Число попыток быстрой смены прокси. |
first_value_min_length | Целое 0..2147483647 | Минимальную длину первого значения; она не может быть больше текущего максимума. |
first_value_max_length | Целое 0..2147483647 | Максимальную длину первого значения; она не может быть меньше текущего минимума. |
second_value_min_length | Целое 0..2147483647 | Минимальную длину второго значения; она не может быть больше текущего максимума. |
second_value_max_length | Целое 0..2147483647 | Максимальную длину второго значения; она не может быть меньше текущего минимума. |
resource_error_filter | true или false | Фильтрацию строк рабочей базы по числу ошибок. |
resource_max_errors | Целое 1..2147483647 | Максимальное число ошибок одной строки рабочей базы. |
proxy_request_limit | Целое 0..9223372036854775807 | Лимит HTTP-попыток на одну прокси; 0 отключает лимит. |
captcha_service | Целое 0..5 | Сервис CAPTCHA: 0 Anti-Captcha, 1 RuCaptcha, 2 DeathByCaptcha, 3 2Captcha, 4 ручной ввод, 5 не использовать. |
captcha_api_key | Любая строка, включая пустую | Ключ выбранного сервиса CAPTCHA. |
auto_pause_continuous_enabled | true или false | Правило паузы после непрерывных сетевых/CAPTCHA-ошибок. |
auto_pause_continuous_seconds | Целое 1..4294967295 | Сколько секунд должны непрерывно идти целевые ошибки. |
auto_pause_percentage_enabled | true или false | Правило паузы по проценту ошибок. |
auto_pause_error_percent | Целое 1..100 | Процент ошибок для автоматической паузы. |
auto_pause_window_seconds | Целое 1..3600 | Интервал, за который считается процент. |
auto_pause_minimum_samples | Целое 1..4294967295 | Минимальное число завершённых результатов перед проверкой процента. |
auto_pause_duration_seconds | Целое 0..86400 | Длительность паузы; 0 означает продолжение только вручную. |
Динамические настройки автора
Динамическая настройка указывается как dynamic: и её точное название:
Обычное поле и многострочное поле принимают любой текст. Флажок и переключатель
принимают только true или false. Список принимает точную подпись одного из своих
пунктов с учётом регистра. Название должно однозначно соответствовать одной
динамической настройке проекта.
Идентификаторы: 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 данные сами содержат нужный перевод строки; проверка записи выполняется в обычном сеансе, а не в студии.