2012-05-05 3 views
0

Firefox에서 iMacros를 사용하여 Wellls Fargo PDF 은행 명세서를 자동으로 다운로드하고 파일 이름에 "Statement 04/22/12 (597K) "iMacros : 변수에서 텍스트를 바꾸기 위해 EVAL과 자바 스크립트 사용하기

그러나 파일 이름에 슬래시를 사용할 수 없습니다 (Windows 제한 사항 ...). 그래서 슬래시대시으로 바꿉니다.

다음은 현재 내 아이맥입니다. 다음 줄에 오류 코드가 표시됩니다.

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

내 자바 스크립트 또는 내 Regex가 작동하지 않아 그 이유를 알 수 없습니다. 나는 어느 언어에서나 강하지 못하다 - 나는 가능한 한 다른 예제에서 복사하려했지만 성공하지는 못했다. 네가 도울 수 있다면, 좋을거야. 감사. 추가로

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)"를 제거하는 방법을 알고있는 경우, 그 케이크 장식이 될 것입니다. (분명히,이 텍스트 문자열의 값은 각기 다른 파일마다 다르기 때문에 동적이어야합니다.)

+1

것입니다 –

답변

1

"-"에서 따옴표를 이스케이프 놓친 경우 JavaScript 문자열을 시작하는 대신 iMacros 문자열이 종료되었습니다. 내가 iMacros 제작이 \/을 먹고 /으로 바꿀 것입니다 생각하기 때문에

또한 잠재적으로 잘못된 문자 ///와 JS를 떠나는는 /\// 정규 표현식에 문제가 생겼어요. 그것은 /\\//이어야합니다.

!EXTRACT 변수에 따옴표, 백 슬래시 또는 개행 문자가 포함되어 있으면 JS 문자열 리터럴을 위반하고 잠재적으로 임의의 스크립트를 실행할 가능성이있는 JavaScript 코드에 직접 변수를 삽입합니다.

다음은 중첩 이스케이프 컨텍스트에서 발생하는 많은 문제의 예입니다. 당신은 다른 비 충돌하는 따옴표를 사용하여 처음 두를 방지 할 수 있습니다, 대신 split/join 관용구 교체 간단한 문자열을 사용하여 문자 정규식 제거하기 :

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

을하지만 여전히 JS 주입 문제를 남긴다. 설명서를 간략하게 살펴보면 iMacros에는 사용할 수있는 문자열 처리 기능이 없으므로 수동 JS 문자열 리터럴 교체를 수행 할 수 없거나 실제로는 / ~ - 대체 작업을 수행 할 수 없습니다. iMacros 내에서. 그것은 현명한 일이었을 것입니다. 문자열에서 실행 코드를 작성하는 것은 거의 항상 피할 수없는 실수입니다.

[매뉴얼을 보면, iMacros의 존재는 나를 진정으로 불행하게 만든다. 이미 사용 가능한 자바 스크립트를 사용하는 대신 자의적이지만 아직 불가능한 자작 스크립팅 언어를 제공하고 있습니다. 그런 다음 어쨌든 JS로 가서 웃기는 일은 거의하지 않고 ... 둘 사이의 값을 안전하게 전송할 수있는 도구를 제공하지 않습니다. . 이 소프트웨어의 요점은 무엇입니까? 나는 이것이 4GL의 어두운 날들부터 잘못된 머리 글자로 된 언어를 다루려는 시도에 좌절감을 느끼지는 않았다. 이것은 단지 끔찍한 일입니다. 사람들이 이것을 사용합니까?] 대부분의 비 사소한 스크 레이 핑 문제와 같은

1

당신의 임무는이 예를 살펴 코드를 귀하의 iMacros 제작

를 구성하는 자바 스크립트를 사용하여 훨씬 쉽게 해결 될 수있다. 나는 그래서 실제 다운로드를 테스트 할 수 없습니다 웰스 파고 (Wells Fargo)를 사용하지 않는하지만 기본 골격 (대시 주위에) 당신이 따옴표를 탈출하지 않은이

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 
    } 
} 
관련 문제