@Fox Спасибо большое, проблема решена!!!
Как автоматизировать сам BAS?
-
@ilsaazure Для вызова функции BAS используйте вызов функции BAS (https://wiki.bablosoft.com/doku.php?id=node.js#calling_bas_functions):
var Result = await BAS_FUNCTION( "FunctionName", {ParamName1: "ParamValue1", ParamName2: "ParamValue2"} )Использование BAS_API возможно только в виде
BAS_API("_HEX:6c6f672822312229")Если заменить двойные кавычки на одинарные кавычки или символ обратной кавычки, то это вызовет ошибку при запуске скомпилированного скрипта с защитой
await BAS_API('_HEX:6c6f672822312229'); await BAS_API(`_HEX:6c6f672822312229`);конкатенация строк и передача аргумента через переменную тоже вызывает проблему:
await BAS_API("_HEX:" + "6c6f672822312229"); var q = "_HEX:6c6f672822312229"; await BAS_API(q);
Основная проблема здесь в том, что при использовании BAS_API вы сохраняете код действия и обновить его автоматически в будущем не получится. Нужно будет в ручную пересохранять код каждого действия BAS в nodejs.
В разы проще создать функцию BAS и вызывать функцию BAS из nodejs, функционал тот же, при этом вы можете автоматически обновить все действия BAS. Ещё учтите, что код действия nodejs находится в открытом виде, а функции BAS в зашифрованном виде
-
@Fox Я тебя понял, я хочу использовать вызовы из node js только для части кода, чтобы не плодить большое количество однотипных действий, вот пример
try { // Получение номера потока в переменную THREAD_INDEX await execute_code(`VAR_THREAD_INDEX = thread_number()`); // Установка символа перевода строки в переменную LINE_BREAK await execute_code(`VAR_LINE_BREAK = '\\r\\n';`); // Установка пустой строки в переменную EMPTY await execute_code(`VAR_EMPTY = ''`); // Проверка включён ли режим записи и установка в переменную IS_RECORD await execute_code(`VAR_IS_RECORD = _is_record()`); // Идентификатор включены ли прокси у http клиента await execute_code(`VAR_PROXY_HTTP_IS_USED = false`); // Идентификатор включены ли прокси у браузера await execute_code(`VAR_PROXY_BROWSER_IS_USED = false`); // Идентификатор использовать ли одну проксю await execute_code(`VAR_PROXY_USING_ONE = false`); // Идентификатор использовать ли базу данных await execute_code(`VAR_DATABASE_USE = true`); } catch (error) { throw `Ошибка в программе: ${error}`; } async function execute_code(code){ await await BAS_API(("_HEX:" + Buffer.from(code, "utf8").toString("hex"))); }или вот ещё пример
try { // Получение ответа, статуса, текущего url http запроса await execute_code(`VAR_SAVED_CONTENT = http_client_encoded_content(\"auto\")\nVAR_SAVED_STATUS = http_client_status()\nVAR_SAVED_URL = http_client_url()\n`) } catch (error) { throw `Ошибка в программе: ${error}`; } async function execute_code(code){ await await BAS_API(("_HEX:" + Buffer.from(code, "utf8").toString("hex"))); }мне такие действия нужны чтобы сократить общее количество действий в моём скрипте BAS и тем самым свести к минимуму логические ошибки баса в исходном коде, из-за которых скрипт может перекинуть выполнение с одного действия на другое или завершиться с сообщением "OK"
На то что эти действия не зашифрованы так то всё равно, это общие действия, а основная логика скриптов у меня именно в стандартных функциях BAS
Буду пробовать корректировать функцию ActionUpdaterModel чтобы она обновляла код действий node js -
@ilsaazure said in Как автоматизировать сам BAS?:
@Fox Я тебя понял, я хочу использовать вызовы из node js только для части кода, чтобы не плодить большое количество однотипных действий,
Если так нужен враппер, то можете создать функцию BAS, название действия передавать через атрибут, а внутри функции в зависимости от названия выполняйте нужное действие. Снаружи будет выглядеть как тот же BAS_API
var thread_number = await BAS_FUNCTION("wrapper", {"n": "thread_number"}); -
@Fox то-есть сделать функцию которая будет выполнять все эти действия в зависимости от того какой аргумент действия был передан?
мне кажется это будет очень кривой костыль, например у меня есть такие вызовы, значит для этой функции нужно будет передавать ещё кучу других аргументов которые должны использоваться в действиях, это же вообще не удобно будетif ([[DATABASE_USE]] == true){ // Получение пути к файлу с данными для работы await execute_code(`VAR_RESOURCE_INPUT_DATA_PATH =RInfo(\"Файл с данными для работы\",\"Location\")`); // Получение директории файла с данными для работы await execute_code(`VAR_RESOURCE_INPUT_DATA_DIRECTORY = _path.dirname(VAR_RESOURCE_INPUT_DATA_PATH);`); // Подключение к бд await execute_code(`SQL_Setup((\"sqlite\"), (\"\"), (\"auto\"), (\"\"), (\"\"), (\"\"), (VAR_DATA_DIRECTORY + \"/data_for_work/database/database.db\"), (\"\"), (300), (\"\"))`); } -
@Fox said in Как автоматизировать сам BAS?:
var thread_number = await BAS_FUNCTION("wrapper", {"n": "thread_number"});
Да и плюсом такие вызовы вообще не удобные, если есть действие которое я хочу перенести в node js то я просто перекидываю его в node js, декодирую hex и пишу код execute_code, а при таком вызове нужно помнить все аргументы которые вызывает функция обработчик которая отвечает за вызов обычных функций BAS
-
@ilsaazure Я бы вообще не советовал писать скрипт для БАС через встроенный Nodejs, будите большую часть времени искать решение подобных проблем. Кроме того у вас будут проблемы в многопотоке и nodejs может упасть в любой момент, а отладка для такого костыля тоже гемор. Если уж автоматизировать через nodejs то делать это именно в nodejs у бас есть для этого библиотека
-
@usertrue При тестировании через многопоток в басе ни разу не было ошибок с скриптами которые используют такой тип работы, скрипты отлично работают, сейчас копаюсь в функции обновления действий, просто через неё сделаю замену моих вызовов await execute_code на await BAS_API, отпишу по результату, может ты действительно прав и возникнут проблемы
-
@ilsaazure said in Как автоматизировать сам BAS?:
При тестировании через многопоток в басе ни разу не было ошибок с скриптами которые используют такой тип работы
У вас все еще впереди, если простые скрипты которые быстро отрабатывают то может проблем и не будет. На тяжелых скриптах которые долго работают будут почти наверняка )) https://github.com/bablosoft/bas-remote-node
-
@usertrue said in Как автоматизировать сам BAS?:
то-есть как вариант полностью на node js написать? я BAS использую как раз из-за того-что в нём легко писать логику скриптов, на node js сложно будет сделать всю нужную мне логику
-
@ilsaazure said in Как автоматизировать сам BAS?:
@usertrue у меня скрипты на ~800 действий и нормально работают
У меня много раз было, что процесс nodejs падал часов через 5-8 работы
-
@ilsaazure said in Как автоматизировать сам BAS?:
то-есть как вариант полностью на node js написать? я BAS использую как раз из-за того-что в нём легко писать логику скриптов, на node js сложно будет сделать всю нужную мне логику
Конкретно эта библиотека позволяет запускать пользовательские функции БАС из nodejs. То что вы делает не кажется упрощением, я бы на чистой nodejs + puppeteer написал бы быстрее чем такое делать )
-
@ilsaazure said in Как автоматизировать сам BAS?:
@usertrue я же писал что мне node js вызовы нужны только для общих действий, вся важная логика в стандартных функциях BAS, а http у меня использует зашифрованные данные для внешнего tls клиента
Так я вам скинул библиотеку которая это и делает, вы можете писать в ней общую логику и вызывать свои функции в БАС, которые будут защищены. Единственный недостаток это нужно сделать интерфейс для скрипта