From beefb91dc21d10f1d1dd7100625d4cf3aacdbb90 Mon Sep 17 00:00:00 2001 From: Glen Myles Date: Thu, 12 Sep 2019 13:33:42 +0200 Subject: [PATCH] ownDepot MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Funktionalität zum Auslesen des gesamten Depots hinzugefügt --- .gitignore | 3 + lib/fetcher.js | 7 ++ lib/parser.js | 1 + lib/parser/owndepot.js | 169 +++++++++++++++++++++++++++++++++++++++++ lib/retrieve.js | 7 +- package-lock.json | 74 +++++++++++++++--- test.js | 5 ++ 7 files changed, 254 insertions(+), 12 deletions(-) create mode 100644 .gitignore create mode 100644 lib/parser/owndepot.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..43c50eb --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +package-lock.json +.DS_Store diff --git a/lib/fetcher.js b/lib/fetcher.js index 3eed89e..0f4812b 100644 --- a/lib/fetcher.js +++ b/lib/fetcher.js @@ -73,6 +73,11 @@ function chronik(wkn) { function depot(wkn) { return section('depot_log&aktie=' + wkn); } +function ownDepot(){ + return raw('index.php?section=agdepot&action=columns', 'POST', { + 'columns[]': [0,1,2,3,4,5,6,7,8,9,15,17,18,19,20,21,22] + }); +} function agstruktur(wkn) { return section('agstruktur&WKN=' + wkn); } @@ -103,6 +108,7 @@ function agsx() { function orders() { return section('agorderbuch'); } + module.exports = { raw: raw, section: section, @@ -114,6 +120,7 @@ module.exports = { indizes: indizes, chronik: chronik, depot: depot, + ownDepot: ownDepot, agstruktur: agstruktur, kontoauszug: kontoauszug, kaeufer: kaeufer, diff --git a/lib/parser.js b/lib/parser.js index 1de40f9..273c701 100644 --- a/lib/parser.js +++ b/lib/parser.js @@ -5,6 +5,7 @@ module.exports = { indizes: require('./parser/indizes.js'), chronik: require('./parser/chronik.js'), depot: require('./parser/depot.js'), + parseOwnDepot: require('./parser/owndepot.js'), aktionaere: require('./parser/aktionaere.js'), kontoauszug: require('./parser/kontoauszug.js'), kaeufer: require('./parser/kaeufer.js'), diff --git a/lib/parser/owndepot.js b/lib/parser/owndepot.js new file mode 100644 index 0000000..72b9b8f --- /dev/null +++ b/lib/parser/owndepot.js @@ -0,0 +1,169 @@ +const cheerio = require('cheerio'); +const format = require('../format.js'); + +function parseOwnDepot(html) { + + let data = cheerio.load(html); + + + let aktien = []; + let aktientbody = data('#depot').children()[1]; + + aktientbody.children.filter(tr => tr.type !== 'text').forEach(tr => { + + let tds = tr.children.filter(td => td.type !== 'text'); + + let wkn = tds[0].children[0].children[0].data; + let name = tds[0].children[0].children[2].children[0].data; + + let notiz = tds[1].children[0].children[0].data; + + let anzahl = tds[2].children[0].data; + + let gKurs = tds[3].children[0].children[0].data; + let hKurs = tds[3].children[1].children[0].data; + let bKurs = tds[3].children[4].children[0].data; + + let kPreis = tds[4].children[0].data; + let kDatum = tds[4].children[2].data; + + let aenderung = tds[5].children[0]; + + let tKurs = tds[6].children[0].children[0].data; + + let bWAktie = tds[7].children[0].data; + + let kBW = tds[8].children[0].children[0].data; + + let buchwert = tds[9].children[0].data; + + let wachstum = tds[10].children[0].data; + + let aGAlter = tds[11].children[0].data; + + let oStatus = tds[12].children[0].data; + + let hAktivitaet = tds[13].children[0].data; + + let orders = (!tds[14].children[0].children[0]) ? "" : tds[14].children[0].children[0].data; + + let kGV = tds[15].children[0].data; + + let fP = tds[16].children[0].data; + + aenderung = (aenderung.name === 'img') ? 0 : aenderung.children[0].data; + + let aktie = { + wkn: +wkn, + name: name, + notiz: notiz, + anzahl: +anzahl, + gKurs: format.from(gKurs), + hKurs: format.from(hKurs), + bKurs: format.from(bKurs), + kPreis: format.from(kPreis), + kDatum: kDatum, + aenderung: aenderung, + tKurs: tKurs, + bWAktie: format.from(bWAktie), + kBW: format.from(kBW), + bW: format.from(buchwert), + wachstum: (!wachstum) ? 0 : +wachstum, + aGAlter: aGAlter, + oStatus: oStatus, + hAktivitaet: hAktivitaet, + orders: orders, + kGV: format.from(kGV), + fP: format.from(fP) + }; + + aktien.push(aktie); + + }); + + + let anleihen = []; + + let tbody = data('#depotAnleihen').find('tbody'); + + tbody[0].children.filter(r => r.type === 'tag').forEach(row => { + row = row.children.filter(cell => cell.type === 'tag'); + let vol = format.from(row[0].children[0].data); + let zins = row[1].children[0].data.replace('%', ''); + let zinsbetrag = format.from(row[2].children[0].data); + let auszahlung = format.from(row[3].children[0].data); + let laufzeit = row[4].children[0].data; + let restlaufzeit = row[5].children[0].data; + let date = row[6].children[0].data.replace(' um', ''); + date = format.date(date, date.substring(10)); + + let anleihe = { + volumen: vol, + zinssatz: +zins, + zinsbetrag: zinsbetrag, + auszahlung: auszahlung, + laufzeit: laufzeit, + restlaufzeit: restlaufzeit, + auszahlungsdatum: date + }; + anleihen.push(anleihe); + }); + + let kredite = []; + let tbody_kredite = data('#depotKredite').find('tbody'); + tbody_kredite[0].children.filter(r => r.type === 'tag').forEach(row => { + row = row.children.filter(cell => cell.type === 'tag'); + let vol = format.from(row[0].children[0].data); + let zins = row[1].children[0].data.replace('%', ''); + let zinsbetrag = format.from(row[2].children[0].data); + let auszahlung = format.from(row[3].children[0].data); + let laufzeit = row[4].children[0].data; + let restlaufzeit = row[5].children[0].data; + let date = row[6].children[0].data.replace(' um', ''); + date = format.date(date, date.substring(10)); + + let kredit = { + volumen: vol, + zinssatz: +zins, + zinsbetrag: zinsbetrag, + rueckzahlungsbetrag: auszahlung, + laufzeit: laufzeit, + restlaufzeit: restlaufzeit, + rueckzahlungsdatum: date + }; + kredite.push(kredit); + }) + + let zertis = []; + let tbody_zertis = data('#depotZertis').find('tbody'); + tbody_zertis[0].children.filter(r => r.type === 'tag').forEach(row => { + row = row.children.filter(cell => cell.type === 'tag'); + let betrag = format.from(row[0].children[0].data); + let hebel = row[1].children[0].data; + let punkte = format.from(row[2].children[0].data.match(/auf (.*) Pkt./)[1]); + let typ = row[2].children[0].data.includes('call') ? 'CALL' : 'PUT'; + let auszahlung = format.from(row[3].children[0].data); + let ablaufdatum = row[4].children[0].data.replace(' um', ''); + ablaufdatum = format.date(ablaufdatum, ablaufdatum.substring(10)); + + let zert = { + betrag: betrag, + hebel: +hebel, + typ: typ, + punkte: punkte, + auszahlung: auszahlung, + ablaufdatum: ablaufdatum, + }; + zertis.push(zert); + }) + + let depot = { + aktien: aktien, + anleihen: anleihen, + kredite: kredite, + zertifikate: zertis + } + return depot; + } + + module.exports = parseOwnDepot; diff --git a/lib/retrieve.js b/lib/retrieve.js index eb70c52..17aabeb 100644 --- a/lib/retrieve.js +++ b/lib/retrieve.js @@ -31,6 +31,10 @@ function depot(wkn) { return fetcher.depot(wkn).then(parser.depot); } +function ownDepot(){ + return fetcher.ownDepot().then(data => parser.parseOwnDepot(data)); +} + function aktionaere(wkn) { return fetcher.agstruktur(wkn).then(parser.aktionaere); } @@ -71,6 +75,7 @@ module.exports = { aglist: agliste, indizes: indizes, depot: depot, + ownDepot: ownDepot, chronik: chronik, aktionaere: aktionaere, kontoauszug: kontoauszug, @@ -79,5 +84,5 @@ module.exports = { trades: trades, online: onlinelist, bilanzen: bilanzen, - index: index, + index: index }; diff --git a/package-lock.json b/package-lock.json index 311cfe2..53d70dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,8 @@ { - "name": "agspiel-nodejs-client-api", - "version": "1.0.0", + "name": "agspiel", + "version": "1.0.1", "lockfileVersion": 1, + "requires": true, "dependencies": { "@types/node": { "version": "6.0.85", @@ -16,7 +17,15 @@ "cheerio": { "version": "1.0.0-rc.2", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", - "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=" + "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" + } }, "core-util-is": { "version": "1.0.2", @@ -26,7 +35,13 @@ "css-select": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=" + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } }, "css-what": { "version": "2.1.0", @@ -37,6 +52,10 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "requires": { + "domelementtype": "~1.1.1", + "entities": "~1.1.1" + }, "dependencies": { "domelementtype": { "version": "1.1.3", @@ -53,12 +72,19 @@ "domhandler": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", - "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=" + "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", + "requires": { + "domelementtype": "1" + } }, "domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=" + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } }, "entities": { "version": "1.1.1", @@ -68,7 +94,15 @@ "htmlparser2": { "version": "3.9.2", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", - "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=" + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "requires": { + "domelementtype": "^1.3.0", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } }, "inherits": { "version": "2.0.3", @@ -88,12 +122,18 @@ "nth-check": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=" + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "requires": { + "boolbase": "~1.0.0" + } }, "parse5": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.2.tgz", - "integrity": "sha1-Be/1fw70V3+xRKefi5qWemzERRA=" + "integrity": "sha1-Be/1fw70V3+xRKefi5qWemzERRA=", + "requires": { + "@types/node": "^6.0.46" + } }, "process-nextick-args": { "version": "1.0.7", @@ -103,7 +143,16 @@ "readable-stream": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==" + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" + } }, "safe-buffer": { "version": "5.1.1", @@ -113,7 +162,10 @@ "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==" + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "~5.1.0" + } }, "util-deprecate": { "version": "1.0.2", diff --git a/test.js b/test.js index 1cf0d96..34c0c1b 100644 --- a/test.js +++ b/test.js @@ -4,3 +4,8 @@ const retrieve = agspiel.retrieve; retrieve.agliste().then(list => { console.log(list); }).catch(console.log); + +/** Gesamtes Depot auslesen + * retrieve.ownDepot().then( + * msg => console.log(msg)); + * / \ No newline at end of file