Security News
PyPI’s New Archival Feature Closes a Major Security Gap
PyPI now allows maintainers to archive projects, improving security and helping users make informed decisions about their dependencies.
dkb-robo is a python library to access the internet banking area of "Deutsche Kreditbank" to fetch
Starting from version 0.9 dkb-robo can handle the 2nd factor DKB introduced to fulfill the PSD2 obligations. Starting from September 2019 logins must be confirmed by either
The introduction of a 2nd factor does limit the usage of dkb-robo for automation purposes. DKB is unfortunately not willing/ not able not allowed to open their PSD2-API for non-Fintechs. I discussed this with them for weeks at some point they stopped responding to my emails so I gave up.
DKB introduced a new web-frontend in July 2023 which is using a REST-API as backend. The migration to the new REST endpoints started with v0.22, will take a certain amount of time and gets spread across different releases. We are trying to keep backwards compatibility as much as we can. However, there are certain breaking changes you need to be aware when upgrading from a release prior to v0.22. Migration status and a list of breaking changes can be found in the issue section of this repo.
These instructions will get you a copy of the project up and running on your local machine.
To run dkb-robo on your system you need
Please make sure python and all the above modules had been installed successfully before you start any kind of testing.
> pip install dkb_robo
> python setup.py install
A bill of material of the packages coming along wiht dkb-robo
will be automatically created during build process and stored in my SBOM respository
you need to import dkb-robo into your script
> from dkb_robo import DKBRobo
create a new DKBRobo context handler and login to DKB portal
> with DKBRobo(dkb_user=<login username>, dkb_password=<password>, chip_tan=True|False|qr, mfa_device=<m|int>, debug=True|False) as dkb:
After login you can return a dictionary containing a list of your accounts, the actual balance and a link to fetch the transactions
from pprint import pprint
pprint(dkb.account_dic)
{0: {
'amount': '1458.00',
'currencycode': 'EUR',
'date': '22.01.2023',
'holdername': 'Firstname Lastname',
'iban': 'DEXXXXXXXXXXXXXXXXXXXXX',
'id': 'xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
'limit': '2500.00',
'name': 'Girokonto',
'productgroup': 'Meine Konten',
'transactions': 'https://banking.dkb.de/api/accounts/accounts/xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/transactions',
'type': 'account'},
1: {
'amount': -1000.23,
'currencycode': 'EUR',
'date': '22.01.2023',
'holdername': 'Firstname Lastname',
'id': 'xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
'limit': '2000.00',
'maskedpan': '1234XXXXXXXX5678',
'name': 'Visa CC',
'productgroup': 'Meine Konten',
'transactions': 'https://banking.dkb.de/api/credit-card/cards/xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/transactions',
'type': 'creditcard'},
2: {
'amount': 100000.23,
'currencycode': 'EUR',
'date': '22.01.2023',
'holdername': 'Firstname lastname',
'id': 'xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
'limit': '0.00',
'maskedpan': '5678XXXXXXXX1234',
'name': 'Another Visa',
'productgroup': 'Meine Konten',
'transactions': 'https://banking.dkb.de/api/credit-card/xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/transactions',
'type': 'creditcard'},
3: {
'amount': '123456,79',
'currencycode': 'EUR',
'holdername': 'Firstname Lastname',
'id': 'xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
'name': 'Mein Depot',
'productgroup': 'Meine Konten',
'transactions': 'https://banking.dkb.de/api/broker/brokerage-accounts/xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx(positions?include=instrument%2Cquote',
'type': 'depot'}}
to get the list of transactions for a certain checking account or a credit card use the following method
tlist = dkb.get_transactions(link, type, date_from, date_to)
this method returns a list of transactions.
A list of transactions for a regular checking account follows the below format.
from pprint import pprint
pprint(tlist)
[{'amount': -44.98,
'bdate': '2023-01-22',
'currencycode': 'EUR',
'customerreferenz': 'XXXXXX',
'peer': 'PayPal Europe S.a.r.l. et Cie S.C.A',
'peeraccount': 'XXXXXXXXX',
'peerbic': 'XXXXXXXXX',
'peerid': 'XXXXXXXXXXX',
'postingtext': 'FOLGELASTSCHRIFT',
'reasonforpayment': 'XXXXXX PP.XXXXX.PP . Foo-bar AG, Ihr Einkauf bei '
'Foo-bar AG',
'vdate': '2023-01-22'},
{'amount': -70.05,
'bdate': '2023-01-22',
'currencycode': 'EUR',
'customerreferenz': '68251782022947180823144926',
'peer': 'FEFASE GmbH',
'peeraccount': 'XXXXXXXXX',
'peerbic': 'XXXXXXXXX',
'peerid': 'XXXXXXXXX',
'postingtext': 'SEPA-ELV-LASTSCHRIFT',
'reasonforpayment': 'ELV68251782 18.08 14.49 MEFAS ',
'vdate': '2023-01-22'},
{'amount': -7.49,
'bdate': '2023-01-22',
'currencycode': 'EUR',
'customerreferenz': '3REFeSERENC',
'peer': 'PEER',
'peeraccount': 'XXXXXXXXX',
'peerbic': 'XXXXXXXXX',
'peerid': 'XXXXXXXXX',
'postingtext': 'FOLGELASTSCHRIFT',
'reasonforpayment': 'VIELEN DANK VON BAR-FOO GMBH',
'vdate': '2023-01-22'}]
The list of transactions from a creditcard will look as below:
[{'amount': 500.0,
'bdate': '2023-08-18',
'currencycode': 'EUR',
'text': 'Berliner Sparkasse',
'vdate': '2023-08-18'},
{'amount': 125.95,
'bdate': '2023-08-14',
'currencycode': 'EUR',
'text': 'Zara Deutschland 3742',
'vdate': '2023-08-14'},
{'amount': 500.0,
'bdate': '2023-08-14',
'currencycode': 'EUR',
'text': 'Commerzbank Berlin',
'vdate': '2023-08-14'}]
A brokerage account (depot) will not show the list of transactions but rather a list of positions:
[{'currencycode': 'EUR',
'isin_wkn': 'DE0005140008',
'lastorderdate': '2017-01-01',
'market': 'Frankfurt',
'price': 9.872,
'price_euro': '39488.00',
'quantity': 4000.0,
'shares_unit': 'pieces',
'text': 'DEUTSCHE BANK AG NA O.N.'},
{'currencycode': 'EUR',
'isin_wkn': 'DE0005557508',
'lastorderdate': '2017-10-01',
'market': 'Frankfurt',
'price': 19.108,
'price_euro': '28.662.00',
'quantity': 1500.0,
'shares_unit': 'pieces',
'text': 'DT.TELEKOM AG NA'}]
to get the credit limits per account or credit-card the method get_credit_limits() must be used
> c_list = dkb.get_credit_limits()
This method returns a dictionary of all identified accounts including the credit limit per account
{u'XXXX********XXXX': 100.00,
u'4748********XXXX': 10000.00,
u'XXXX********XXXX': 10000.00,
u'DEXX XXXX XXXX XXXX XXXX XX': 200.00,
u'DEXX XXXX XXXX XXXX XXXX XX': 2000.00}
A list of standing orders (Daueraufträge) can be obtained by calling get_standing_orders() method
> so = dkb.get_standing_orders(account_id)
dkb.account_dic[x]['id']
)A list of standing orders will be returned containing a dictionary per standing order
> pprint(so)
[{'amount': 30.0,
'creditoraccount': {'bic': 'BIC-1', 'iban': 'IBAN-1'},
'currencycode': 'EUR',
'interval': {'frequency': 'monthly',
'from': '2019-01-05',
'holidayExecutionStrategy': 'following',
'nextExecutionAt': '2023-10-01',
'until': '2025-12-01'},
'purpose': 'Purpose-1',
'recpipient': 'Recipient-1'},
{'amount': 58.0,
'creditoraccount': {'bic': 'BIC-2', 'iban': 'IBAN-2'},
'currencycode': 'EUR',
'interval': {'frequency': 'monthly',
'from': '2022-12-30',
'holidayExecutionStrategy': 'following',
'nextExecutionAt': '2023-12-01'},
'purpose': 'Purpose-2',
'recpipient': 'Recipient-2'},]
The method get_exemption_order() can be used to get the exemption orders (Freistellungsaufträge)
> exo = dkb.get_exemption_order()
A dictionary similar to the one below will be returned
> pprint(exo)
{1: {'amount': 1602.0,
'available': 1602.0,
'description': u'Gemeinsam mit XXXX XXXX',
'used': 0.0,
'validity': u'01.01.2017 unbefristet'}}
To get the amount of dkb points the below method can be used
> points_dic = dkb.get_points()
A dictionary similar to the below will be returned
> pprint(points_dic)
{u'DKB-Punkte': 99999,
u'davon verfallen zum 31.12.2018': 999}
To scan the DKB postbox for documents the below method can be used
> document_dic = dkb.scan_postbox(path, download_all, archive, prepend_date)
True
the "Archiv" folder in the Postbox will be scanned and documents will be downloaded if a path
variable is specificed. Handle this parameter with care as the amount of documents to be downloaded can be huge.YYYY-MM-DD_
format to each document to allow easy sorting of downloaded filesThe method will return a dictionary containing the different postbox folders and links to download the corresponding documents
Check the scripts dkb_example.py and dkb_docdownload.py for further examples.
Starting with v0.20 dkb_robo comes with a CLI tool
$ dkb --help
Usage: dkb [OPTIONS] COMMAND [ARGS]...
Options:
-d, --debug Show additional debugging
-t, --chip-tan TEXT use [ChipTan](https://www.dkb.de/fragen-antworten/was-ist-das-chiptan-verfahren) for login ("qr" for chipTan-QR "manual" for chipTan-manuell)
-u, --username TEXT username to access the dkb portal
[required]
-p, --password TEXT corresponding login password
--format [pprint|table|csv|json]
output format to use
--help Show this message and exit.
Commands:
accounts
credit-limits
last-login
standing-orders
transactions
py dkb -u <user> -p <password> accounts
py dkb -u <user> -p <password> transactions --name Girokonto
py dkb -u <user> -p <password> transactions --account "DE75xxxxxxxxxxxxxxxxxxx"
py dkb -u <user> -p <password> transactions --account "DE75xxxxxxxxxxxxxxxxxxx" --date-from 2023-08-01 --date-to 2023-08-15"
please check the doc folder of the project. You will find further documentation and an example scripts of all dkb-robo methods there.
Please read CONTRIBUTING.md for details on my code of conduct, and the process for submitting pull requests. Please note that I have a life besides programming. Thus, expect a delay in answering.
I use SemVer for versioning. For the versions available, see the tags on this repository.
This project is licensed under the GPLv3 - see the LICENSE.md file for details
FAQs
Download transactions from the website of Deutsche Kreditbak AG
We found that dkb-robo demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
PyPI now allows maintainers to archive projects, improving security and helping users make informed decisions about their dependencies.
Research
Security News
Malicious npm package postcss-optimizer delivers BeaverTail malware, targeting developer systems; similarities to past campaigns suggest a North Korean connection.
Security News
CISA's KEV data is now on GitHub, offering easier access, API integration, commit history tracking, and automated updates for security teams and researchers.