Postbox-Sammeldownload ? codipodo !

FloHallo
Autor ★
Beiträge: 5
Mitglied seit: 11.11.2018

soweit ich gelesen habe, kann das mechanize nicht.

außer mit viel Aufwand in dem man den POST/GET simuliert.

Von daher lasse ich das.

 

Der neue Download funktioniert, nur stört er sich an HTML Einträgen, obwohl er ja nach PDFs schaut.

Bsp: 

 

Traceback (most recent call last):
        7: from codipodo.ry:38:in `<main>'
        6: from C:/Ruby/lib/ruby/gems/2.5.0/gems/mechanize-2.7.6/lib/mechanize.rb:466:in `get'
        5: from codipodo.ry:55:in `block in <main>'
        4: from codipodo.ry:55:in `each'
        3: from codipodo.ry:63:in `block (2 levels) in <main>'
        2: from C:/Ruby/lib/ruby/gems/2.5.0/gems/mechanize-2.7.6/lib/mechanize/file.rb:85:in `save!'
        1: from C:/Ruby/lib/ruby/gems/2.5.0/gems/mechanize-2.7.6/lib/mechanize/file.rb:85:in `open'
C:/Ruby/lib/ruby/gems/2.5.0/gems/mechanize-2.7.6/lib/mechanize/file.rb:85:in `initialize': Invalid argument @ rb_sysopen - comdirect-postbox/Wichtige_Steuerinformation_zu_Ihrem_comdirect-Depot623254.html?forceDownload=true (Errno::EINVAL)

Es wird sogar heruntergeladen, dh. wenn er nach der Exception weiter machen würde, wärs gar kein Problem.

Mentor ★★
Beiträge: 1585
Mitglied seit: 16.08.2016

@FloHallo  schrieb:

soweit ich gelesen habe, kann das mechanize nicht.

Was kann mechanize nicht ?

Der neue Download funktioniert, nur stört er sich an HTML Einträgen, obwohl er ja nach PDFs schaut.

Der neue Download schaut nicht nach PDFs, sondern nach URLs mit dem Pfad "dokumentenabruf". Früher waren darunter nur PDFs zu finden.

 

Workaround 1: manuell in die Postbox gehen, das entsprechende Dokument archivieren, danach codipodo aufrufen.

 

Workaround 2:

      if idx = filename.rindex(".pdf")
        filename = filename[0..(idx+3)]
      end

ersetzen durch

      if idx = filename.rindex(".pdf")
        filename = filename[0..(idx+3)]
else
next end

 

Workaround 3: Einen richtigen Browser (chrome oder Firefox) nehmen und diesen über ein Script und einen entsprechenden Treiber (z.B. selenium) fernsteuern.

 

 

Highlighted
FloHallo
Autor ★
Beiträge: 5
Mitglied seit: 11.11.2018

Hier mein aktuelles Script zum Herunterladen von zwei Konten, ich habe bei mir die IDs fest hinterlegt und gebe nur die Passwörter ein.

Die Pfade kann man auch getrennt festlegen.

Quick & Dirty, kann man schöner machen und ruby mecker über gleichnamige Variablen, aber egal Smiley (überglücklich)

 

# COmDIrect-POstfach-DOwnloader: codipodo
# Dieses Programm holt die PDF-Dokumente der ersten Seite der Postbox
# und legt sie im Ausgabeverzeichenis (s.u.) ab

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

require 'mechanize'

# LOGINDATEN, bitte anpassen
#ID = ""  # Comdirect-Zugangsnummer
#PIN = "123456"  # Comdirect-PIN

require "highline/import"
ID = "12345678" #ask "ID: "
puts "Beschreibung Konto 1: #{ID}"
PIN = ask "Passwort: "

# Ablageort der heruntergeladenen Dateien
DIRECTORY="e:/Pfad1/"

# Feste URLs der Comdirect
LOGINURL="https://kunde.comdirect.de/lp/wt/login"
LOGOUTURL="https://kunde.comdirect.de/lp/wt/logout"
POSTBOX_URL="https://kunde.comdirect.de/itx/posteingangsuche"
SUCCESSPAGE="https://kunde.comdirect.de/itx/persoenlicherbereich/anzeigen?execution=e1s1"

  @agent = Mechanize.new 
  @agent.get(LOGINURL) do |page|
     login_result = page.form_with(:name => 'login') do |log|
       log.add_field!("loginAction", "loginAction")
       log.param1= ID
       log.param3 = PIN
     end.click_button

     # Sind wir auf der richtigen Seite gelandet?"
     if login_result.uri.to_s != SUCCESSPAGE
       puts "Login fehlgeschlagen,  aktuelle URL: #{login_result.uri.to_s}"
       break
     end

    @agent.get(POSTBOX_URL)

     # Nur Eintraege, deren URL "/dokumentenabruf/" enthält, abholen,
    # d.h. Werbung oder andere nicht-downloadbare Elemente überspringen
    @agent.page.links_with(:href => /dokumentenabruf/).each do |link|
      filename = link.href.split('/')[-1]
    
      if idx = filename.rindex(".pdf")
        filename = filename[0..(idx+3)]
      end

      path = File.join DIRECTORY, filename
      result = link.click.save! path
    end
  end
  @agent.get(LOGOUTURL)
  
  
  
  
  
ID = "987654321" #ask "ID: "
puts "Beschreibung Konto 2: #{ID}"
PIN = ask "Passwort: "

# Ablageort der heruntergeladenen Dateien
DIRECTORY="e:/Pfad2/"

# Feste URLs der Comdirect
LOGINURL="https://kunde.comdirect.de/lp/wt/login"
LOGOUTURL="https://kunde.comdirect.de/lp/wt/logout"
POSTBOX_URL="https://kunde.comdirect.de/itx/posteingangsuche"
SUCCESSPAGE="https://kunde.comdirect.de/itx/persoenlicherbereich/anzeigen?execution=e1s1"

  @agent = Mechanize.new 
  @agent.get(LOGINURL) do |page|
     login_result = page.form_with(:name => 'login') do |log|
       log.add_field!("loginAction", "loginAction")
       log.param1= ID
       log.param3 = PIN
     end.click_button

     # Sind wir auf der richtigen Seite gelandet?"
     if login_result.uri.to_s != SUCCESSPAGE
       puts "Login fehlgeschlagen,  aktuelle URL: #{login_result.uri.to_s}"
       break
     end

    @agent.get(POSTBOX_URL)

     # Nur Eintraege, deren URL "/dokumentenabruf/" enthält, abholen,
    # d.h. Werbung oder andere nicht-downloadbare Elemente überspringen
    @agent.page.links_with(:href => /dokumentenabruf/).each do |link|
      filename = link.href.split('/')[-1]
    
      if idx = filename.rindex(".pdf")
        filename = filename[0..(idx+3)]
      end

      path = File.join DIRECTORY, filename
      result = link.click.save! path
    end
  end
  @agent.get(LOGOUTURL)