Postbox-Sammeldownload ? codipodo !

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

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:Smiley (überglücklich)irectorySaver.save_to(DIRECTORY, Smiley (überrascht)verwrite => 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)

 

12 ANTWORTEN
Social-Media-Team
Social-Media-Team
Beiträge: 1782
Mitglied seit: 22.07.2016

Hallo dg2210,

 

da hast du dir bestimmt einige Mühe gemacht. Prima! Smiley (fröhlich)

 

Nur der Vollständigkeit halber möchten wir ergänzen, dass diese Anwendung nicht von uns ist und wir für die Funktionstüchtigkeit dieses Programms sowie die Sicherheit der Zugangsdaten keinerlei Gewährleistung übernehmen.

 

Es sieht so aus, als ob die Zugangsdaten vom Programm unverschlüsselt auf dem Rechner abgelegt werden. Daher regen wir an für eine Verschlüsselung zu sorgen, um die Daten vor Ausspähung zu schützen. Mit einem kostenpflichtigen Support hätte dein Angebot übrigens den Geschmack eines gewerblichen Angebots. Vielleicht kannst du darüber ja nochmal nachdenken? Smiley (zwinkernd)

 

Gruß aus Quickborn,

Erik


Der gute Ton macht die Musik. Wie im Leben, so in der Community.
Mentor ★★
Beiträge: 1571
Mitglied seit: 16.08.2016

SMT_Erik schrieb:Verschlüsselung zu sorgen, um die Daten vor Ausspähung zu schützen. Mit einem kostenpflichtigen Support hätte dein Angebot übrigens den Geschmack eines gewerblichen Angebots. Vielleicht kannst du darüber ja nochmal nachdenken? Smiley (zwinkernd)

 


Hallo @SMT_Erik,

 

gerne stelle ich das klar: falls es einen Support geben sollte, dann wird er so teuer, dass ich mir davon eine Sperrminorität bei der Comdirect AG kaufen kann. Dann lasse ich mich in den comdirect Aufsichtsrat wählen und bekomme in dieser Community einen eigenen "Aufsichtsrat"-Avatar. Smiley (zwinkernd)

Tags (1)
Social-Media-Team
Social-Media-Team
Beiträge: 1782
Mitglied seit: 22.07.2016

dg2210 schrieb:

Hallo @SMT_Erik,

 

gerne stelle ich das klar: falls es einen Support geben sollte, dann wird er so teuer, dass ich mir davon eine Sperrminorität bei der Comdirect AG kaufen kann. Dann lasse ich mich in den comdirect Aufsichtsrat wählen und bekomme in dieser Community einen eigenen "Aufsichtsrat"-Avatar. Smiley (zwinkernd)


Das zumindest klingt nach einem Plan! Roboter (zwinkernd)

 

Gruß,

Erik


Der gute Ton macht die Musik. Wie im Leben, so in der Community.
Experte ★
Beiträge: 152
Mitglied seit: 26.02.2018

@dg2210

 

Sauber gecodet und kommentiert Smiley (zwinkernd)

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

Hi dg2210,

danke für die Mühe für das Script!

Benutzt du das noch?

Bei mir werden alle PDFs doppelt heruntergeladen.

Einige haben auch die Endung .pdf, aber die meisten haben die Endung .pdf_selectEntryId=9, wobei die letzte Zahl immer anders ist.

Die Dublette hat jeweils keine Endung.

 

Beispiel:

Ertragsgutschrift_0330_St._WKN_ETF701

Ertragsgutschrift_0330_St._WKN_ETF701(CS_VERMOEG.STRATE.U.ETF_I)_vom_31.10.2018522983.pdf_selectEntryId=8

 

Kann man da etwas machen?

Ich kann zwar kein Ruby aber ich arbeite mich gerne ein.

Um das Passwort nicht im Klartext zu speichern frage ich es per Eingabe ab.

Ich hole mir die PDFs eh nur nach der Mail-Benachrichtigung ab:

 

require "highline/import"
PIN = ask "Passwort: "

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

Hallo @FloHallo,

 

danke für die Rückmeldung.

Ja, ich benutze codipo wöchentlich und ich habe den doppel-Download-Fehler bei mir zu Hause schon seit langem beseitigt, aber vergessen, es hier in der community zu kommunizieren. Das hole ich bald nach.

 

Hintergrund:

Seit der letzten Postbox-Umstellung haben ungelesene und gelesene Dokumente unterschiedliche URLs (der selectEntry-Teil)

 

Das man man dadurch verifizieren, daß man die ungelsenen Dokumente in der Postbox anklickt, danach werden sie von codipo normal (einfach) heruntergeladen.

 

Workaround:

codpipo aufrufen, Dokumente werden doppelt heruntergeladen

alle heruntergeladenen Dokumente löschen

codipo nochmal aufrufen

 

 

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

Hier die notwendigen Änderungen:

 

a) Die Zeile

@agent.pluggable_parser.pdf = Mechanize:Smiley (überglücklich)irectorySaver.save_to(DIRECTORY, Smiley (überrascht)verwrite => true)

bitte löschen

 

b) Den Block nach dem Kommentar "Nur Eintraege..." bis zum Ende ersetzen durch

 

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

Was macht das?

Statt dem eleganten "link.click" holen wir uns manuell den Dateinamen aus dem href-element, suchen nach der Zeichenfolge ".pdf" und schneiden alles, was dahinter steht, ab.

 

Dann basteln wir uns den vollständigen Dateinamen uns speichern manuell ab.

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

Hi dg2210,

vielen Dank für die schnelle Antwort.

Ich probier das demnächst mal aus.

Ich probiere dann auch, ob man die Postbox auch gleich Löschen und Archivieren kann.

Mal sehen, ob ich das hinbekomme Smiley (überglücklich)

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

@FloHallo  schrieb:

Ich probiere dann auch, ob man die Postbox auch gleich Löschen und Archivieren kann.

Mal sehen, ob ich das hinbekomme Smiley (überglücklich)


Viel Glück dabei! Ich habe es aufgegeben, weil zu viel "schwarze Java-Script Magie" im Spiel ist.