Лайфхаки BAS

Pinned Moved LifeHacks
  • Думаю очень годный лайфхак:

    Чтобы убрать весь звук со страниц из скриптов BAS нужно добавить в файл chrome_command_line.txt строку

    --mute-audio
    

    upd: Пользователь @Mic предложил альтернативный вариант отключения звука
    https://community.bablosoft.com/topic/11145/bas-палится/24

    upd2: Начиная с 24 версии BAS звук можно отключить в настройках профиля браузера

    chrome://settings/content/sound
    

    тестовый скрипт: 1934.xml

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

    Добавлю так же полезную штуку - прогрессбар.

    progress_maximum(100)
    progress_value(10)
    

    Выглядит это так
    0_1557990924619_7fa3ad64-41e2-4495-a837-c18ab42ad974-изображение.png

    К сожалению прогресс бар виден только во вкладке "результаты", которую видят далеко не все пользователи. По этому я решил сделать прогресс бар в логе:

    0_1557991465746_support62.gif

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

    progressbar = function(val,max){
    var res = parseInt(val * 1000 / max )
    if(val == 0) log_html('<table style="border-color:#000000" width="1000" cellspacing="0" cellpadding="4" border="0"><tr><td bgcolor="#F0FFF0"</td></tr></table>')
    if(val >= max) log_html('<table style="border-color:#000000" width="1000" cellspacing="0" cellpadding="4" border="0"><tr><td bgcolor="#32CD32"</td></tr></table>')
    if(val != 0 && val < max)log_html('<table style="border-color:#000000" width="1000" cellspacing="0" cellpadding="4" border="0"><tr><td bgcolor="#32CD32" width="' + res + '"></td><td bgcolor="#F0FFF0" ></td></tr></table>')
    }
    

    Думаю описывать, что такое val и max в этой функции излишне :D


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

    Так выглядит лог без чистки:
    0_1557991896086_57484118-e735-480e-906b-77f2e20d8ce5-изображение.png


    html код таблицы лежит в открытом виде, так что изменить длину, цвет, или добавить текст не составит труда. Если этот прогресс бар зайдёт, добавлю дополнительную функцию настройки внешнего вида.


    Вот тестовый скрипт



    Ещё вариант с установкой цвета:

    progressbar = function(val,max,color){
    var res = parseInt(val * 1000 / max )
    if(val == 0) log_html('<table style="border-color:#000000" width="1000" cellspacing="0" cellpadding="4" border="0"><tr><td bgcolor="#F0FFF0"</td></tr></table>')
    if(val >= max) log_html('<table style="border-color:#000000" width="1000" cellspacing="0" cellpadding="4" border="0"><tr><td bgcolor="' + color + '"</td></tr></table>')
    if(val != 0 && val < max)log_html('<table style="border-color:#000000" width="1000" cellspacing="0" cellpadding="4" border="0"><tr><td bgcolor="' + color + '" width="' + res + '"></td><td bgcolor="#F0FFF0" ></td></tr></table>')
    }
    

    Пример использования

    progressbar(35,100,"#00BFFF")
    

    0_1557994592588_2ab0a545-3784-4b2d-9deb-5212c36cc178-изображение.png


    С глобальными переменными (или объектом в глобальной переменной) можно установить прогресс бар на несколько потоков:
    0_1557994637924_support63.gif

  • Добавлена информация с рекомендацией ожидания после крупных обновлений и о том как скачать предыдущую версию

  • Добавлена информация о том, как подключать разные программы на BAS к разным VPN соединениям/также можно разделять чтобы в BAS было VPN соединение, а на компьютере нет

  • Добавлены пункты:
    13. Взаимодействие с командной строкой
    14. Интеграция с языком программирования

  • Добавлены пункты:
    15. Модуль парсинга JSON
    16. Бесконечный цикл

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

    0_1563099815733_BasCookieToChromeEditThisCookie.xml

  • @fox Здравствуйте, не могли подсказать или скинуть шаблон как распределить на несколько потоков?

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

    @fox Здравствуйте, не могли подсказать или скинуть шаблон как распределить на несколько потоков?

    распределить на несколько потоков что?

  • @fox

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

    С глобальными переменными (или объектом в глобальной переменной) можно установить прогресс бар на несколько потоков:

    Этот прогресс бар

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

    @fox

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

    С глобальными переменными (или объектом в глобальной переменной) можно установить прогресс бар на несколько потоков:

    Этот прогресс бар

    Вот вариант с костылями скрипт.xml (с обычными глобальными переменными и обычными условиями)

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

    progressbar = function (val, max) {
        var SettingsProgressbar = JSON.parse(P("basglobal", "SETTINGSPROGRESSBAR")) //прочитали настройки из глобальной переменной
        if (!SettingsProgressbar[(thread_number() - 1)]) SettingsProgressbar[(thread_number() - 1)] = {}
            SettingsProgressbar[(thread_number() - 1)].val = val
        SettingsProgressbar[(thread_number() - 1)].max = max
        PSet("basglobal", "SETTINGSPROGRESSBAR", (JSON.stringify(SettingsProgressbar))) //обновили настройки
    
        for (var i = 0; i <= SettingsProgressbar.length - 1; i++) { //проходим циклом все объявленные статус бары
            if (SettingsProgressbar[i]) { //если статусбар данного потока существует
    
                var res = parseInt(SettingsProgressbar[i].val * 1000 / SettingsProgressbar[i].max)
                if (SettingsProgressbar[i].val == 0) log_html('<table style="border-color:#000000" width="1000" cellspacing="0" cellpadding="4" border="0"><tr><td bgcolor="#F0FFF0"</td></tr></table>')
                if (SettingsProgressbar[i].val >= SettingsProgressbar[i].max) log_html('<table style="border-color:#000000" width="1000" cellspacing="0" cellpadding="4" border="0"><tr><td bgcolor="' + SettingsProgressbar[i].color + '"</td></tr></table>')
                if (SettingsProgressbar[i].val != 0 && SettingsProgressbar[i].val < SettingsProgressbar[i].max) log_html('<table style="border-color:#000000" width="1000" cellspacing="0" cellpadding="4" border="0"><tr><td bgcolor="' + SettingsProgressbar[i].color + '" width="' + res + '"></td><td bgcolor="#F0FFF0" ></td></tr></table>')
                log_html(" ")
            }
        }
    }
    

    Убрал определение цвета внутри потока (это не удобно, так как придётся создавать в скрипте кучу условий).

    Вместо этого вынес определение цветов для всех статусбаров в глобальный массив объектов SETTINGSPROGRESSBAR, который объявляется в функции OnApplicationStart и там же заполняет цвета для всех статусбаров из массива [[NEW_LIST]]

    0_1568292795342_395e1e4b-fa62-452b-bb2b-390f1d11c3ec-изображение.png

    0_1568292823407_d6789c2f-24fe-42a7-9062-3a4fed358d7a-изображение.png

    в самой функции добавил цикл отрисовки с условием, на случай если ещё не все потоки начали работу:
    0_1568293322087_support148.gif

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

  • @romanbiz

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

    Добавлена информация о том, как подключать разные программы на BAS к разным VPN соединениям/также можно разделять чтобы в BAS было VPN соединение, а на компьютере нет

    Can you point me where can I find that info about VPN? Is it some 3rd party app that assigns VPN Adapters to different programs or what?

  • Решил разместить пример работы с встроенной в БАС БД mongo(монго) по средством nodejs.

    Ссылки на документацию, версия в БАС 2.6

    https://www.mongodb.com/docs/v2.6/
    http://mongodb.github.io/node-mongodb-native/3.6/api/index.html

    mongodb-with-node.xml

    И еще нюанс, если будите большие списки гонять между БАС и nodejs, то лучше использовать временные файлы на диске, тк БАС передает их как JSON и это может занять приличное время на больших данных. Примерная схема такая:

    1. Список, которые надо обработать в Node пишем c помощью БАС на диск (если его там нет)
    2. В Node читаем его (встроенный модуль fs)
    3. Пропускаем через БД
    4. Результат снова записываем на диск с помощью Node
    5. В БАС читаем результат

    update:
    mongodb в БАС сильно устарела, поэтому следует использовать модуль не выше версии 3.6

    • 29.07.2022 Обновил пример, оптимизировал подключение к БД, для всех потоков используется один коннект
  • @GamiD said in Лайфхаки BAS:

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

    0_1563099815733_BasCookieToChromeEditThisCookie.xml

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

  • This post is deleted!
  • @Fox перебрав кучу генераторов html таблиц нашел лучший, https://www.tablesgenerator.com/html_tables рекомендую только его, делать в гугл таблицах а потом конвертировать хуже (проверено на личном опыте) там и код сразу копируешь без изменений)

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

    @Fox перебрав кучу генераторов html таблиц нашел лучший, https://www.tablesgenerator.com/html_tables рекомендую только его, делать в гугл таблицах а потом конвертировать хуже (проверено на личном опыте) там и код сразу копируешь без изменений)

    Не думаю что это подходит под тему лайфхак БАС

  • @UserTrue это дополнение к посту фокса про таблицы, я как раз этим лайфхаком воспользовался и нормальный html генератор таблицы это боль)

  • Пауза в любой точки скрипта
    Создаете ресурс с названием "Pause" тип "Из файла" выбираете пустой файл
    В начало скрипта добавляете действие "Выполнить код" с содержимым

    function wait(milliseconds) {
      var start = new Date().getTime();
      for (var i = 0; i < 1e7; i++) {
        if ((new Date().getTime() - start) > milliseconds){
          break;
        }
      }
    }
    function _sa()
    {
    var pause = native("filesystem", "readfile", JSON.stringify({value: RInfo("Pause","Location"),base64:false,from:0,to:0}));
    if(pause.length != 0){
      for (var i = 0; i < 1e7; i++) {
        var pause = native("filesystem", "readfile", JSON.stringify({value: RInfo("Pause","Location"),base64:false,from:0,to:0}));
        if(pause.length == 0){break;}
        wait(1000);
        }
      }
    }
    

    Если файл выбранный в ресурсе "Pause" содержит символы будет пауза
    Чтобы продолжить работу скрипта нужно очистить файл

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

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

    Пауза в любой точки скрипта
    Создаете ресурс с названием "Pause" тип "Из файла" выбираете пустой файл
    В начало скрипта добавляете действие "Выполнить код" с содержимым

    function wait(milliseconds) {
      var start = new Date().getTime();
      for (var i = 0; i < 1e7; i++) {
        if ((new Date().getTime() - start) > milliseconds){
          break;
        }
      }
    }
    function _sa()
    {
    var pause = native("filesystem", "readfile", JSON.stringify({value: RInfo("Pause","Location"),base64:false,from:0,to:0}));
    if(pause.length != 0){
      for (var i = 0; i < 1e7; i++) {
        var pause = native("filesystem", "readfile", JSON.stringify({value: RInfo("Pause","Location"),base64:false,from:0,to:0}));
        if(pause.length == 0){break;}
        wait(1000);
        }
      }
    }
    

    Если файл выбранный в ресурсе "Pause" содержит символы будет пауза
    Чтобы продолжить работу скрипта нужно очистить файл

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

    Идея хорошая, как оказалось ты её реализовал ещё до того, как я об этом написал :D
    Но давай по порядку:

    1. Объявление локальной функции в функции main приведёт к ошибке при вызове этой локальной функции из другой функции BAS. Для наглядности - тестовый скрипт
    2. Переопределяя функцию _sa() не нужно было удалять рабочий код самой функции
    ScriptWorker.SetCurrentAction(id)
    

    это может привезти к непредсказуемым багам и ошибкам
    3. Переопределённая функция _sa() вернётся в исходное состояние после любого браузерного действия
    239162f5-7596-45b2-8dca-401bc5887cb6-изображение.png
    938d0192-5896-4a5d-a51b-b79f142b74ba-изображение.png
    Тестовый скрипт

    функция wait это отдельный кошмар

    1. Для чего в ней цикл на 10 000 000 итераций? (да 1e7, это число 10 000 000) Ведь для использования этого кода, как функцию задержки цикл for не подходит, например если указать время wait(100000), то все итерации завершатся быстрее, чем пройдёт указанное время.
    2. Условие new Date().getTime() - start) > milliseconds является дико ресурсоёмким, так как в секунду происходит очень много итераций и выполнения кода. Можно запросто забить процессор на 100% в 2-3 потока с таким ожиданием. Лучше использовать асинхронный код ожидания или метод sleep() в BAS, но функцию тогда нужно будет оформить для работы с асинхронными методами BAS.
    3. Для чего в функции _sa() цикл с ожиданием? Эта функция будет вызываться перед каждым действием BAS и так как функция не асинхронная, итерпретатор будет ждать, пока цикл из 10 000 000 итераций с секундной задержкой закончится прежде чем выполнить каждое действие (на выполнение первого действия в скрипте уйдёт чуть больше 115 дней)
    4. Сама логика читать файл после каждого действия BAS тоже не очень хорошая идея. Каждый поток, после каждого действия в скрипте будет читать файл, винт вам не скажет спасибо. Лучше было ограничить чтение файла одним или несколькими потоками с записью данных в глобальную переменную.