Оп оп , решил ) аргументы
Встроенный язык
-
@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 Встроенный язык:
Я написал несколько проектов на тысячи строк кода... сдуру и поэтом знаю о чем говорю.
Вероятно, у меня была бы сотня функций на такое кол-во кода 😃.
-
@UserTrue said in Встроенный язык:
Я написал несколько проектов на тысячи строк кода... сдуру и поэтом знаю о чем говорю.
У меня, кстати, есть небольшая "проблема". Вероятно, связанная с тем, что пользователи/разработчики BAS ребята скрытные и опытом не делятся или делают это с неохотой.
Я не до конца понимаю, как делать большие проекты так, чтобы не было потом мучительно больно.
Понятно, что проект надо проектировать и не забывать про документацию, так как переделывать что-то в рамках BAS иногда стоит столько времени, что проще сделать заново.
Например, можно большой проект разбить на модули по функциональному признаку.
Модули данных. Вероятно, если проект большой, то данные надо хранить где-то удаленно в какой-то БД или сервисе:
- создание/хранение/обновление данных аккаунта: логин с паролем, данные запасной почты, etc
- создание/хранение/обновление данных профиля браузера: cookies, local storage, etc.
Модули логики:
- регистрация аккаунта
- проверка статуса аккаунта(живой, забанен, etc)
- какие-то другие действия, ради чего делался аккаунт
Вспомогательные модули:
- километровый список функций аля utils.
Нужны соглашения как модуль/функции должны возвращать данные. Например, функция в BAS может вернуть только одно значение. Если надо вернуть больше одного значения, то тут есть пути.
Мало того, нужны даже соглашения как вызывать функции. Так как функция может принять больше одного параметра. Если создать функцию, а потом ее вызвать, то проблем не будет. А вот если изменить что-то в API функции: переименовать параметр, добавить новый, поменять местами параметры и так далее, то тут будет абсолютно не предсказуемое поведение в текущем коде, который эти функции вызывает.В этом случае обязательно нужна будет документация и хотя бы функциональные тесты. Как минимум, чтобы тестировать модуль как черный ящик.
BAS не дает множества инструментов, к которым привыкли программисты из обычного мира программирования, поэтому в этом случае нужны четкие правила как работать в рамках проекта и надо за этим правилами следить, причем вручную без каких-либо инструментов.
P.S.
А лучше не писать большие проекты на BAS, а писать на чем угодно, а из BAS брать только браузеры. Вероятно, это самый разумный путь.