@tet-vivi Теперь все поменяло, но рекапчу нет. Возможно что сайт дает рекапчу только на руском?
Встроенный язык
-
F Fox moved this topic from Поддержка on
-
@sergerdn said in Встроенный язык:
Что-то должно быть в исходниках BAS IDE.
Да я знаю как там все устроенно, даже в исходники никакие лезть не нужно, что бы разобраться в этом. Речь не об этом, а о том что не нужно писать на этом api. Обычно этим страдают те, кто уже писал на каких-то язык и наткнулся на БАС, но бас не заточен под использование api для написания кода. Простой аргумент в нем нет никакого стектрейса для нахождения ошибок в блоке выполнить код, поэтому если твоя огромная простыня будет где-то крашится да и к тому же рандомно и не часто то ты заепешься логи пихать на каждой строчке, что бы понять в чем проблема. Я прекрасно обхожусь без этого, хотя отлично знаю как работает внутренний api.
Максимум это может быть оправдано в использование тем кто пишет сложные модули.
-
@UserTrue said in Встроенный язык:
Обычно этим страдают те, кто уже писал на каких-то язык и наткнулся на БАС
Топикастер начал с того, что не написал зачем он спрашивает это, он сам придумал решение своей задачи, но не сказал какая задача у него стоит.
Если ты прав и у него стоит задача писать кодом(как он привык), то на данный момент есть несколько путей.
Часть из этих путей мы с тобой обсуждали на этом форуме и я как раз сейчас пишу скрипт, реализующий удобную мне логику:
-
Использовать библиотеки управления браузером из BAS, описаны документации https://wiki.bablosoft.com/doku.php?id=puppeteerwithfingerprints. В документации не описано что делать, если хочется использовать не Javascript, но пути есть, просто они не документированы. В этом случае разработчик теряет GUI и должен делать его сам, если скрипт предназначен для конечных пользователей.
-
Использовать гибридную схему, где BAS используется только для задания настроек скрипта и для старта браузеров. BAS пишет данные стартовавших браузеров в файлик, запускается python(тут может быть любой язык) скрипт, который уже отвечает за всю логику скрипта. Тут мы сохраняем GUI BAS для пользователя. А программируем как хотим, на чем хотим, etc. Но защита скрипта уже ложится на плечи не BAS. Но это как раз часто легко решаемо.
BAS -> start Browsers with settings, proxies, etc -> list of cdp connections -> python my_cool_script.py --setting_filename_with_data_from_bas=settings.yaml
В этом случае получается сохранить и GUI BAS и привычный стиль программирования на любом языке с помощью любой библиотеки, которая работает по CDP.
Пример, как управлять уже запущенным браузером для Python(можно любой язык программирования):
https://github.com/sergerdn/playwright-with-fingerprints-python/blob/09c2a108a166531a32123dcd61f1da69f3f1882e/local/remote_cdp.pyТакже можно стартовать браузеры на одном сервере, а управлять ими с другого. Это позволит сделать что-то вроде API.
Windows Servers with BAS and started browsers <-> some own API <-> some scripts to make all hard work with browsers.
-
-
@sergerdn said in Встроенный язык:
Топикастер начал с того, что не написал зачем он спрашивает это, он сам придумал решение своей задачи, но не сказал какая задача у него стоит.
И что? Если у человека нет опыта с БАС и тп, он не может правильно продумать решение и максимально вероятно, что это решение будет не самое удачное. Это касается не только БАС, но и любой другой разработки. У меня достаточно опыта, чтобы сказать что так делать не нужно, более того это и официальная позиция разработчика самого БАС. A puppeteer и тп, это уже другая история.
-
@UserTrue said in Встроенный язык:
Если у человека нет опыта с БАС и тп, он не может правильно продумать решение и максимально вероятно, что это решение будет не самое удачное.
Именно поэтому нужно начинать топик не с поиска реализации путей решения своей задачи, а с описания этой самой задачи.
К сожалению, люди обычно не склонны описывать свою задачу, особенно на этом форуме.
-
@sergerdn said in Встроенный язык:
Именно поэтому нужно начинать топик не с поиска реализации путей решения своей задачи, а с описания этой самой задачи.
Согласен, но тут такое обычно не хотят говорить либо придумают настолько абстрактный пример, что лучше бы его не было )
-
@UserTrue said in Встроенный язык:
Согласен, но тут такое обычно не хотят говорить либо придумают настолько абстрактный пример, что лучше бы его не было )
Можно перефразировать безопасность через неясность на не спалю свою тему через неясность, взамен ничего не хочу давать, но помощь нужна, вот и приходиться выкручиваться 😃
-
@sergerdn said in Встроенный язык:
Топикастер начал с того, что не написал зачем он спрашивает это, он сам придумал решение своей задачи, но не сказал какая задача у него стоит.
Если ты прав и у него стоит задача писать кодом(как он привык)
@UserTrue said in Встроенный язык:
Обычно этим страдают те, кто уже писал на каких-то язык и наткнулся на БАС, но бас не заточен под использование api для написания кода. Простой аргумент в нем нет никакого стектрейса для нахождения ошибок в блоке выполнить код, поэтому если твоя огромная простыня будет где-то крашится
Всё так, джентльмены! Вы меня раскусили. Хотелось программировать буквами об клавиатуру, а не лого-черепашкой об блок-схему. Ради этого даже готов мириться с мукамми отладки при отсутсвии инструментария.

