Приветствую
Заметил что появилась возможность использовать 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.
Казалось бы, в чем проблема, если можно сделать то, что я сделал выше — создать вспомогательные классы для работы.
Однако есть некоторые проблемы:
-
Код на встроенных языках не шифруется (где-то это прочитал, возможно у меня устаревшие данные)
-
Сам код классов, который пришлось написать, выглядит очень костыльно, но иначе не сделаешь.
Например: return [[RESULT]]; (см. демо-проект)
Хотелось бы как-то по-человечески возвращать результат.
-
Чтобы функции возвращали значение пришлось вставить макрос [[RESULT]], в текст файла "текущий". Иначе переменная RESULT была undefined.
-
Почему-то если первое действие на встроенном языке, то проект не работает в режиме релиза. Пока это тоже подпер костылем (добавил лишний кубик).
-
Для некоторых функций программы требуется игнорировать ошибки (например если элемент не найден). Но это сделать кодом сложновато. Ничего не понятно. Понятно только на кубиках.
Хотелось бы чтобы была возможность сделать что то такое:
ignoreErrors(function(){
// код в котором нужно проигнорировать ошибку.
});
-
Очень сложно искать ошибки в коде. Например в консоли выводится просто что-то вроде "Поток №1 : SyntaxError: Unexpected identifier". И не понятно в каком файле и строке произошла ошибка.
-
Неудобно организовывать файлы (для целей написания ботов только на node.js). Лучше всего было бы иметь возможность редактировать их в отдельной IDE.
-
Было бы круто иметь возможность пошаговой отладки кода
Ну и возможен вопрос со стороны зала "нафига весь этот цирк, если можно на кубиках".
Больше возможностей организовать свой проект. Использование ООП, свои уровни абстракции. А еще код значительно быстрее писать и сопровождать.