2012-05-05 55 views
0

我在Firefox上使用iMacros自動下載Wells Fargo PDF銀行對帳單,併爲文件提供鏈接名稱,如「Statement 04/22/12(597K)iMacros:使用JavaScript和EVAL替換變量中的文本

但是,我不能在文件名中使用斜槓(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 

作爲一個額外的,如果你知道如何刪除「(597K)」與正則表達式中的JavaScript,會是蛋糕上的糖衣。 (顯然,這個文本字符串的值對於每個不同的文件都是不同的,所以它必須是動態的)

+1

看來你也沒能逃脫雙引號(周圍的破折號) –

回答

1

您錯過了在"-"中引用的引號,所以結束了iMacros字符串而不是啓動JavaScript字符串。

你也可能得到了在/\//正則表達式的一個問題,因爲我懷疑的iMacros會吃\/,並把它變成/,讓JS與無效文字///。它必須是/\\//

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

這些是嵌套轉義上下文的許多問題的例子。您可以通過使用替代的非爭食引號避免了前兩個,並且擺脫了正則表達式通過使用簡單的字符串字面量替代split/join語言,而不是:

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

但是這仍然讓JS注入問題。從快速瀏覽手冊看來,iMacros似乎沒有任何可用的字符串處理功能,因此您將無法執行手動JS字符串字面替換,或者只是執行/替換爲-來自iMacros。這將是明智的做法;從字符串創建可執行代碼幾乎總是一個可怕的錯誤的事情,以避免。

[旁白:從這本手冊看,iMacros的存在讓我真的不高興。它爲您提供了一種完全隨心所欲,無能爲力的自制腳本語言,而不是僅僅使用已有的JavaScript,然後讓您繼續使用JS去做任何超出可笑的小事情的東西......並且不會給您工具來安全地在兩者之間傳遞值。這個軟件甚至是什麼?自從4GL的黑暗時代以來,我一直在努力解決錯誤的語言設計,這讓我感到沮喪。這太糟糕了。人們用這個嗎?]

1

你的任務,像極不平凡的拼搶問題都可以用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 
    } 
}