Hilfe
abbrechen
Suchergebnisse werden angezeigt für 
Stattdessen suchen nach 
Meintest du: 

Postbox-Sammeldownload ? codipodo !

dg2210
Legende
6.199 Beiträge

Eine Funktion, die ich bei der comdirext seit langem vermisse, ist der Sammeldownload von Dokumenten aus der Postbox.

 

Ich habe mir deswegen ein kleines tool gebastelt, mit ich ich vollautomatisch die PDF-Dokumente aus meiner Postbox abholen kann (zumindest die Dokumente auf der ersten Seite der Postbox).

 

Ihr findet die aktuelle Version am Ende dieses beitrags und unter

https://github.com/dg2210/comdirect/blob/master/codipodo.rb

 

Es ist sofort einsatzbereit, nachdem ihr Kundennummer und PIN eingetragen habt.

 

Systemvorrausetzungen:

irgendetwas PC- oder Workstation-artiges mit halbwegs aktuellem Ruby-Interpreter (z. B. Version 2.0)  und dazugehöriger "mechanize"-Bibliothek (Ergänzung vom 07.06.18: OpenSUSE-Anwender schalten bitte per YaST das Repository Ruby Extensions (openSUSE_Leap_42.3) ein um die "mechanize"-Bibliothek installieren zu können)

 

Aufruf

ruby codipodo.rb

Das Programm erwartet keine Parameter und sollte regemässig automatisch, z.B. täglich in den frühen Morgenstunden einmal aufgerufen werden.

 

FAQ

F: Warum Ruby? Warum "mechanize" ?

A: Ich mag es nicht, wenn ich meine Zugangsdaten einem Programm anvertrauen muss, das ich nicht verstehe. Darum war mein Hauptziel, ein kurzes, auditierbares, auch von Nicht-Experten zu verstehendes Werkzeug zu schaffen, das möglichst plattformunabhängig ist. Die "mechanize"-Bibliothek (zusammen mit dem ruby-Interpreter) erfüllt diese Anforderungen.

 

F: Was macht codipodo?

A:  Bis Zeile 31 werden ein paar Konstanten definiert: die festen URLs der comdirect und der Ordner, in den die Dokumente gespeichert werden sollten (Voreinstellung: comdirect-postbox).

In Zeile 33 wird ein neuer Webbrowser gestartet und in Zeile 34 die Voreinstellung für den Umgang mit PDFs auf "Download" geändert.

Ab Zeile 36 gehen wir auf die Login-Seite, füllen das Formular aus und schicken es ein Zeile 41 ab.

 

Falls wir nicht im Persönlichen Bereich angekommen sind, beenden wir die Sache, anderfalls wechseln wir zur Postbox (Zeile 49)

 

In Zeile 53-56 klicken wir auf alle links, die den Text "dokumentabruf" in ihrer URL enthalten. Diese werden automatisch gespeichert (s.o.)

 

F: Warum lädt das codipodo nur PDF-Dateien?

A: Bei der comdirect sind Wertpapier/Ordermitteilungen als PDF hinterlegt, termingebundene Mitteilungen und Werbung aber nicht. Das tool kümmert sich nur PDFs, weil man bei den anderen Mitteilungen noch auf ein paar links klicken müsse und das tool nicht erkennen kann, ob damit evtl. unerwünsche Aktionen ausgelöst werden.

 

F: Warum lädt codipodo nur die erste Seite der Postbox?

A: Die "nächste Seite" Funktion der Postbox ist kein normaler link, sondern ein Stück schwarzer Javscriptmagie. Beim unvorsichtigen Umgang damit besteht die Gefahr, dass das tool in eine Endlosschleife gerät und Millionen von Anfragen an die comdirect schickt, was von deren System möglicherweise als dos-Attacke missverstanden werdenn kann. So wie es jetzt ist, terminiert das Programm nach spätestens 20 Downloads. 

 

F: Gibt es support?

A: Falls genügend Nachfrage besteht, werde ich einen kostenpflichtigen Support anbieten.

 

 

# 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 = "1234578"  # Comdirect-Zugangsnummer
PIN = "123456"  # Comdirect-PIN

# Ablageort der heruntergeladenen Dateien
DIRECTORY="comdirect-postbox"

# 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.pluggable_parser.pdf = Mechanize::DirectorySaver.save_to(DIRECTORY, :overwrite => true)
  
  @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|
      link.click
    end
  end
  @agent.get(LOGOUTURL)

 

36 ANTWORTEN

FloHallo
Autor ★
8 Beiträge

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.

dg2210
Legende
6.199 Beiträge

@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.

 

 

FloHallo
Autor ★
8 Beiträge

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 😄

 

# 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)

Tarulia
Mentor ★
1.112 Beiträge

Hab mir das ganze heute mal unter nem relativ taufrischen Fedora 29 aufgesetzt und musste so einige packages nachinstallieren, damit mechanize überhaupt installiert werden konnte:

 

  • ruby-devel für die ruby header
  • automake
  • redhat-rpm-config
  • gcc-c++
  • zlib-devel
  • git (oder patch, geht beides, aber Git brauch man eh mal)

Damit habe ich nach und nach die compile-Fehler beseitigt und es funktioniert jetzt.

 

Ich habe mir auf GitHub auch mal das Repo geclont und die bisher geposteten Änderungen reingebracht, hab ein PR geschickt:

https://github.com/dg2210/comdirect/pull/1

 

Bin auch gerade noch selbst am rumbasteln und testen, werde meine Änderungen dann auch zu gegebener Zeit nochmal hier posten.

dg2210
Legende
6.199 Beiträge

@Tarulia  schrieb:

