ucash.org/>
#
# Changes:
# Rewritten for issue #516: 2025-10-21, Bruce Schuck
# Parses JSON retrieved from
# https://internal.api.union-investment.de/beta/web/funddata/fundsearch?segme
{DEBUG};
use if DEBUG, 'Smart::Comments', '###';
use JSON qw(decode_json);
our $VERSION = '1.67_01'; # TRIAL VERSION
# This url retrieve a JSON data structure containing data for all funds
our $UNI
==========
# The unionfunds routine gets quotes of UNION funds (Union Invest)
# The URL returns a JSON data structure containing a table containing
# quote data for all funds
#
# This subroutine was w
USA
#
# $Id: $
package Finance::Quote::GoldMoney;
require 5.005;
use HTTP::Request::Common;
use JSON;
use strict;
use warnings;
our $VERSION = '1.67_01'; # TRIAL VERSION
sub methods {
return
returned (note: this module only works for 'gold' and 'silver')";
}
}
# get the JSON of the prices. Currently getting sell price,
if ( $_want_gold or $_want_silver or $_want_plat
my $json = from_json($html_string);
$table_gold = $json->{spotPrices}[0];
$table_silver = $json->{spotPrices}[1];
$table_platinum = $json->{spotPrice
';
use LWP::Simple;
use LWP::UserAgent;
use HTTP::Request::Common;
use HTTP::Cookies;
use JSON qw(decode_json);
use Text::Template;
our $VERSION = '1.67_01'; # TRIAL VERSION
$MSTARUK_MAIN_URL =
next;
}
$webdoc = $response->content;
### [<now>] 2nd Webdoc: $webdoc
my $json;
eval {$json = decode_json $webdoc};
if ($@) {
# serious error, report it and give up
ecode JSON";
next;
}
### [<now>] JSON: $json
# Find date, currency and price all in one table row
my ($date, $time);
my $currency = $json->{'currency'};
my $price = $json->{'na
use strict;
use warnings;
package Finance::Quote::Consorsbank;
use LWP::UserAgent;
use JSON qw( decode_json );
use Date::Parse qw(str2time);
use POSIX qw(strftime);
use Encode qw(encode_utf8);
use
$info{ $symbol, 'success' } = 0;
$info{ $symbol, 'errormsg' } = '';
my $get_json = sub {
my $query = shift;
my $response = $ua->get($query);
tent-type') =~ m|application/json|i) {
$info{ $symbol, 'errormsg' } = "Invalid content-type from Consorsbank server for $symbol. Expected: application/json, received: " . $response->h
package Finance::Quote::Oslobors;
use strict;
use JSON qw( decode_json );
use HTTP::Request::Common;
our $VERSION = '1.65'; # VERSION
use vars qw( $OSLOBORS_COMPONENTS_URL );
$OSLOBORS_COMPONENTS_
= 0;
$funds{$symbol, "errormsg"} = "HTTP request failed";
} else {
$data = JSON::decode_json($reply->content)->{"rows"}[0]{"values"};
$quoter->store_date(\%funds, $symbol, { is
renamed to yahooJSON
# since it gets a lot of quotes besides Indian
#
# The code has been modified by Abhijit K to
# retrieve stock information from Yahoo Finance through json calls
#
# Th
t, Fifth Floor, Boston, MA
# 02110-1301, USA
package Finance::Quote::YahooJSON;
use strict;
use JSON qw( decode_json );
use vars qw($VERSION $YIND_URL_HEAD $YIND_URL_TAIL);
use HTTP::Request::Co
YahooJSON';
our @LABELS = qw/name last date isodate volume currency method exchange type
div_yield eps pe year_range open high low close/;
our $METHODHASH = {subroutine => \&yahoo_json,
';
use LWP::Simple;
use LWP::UserAgent;
use HTTP::Request::Common;
use HTTP::Cookies;
use JSON qw(decode_json);
use Text::Template;
our $VERSION = '1.67_01'; # TRIAL VERSION
$MSTARCH_MAIN_URL =
next;
}
$webdoc = $response->content;
### [<now>] 2nd Webdoc: $webdoc
my $json;
eval {$json = decode_json $webdoc};
if ($@) {
# serious error, report it and give up
ecode JSON";
next;
}
### [<now>] JSON: $json
# Find date, currency and price all in one table row
my ($date, $time);
my $currency = $json->{'currency'};
my $price = $json->{'na
r ();
use Carp;
use Finance::Quote::UserAgent;
use HTTP::Request::Common;
use Encode;
use JSON qw( decode_json );
use vars qw/@ISA @EXPORT @EXPORT_OK @EXPORT_TAGS
$TIMEOUT @MODULES %MODUL
w/
AlphaVantage
CurrencyFreaks
ECB
FinanceAPI
Fixer
OpenExchange
YahooJSON
/;
@MODULES = qw/
AEX
ASEGR
ASX
AlphaVantage
BSEIndia
BorsaItaliana
reto
TMX
Tradegate
TreasuryDirect
TSP
TwelveData
Union
XETRA
YahooJSON
YahooWeb
ZA
/;
@ISA = qw/Exporter/;
@EXPORT = ();
@EXPORT_OK = qw/asx currency_lookup
t;
use HTTP::Request::Common;
use HTTP::CookieJar::LWP ();
use HTML::TreeBuilder;
use Encode;
use JSON;
our $VERSION = '1.65_01'; # TRIAL VERSION
use vars qw($BLOOMBERG_URL);
$BLOOMBERG_URL = 'http
nt);
my $json = encode_utf8 (($tree->look_down(_tag=>'script', 'id'=>'__NEXT_DATA__')->content_list())[0]);
my $json_decoded = decode_json $json;
my $json_quote = $json_decoded->{'pr
{'quote'};
my $desc = $json_quote->{'longName'};
my $price = $json_quote->{'price'};
my $curr = $json_quote->{'issuedCurrency'};
my $date = $json_quote->{'lastUpdate'};
L $FUNDLIB_MAIN_URL);
use LWP::UserAgent;
use HTTP::Request::Common;
use HTML::TableExtract;
use JSON;
use warnings;
use Time::Piece;
our $VERSION = '1.59_01'; #TRIAL VERSION
# URLs of where to ob
racefully - add later##
return unless ($reply->is_success);
my $json = JSON->new;
my $data = decode_json($reply->decoded_content);
# If the fund is not found, "PriceAsOfDateStr
constant DEBUG => $ENV{DEBUG};
use if DEBUG, 'Smart::Comments';
use LWP::UserAgent;
use JSON qw( decode_json );
use String::Util qw(trim);
use Scalar::Util qw(looks_like_number);
our $VERSION = '1.
s/snap.json?select=ValorId,PortalSegment,ProductLine&where=PortalSegment=EQ|BO|FU|EP|IN&pagesize=2&match=' . $symbol;
my $reply = $ua->get($url);
my $search = JSON::decode_json $reply
mbol not found" unless defined $valorid;
$url = 'https://www.six-group.com/fqs/ref.json?select=DividendEntitlementFlag,FirstTradingDate,LastTradingDate,ISIN,IssuerNameFull,IssuerNameSho
gs;
use constant DEBUG => $ENV{DEBUG};
use if DEBUG, 'Smart::Comments';
use Encode;
use JSON qw( decode_json );
use LWP::UserAgent;
use Web::Scraper;
use String::Util qw(trim);
our $VERSION = '1.67
/instruments/$symbol";
my $reply = $ua->get($url);
# JSON inside script id="__NEXT_DATA__" type="application/json" crossorigin="">
my $widget = scraper {
process '
ult->script: $result->{script}
my $json = encode_utf8($result->{script});
my $json_data;
eval {$json_data = JSON::decode_json($json)};
if ($@) {
$info{ $sy
sh.org/>
use strict;
use warnings;
package Finance::Quote::ASX;
use LWP::UserAgent;
use JSON qw/decode_json/;
use constant DEBUG => $ENV{DEBUG};
use if DEBUG, 'Smart::Comments';
use vars qw/$ASX_
uotes
# which prevented the previous HTML screen scraping from working, but exposed
# a number of JSON data sources, two of which are used here.
# The primary source returns data elements for almost a
) {
$status = 0;
$error = "Cannot parse content from ASX server '$url'. Expected a top level JSON element named data.";
### ASX.pm Error: $error
return $status, $error;
}
# Map the Finance::
eSlidesCloud::Object::Placeholder;
require 5.6.0;
use strict;
use warnings;
use utf8;
use JSON qw(decode_json);
use Data::Dumper;
use Module::Runtime qw(use_module);
use Log::Any qw($log);
use Date::
bute};
$self->$attribute( $args{ $args_key } );
}
return $self;
}
# used by JSON for serialization
sub TO_JSON {
my $self = shift;
my $_data = {};
foreach my $_key (keys %{$self->a
e strict;
use warnings;
use constant DEBUG => $ENV{DEBUG};
use if DEBUG, 'Smart::Comments';
use JSON;
our $VERSION = '1.67_01'; # TRIAL VERSION
sub parameters {
return ('API_KEY');
}
sub new
{
.json?app_id=$this->{API_KEY}";
my $reply = $ua->get($url);
return unless ($reply->code == 200);
my $body = $reply->content;
my $json_data = JSON::decode_json $body;
if ( !$json
_data || $json_data->{error} || not exists $json_data->{rates}) {
### OpenExchange error : $json_data->{description}
return;
}
$this->{cache} = $json_data->{rates};
### OpenEx
ENV{DEBUG};
use if DEBUG, 'Smart::Comments';
use LWP::UserAgent;
use Text::Template;
use JSON qw( decode_json );
our $VERSION = '1.67_01'; # TRIAL VERSION
our $DISPLAY = 'ASEGR - Athens Exchang
strument}/inbroker');
my @instruments = qw/stocks bonds etfs lending derivatives indices/;
my ( %jsondata, %info );
sub methodinfo {
return (
asegr => $METHODHASH,
greece => $METHODHASH,
b methods {
my %m = methodinfo();
return map {$_ => $m{$_}{subroutine} } keys %m;
}
# Since %jsondata and %info are global to this module
# pass in the instrument and symbol to search for the dat
package Finance::Quote::CurrencyRates::YahooJSON;
use strict;
use warnings;
use constant DEBUG => $ENV{DEBUG};
use if DEBUG, 'Smart::Comments';
use JSON;
our $VERSION = '1.67_01'; # TRIAL VERSION
his, $class;
my $args = shift;
### YahooJSON->new args : $args
return $this;
}
sub multipliers
{
my ($this, $ua, $from, $to) = @_;
my $json_data;
my $rate;
my $reply = $ua->get($YIN
$json_data = JSON::decode_json $body;
### JSON: $json_data
if ( !$json_data || !$json_data->{'chart'}->{'result'}->[0]->{'meta'}->{'regularMarketPrice'} ) {
return;
}
$rate =
$json_
:Comments';
use HTTP::Request::Common;
use HTML::TreeBuilder;
use Encode qw(decode);
use JSON qw( decode_json );
use utf8;
our $VERSION = '1.67_01'; # TRIAL VERSION
my $Bourso_URL = 'https://www.bo
my $json = JSON::decode_json($div->attr('data-ist-init'));
$date = $json->{'tradeDate'};
$last = $json->{'last'};
$symbol = $json->{'symbol'
= $json->{'low'};
$high = $json->{'high'};
$close = $json->{'previousClose'};
$exchange = $json->{'exchangeCode'};
$volume = $json->{'
e strict;
use warnings;
use constant DEBUG => $ENV{DEBUG};
use if DEBUG, 'Smart::Comments';
use JSON;
our $VERSION = '1.67_01'; # TRIAL VERSION
sub parameters {
return ('API_KEY');
}
sub new
{
l = 'https://www.alphavantage.co/query?function=CURRENCY_EXCHANGE_RATE';
my $try_cnt = 0;
my $json_data;
my $rate;
do {
$try_cnt += 1;
my $reply = $ua->get($url
. '&from_curren
$json_data = JSON::decode_json $body;
if ( !$json_data || $json_data->{'Error Message'} ) {
return;
}
### JSON: $json_data
sleep (20) if (($try_cnt < 5) && ($json_data-
BUG};
use if $DEBUG, 'Smart::Comments';
use HTTP::Request;
use LWP::UserAgent;
use JSON qw( decode_json encode_json );
use String::Util qw(trim);
our $VERSION = '1.67_01'; # TRIAL VERSION
our @labe
"authorization" => "",
"content-type" => "application/json",
"locale" => "en",
"sec-ch-ua" => "\"
h : $url, $reply->code
### reply : $reply->content
my $data = decode_json $reply->content;
if (exists $data->{errors}) {
$info{$symbol, 'errormsg'} = $da