#!/usr/bin/perl -w
Readonly
my
$DEBUG
=>
$ENV
{DEBUG};
use
if
$DEBUG
,
'Smart::Comments'
;
use
JSON
qw( decode_json encode_json )
;
our
$VERSION
=
'1.64_03'
;
our
@labels
=
qw/currency name exchange volume open high low cap close year_range last p_change symbol isodate date/
;
sub
labels {
return
(
tmx
=> \
@labels
);
}
sub
methods {
return
(
tmx
=> \
&tmx
,
tsx
=> \
&tmx
,
canada
=> \
&tmx
);
}
sub
tmx {
my
$quoter
=
shift
;
my
@symbols
=
@_
;
my
$ua
=
$quoter
->user_agent();
my
%info
;
foreach
my
$symbol
(
@symbols
) {
eval
{
my
$header
= [
"accept"
=>
"*/*"
,
"accept-language"
=>
"en-US,en;q=0.9"
,
"authorization"
=>
""
,
"content-type"
=>
"application/json"
,
"locale"
=>
"en"
,
"sec-ch-ua"
=>
"\"Google Chrome\";v=\"87\", \" Not;A Brand\";v=\"99\", \"Chromium\";v=\"87\""
,
"sec-ch-ua-mobile"
=>
"?0"
,
"sec-fetch-dest"
=>
"empty"
,
"sec-fetch-mode"
=>
"cors"
,
"sec-fetch-site"
=>
"same-site"
];
my
$body
=
"{\"operationName\":\"getQuoteBySymbol\",\"variables\":{\"symbol\":\"$symbol\",\"locale\":\"en\"},\"query\":\"query getQuoteBySymbol(\$symbol: String, \$locale: String) {\\n getQuoteBySymbol(symbol: \$symbol, locale: \$locale) {\\n symbol\\n name\\n price\\n percentChange\\n exchangeName\\n volume\\n openPrice\\n dayHigh\\n dayLow\\n MarketCap\\n prevClose\\n weeks52high\\n weeks52low\\n }\\n}\\n\"}"
;
my
$request
= HTTP::Request->new(
'POST'
,
$url
,
$header
,
$body
);
"referrerPolicy"
=>
"strict-origin-when-cross-origin"
,
"mode"
=>
"cors"
);
my
$reply
=
$ua
->request(
$request
);
if
(!
$reply
->is_success) {
$info
{
$symbol
,
'errormsg'
} =
'Failed to connect with TMX website'
;
$info
{
$symbol
,
'success'
} = 0;
return
;
}
my
$data
= decode_json
$reply
->content;
if
(
exists
$data
->{errors}) {
$info
{
$symbol
,
'errormsg'
} =
$data
->{errors}[0]->{message};
$info
{
$symbol
,
'success'
} = 0;
return
;
}
$data
=
$data
->{data}->{getQuoteBySymbol};
if
(
lc
(
$data
->{symbol}) ne
lc
(
$symbol
)) {
$info
{
$symbol
,
'errormsg'
} =
"returned symbol was not correct for $symbol"
;
$info
{
$symbol
,
'success'
} = 0;
return
}
if
(
$symbol
=~ /:us/ix ) {
$info
{
$symbol
,
'currency'
} =
'USD'
; }
else
{
$info
{
$symbol
,
'currency'
} =
'CAD'
}
$info
{
$symbol
,
'name'
} =
$data
->{name};
$info
{
$symbol
,
'exchange'
} =
$data
->{exchangeName};
$info
{
$symbol
,
'volume'
} =
$data
->{volume};
$info
{
$symbol
,
'open'
} =
$data
->{openPrice};
$info
{
$symbol
,
'high'
} =
$data
->{dayHigh};
$info
{
$symbol
,
'low'
} =
$data
->{dayLow};
$info
{
$symbol
,
'cap'
} =
$data
->{MarketCap};
$info
{
$symbol
,
'close'
} =
$data
->{prevClose};
$info
{
$symbol
,
'year_range'
} =
$data
->{weeks52low} .
' - '
.
$data
->{weeks52high};
$info
{
$symbol
,
'last'
} =
$data
->{price};
$info
{
$symbol
,
'symbol'
} =
$data
->{symbol};
$info
{
$symbol
,
'p_change'
} =
$data
->{percentChange};
$quoter
->store_date(\
%info
,
$symbol
, {
today
=> 1});
$info
{
$symbol
,
'success'
} = 1;
};
if
($@) {
my
$error
=
"TMX failed: $@"
;
$info
{
$symbol
,
'success'
} = 0;
$info
{
$symbol
,
'errormsg'
} = trim(
$error
);
}
}
return
wantarray
() ?
%info
: \
%info
;
}
1;