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 код]")
Параметры:
Строка в двойных кавычках содержит JavaScript код для выполнения.
Функция MacroError (errorMsg). Кроме стандартных JavaScript функций (в IE и iMacros Browser, JScript 8.0), команда EVAL имеет встроенную функцию вывода ошибок: MacroError().
MacroError принимает значение в качестве аргумента и если выдает ошибку iMacros error -1340, где текстом ошибки является аргумент строки errorMsg. Используйте эту функцию, если вы хотите условно остановить макрос, как это делается в примере 3.
Примечания:
Необходимо явно вернуть окончательное значение, объявив его в конце JavaScript.
Правильно:
SET myVal EVAL("var x = 1; x;") 'myVal = 1
Неправильно:
SET myVal EVAL("var x = 1;") 'myVal = null
Можно вызвать специальную функцию MacroError (errorMsg) в Javascript, чтобы cгенерировать iMacros ошибку.
В спец символах нужно дублировать обратный слеш, например, \d правильно записать \\d.
Двойные кавычки должны быть экранированы, внешние кавычки не экранируются, так как содержат в себе Javascript код.
EVAL в iMacros Browser и плагине для IE использует Microsoft’s JScript 8.0 JScript .NET, framework version 3.5), есть ограничения безопасности. Как следствие, методы DOM/GUI как «compatMode()» или «alert()» не доступны. Для DOM/GUI доступа можно использовать URL GOTO с Javascript кодом (возможно данная проблема уже исправлена разработчиками).
iMacros для Firefox’s EVAL использует javascript встроенный в Firefox.
Примеры использования:
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(\"Значение не в заданных пределах\");")