Лайфхаки BAS

Pinned Moved LifeHacks
  • @Antonio said in Лайфхаки BAS:

    function _sa(id)
    {
    log(id)
       ScriptWorker.SetCurrentAction(id)
    }
    

    После этого когда в лог начинают выводиться id всех выполняемых действий. Потом можно однозначно прочесть последовательность всего произошедшего. Помогало мне жесткие баги отлавливать.
    Лучше включать только для дебага! (если действий много в скрипте).

    @romanbiz, я так понимаю, что это твой пункт 6 "по-умному".

    В новых версия использование этого кода приводит к тому, что скрипт невозможно запустить после остановки редактирования.
    Скрипт не запускается не в режиме записи, не в режиме запуска. Более того, у кого-то удаляется большая часть действий скрипта.
    Для тех, кто столкнулся с проблемой - ищите в бэкапах версию скрипта, в которую вы не вносили эту функцию.

  • @Sadzurami said in Лайфхаки BAS:

    @Antonio said in Лайфхаки BAS:

    function _sa(id)
    {
    log(id)
       ScriptWorker.SetCurrentAction(id)
    }
    

    После этого когда в лог начинают выводиться id всех выполняемых действий. Потом можно однозначно прочесть последовательность всего произошедшего. Помогало мне жесткие баги отлавливать.
    Лучше включать только для дебага! (если действий много в скрипте).

    @romanbiz, я так понимаю, что это твой пункт 6 "по-умному".

    В новых версия использование этого кода приводит к тому, что скрипт невозможно запустить после остановки редактирования.
    Скрипт не запускается не в режиме записи, не в режиме запуска. Более того, у кого-то удаляется большая часть действий скрипта.
    Для тех, кто столкнулся с проблемой - ищите в бэкапах версию скрипта, в которую вы не вносили эту функцию.

    Я сам периодически эту функцию использую в некоторых скриптах, ни разу не было с ней проблем. Только функцию нужно вынести в переменную, что бы она не переопределялась обратно после некоторых действий (например после действия "загрузить")

    _sa = function(id)
    {
        log(id)
        ScriptWorker.SetCurrentAction(id)
    }
    

    Тестовый скрипт 493.xml

  • @Fox said in Лайфхаки BAS:

    @Sadzurami said in Лайфхаки BAS:

    @Antonio said in Лайфхаки BAS:

    function _sa(id)
    {
    log(id)
       ScriptWorker.SetCurrentAction(id)
    }
    

    После этого когда в лог начинают выводиться id всех выполняемых действий. Потом можно однозначно прочесть последовательность всего произошедшего. Помогало мне жесткие баги отлавливать.
    Лучше включать только для дебага! (если действий много в скрипте).

    @romanbiz, я так понимаю, что это твой пункт 6 "по-умному".

    В новых версия использование этого кода приводит к тому, что скрипт невозможно запустить после остановки редактирования.
    Скрипт не запускается не в режиме записи, не в режиме запуска. Более того, у кого-то удаляется большая часть действий скрипта.
    Для тех, кто столкнулся с проблемой - ищите в бэкапах версию скрипта, в которую вы не вносили эту функцию.

    Я сам периодически эту функцию использую в некоторых скриптах, ни разу не было с ней проблем. Только функцию нужно вынести в переменную, что бы она не переопределялась обратно после некоторых действий (например после действия "загрузить")

    _sa = function(id)
    {
        log(id)
        ScriptWorker.SetCurrentAction(id)
    }
    

    Тестовый скрипт 493.xml

    благодарю
    в таком виде данная функция проблем не вызвала

  • Сделал небольшой js скрипт, который перехватывает на сайте все копирования сразу в переменную в обход буфера обмена

    Вставить в действие "Выполнять при каждой загрузке страницы в браузере":

    window.copyText;
    document.addEventListener("copy", function (e) {    
        copyText = e.target.value;
        e.preventDefault();
    });
    

    После того как вы на сайте скопировали текст, вставьте в действие "Яваскрипт":

    copyText
    

    и вы получите скопированный текст в переменную

  • Сегодня узнал о существовании метода BAS для определения имени файла лога Logger.GetFileName() :D

    На случай, если кому то будет необходимо, использовать в действии "выполнить код":

    [[FILE_NAME]] =  Logger.GetFileName()
    
  • @Fox said in Лайфхаки BAS:

    Сегодня узнал о существовании метода BAS для определения имени файла лога Logger.GetFileName() :D

    На случай, если кому то будет необходимо, использовать в действии "выполнить код":

    [[FILE_NAME]] =  Logger.GetFileName()
    

    Нужная вещь, я в веб интерфейсе, сначала получал весь лог, затем писал его на диск, потом открывал )

    Теперь можно просто получить путь и открыть сразу

  • @Fox said in Лайфхаки BAS:

    [[FILE_NAME]] = Logger.GetFileName()

    а еще его можно очистить с помощью

    Logger.Clear()
    

    Или указать свой путь для записи лога

    Logger.SetFileName("C:/project/new_log.txt")
    

    Но меня больше интересует, как можно писать в лог удаленно? есть какое-то апи?

    upd:

    Вот нашел возможность писать в лог

    Logger.Write('test')
    

    Как бы это использовать удаленно? через командную строку, запись файла или как-то ещё.

  • @graf said in Лайфхаки BAS:

    Как бы это использовать удаленно? через командную строку, запись файла или как-то ещё.

    Удалённо точно ни как не получится использовать

  • @Fox said in Лайфхаки BAS:

    Удалённо точно ни как не получится использовать

    Ну почему )) Можно вместе с бас стартовать сервер, который будет писать в лог. Только накой такой изврат может пригодиться...

  • @UserTrue

    С помощью бас запускаю веб сервер на локалке, на котором в цикле крутится скрипт PHP, вот мне нужно из этого скрипта отстукивать в лог. Вчера ковырял дебаг бас, который запускается в хром, работает на веб сокете и все его действия транслируются в лог программы. По всей видимости как-то можно использовать удаленный лог. Есть конечно и костыльный вариант, писать в файл с помощью пхп, а в ассинхронной функции бас читать этот файл и выводить в лог, но это уже крайний вариант

  • Не знаю подходящий ли раздел для лайфахака ведь он не косвенно относится к басу... но пусть будет)
    В очередной раз полез чистить бэкапы проектов которые бас создает автоматически.
    Screenshot_2.png
    Решил в этот раз поставить и на свой пк очистку от старых файлов с помощью простых cmd команд.
    Возможно на форуме уже выкладывали, но думаю не лишнем будет закинуть и сюда.
    Данный набор скриптов использую на всех серверах, с помощью него очищаю старые логи баса, логи nodejs, уменьшать размер профилей и прочее.

    CMD команды: Можно использовать в bat скрипте и через планировщик выполнять каждый заданный промежуток времени:

    Удаляет по маске *debug.txt

    Del /S /Q "C:\Soft\"*debug.txt
    
    Del /S /Q "C:\Soft\"*node_log.txt
    

    Удаляет все файлы старше 30 дней. Я использовал для удаления временных картинок.

    chcp 1251
    echo Y | ForFiles /p "C:\Soft\Poster\Files\downloadimage\black2" /s /d -30 /c "cmd /c del @file"
    echo Y | ForFiles /p "C:\Soft\Poster\Files\downloadimage" /s /d -30 /c "cmd /c del @file"
    

    И по аналогии удаляются логи старше 3х дней

    chcp 1251
    echo Y | ForFiles /p "C:\Soft\Bots 1\appsremote\Bots\logs" /s /d -3 /c "cmd /c del @file"
    echo Y | ForFiles /p "C:\Soft\main\appsremote\Bots\logs" /s /d -3 /c "cmd /c del @file"
    echo Y | ForFiles /p "C:\Soft\Poster\Poster\appsremote\PinterestPoster\logs" /s /d -3 /c "cmd /c del @file"
    echo Y | ForFiles /p "C:\Soft\FeedCreater\appsremote\FeedCreater\logs" /s /d -3 /c "cmd /c del @file"
    

    Для уменьшения размера профилей баса. Удаляет папку Cache во всех профилях в папке D:\Profile\allprofile. В моих случаях не сказывалось на работоспособности авторизаций на сайтах.

    @echo on
    cd /d "D:\Profile\allprofile"
    for /r %%i in ("Cache") do (
     if exist "%%i" rd /s /q "%%i"
    )
    

    тоже самое но для папки Service Worker

    FOR /R "D:\Profile\profile 16" %%G in (.) DO (
     Pushd %%G
     Echo now in %%G
     for /f "delims=" %%a in ('dir /b *Worker* ') do  rd /s /q "%%~dpnxa"
     Popd )
    

    Вы могли заметить что для удаления файлов по возрасту используется forfiles.
    forfiles - это программная утилита для Microsoft Windows, которая выбирает файлы и запускает на них команду. Критерии выбора файла включают имя и дату последнего изменения.

    forfiles.exe должен находиться в папке откуда выполняется команда. Загружать exe сюда не стал т.к. virustotal ругается на Malicious.moderate.ml.score.
    Насчет удаления кэша из папок профилей - может плохо работать на медленных или битых дисках. На всех серверах с SSD работает адекватно.

    Аккуратно с удалением файлов по времени изменения! Удаляет все файлы, фильтруйте если нужно работать лишь с определёнными, либо как я - указываю полный путь к папкам где лежат логи.

    Если Forfiles не срабатывает то пробуйте поменять параметры например так:

    echo Y | ForFiles /p "C:\Users\venom\AppData\Roaming\BrowserAutomationStudio\projectbackups" -s -m *.* -d -14 -c "cmd /c del /q @path"
    
  • Есть несколько интересных функций, о которых мог кто-то не знать. Делюсь, вдруг кому пригодится:

    directory_of('F:\\Text\\api.txt'); /* returns `F:/Text` */
    
    filename_of('F:\\Text\\api.txt'); /* returns `api.txt` */
    
    _user_data_folder(); /* returns `C:/Users/USERNAME/AppData/Local` */
    
  • Немного костыльный способ найти путь к вашему модулю, это пригодится для разработчиков модулей в которых используются доп файлы, чтобы в скомпилированном скрипте ваш код мог найти нужные файлы без лишних копирований.

    moduleFolder.xml

  • @GamiD said in Лайфхаки BAS:

    Конвертор BAS Cookie для Google Chrome расширения EditThisCookie
    Проверял на mail.ru, facebook.com и еще на нескольких сайтах возможно есть сайты на которых не будет работать

    0_1563099815733_BasCookieToChromeEditThisCookie.xml

    Привет, сейчас не работает.
    У кого-то есть готовое решение ?

  • Так как на данный момент в модулях BAS не работают зависимости, то я придумал способ использовать модули (которые устанавливаются только при использовании, строка, путь и т.д) в других модулях, без необходимости использовать дополнительные действия.

    Нужно добавить /*Dat:eyJzIjoiaXNfc3RyaW5nIn0=*/ в code.js файлы действий, eyJzIjoiaXNfc3RyaW5nIn0= - это закодированная в base64 строка {"s":"is_string"}, is_string - это имя любого действия нужного модуля (можно найти в manifest.json файле модуля).

    Этот код нужно добавлять только в те действия которые зависят от других модулей.

    Пример модуля использующего действие модуля "Строка": TestModule.zip
    Тестовый проект: depends.xml

  • Встала перед мной задачка работать с большими файлами в бас. Стандартные инструменты для объемов не подходят, городить костыли не очень хочется а js из выполнить код оказался слишком медленным и прожерливым. Казалось бы безнадега, но ведь есть еще и node js. Вот краткий результат на обработку 123к строк по 11 регуляркам и записью в разные файлы
    ce58183a-fdc0-4173-9182-2494010be647-image.png
    ВСе что нужно - включить node js без каких либо модулей и скопипасть этот код. Ну и синхронизировать

    const fs = require('fs'),
          readline = require('readline');
    const instream = fs.createReadStream('pathToFile'); //тут пишем путь к файлу, который нужно сортировать
    const other = fs.createWriteStream( 'pathToOther', {encoding:'utf8'}); //а тут файлик для сохранения не прошедших проверку строк
    const myCheck = fs.createWriteStream( 'pathToResult', {encoding:'utf8'});//ну а  этот файл сохранятся уже подходящие строки
    const rl = readline.createInterface({
        input: instream,
        crlfDelay: Infinity
    });
    let uniqMyCheck = new Set(); //если не нужно чистить от дублей, то заменить new Set() на [], в строках ниже add на push
    let uniqOther = new Set();
    rl.on('line', (line) => {
      let currLine = line.toString();
      switch (true) { 
        case currLine.search(/regex/) > -1: uniqMyCheck.add(line); break; //тут проходит наша проверка
        default: uniqOther.add(line); break; //а тут складывается все остальное
      };
    });
    rl.on('close', () => {
      uniqOther.forEach(value => other.write(`${value}\n`));
      uniqMyCheck.forEach(value => myCheck.write(`${value}\n`)); //ну а так записывается результат
    });
    

    Знающим, умеющим и практикующим за советы и/или доработку - большая благодарность

  • This post is deleted!
  • Установка модулей для nodejs прямо из nodejs xD
    Возможно будет полезным, если модуль не устанавливается штатно

    node install module.xml
    2021-12-06_232352.png

  • Выше человек хотел перебрать большой массив на JS. Вот статья, человек сравнил кучу виду циклов на JS.
    https://gist.github.com/DungGramer/7efdfefecaa1b8f5d6510202524dc751

    Самый быстрый - перебрать большой массив JS без NodeJS. Результат следующий (выводы из статьи)

    Массив до 100 элементов
    Лучший способ: --while forward: 0.01289999857544899ms

    Массив 1000 элементов
    Лучший способ:: pop: 0.0018000006675720215ms

    Массив 10000 элементов и далее
    Лучший способ:: pop: 0.0018000006675720215ms

    Ускорил свои циклы и перебор массивов для консольных команд на 40%+

  • @FastSpace а вы эти тесты в бас сами прогоняли?
    результаты могут быть отличны.
    в какой среде тесты прогонялись автором?

    в любом случае нативный js цикл многократно быстрей встроенного в бас.