В iMacros нету никаких толковых функций для нормальной работы со строками. Зато в Javascript их предостаточно, плюс у нас есть чудесная возможность использовать титаническую мощь регулярных выражений. Обработка текста, поиск необходимых значений в тексте — это те задачи, с которыми вы будете сталкиваться постоянно. Поэтому очень важно уметь виртуозно работать с текстом.
Но для начала я хочу поделиться своей болью, которую я испытываю при виде большинства чужих скриптов на iMacros и изящным примером, как сделать код лучше, чище и более читаемым, как принято это называть в среде программистов — «Best Practice».
Прекращайте писать «var macro; macro +=…» для многострочного iMacros-кода!
Все примеры ниже — рабочие, но не у всех красивая и четкая реализация.
Так делать не надо:
var macro; var seconds = 3; macro = "CODE:"; macro += "TAB CLOSEALLOTHERS" + "\n"; macro += "TAB T=1" + "\n"; macro += "WAIT SECONDS=" + seconds + "\n"; macro += "URL GOTO=http://ya.ru" + "\n"; iimPlay(macro);
Так тоже делать не надо:
var macro; var seconds = 3; macro = "CODE:\ TAB CLOSEALLOTHERS\n\ TAB T=1\n\ WAIT SECONDS=" + seconds + "\n\ URL GOTO=http://ya.ru" + "\n"; iimPlay(macro);
Делайте лучше вот так:
var seconds = 3; iimPlayCode(` TAB CLOSEALLOTHERS TAB T=1 WAIT SECONDS=${seconds} URL GOTO=http://ya.ru `);
На дворе 2016 год, вы спокойно можете использовать гравис(`) — не путайте с апострофом, гравис на английской раскладке находится там же, где и тильда(~). Переводы строк(«\n») при таком форматировании ставятся автоматически. Также обратите внимание, насколько удобно можно вставлять переменные и любые javascript-выражения при помощи конструкции ${...}
. Вы можете использовать гравис и для создания обычных переменных через var.
Работа со строками в Javascript. Проверяем баланс биткойн-крана
Чтобы не брать примеры из вакуума, давайте возьмем какой-нибудь стандартный биткойн-кран и будем тренироваться на нем. Я буду использовать кран http://cpabitcoin.com — это самый обычный кран.
Давайте для начала попробуем узнать баланс крана. Для этого мы найдем необходимый тэг, получим из него текст и вытащим оттуда только цифры. Я покажу несколько способов.
split()
— Этот метод разбивает строку на массив, в качестве параметра можно указать один или несколько символов. Если указать пробел, то можно разделить любое предложение на отдельные слова и потом обратиться к элементам полученного массива по индексу.
var text = window.document.querySelector('.alert-info').innerHTML; // text = "Balance: 145100 satoshi" var balance = text.split(' '); // ["Balance:", "145100", "satoshi"] var balance = text.split(' ')[1]; // 145100
substring()
var text = "Balance: 145100 satoshi"; var balance = text.substring(9, text.length - 8); //145100
Тут нужно немного пояснить, метод substring(begin, end)
возвращает подстроку с позиции begin до, но не включая end.
indexOf() и lastIndexOf()
Этот метод возвращает позицию, на которой находится подстрока или -1, если ничего не найдено. indexOf()
ищет с начала строки, а lastIndexOf()
с конца строки. Этот метод может принимать и второй параметр, который будет указывать, с какого символа осуществлять поиск.
var text = "Balance: 145100 satoshi"; var hasBalance = text.indexOf("Balance"); // 0, т.к. "Balance" найден прямо в начале str var hasBalance = text.indexOf("ala"); // 1, т.к. "ala" найден, начиная с позиции 1 var hasBalance = text.indexOf("balance"); // -1, не найдено, так как поиск учитывает регистр var hasBalance = text.toLowerCase().indexOf("balance"); // 0, т.к. мы преобразовали text в нижний регистр // и "balance" найден прямо в начале str // Для красоты можно использовать побитовый оператор "НЕ" if (~hasBalance) { // тут действия "если найдено". } else { // тут действия "если не найдено". }
toLowerCase(), toUpperCase()
Эти методы преобразуют строку в нижний и верхний регистр соответственно.
var string = "Тестовая Строка"; string.toLowerCase(); // "тестовая строка" string.toUpperCase(); // "ТЕСТОВАЯ СТРОКА"
trim(), trimLeft(), trimRight()
Метод trim() удаляет все пробельные символы, символы табуляции, переноса строки и т.д. с начала и с конца строки. trimLeft() и trimRight() удаляют все пробельные символы только слева и справа соответственно.
var str = "\t\t\t first second three \t\t \n\n";
str.trim(); // "first second three"
length, обращение по индексу
length — это скорее свойство, чем функция. И не забываем, что строка — это массив символов, что позволяет нам обращаться со строкой, как с массивом.
var str = "1234567890"; str.length; // 10 str[0]; // "1" str[4]; // "5"
Для начала, этого будет достаточно, больше информации по работе со строками вы можете посмотреть тут — https://learn.javascript.ru/string.
Оставляйте ваши вопросы и пожелания в комментариях.
Давненько копаю в этом направлении, и как по мне, на данный момент это наиболее толковый блог об интеграции JS в iMacros, спасибо автору за полезности. Хотелось бы увидеть решение автора в формате «Best Practice» относительно обхода капчи на кранах.
Николай, по поводу капчи запланировано несколько уроков, я буду рассматривать Recaptcha, Solvemedia и аудиоварианты этих капч.
Ждём)
Появилась одна проблема. Упомянутый гравис (`) очень удобен, но он почему то не работает на разных версиях браузера. Например, в 47 версии MozillaFF работает, а на 37 версии уже нет. При этом версия Imacros одна и та же. Есть какие то мысли по этому поводу?
Neo, странно, должно работать. Гравис — это часть спецификации ECMAScript 6, поддерживается с 34 версии Firefox, я тестил на FF35.
P.S. если моя телепатия меня не подводит, думаю, вы опечатались и имели ввиду 27 версию ФФ, поскольку она более популярная, а 37 версию не слышал, чтобы кто-то использовал.
Оу, точно) Все напутал. У меня версия 31.7 esr
В куче версий выбрал ту что памяти ест на 100 мб меньше, чем 47 версия и поддерживает плагины random agent spoofer и requestPolicy.
Может посоветуете версию непрожорливую для памяти и поддерживающую Imacros не ниже 8.9.7.