Программирование ботов на node.js



  • Приветствую

    Заметил что появилась возможность использовать node.js это очень здорово и неожиданно, проект шагнул в очень крутом направлении.

    Это значит что близится время, когда наконец-то можно будет писать ботов не на кубиках, а на JS
    К сожалению сейчас попытки написать что-то без кубиков, сопряжены с некоторыми трудностями.

    Я хочу поделиться своими соображениями на этот счет.

    Хотелось бы иметь некоторый уровень абстракции над функцией BAS_API и ее содержимым.
    Например, если нужно получить список элементов, то хотелось бы использовать что-то вроде следующего кода:

    var elements = await Element.collect(">CSS> .item-class img");
    
    var img_urls = [];
    for(var i = 0; i < elements.length; i++){
    	img_urls.push(await elements[i].attr("src"));
    }
    //Теперь img_urls будет список картинок. 
    

    Сейчас если подобное написать кодом, то выйдет нечто очень длинное запутанное. Хотел привести пример стандартного кода, который автоматически генерирует BAS, но там какой-то ужас.

    Чтобы лучше проиллюстировать написанное, я создал демо-проект, в котором реализовал уровень абстракции над элементами и браузером.

    0_1511554540826_demo.xml

    В javascript я не силен, предупреждаю сразу.
    Проект написан на чистом node.js и делает следующее:
    Заходит на яндекс, вводит поисковый запрос, парсит все ссылки, описанным выше способом, выводит их в консоль.

    Обратите внимание на сколько чисто выглядит код. (можно еще лучше).
    А программировать ботов без кубиков сможет даже человек, который хоть немного разбирается в javascript.

    Казалось бы, в чем проблема, если можно сделать то, что я сделал выше — создать вспомогательные классы для работы.

    Однако есть некоторые проблемы:

    1. Код на встроенных языках не шифруется (где-то это прочитал, возможно у меня устаревшие данные)

    2. Сам код классов, который пришлось написать, выглядит очень костыльно, но иначе не сделаешь.
      Например: return [[RESULT]]; (см. демо-проект)
      Хотелось бы как-то по-человечески возвращать результат.

    3. Чтобы функции возвращали значение пришлось вставить макрос [[RESULT]], в текст файла "текущий". Иначе переменная RESULT была undefined.

    4. Почему-то если первое действие на встроенном языке, то проект не работает в режиме релиза. Пока это тоже подпер костылем (добавил лишний кубик).

    5. Для некоторых функций программы требуется игнорировать ошибки (например если элемент не найден). Но это сделать кодом сложновато. Ничего не понятно. Понятно только на кубиках.
      Хотелось бы чтобы была возможность сделать что то такое:

    ignoreErrors(function(){
    	// код в котором нужно проигнорировать ошибку.
    });
    
    1. Очень сложно искать ошибки в коде. Например в консоли выводится просто что-то вроде "Поток №1 : SyntaxError: Unexpected identifier". И не понятно в каком файле и строке произошла ошибка.

    2. Неудобно организовывать файлы (для целей написания ботов только на node.js). Лучше всего было бы иметь возможность редактировать их в отдельной IDE.

    3. Было бы круто иметь возможность пошаговой отладки кода

    Ну и возможен вопрос со стороны зала "нафига весь этот цирк, если можно на кубиках".
    Больше возможностей организовать свой проект. Использование ООП, свои уровни абстракции. А еще код значительно быстрее писать и сопровождать.



  • BAS как и Зеннопостер больше ориентированы на людей которые далеки от программирования. При том 99% задач по автоматизации в браузере можно решить на кубиках. Я думаю что разраб ориентируется больше на эту категорию людей и делать очень удобную среду для тру программистов не будет) По крайней мере в ближайшем будущем.



  • Те кто разобрался в логике кубиков — уже программисты по сути.
    Если кто-то разобрася, что и куда вписать например здесь: http://joxi.ru/52aQwl1S4JOYy2

    То вписать нужные значения в этот код, также не составит значительных интеллектуальных усилий:

    var pixel = image.getPixel({x: 100, y: 200});
    
    pixel.r //R
    pixel.g //G
    pixel.b //B
    

    Вот только сейчас автоматически сгенерированный код действительно вызывает страх, даже у программистов:

    var split = native("imageprocessing", "getpixel", ("1") + "," + (0) + "," + (0)).split(",")
    VAR_PIXEL_R = parseInt(split[0])
    VAR_PIXEL_G = parseInt(split[1])
    VAR_PIXEL_B = parseInt(split[2])
    VAR_PIXEL_A = parseInt(split[3])
    

    или того хуже:

    await BAS_API("{\nvar split = native(\"imageprocessing\", \"getpixel\", (\"1\") + \",\" + (0) + \",\" + (0)).split(\",\")\nVAR_PIXEL_R = parseInt(split[0])\nVAR_PIXEL_G = parseInt(split[1])\nVAR_PIXEL_B = parseInt(split[2])\nVAR_PIXEL_A = parseInt(split[3])\n}");
    

    Но все решаемо. Осталось совсем немного. Раз разработчик внедрил возможность писать код на node.js (а в перспективе может и на других языках), то это уже о многом говорит. Осталось только некоторые нюансы продумать и все будет очень хорошо.


  • administrators

    @noask said in Программирование ботов на node.js:

    Чтобы лучше проиллюстировать написанное, я создал демо-проект, в котором реализовал уровень абстракции над элементами и браузером.
    0_1511554540826_demo.xml

    Довольно неплохой враппер.

    Код на встроенных языках не шифруется (где-то это прочитал, возможно у меня устаревшие данные)

    Будет.

    Сам код классов, который пришлось написать, выглядит очень костыльно, но иначе не сделаешь.
    Например: return [[RESULT]]; (см. демо-проект)
    Хотелось бы как-то по-человечески возвращать результат.

    Да, обмен данными пока только через переменные, исправлю.

    Чтобы функции возвращали значение пришлось вставить макрос [[RESULT]], в текст файла "текущий". Иначе переменная RESULT была undefined.

    Тоже исправлю.

    Для некоторых функций программы требуется игнорировать ошибки (например если элемент не найден). Но это сделать кодом сложновато. Ничего не понятно. Понятно только на кубиках.

    Будет работать try catch

    Очень сложно искать ошибки в коде. Например в консоли выводится просто что-то вроде "Поток №1 : SyntaxError: Unexpected identifier". И не понятно в каком файле и строке произошла ошибка.

    Согласен, добавлю stack в режиме записи.

    Неудобно организовывать файлы (для целей написания ботов только на node.js). Лучше всего было бы иметь возможность редактировать их в отдельной IDE.

    Было бы круто иметь возможность пошаговой отладки кода

    Те кто разобрался в логике кубиков — уже программисты по сути.
    Если кто-то разобрася, что и куда вписать например здесь: http://joxi.ru/52aQwl1S4JOYy2

    Для каждого кубика планируется детальное описание и примеры.

    Вот только сейчас автоматически сгенерированный код действительно вызывает страх, даже у программистов:

    Я не стремился сделать автоматически сгенерированный код читаемым
    Это в очень дальних планах.


  • administrators

    @noask said in Программирование ботов на node.js:

    Почему-то если первое действие на встроенном языке, то проект не работает в режиме релиза. Пока это тоже подпер костылем (добавил лишний кубик).

    Это уже исправил в 20.7.*


Log in to reply
 

Looks like your connection to Bablosoft was lost, please wait while we try to reconnect.