finance-quote/Finance/Quote/Morningstarde.pm

157 lines
4.4 KiB
Perl

# Finance::Quote Perl module to retrieve prices of funds from morningstar.de
# Copyright (C) 2020 Matthias Merz <matthias@merz-ka.de>
#
# 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 2 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, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
package Finance::Quote::Morningstarde;
use strict;
use HTML::TreeBuilder::XPath;
use POSIX qw(strftime);
my $agent_string = 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0';
my %urlmap_wkn = (
'986855' => 'https://www.morningstar.de/de/funds/snapshot/snapshot.aspx?id=F0GBR04DI1'
);
my %wknmap = (
'de0005326565' => '532656',
'de000a0m8hd2' => 'a0m8hd',
'de000a0x7541' => 'a0x754',
'de000a0x7582' => 'a0x758',
'de000ewg0ld1' => 'ewg0ld',
'fr0010135103' => 'a0dpw0',
'lu0087412390' => '974515',
'lu0323578657' => 'a0m430',
'lu0327386487' => 'dws0pr',
'lu0336084032' => 'a0m9a2',
'lu0438336264' => 'a0ndda',
'lu0454071019' => 'a0ya5q'
);
sub methods {return ('morningstarde' => \&morningstarde,
'europe' => \&morningstarde);}
{
my @labels = ('name', 'date', 'price', 'last', 'currency');
sub labels { return (morningstarde => \@labels, europe => \@labels); }
}
sub get_stock_url {
my $stock_wkn = shift;
my $url = $urlmap_wkn{lc($stock_wkn)};
if (!defined($url) || length($url) == 0) {
my $wkn = $wknmap{lc($stock_wkn)};
$url = $urlmap_wkn{$wkn};
}
return $url;
}
sub morningstarde
{
my $quoter = shift; # The Finance::Quote object.
my @stocks = @_;
my $ua = $quoter->user_agent();
$ua->agent($agent_string);
my %info;
foreach my $stock (@stocks) {
my $get_url = get_stock_url($stock);
if (!defined($get_url) || length($get_url) == 0) {
$info{$stock,"errormsg"} = "undefined URL";
next;
}
my $response = $ua->get($get_url . "&search_value=" . $stock);
#print $response->content, "\n";
$info{$stock,"success"} = 0;
if (!$response -> is_success()) {
$info{$stock,"errormsg"} = "HTTP failure";
} else {
$info{$stock,"success"} = 1;
$info{$stock,'symbol'} = $stock;
my $parser = HTML::TreeBuilder::XPath->new_from_content($response->decoded_content);
my $namestr = $parser->findnodes('//div[@id="snapshotTitleDiv"]//h1');
if (defined($namestr)) {
$info{$stock,'name'} = $namestr;
};
my $pricestr = $parser->findnodes('//div[@id="overviewQuickstatsDiv"]//tr[2]/td[3]');
if (defined($pricestr)) {
my @splitvals = ( $pricestr =~ /(\w+).([0-9,.]+)/g);
if (@splitvals) {
$info{$stock,'currency'} = $splitvals[0];
my $converted_price = $splitvals[1];
$converted_price =~ s/\.//g;
$converted_price =~ s/,/./g;
$info{$stock,'price'} = $converted_price;
$info{$stock,'last'} = $converted_price;
}
};
my $datestr = $parser->findnodes('//div[@id="overviewQuickstatsDiv"]//tr[2]/td[1]//span');
if (defined($datestr)) {
print "got datestr: $datestr\r\n";
my $tradedate = $datestr;
$tradedate =~ s/.*\|\s*(\d\d.*) $/$1/g;
if (length($tradedate) < 10) {
$tradedate = POSIX::strftime( '%d.%m.%Y', localtime());
}
$info{$stock,'date'} = $tradedate;
$quoter->store_date(\%info, $stock, {eurodate => $tradedate});
};
$info{$stock,'timezone'} = 'Europe/Berlin';
#$info{$stock,'currency'} = 'EUR';
}
}
return wantarray ? %info : \%info;
}
1;
=head1 NAME
Finance::Quote::Morningstarde - Obtain fonds quotes from Morningstar.de.
=head1 SYNOPSIS
use Finance::Quote;
$q = Finance::Quote->new("Morningstarde");
%info = Finance::Quote->fetch("morningstarde","A0M9A2");
=head1 DESCRIPTION
This module obtains fund prices from Morningstar.de,
https://www.morningstar.de/.
=head1 LABELS RETURNED
The following labels may be returned by Finance::Quote::Morningstarde:
name, date, price, last, method.
=head1 SEE ALSO
https://www.morningstar.de/
Finance::Quote;
=cut