#!/usr/bin/perl -w
use
if
DEBUG,
'Smart::Comments'
,
'###'
;
our
$VERSION
=
'1.64_02'
;
our
$DISPLAY
=
'Stooq - Warsaw Stock Exchange'
;
our
@LABELS
=
qw/symbol name open high low last bid ask date currency method/
;
our
$METHODHASH
= {
subroutine
=> \
&stooq
,
display
=>
$DISPLAY
,
labels
=> \
@LABELS
};
sub
methodinfo {
return
(
stooq
=>
$METHODHASH
,
europe
=>
$METHODHASH
,
poland
=>
$METHODHASH
,
);
}
sub
labels {
my
%m
= methodinfo();
return
map
{
$_
=> [@{
$m
{
$_
}{labels}}] }
keys
%m
; }
sub
methods {
my
%m
= methodinfo();
return
map
{
$_
=>
$m
{
$_
}{subroutine} }
keys
%m
;
}
my
%currencies_by_link
= (
'?i=21'
=>
"EUR"
,
'?i=23'
=>
"GBP"
,
'?i=25'
=>
"HKD"
,
'?i=30'
=>
"HUF"
,
'?i=39'
=>
"JPY"
,
'?i=60'
=>
"PLN"
,
'?i=77'
=>
"USD"
,
);
my
%currencies_by_symbol
= (
'£'
=>
"GBP"
,
'p.'
=>
"GBX"
,
'€'
=>
"EUR"
,
"z\x{142}"
=>
"PLN"
,
'$'
=>
"USD"
,
'¢'
=>
"USX"
,
'HK$'
=>
"HKD"
,
'¥'
=>
"JPY"
,
'Ft'
=>
"HUF"
,
);
sub
stooq {
my
$quoter
=
shift
;
my
@stocks
=
@_
;
my
(
%info
,
$tree
,
$table
,
$pricetable
,
$url
,
$reply
);
my
$cj
= HTTP::CookieJar::LWP->new;
my
$ua
=
$quoter
->user_agent();
$ua
->cookie_jar(
$cj
);
$ua
->default_header(
'Accept-Encoding'
=>
'deflate'
);
$ua
->default_header(
'Accept-Language'
=>
'en-US,en;q=0.5'
);
foreach
my
$stock
(
@stocks
) {
$url
=
$STOOQ_URL
.
$stock
;
$reply
=
$ua
->request( GET
$url
);
my
$code
=
$reply
->code;
my
$desc
= HTTP::Status::status_message(
$code
);
my
$headers
=
$reply
->headers_as_string;
my
$body
=
$reply
->decoded_content;
my
(
$name
,
$bid
,
$ask
,
$last
,
$open
,
$high
,
$low
,
$date
,
$currency
);
my
(
$te
,
$table
);
$info
{
$stock
,
"symbol"
} =
$stock
;
if
(
$code
== 200 ) {
$te
= HTML::TableExtract->new(
attribs
=> {
bgcolor
=>
'e9e9e9'
,
style
=>
'z-index:1'
} );
if
((
$te
->parse(
$body
)) && (
$table
=
$te
->first_table_found)) {
(
$name
) =
$table
->cell(0,1) =~ m|^.*?(\w.*)$|;
$te
->
eof
;
}
$te
= HTML::TableExtract->new(
keep_html
=> 1,
attribs
=> {
id
=>
't1'
} );
if
((
$te
->parse(
$body
)) && (
$table
=
$te
->first_table_found)) {
(
my
$last
) =
$table
->cell(0,0) =~ m|^.+>([\d\.]+)<|;
(
my
$currlink
) =
$table
->cell(0,0) =~ m|<a href=t/(\?i=\d+)>|;
if
( (
$currlink
) && (
$currencies_by_link
{
$currlink
}) ) {
$currency
=
$currencies_by_link
{
$currlink
};
}
else
{
(
my
$currsymbol
) =
$table
->cell(0,0)
=~ m
if
( (
$currsymbol
) && (
$currencies_by_symbol
{
$currsymbol
}) ) {
$currency
=
$currencies_by_symbol
{
$currsymbol
};
}
}
(
my
$date
) =
$table
->cell(0,1) =~ m|Date.+>(\d{4}-\d{2}-\d{2})<|;
(
my
$high
,
my
$low
) =
$table
->cell(1,1)
=~ m|.+>([\d\.]+)<.+>([\d\.]+)<|;
(
my
$open
) =
$table
->cell(3,0) =~ m|Open.+>([\d\.]+)<|;
(
my
$bid
) =
$table
->cell(4,0) =~ m|Bid.+>([\d\.]+)<|;
(
my
$ask
) =
$table
->cell(4,1) =~ m|Ask.+>([\d\.]+)<|;
if
( (
$last
) && (
$date
) && (
$currency
) ) {
$info
{
$stock
,
'success'
} = 1;
$info
{
$stock
,
'method'
} =
'stooq'
;
$info
{
$stock
,
'name'
} =
$name
;
$info
{
$stock
,
'last'
} =
$last
;
$info
{
$stock
,
'currency'
} =
$currency
;
$info
{
$stock
,
'open'
} =
$open
;
$info
{
$stock
,
'high'
} =
$high
;
$info
{
$stock
,
'low'
} =
$low
;
$info
{
$stock
,
'bid'
} =
$bid
if
(
$bid
);
$info
{
$stock
,
'ask'
} =
$ask
if
(
$ask
);
$quoter
->store_date(\
%info
,
$stock
, {
isodate
=>
$date
});
if
( (
$currency
eq
'GBX'
) || (
$currency
eq
'USX'
) ) {
foreach
my
$field
(
$quoter
->default_currency_fields ) {
next
unless
(
$info
{
$stock
,
$field
} );
$info
{
$stock
,
$field
} =
$quoter
->scale_field(
$info
{
$stock
,
$field
}, 0.01 );
}
if
(
$info
{
$stock
,
'currency'
} eq
'GBX'
) {
$info
{
$stock
,
'currency'
} =
'GBP'
;
}
else
{
$info
{
$stock
,
'currency'
} =
'USD'
;
}
}
}
else
{
$info
{
$stock
,
"success"
} = 0;
$info
{
$stock
,
"errormsg"
} =
"Error retrieving quote for $stock. Could not parse HTML returned from $url."
;
}
}
else
{
$te
->
eof
;
$info
{
$stock
,
"success"
} = 0;
$info
{
$stock
,
"errormsg"
} =
"Error retrieving quote for $stock. Could not parse HTML returned from $url."
;
}
}
else
{
$info
{
$stock
,
"success"
} = 0;
$info
{
$stock
,
"errormsg"
} =
"Error retrieving quote for $stock. Attempt to fetch the URL $url resulted in HTTP response $code ($desc)"
;
}
}
return
wantarray
() ?
%info
: \
%info
;
return
\
%info
;
}
1;