Hab mir das ganze heute mal unter nem relativ taufrischen Fedora 29 aufgesetzt und musste so einige packages nachinstallieren, damit mechanize überhaupt installiert werden konnte:

 

  • ruby-devel für die ruby header
  • automake
  • redhat-rpm-config
  • gcc-c++
  • zlib-devel
  • git (oder patch, geht beides, aber Git brauch man eh mal)

Danke für die interessante Rückmeldung. Ich hätte andere Pakete erwartet. Mechanize hängt ab von nokogiri (XML-Parser) und dieses von libxml2. Offensichtlich installiert Fedora die libxml2-devel / -header Pakete, aber keinen gcc. Ich habe keine Ahnung, woher die Abhängigkeit von git kommt.

 

Zu deinem Pull-Request: ich habe Bedenken, den zweiten hack (Ignorieren aller nicht-pdfs) offiziell zu machen. Die Aufgabe von codipodo ist es, die Postbox möglichst vollständig herunterzuladen. Das stille Ignorieren von wichtigen Dokumenten (z.B. AGB-Änderungen als html)  ist falsch. Das jetzige Verhalten (exception) ist unschön, aber macht den Anwender auf das Problem aufmerksam und daher "weniger falsch" als das Ignorieren.

 

Möglicherweise liegt die Lösung darin, nicht nach ".pdf" zu suchen und den Dateinamen danach abzuschneiden, sondern nach /.(pdf|html)/ zu schauen und den Dateinamen am ersten Fragezeichen nach diesem Muster abzuschneiden.

 

Kannst du mir bitte einen Pull-Request schicken, der nur die erste Änderung (vom 12.11.2018) umfasst?

 

 

 

 

 

 

 

Tarulia
Mentor ★
1.112 Beiträge

@dg2210  schrieb:

Danke für die interessante Rückmeldung. Ich hätte andere Pakete erwartet. Mechanize hängt ab von nokogiri (XML-Parser) und dieses von libxml2. Offensichtlich installiert Fedora die libxml2-devel / -header Pakete, aber keinen gcc. Ich habe keine Ahnung, woher die Abhängigkeit von git kommt.

nokogiri und libxml2 werden vom Gem mit geladen, brauchen also anscheinend keine Systemlib. Für libxml2 brauchte es aber anscheinend zlib... vermute mal zum entpacken? Habe mir das ehrlich gesagt nicht so genau durchgelesen 🙂

Git wird nicht zwingend benötigt, in der Meldung steht entweder patch oder git. Beide sind um binärpatches auf eine Datei zu legen, warum das Gem das macht hab ich aber nicht weiter nachgeforscht 🙂

 

Zu deinem Pull-Request: ich habe Bedenken, den zweiten hack (Ignorieren aller nicht-pdfs) offiziell zu machen. Die Aufgabe von codipodo ist es, die Postbox möglichst vollständig herunterzuladen. Das stille Ignorieren von wichtigen Dokumenten (z.B. AGB-Änderungen als html)  ist falsch. Das jetzige Verhalten (exception) ist unschön, aber macht den Anwender auf das Problem aufmerksam und daher "weniger falsch" als das Ignorieren.

Ja, den Einwand versteh ich. An dem Problem arbeite ich gerade noch mit und hab das auch soweit raus (config Option), sollte dann vielleicht noch einen dicken Hinweis drantackern 🙂

 

Möglicherweise liegt die Lösung darin, nicht nach ".pdf" zu suchen und den Dateinamen danach abzuschneiden, sondern nach /.(pdf|html)/ zu schauen und den Dateinamen am ersten Fragezeichen nach diesem Muster abzuschneiden.

Das hatte ich auch schon überlegt, aber war nicht die Anfrage, dass die HTML Dateien Probleme machen? Ich hatte den zweiten Hack übrigens am Anfang vergessen und das funktionierte auch, wird das überhaupt noch gebraucht?

Kannst du mir bitte einen Pull-Request schicken, der nur die erste Änderung (vom 12.11.2018) umfasst?

Erledigt: https://github.com/dg2210/comdirect/pull/2

 

PS: Gibt es in diesem Forum eine einfachere Variante Teile eines Beitrags zu zitieren, als in den HTML Modus zu gehen? 😕

dg2210
Legende
6.199 Beiträge

@Tarulia  schrieb:

Das hatte ich auch schon überlegt, aber war nicht die Anfrage, dass die HTML Dateien Probleme machen? Ich hatte den zweiten Hack übrigens am Anfang vergessen und das funktionierte auch, wird das überhaupt noch gebraucht?


Die Fehlermeldung beim Schreiben der heruntergeladenen Datei war  "invalid parameter". Ob man das noch braucht, kann ich dir sagen, sobald ich wieder einmal einen  HTML-Datei in meiner Postbox habe.

 

 

Tarulia
Mentor ★
1.112 Beiträge

Habe ich noch und das ging ohne Probleme 🙂

dg2210
Legende
6.199 Beiträge

@Tarulia  schrieb:

Habe ich noch und das ging ohne Probleme 🙂


Der Dateiname war korrekt?

Tarulia
Mentor ★
1.112 Beiträge

Naja, der Dateiname war korrekt, aber ich habe eben 2 Dateien (einmal noch mit dem forceDownload parameter)

Denke mit (pdf|html) sollte es funktionieren, das Downloaden geht. Nur dass der Zeichensatz wohl falsch ist. Der HTML head sagt charset=ISO-8859-15, und direkt aus der PostBox abrufen funktioniert auch, wenn ich die lokale Datei öffne ist der Zeichensatz aber kaputt... Umlaute sind eben falsch