#!/usr/bin/perl -w
require
5.005;
our
$VERSION
=
'1.55'
;
my
$DEBUG
= 0;
our
@totalqueries
=();
my
$maxQueries
= {
quantity
=> 3,
seconds
=> 10};
sub
methods {
return
(
canadamutual
=> \
&fundata
,
fundata
=> \
&fundata
);
}
sub
labels {
my
@labels
=
qw/method source name symbol currency date isodate nav/
;
return
(
canadamutual
=> \
@labels
,
fundata
=> \
@labels
);
}
sub
sleep_before_query {
my
$q
=
$maxQueries
->{quantity}-1;
if
(
$#totalqueries
>=
$q
) {
my
$time_since_x_queries
=
time
()-
$totalqueries
[
$q
];
print
STDERR
"LAST QUERY $time_since_x_queries\n"
if
$DEBUG
;
if
(
$time_since_x_queries
<
$maxQueries
->{seconds}) {
my
$sleeptime
= (
$maxQueries
->{seconds} -
$time_since_x_queries
) ;
print
STDERR
"SLEEP $sleeptime\n"
if
$DEBUG
;
sleep
(
$sleeptime
);
print
STDERR
"CONTINUE\n"
if
$DEBUG
;
}
}
unshift
@totalqueries
,
time
();
pop
@totalqueries
while
$#totalqueries
>
$q
; # remove unnecessary data
}
sub
fundata {
my
$quoter
=
shift
;
my
@symbols
=
@_
;
my
%info
;
return
unless
@symbols
;
my
$ua
=
$quoter
->user_agent;
foreach
my
$symbol
(
@symbols
) {
my
(
$day_high
,
$day_low
,
$year_high
,
$year_low
);
$info
{
$symbol
,
"success"
} = 0;
$info
{
$symbol
,
"symbol"
} =
$symbol
;
$info
{
$symbol
,
"method"
} =
"fundata"
;
$info
{
$symbol
,
"source"
} =
$FUNDATA_MAINURL
;
$info
{
$symbol
,
"timezone"
} =
"EST"
;
my
$url
=
$FUNDATA_URL
.
$symbol
;
print
$url
.
"\n"
if
(
$DEBUG
);
my
$reply
=
$ua
->request(GET
$url
);
my
$code
=
$reply
->code;
my
$desc
= HTTP::Status::status_message(
$code
);
my
$body
=
$reply
->content;
if
(!
$reply
->is_success) {
$info
{
$symbol
,
"errormsg"
} =
"Error contacting URL"
;
next
;
}
my
$parser
= HTML::TokeParser::Simple->new(
string
=>
$reply
->content);
my
$nav
= 0;
while
(
my
$h1
=
$parser
->get_tag(
'h1'
)) {
my
$class
=
$h1
->get_attr(
'class'
);
if
(
$class
eq
"SnapshotHeader"
) {
my
$name
=
$parser
->get_trimmed_text(
'/h1'
);
print
$name
if
$DEBUG
;
$info
{
$symbol
,
"name"
} =
$name
;
}
}
$parser
= HTML::TokeParser::Simple->new(
string
=>
$reply
->content);
while
(
my
$span
=
$parser
->get_tag(
'span'
)) {
my
$class
=
$span
->get_attr(
'class'
);
my
$id
=
$span
->get_attr(
'id'
);
if
(
defined
$id
and
$id
eq
"ctl00_MainContent_lblNavpsDate"
) {
my
$rawline
=
$parser
->get_trimmed_text(
'/span'
);
print
$rawline
.
"\n"
if
(
$DEBUG
);
if
(
$rawline
=~ m/(\d+)\/(\d+)\/(\d\d\d\d)/) {
my
$month
= $1;
my
$day
= $2;
my
$year
= $3;
print
$month
.
" "
.
$day
.
" "
.
$year
if
(
$DEBUG
);
$quoter
->store_date(\
%info
,
$symbol
, {
month
=>
$month
,
day
=>
$day
,
year
=>
$year
});
}
}
if
(
defined
$id
and
$id
eq
"ctl00_MainContent_txtNavps"
) {
$nav
=
$parser
->get_trimmed_text(
'/span'
);
$nav
=~ s/\$//g;
print
$nav
if
(
$DEBUG
);
$info
{
$symbol
,
"nav"
} =
$nav
;
$info
{
$symbol
,
"success"
} = 1;
}
print
"\n"
if
(
$DEBUG
);
}
if
(
$nav
== 0) {
$info
{
$symbol
,
"success"
} = 0;
$info
{
$symbol
,
"errormsg"
} =
"Cannot parse quote data"
;
next
;
}
$info
{
$symbol
,
"success"
} = 1;
$info
{
$symbol
,
"currency"
} =
"CAD"
;
sleep_before_query();
}
return
wantarray
() ?
%info
: \
%info
;
}
1;