[Урок 5] . Правильная работа со строками. Узнаем баланс биткойн-крана.

В 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 — это самый обычный кран.

cpabitcoin биткойн кран

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

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.

Оставляйте ваши вопросы и пожелания в комментариях.

6 комментариев

  1. Давненько копаю в этом направлении, и как по мне, на данный момент это наиболее толковый блог об интеграции JS в iMacros, спасибо автору за полезности. Хотелось бы увидеть решение автора в формате «Best Practice» относительно обхода капчи на кранах.

    Ответить
  2. Николай, по поводу капчи запланировано несколько уроков, я буду рассматривать Recaptcha, Solvemedia и аудиоварианты этих капч.

    Ответить
  3. Появилась одна проблема. Упомянутый гравис (`) очень удобен, но он почему то не работает на разных версиях браузера. Например, в 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.

        Ответить

Оставить комментарий