EVAL

Команда iMacros EVAL

Команда EVAL позволяет использовать возможности JavaScript в iim макросах. Команда может быть использована для простого анализа и постобработки извлеченных данных. Доступна в версиях iMacros V7.5 и более поздних,  дополнение iMacros для Firefox 7.4.0.1 и выше.

Чаще всего к данной команде обращаются, когда использование встроенного функционала iMacros проще, чем написание полного кода на js или использование чистого js невозможно. Но надо учитывать, что на JS можно реализовать более сложные проекты.

Синтаксис:

SET !VAR1 EVAL("[JavaScript код]") TAG ... CONTENT=EVAL("[JavaScript код]")

Параметры:

MacroError принимает значение в качестве аргумента и если выдает ошибку iMacros error -1340, где текстом ошибки является аргумент строки errorMsg.  Используйте эту функцию, если вы хотите условно остановить макрос, как это делается в примере 3.

Примечания:

Правильно:

SET myVal EVAL("var x = 1; x;") 'myVal = 1

Неправильно:

SET myVal EVAL("var x = 1;") 'myVal = null

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

1. Случайное время задержки. Подождать случайно выбранное время (от 1 до 10 секунд), после загрузки страницы:

SET !VAR1 EVAL("var randomNumber=Math.floor(Math.random()*10 + 1); randomNumber;") URL GOTO=https://www.imacros.org ' ждать от 1 до 10 секунд WAIT SECONDS={{!VAR1}}

2. Сгенерировать случайное число в определенном диапазона:

SET randomNumber EVAL("var min = 50; var max = 100; var randomNumber = Math.floor(Math.random() * (max - min + 1)) + min; randomNumber;")

3. Получение и сравнение валют. Сохранить результат.

Сохранить EUR-ставку в долларах USD, только если она выше определенного порога (1.3 USD). Если ставка ниже, остановить макрос и выдать сообщение об ошибке:

URL GOTO=http://www.xe.com/ucc/convert/?Amount=1&From=EUR&To=USD 

SET !EXTRACT_TEST_POPUP NO 

TAG POS=1 TYPE=TD ATTR=TXT:*<SP>USD&&WIDTH:46%&&ALIGN:left EXTRACT=TXT 

SET !VAR1 EVAL("var s = \"{{!EXTRACT}}\"; s.replace(\"USD\",\"\"); var d = parseFloat(s); if(d < 1.3){MacroError(\"Euro меньше 1.3 USD.\");} else {d};") 

SET !EXTRACT NULL 

SET !EXTRACT {{!VAR1}} 

SAVEAS TYPE = EXTRACT FOLDER=* FILE=EuroRate.csv

4. Получение и сравнение даты/времени.

Проверить: последнее сообщение старше нескольких часов (12 часов):

CLEAR 

URL GOTO=http://www.readwriteweb.com/ 

SET !EXTRACT_TEST_POPUP NO TAG POS=1 TYPE=DIV ATTR=CLASS:submeta EXTRACT=TXT 

SET !VAR1 EVAL("var h = 12; var s = \"{{!EXTRACT}}\"; var re = /\\w+\\s\\d{1,2},\\s\\d{4}\\s+\\d{1,2}\\:\\d{2}\\s[A|P]M/; var postDateStr = re.exec(s); var today = new Date(); var postAge = today.getTime() - Date.parse(postDateStr); var hInMilli = h*60*60*1000; if(postAge > hInMilli){MacroError(\"Сообщение старше 12 часов\");}")

5. Получить вчерашнюю дату.

Ввести текст с вчерашней датой в ISO-формате (гггг-мм-дд), месяц меняется, високосный год, и так далее. Для сегодняшней даты можно использовать команду !NOW, но ее не получится преобразовать чтобы получить вчерашнее число, EVAL решает эту проблему:

... CONTENT=EVAL("var d = new Date(); d.setDate(d.getDate() - 1); var year = d.getFullYear(); var month = d.getMonth() + 1; var day = d.getDate(); year + '-' + month + '-' + day;") 

6. Получить завтрашнюю дату.

Создайте переменную с завтрашней датой в формате дд/мм/гггг:

SET tomorrow EVAL("var today = new Date(); var tomorrow = new Date(); tomorrow.setDate(today.getDate() + 1); var day = tomorrow.getDate().toString(); if (day.length < 2) {day = \"0\" + day;} var month = (tomorrow.getMonth() + 1).toString(); if (month.length < 2) {month = \"0\" + month;} var year = tomorrow.getFullYear().toString(); var dateString = day + \"/\" + month + \"/\" + year; dateString;") 

PROMPT {{tomorrow}}

7. Редактировать извлеченный текст.

Преобразование текста в строку верхнего регистра:

TAB T=1 

URL GOTO=http://android-developers.blogspot.com/2011/09/preparing-for-handsets.html 

SET !EXTRACT_TEST_POPUP NO

TAG POS=1 TYPE=P ATTR=TXT:Early<SP>this<SP>year,* EXTRACT=TXT 

SET !VAR1 EVAL("var s=\"{{!EXTRACT}}\"; s.toUpperCase()") PROMPT {{!VAR1}}

Удалить первые и последние пробелы:

SET !EXTRACT "    Эта строка имеет в начале и в конце пробелы     " ' Отображается значение в кавычках со всеми пробелами 

PROMPT {{!EXTRACT}} 

SET trimmedValue EVAL("\"{{!EXTRACT}}\".replace(/^\\s*|\\s*$/g, \"\");") 

PROMPT "{{trimmedValue}} - без пробелов!"

8. DemoEval.iim:

URL GOTO=http://www.iopus.com/imacros/demo/v7/eval.htm 

SET !VAR1 EVAL("Math.floor(Math.random()*5 + 1);") 

WAIT SECONDS={{!VAR1}} 

SET !EXTRACT_TEST_POPUP NO TAG POS=1 TYPE=B ATTR=TXT:* EXTRACT=TXT 

SET !VAR2 EVAL("var h = 20; var s = \"{{!EXTRACT}}\"; var today = new Date(); var postAge = today.getTime() - Date.parse(s); var hInMilli = h*60*60*1000; if(postAge > hInMilli){MacroError(\"Разница во времени более 20 часов\");}else null") 

SET !EXTRACT NULL TAG POS=1 TYPE=INPUT:TEXT FORM=ID:form1 ATTR=NAME:textfield EXTRACT=TXT SET !VAR2 EVAL("var s=\"{{!EXTRACT}}\"; var d = parseFloat(s); if((d > 99)&&(d < 101))d; else MacroError(\"Значение не в заданных пределах\");")