-
@Kosma добавляете нужное вам действие в скрипт, потом по его id на вкладке скрипт его находите в коде оттуда копируете. Так же нужно знать что функции в конце которых стоит знак ! асинхронные и их нельзя использовать внутри обычных циклов, условии и их нельзя вызывать обычном способом. На форуме есть крупицы инфы ищите или разбирайтесь сами методом который я описал. Лично я не хочу писать тут детали, что бы не учить людей плохому )))
-
@Kosma said in Встроенный язык:
Всё так, джентльмены! Вы меня раскусили. Хотелось программировать буквами об клавиатуру, а не лого-черепашкой об блок-схему.
Читай выше, я написал варианты. И отлаживать тоже можно. Если пишешь на Javascript, то вообще проблем нет.
-
Вероятно, есть еще путь использовать внутренний API BAS для написания кода. Но тут на свой страх и риск, так как:
@UserTrue said in Встроенный язык:
Простой аргумент в нем нет никакого стектрейса для нахождения ошибок в блоке выполнить код, поэтому если твоя огромная простыня будет где-то крашится да и к тому же рандомно и не часто то ты заепешься логи пихать на каждой строчке, что бы понять в чем проблема.
Но это частично решаемо, если оборачивать свой код в try ... catch. Но полного stacktrace не будет, к сожалению.
try { nonExistentFunction(); } catch (error) { log("Error caught: " + error); log(JSON.stringify(error)); }Вывод ошибки:
[865451621] [06:05:57] Thread #1 : {"message":"Can't find variable: nonExistentFunction","lineNumber":3,"sourceId":2310798157248,"fileName":"","expressionBeginOffset":25,"expressionCaretOffset":44,"expressionEndOffset":44}Скриншот:
Код:
// Retrieve file or directory information from the profiles directory path. var json = JSON.parse(native("filesystem", "fileinfo", [[_PROFILES_DIR_NAME]])); // Extract and store the existence status and type (file or directory) from the retrieved information. FILEINFO_EXISTS = json["exists"]; FILEINFO_IS_DIRECTORY = json["is_directory"]; // Log the existence status and type of the profiles directory for debugging and verification purposes. log("[gmail_tools][prepare] checking profiles dir, FILEINFO_EXISTS: " + FILEINFO_EXISTS + ", FILEINFO_IS_DIRECTORY: " + FILEINFO_IS_DIRECTORY); // Validate the existence and type of the profiles directory. // If it doesn't exist or isn't a directory, halt the process with an error message. if (FILEINFO_EXISTS !== true || FILEINFO_IS_DIRECTORY !== true) { fail_user("ProfilesPath doesn’t exist or is not a directory.", true); } // Retrieve and log additional configuration information. var profiles_dir_name = VAR__PROFILES_DIR_NAME; log("[gmail_tools][prepare] threads: " + {{Threads}} + ", profiles dir: " + profiles_dir_name); /////// END OF CHECKING PREREQUISITES /////// // Initiate a search for subdirectories within the profiles directory. native_async("filesystem", "search", JSON.stringify({ folder: profiles_dir_name, mask: "*", contains: "", include_folders: true, include_files: false, recursive: false }))!; // Retrieve the results of the asynchronous search. var result = _result(); // Parse the result to extract the directory information. profiles_sub_dirs = JSON.parse(result)["d"]; log("[gmail_tools][prepare] found profiles count: " + profiles_sub_dirs.length); // If no profile directories are found, halt the process with an error message. if (profiles_sub_dirs.length == 0) { fail_user("Could not find any subdirectories in the provided directory: " + profiles_dir_name, true); } // Initialize an array to store the paths of valid profile directories. var profiles_dir_checked = []; // Iterate through each subdirectory found in the profiles directory. profiles_sub_dirs.forEach(function (profile_dir) { // Construct the path to the "Default" folder within each profile directory. profile_dir_checking_file = _path.join([_avoid_nil(profile_dir), _avoid_nil("Default")]); // Log the path being checked for easy tracking and debugging. log("[gmail_tools][prepare] checking profile dir: " + profile_dir); // Retrieve file or directory information of the "Default" folder. var json = JSON.parse(native("filesystem", "fileinfo", profile_dir_checking_file)); // Extract and store the existence status from the retrieved information. FILEINFO_EXISTS = json["exists"]; FILEINFO_IS_DIRECTORY = json["is_directory"]; // Check if the "Default" folder exists. if (FILEINFO_EXISTS !== true) { // If not, log a message and skip to the next iteration. log("[gmail_tools][prepare] not a profile dir, skipping: " + profile_dir); return; } // If the "Default" folder exists, add the profile directory to the list of valid profiles. profiles_dir_checked.push(profile_dir); }); // Log the number of valid profile directories found. log("[gmail_tools][prepare] found valid profiles: " + profiles_dir_checked.length); // Fill resource RClear("PROFILE_DIR") RSync("PROFILE_DIR") for(var i = 0;i<(profiles_dir_checked).length;i++){ RInsert("PROFILE_DIR",(profiles_dir_checked)[i],false) } RSync("PROFILE_DIR")Положительные моменты:
- пишешь кодом на Javascript
- вероятно, огромное кол-во разработчиков BAS не смогу ни понять ни изменить твои скрипты. Если будешь делать скрипты на продажу, поддерживать сможешь только ты.
Отрицательные моменты:
- если пишешь на заказ, некоторые заказчики не захотят работу в таком виде, так как не смогут в будущем поправить по мелочи, не оплачивая никому денег
- код скриптов можно скрыть, в отличии от кода на NodeJS, который будет идти в явном виде.
- при обновлении BAS, может потребоваться обновить код, если внутренний API функций изменится. Это решается ровно также, как и в обычном мире программирования - unit тестами. Да, функции в BAS тоже можно покрыть тестами. Также можно и написать функциональные тесты, что скрипт, как минимум, вообще запускается и не падает с синтаксическими ошибками. Я это же делал.
- ну и еще момент - это возможность себя почувствовать мега-хакером, который кодит не так, как все 😃
-
@sergerdn Я так делал, по факту плюсов в этом не оказалось. Только замедляет разработку. Сейчас пишу в выполнить код только тогда когда это действительно нужно, обычно это какие-то js обработки данных, api самого БАС особенного его асинхронное api стараюсь вообще не использовать. Если хочется писать кодом то лучше выбирать вариант чистый nodejs/python + браузер БАС, а на двух стульях усидеть нормально не получится. У кого времени дофига могут меня не слушать и пройти мой путь, я все это прошел, поэтому сейчас всех отговариваю. Единственнй реальный плюс это то, что если хватит упорства и способностей БАС выучишь досконально вплоть до все его не документированных возможностей, но деньги можно зарабатывать и без этого.
-
@UserTrue said in Встроенный язык:
@sergerdn Я так делал, по факту плюсов в этом не оказалось.
Я думаю, что самый жирный плюс - это возможность писать кодом, а не кубиками. И код скрыт при компиляции скрипта в отличии от NodeJS.
Если бы код NodeJS по умолчанию был бы скрыт при компиляции, это кардинально меняло бы дело.
@UserTrue said in Встроенный язык:
Если хочется писать кодом то лучше выбирать вариант чистый nodejs/python + браузер БАС, а на двух стульях усидеть нормально не получится.
Да, это один из возможных вариантов.
@UserTrue said in Встроенный язык:
У кого времени дофига могут меня не слушать и пройти мой путь, я все это прошел, поэтому сейчас всех отговариваю.
Ты не учитываешь, что ты не зря прошел этот путь, так как твой опыт остался с тобой.
@UserTrue said in Встроенный язык:
Единственнй реальный плюс это то, что если хватит упорства и способностей БАС выучишь досконально вплоть до все его не документированных возможностей, но деньги можно зарабатывать и без этого.
Ну, поковыряться в источниках BAS прикольно, но время и силы жрет капитально. Так как тесты к BAS где-то в другом репозитории, а без тестов не всегда легко понять, что происходит.
-
@sergerdn said in Встроенный язык:
Я думаю, что самый жирный плюс - это возможность писать кодом, а не кубиками. И код скрыт при компиляции скрипта в отличии от NodeJS.
Проблемы в том, что ты все равно не сможешь писать нормальным кодом из-из ограничений js движка и особенностей асинхронного кода БАС. В итоге вместо понятных кубиков получаешь простыни говнокода.
Что касается опыта, то я это упомянул, что это единственный плюс. Но лучше это время потратить на нормальный it курс тк инвестиция своего времени в БАС крайне сомнительный выбор, это я теперь понимаю
-
@UserTrue said in Встроенный язык:
В итоге вместо понятных кубиков получаешь простыни говнокода.
Я думаю, что чистота кода зависит скорее от рук того, кто этот код пишет.
@UserTrue said in Встроенный язык:
Но лучше это время потратить на нормальный it курс тк инвестиция своего времени в БАС крайне сомнительный выбор, это я теперь понимаю
Смотря как смотреть на BAS, если от BAS брать только браузеры, то это хороший выбор. А управлять браузерами можно по CDP и писать код на чем угодно.
Или есть совсем вариант для хахнутых на голову - это писать свой модуль к BAS, который использует dll и переносить часть логики в dll.
Иногда это единственный относительно надежный вариант, если нужно использовать шифрование данных профиля и ключи шифрования нужно скрыть в памяти процесса и от любопытных пользователей скрипта. К примеру такое нужно, если профиль загружается в облака и не хочется, чтобы кто-то к ним смог получить доступ просто так. Включая самого облачного провайдера. -
@sergerdn said in Встроенный язык:
Смотря как смотреть на BAS, если от BAS брать только браузеры, то это хороший выбор. А управлять браузерами можно по CDP и писать код на чем угодно.
Это другая история, если писать по CDP то браузер БАС это всего лишь один из вариантов браузеров, которые можно использовать. Я же против использования внутреннего api БАС для написания скриптов в выполнить код, которое вы так защищаете при это судя по всему не имея в этом реального опыта и решив что это удобно написав пару плюшевых примеров. Я написал несколько проектов на тысячи строк кода... сдуру и поэтом знаю о чем говорю. Больше не буду продолжать этот холивар, не имею столько времени.
-
@UserTrue said in Встроенный язык:
которое вы так защищаете при это судя по всему не имея в этом реального опыта и решив что это удобно написав пару плюшевых примеров.
Я не защищаю. А предполагаю, что это вариант, имеющий право на жизнь. Я постоянно использую вставки разного кода, в том числе, что использует внутренний API.
Да, не всегда до конца понимая, что я делаю, это не очень хорошо, конечно.
@UserTrue said in Встроенный язык:
Я написал несколько проектов на тысячи строк кода... сдуру и поэтом знаю о чем говорю.
Вероятно, у меня была бы сотня функций на такое кол-во кода 😃.