簡體   English   中英

iMacros:使用Javascript和EVAL替換變量中的文本

[英]iMacros: Using Javascript with EVAL to replace text in a variable

我在Firefox上使用iMacros自動下載我的Wells Fargo PDF銀行對帳單,並為文件提供鏈接名稱,例如“ Statement 04/22/12(597K)

但是,我不能在文件名中添加斜杠(Windows限制...)。 所以我試圖用破折號替換正斜杠

這是我的iMacro。 我在以下行中收到錯誤代碼:

SET !VAR1 EVAL("var s=\"{{!EXTRACT}}\"; s.replace(/\//g, "-");") 

我的javascript或我的正則表達式不起作用,我不知道為什么。 我用這兩種語言都不強 - 我試圖盡可能地從其他例子中復制,但沒有成功。 如果你能提供幫助,那就太好了。 謝謝。

VERSION BUILD=5010424 RECORDER=CR
' SET !ERRORIGNORE YES

TAB OPEN
TAB T=2
URL GOTO=https://online.wellsfargo.com/login
TAG POS=1 TYPE=INPUT:TEXT FORM=ID:Signon ATTR=ID:username CONTENT=XXX
SET !ENCRYPTION TMPKEY
TAG POS=1 TYPE=INPUT:PASSWORD FORM=ID:Signon ATTR=ID:password CONTENT=XXX
TAG POS=1 TYPE=INPUT:SUBMIT FORM=ID:Signon ATTR=NAME:continue&&VALUE:Sign<SP>On
TAG POS=1 TYPE=A ATTR=TXT:View<SP>online<SP>statements

SET !EXTRACT_TEST_POPUP NO

TAG POS=1 TYPE=A ATTR=TXT:Statement<SP>* EXTRACT=TXT
SET !VAR1 EVAL("var s=\"{{!EXTRACT}}\"; s.replace(/\//g, "-");")    <---- THIS IS THE PROBLEMATIC LINE!!!!!!!!!!!!!!
ONDOWNLOAD FOLDER=D:\Wells<SP>Fargo\CREDIT<SP>CARD\ FILE={{!VAR1}}.pdf
TAG POS=1 TYPE=A ATTR=TXT:Statement<SP>* CONTENT=EVENT:SAVETARGETAS

TAB CLOSE

另外,如果你知道如何在javascript中刪除帶有正則表達式的“ (597K) ”,這將是錦上添花。 (顯然,對於每個不同的文件,此文本字符串的值將不同,因此它必須是動態的)

您錯過了"-"的引號轉義,因此結束了iMacros字符串而不是啟動JavaScript字符串。

你也可能在/\\// regexp中遇到了問題,因為我懷疑iMacros會吃\\/並把它變成/ ,讓JS留下無效的文字/// 它必須是/\\\\//

此外,如果!EXTRACT變量包含引號,反斜杠或換行符,它將直接將這些內容注入JavaScript代碼,從而破壞JS字符串文字並可能執行任意腳本。

這些是嵌套轉義上下文的許多問題的示例。 您可以通過使用備用非沖突引號來避免前兩個,並通過使用簡單字符串替換split / join idiom來刪除正則表達式文字:

SET !VAR1 EVAL("'{{!EXTRACT}}'.split('/').join('-').split(' (')[0]") 

但這仍然留下了JS注入問題。 從一個簡單看一下說明書,似乎iMacros都沒有任何可用的字符串處理功能,所以你不能夠做一個手動JS-字符串文本替換,或者實際上只是做/ -to -更換來自iMacros。 那將是明智的做法; 從字符串創建可執行代碼幾乎總是強烈避免的災難性錯誤。

[除了咆哮:從手冊上看,iMacros的存在讓我真的很不開心。 它為您提供了一個完全隨意但無法使用的自制腳本語言,而不僅僅是使用已經可用的JavaScript,然后讓你去JS,除了可笑的瑣碎之外做任何事情......並沒有給你工具來安全地傳遞兩者之間的價值。 這個軟件的重點是什么? 自從4GL的黑暗日子以來,我一直沒有感到因為試圖解決錯誤的語言設計而感到沮喪。 這太可怕了。 人們用這個?]

使用javascript來組織你的imacros代碼可以更輕松地解決你的任務,就像大多數非平凡的抓取問題一樣

看看這個例子。 我不使用富國銀行,所以我無法測試實際的下載,但基本的骨架就在那里

run()
function run() {
  // loginResult is null on success
  var loginError = performLogin()
  if (loginError) {
    alert(JSON.stringify(loginError, null, ' '))
    throw new Error(JSON.stringify(loginError))
  }
  // loginResult is null on success
  var extractError = extractStatement()
  if (extractError) {
    alert(JSON.stringify(extractError, null, ' '))
    throw new Error(JSON.stringify(extractError))
  }
  iimDisplay('Download completed successfully')
}

/**
 * @return null on success, error object on failure
 */
function extractStatement() {
  var error,
      code,
      extract
  code = iimPlay('CODE: TAG POS=1 TYPE=A ATTR=TXT:View<SP>online<SP>statements\n'
                 + 'TAG POS=1 TYPE=A ATTR=TXT:Statement<SP>* EXTRACT=TXT')
  if (code !== 1) {
    error = {
      message: 'error extracting statement',
      error: iimGetLastError(),
      errorCode: code
    }
  }
  extract = iimGetLastExtract()

  // #EANF# means Extract Anchor Not Found (ie extract failed)
  if (extract === '#EANF#') {
    error = {
      message: 'error extracting statement',
      error: 'extract not found'
    }
  }

  // the magic line to replace all slashes
  var filename = extract.replace(/\//g, '-')
  // add the .pdf extension
  filename = filename + '.pdf'

  // download with the new filename, the double slashes are needed because
  // javascrtip otherwise views a backslash as an escape character
  var folderPath = 'D:\\Wells<SP>Fargo\\CREDIT<SP>CARD\\'
  var downloadCode = iimPlay('CODE: ONDOWNLOAD FOLDER=' +folderPath + '  FILE=' + filename + '\n'
                             + 'TAG POS=1 TYPE=A ATTR=TXT:Statement<SP>* CONTENT=EVENT:SAVETARGETAS\n'
                            + 'TAB CLOSE')

  if (downloadCode !== 1) {
    error = {
      message: 'failed to download statement',
      error: iimGetLastError(),
      errorCode: downloadCode
    }
    return error
  }

  // download completed correctly
  return null
}

/**
 * @return null on success, error object on failure
 */
function performLogin() {
  var code = iimPlay('CODE: TAB OPEN\n'
                     + 'TAB T=2\n'
                     + 'URL GOTO=https://online.wellsfargo.com/login\n'
                     + 'TAG POS=1 TYPE=INPUT:TEXT FORM=ID:Signon ATTR=ID:username CONTENT=XXX\n'
                     + 'SET !ENCRYPTION TMPKEY\n'
                     + 'TAG POS=1 TYPE=INPUT:PASSWORD FORM=ID:Signon ATTR=ID:password CONTENT=XXX\n'
                     + 'TAG POS=1 TYPE=INPUT:SUBMIT FORM=ID:Signon ATTR=NAME:continue&&VALUE:Sign<SP>On\n')

  // code will be 1 on success
  if (code === 1) {
    return null
  }
  var error = {
    message: 'error performing login',
    error: iimGetLastError(),
    errorCode: code
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM