0

FirefoxでiMacrosを使用して、Wells Fargo PDF銀行取引明細書を自動的にダウンロードし、ファイルに「ステートメント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) 」を削除する方法を知っている場合、それはケーキのアイシングになります。(明らかに、このテキスト文字列の値はファイルごとに異なるため、動的である必要があります)

4

2 に答える 2

1

で引用符をエスケープ"-"できなかったため、JavaScript文字列を開始する代わりにiMacros文字列を終了しました。

また、正規表現で問題が発生する可能性もあります。これは、/\//iMacrosがを食べて\/に変換し/、JSに無効なリテラルが残ると思われるため///です。である必要があります/\\//

また、!EXTRACT変数に引用符、円記号、または改行が含まれている場合、それらをJavaScriptコードに直接挿入し、JS文字列リテラルを壊して、任意のスクリプトを実行する可能性があります。

これらは、ネストされたエスケープコンテキストに関する多くの問題の例です。衝突しない引用符を交互に使用し、代わりに単純な文字列replace split/ joinidiomを使用して正規表現リテラルを削除することで、最初の2つを回避できます。

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

しかし、これでもJSインジェクションの問題が残ります。マニュアルをざっと見てみると、iMacrosには使用可能な文字列処理機能がないようです。そのため、手動でJS-string-literal-replaceを実行したり、内部から/-toreplaceを実行したりすることはできません。 -iMacros。それは賢明なことだったでしょう。文字列から実行可能コードを作成することは、ほとんどの場合、ひどく避けるべき悲惨なほど間違ったことです。

[暴言は別として:マニュアルを見ると、iMacrosの存在は私を本当に不幸にさせます。すでに利用可能なJavaScriptを使用するのではなく、完全に恣意的でありながら機能しない自作スクリプト言語を提供し、とにかくJSにアクセスして、笑えるほど些細なことを超えて何かを行うようにします...そして、2つの間で値を安全に転送するためのツールを提供しません。このソフトウェアのポイントさえ何ですか?4GLの暗い時代以来、間違った言語の設計を回避しようとすることにこれほど不満を感じたことはありません。これはひどいです。人々はこれを使用しますか?]

于 2012-05-05T21:25:26.033 に答える
1

あなたのタスクは、ほとんどの重要なスクレイピングの問題と同様に、javascript を使用して 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
  }
}
于 2013-03-18T02:14:00.177 に答える