@SimpleBot said in Как поставить русский язык в веб-версии телеграм?:
Accept-Language
Да, это действие помогло, спасибо!
@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")
Положительные моменты:
Отрицательные моменты:
@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 Встроенный язык:
Я написал несколько проектов на тысячи строк кода... сдуру и поэтом знаю о чем говорю.
Вероятно, у меня была бы сотня функций на такое кол-во кода 😃.