Opdatering 18/02/2023: Nordnet ændrer tit på deres ting. På https://github.com/helmstedt/nordnet-utilities forsøger jeg at følge med, så hent gerne din kode der, hvis koden neden for ikke virker længere.
Nordnet har opdateret deres login-procedure, så jeg har også opdateret mit Python-script til at logge ind på Nordnet og hente transaktioner. Her er den nye version.
# -*- coding: utf-8 -*-
# Author: Morten Helmstedt. E-mail: helmstedt@gmail.com
""" This program logs into a Nordnet account and extracts transactions as a csv file.
Handy for exporting to Excel with as few manual steps as possible """
import requests
from datetime import datetime
from datetime import date
# USER ACCOUNT, PORTFOLIO AND PERIOD DATA. SHOULD BE EDITED FOR YOUR NEEDS #
# Nordnet user account credentials and accounts/portfolios names (choose yourself) and numbers.
# To get account numbers go to https://www.nordnet.dk/transaktioner and change
# between accounts. The number after "accid=" in the new URL is your account number.
# If you have only one account, your account number is 1.
user = ''
password = ''
accounts = {
'Nordnet: Frie midler': '1',
'Nordnet: Ratepension': '3',
}
# Start date (start of period for transactions) and date today used for extraction of transactions
startdate = '2013-01-01'
today = date.today()
enddate = datetime.strftime(today, '%Y-%m-%d')
# Manual data lines. These can be used if you have portfolios elsewhere that you would
# like to add manually to the data set. If no manual data the variable manualdataexists
# should be set to False
manualdataexists = True
manualdata = '''
Id;Bogføringsdag;Handelsdag;Valørdag;Depot;Transaktionstype;Værdipapirer;Værdipapirtype;ISIN;Antal;Kurs;Rente;Samlede afgifter;Samlede afgifter Valuta ;Beløb;Valuta;Indkøbsværdi;Resultat;Totalt antal;Saldo;Vekslingskurs;Transaktionstekst;Makuleringsdato;Notanummer;Verifikationsnummer;Kurtage;Kurtage Valuta;Depotnavn
;30-09-2013;30-09-2013;30-09-2013;;KØBT;Obligationer 3,5%;Obligationer;;72000;;;;;-69.891,54;DKK;;;;;;;;;;;;Frie midler: Finansbanken
'''
# A variable to store transactions before saving to csv
transactions = ''
# LOGIN TO NORDNET #
session = requests.Session()
# Setting cookies prior to login by visiting login page
url = 'https://www.nordnet.dk/logind'
request = session.get(url)
# Update headers for login
session.headers['client-id'] = 'NEXT'
session.headers['sub-client-id'] = 'NEXT'
# Actual login
url = 'https://www.nordnet.dk/api/2/authentication/basic/login'
request = session.post(url, data = {'username': user, 'password': password})
# GET ACCOUNT(S) TRANSACTION DATA #
# Payload and url for transaction requests
payload = {
'locale': 'da-DK',
'from': startdate,
'to': enddate,
}
url = 'https://www.nordnet.dk/mediaapi/transaction/csv/filtered'
firstaccount = True
for portfolioname, id in accounts.items():
payload['account_id'] = id
data = session.get(url, params=payload)
result = data.content.decode('utf-16')
result = result.replace('\t',';')
result = result.splitlines()
firstline = True
for line in result:
# For first account and first line, we use headers and add an additional column
if line and firstline == True and firstaccount == True:
transactions += line + ';' + 'Depotnavn' + '\n'
firstaccount = False
firstline = False
# First lines of additional accounts are discarded
elif line and firstline == True and firstaccount == False:
firstline = False
# Content lines are added
elif line and firstline == False:
# Fix because Nordnet sometimes adds one empty column too many
if line.count(';') == 27:
line = line.replace('; ',' ')
transactions += line + ';' + portfolioname + '\n'
# ADD MANUAL LINES IF ANY #
if manualdataexists == True:
manualdata = manualdata.split("\n",2)[2]
transactions += manualdata
# WRITE CSV OUTPUT TO FILE #
with open("transactions.csv", "w", encoding='utf8') as fout:
fout.write(transactions)