【问题标题】:iMacros: Using Javascript with EVAL to replace text in a variableiMacros:使用带有 EVAL 的 Javascript 替换变量中的文本
【发布时间】:2012-05-05 19:14:21
【问题描述】:

我在 Firefox 上使用 iMacros 自动下载我的 Wells Fargo PDF 银行对账单,并为文件提供链接名称,例如“Statement 04/22/12 (597K)”

但是,我不能在文件名中使用斜杠(Windows 限制...)。所以我试图用 dash 替换 正斜杠。

下面是我的 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 中使用 Regex 删除“(597K)”,那将是锦上添花。 (显然,这个文本字符串的值对于每个不同的文件都会不同,所以它必须是动态的)

【问题讨论】:

  • 看来你没有转义双引号(破折号周围)

标签: javascript regex replace escaping imacros


【解决方案1】:

您错过了转义 "-" 中的引号,因此结束了 iMacros 字符串而不是开始 JavaScript 字符串。

您还可能在/\// 正则表达式中遇到问题,因为我怀疑 iMacros 会吃掉\/ 并将其转换为/,从而使JS 得到无效的文字///。它必须是/\\//。

另外,如果!EXTRACT 变量包含引号、反斜杠或换行符,它会将这些直接注入到 JavaScript 代码中,从而破坏 JS 字符串文字并可能执行任意脚本。

这些是嵌套转义上下文的许多问题的示例。您可以通过使用备用非冲突引号来避免前两个,并通过使用简单的字符串替换 split/join 成语来摆脱正则表达式文字:

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

但这仍然会留下 JS 注入问题。快速浏览一下手册,iMacros 似乎没有任何可用的字符串处理功能,因此您将无法手动执行 JS-string-literal-replace,或者实际上只执行/-to - iMacros 内的替换。那将是明智的做法。从字符串创建可执行代码几乎总是一件需要极力避免的灾难性错误。

[除了咆哮:从手册上看,iMacros 的存在让我真的很不开心。它为您提供了一种完全任意但无能的自制脚本语言,而不仅仅是使用已经可用的 JavaScript,然后让您无论如何都去 JS 做任何超出可笑琐碎的事情......并且没有给您提供在两者之间安全地传输值的工具.这个软件还有什么意义?自从 4GL 的黑暗日子以来,我没有因为试图解决错误的语言设计而感到沮丧。这太可怕了。人们用这个?]

【讨论】:

    【解决方案2】:

    您的任务,就像大多数重要的抓取问题一样,可以使用 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
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多