App-Chart

 view release on metacpan or  search on metacpan

misc/t-yahoo.pl  view on Meta::CPAN

}
{
  # v1 info parse
  my $filename = "$ENV{HOME}/chart/samples/yahoo/v1-info-CSCO.json";
  $filename = "$ENV{HOME}/chart/samples/yahoo/v1-info-ORD.AX.json";
  $filename =~ /v1-info-([A-Z.]+)\.json/ or die;
  my $symbol = $1;
  require HTTP::Response;
  my $resp = HTTP::Response->new(200,'OK');
  $resp->content(slurp($filename));
  $resp->content_type('application/json;charset=utf-8');
  my $h = App::Chart::Yahoo::info_parse ($symbol,$resp);
  print Dumper ($h);
#  App::Chart::Download::write_daily_group ($h);
  exit 0;
}

{
  # v8 parse

  my $filename = "$ENV{HOME}/chart/samples/yahoo/TSCO.L-2017.json";
  $filename = "$ENV{HOME}/chart/samples/yahoo/SCT.AX-split2024.json";
  $filename = "$ENV{HOME}/chart/samples/yahoo/BHP.AX-2024div.json";
  $filename = "$ENV{HOME}/chart/samples/yahoo/NKLA.MX-split.json";
  $filename =~ m{.*/(.*)-} or die;
  my $symbol = $1;
  my $content = slurp ($filename);
  require JSON;
  my $href = JSON::decode_json($content);
  #  ### $href
  my $result = $href->{'chart'}->{'result'}->[0];
  my $meta = $result->{'meta'};
  my $timestamps = $result->{'timestamp'};
  my $quote= $result->{'indicators'}->{'quote'}->[0];
  my $events = $result->{'events'};
  my $dividends = $events->{'dividends'};
  my $splits = $events->{'splits'};
  ### $meta
  ### $quote
  ### $timestamps
  ### $events
  # symbol
  # priceHint
  # exchangeName
  # currency
  # gmtoffset

  require HTTP::Response;
  my $resp = HTTP::Response->new();
  $resp->content($content);
  my $h = App::Chart::Yahoo::daily_parse ($symbol, $resp);
  App::Chart::Download::crunch_h ($h);
  print Dumper(\$h);
  exit 0;
}
{
  # cookie
  # cf Finance::Quote::YahooJSON

  # https://www.yahoo.com/
  # Set-Cookie: RRC=st=1725958300186.3&cnt=1; path=/; domain=.www.yahoo.com; HttpOnly
  # Redirect to https://au.yahoo.com/?p=us
  #
  # https://finance.yahoo.com/quote/IBM/history/?p=IBM
  # no cookie

  my $url = 'https://www.yahoo.com/';
  $url = 'https://finance.yahoo.com';
  $url = 'https://finance.yahoo.com/quote/IBM/history/?p=IBM';

  $App::Chart::option{'verbose'} = 2;
  require HTTP::Cookies;
  my $jar = HTTP::Cookies->new;
  my $user_agent = 'Mozilla/5.0';
  my $resp = App::Chart::Download->get
    ($url,
     user_agent => $user_agent,
     cookie_jar => $jar,
     redirect_ok => 0);
  ### headers: $resp->headers->as_string
  print "jar string: ",$jar->as_string,"\n";
  print "content:\n";
  my $content = $resp->decoded_content (raise_error => 1, charset => 'none');
  print $content,"\n";
  exit 0;
}
{
  $App::Chart::option{'verbose'} = 2;
  my $h = App::Chart::Yahoo::cookie_and_crumb_data();
  print Dumper($h);
  exit 0;
}

{
  # v8 dividends ahead
  # https://www.intelligentinvestor.com.au/investment-tools/shares/dividends
  # https://query2.finance.yahoo.com/v8/finance/chart/IBM?formatted=true&lang=en-US&region=US&period1=1487372400&period2=1495058400&interval=1d&events=div%7Csplit&corsDomain=finance.yahoo.com

  my $symbol = 'NKLA.MX';
  $symbol = 'WBCPK.AX';
  my $tdate = App::Chart::Yahoo::daily_available_tdate ($symbol);
  my $lo_timet = App::Chart::Yahoo::tdate_to_unix($tdate - 30);
  my $hi_timet = App::Chart::Yahoo::tdate_to_unix($tdate + 100);

  my $url = "https://query1.finance.yahoo.com/v8/finance/chart/"
    . URI::Escape::uri_escape($symbol)
    ."?period1=$lo_timet"
    ."&period2=$hi_timet"
    ."&interval=1d"
    ."&events=". URI::Escape::uri_escape('div|split')
    ."&close=unadjusted";
  print "$url\n";

  require App::Chart::UserAgent;
  my $ua = App::Chart::UserAgent->instance;
  my $resp = $ua->get($url);

  my $content = $resp->decoded_content (raise_error => 1, charset => 'none');
  File::Slurp::write_file('/tmp/z', {err_mode=>'carp'}, $content);
  $content = $resp->decoded_content (raise_error => 1);
  print $content;

  exit 0;
}
{
  # v8 dates, as of June 2024
  my $t = 1504013400;  # IBM
  my $tz = "America/New_York";
  my $gmtoff = -14400;

  $t = 1504051200;  # BHP.AX
  $tz = "Australia/Sydney";
  $gmtoff = 36000;

misc/t-yahoo.pl  view on Meta::CPAN

              prefer_decimals => 2,
              date_format   => 'ymd',
            };
    App::Chart::Yahoo::daily_parse
        ($symbol, $resp, $h, App::Chart::ymd_to_tdate_floor(2017,9,7));
    print Dumper(\$h);
    exit 0;

    # (chart-quote "NAB.AX")
    # (chart-latest "NAB.AX" 'last)
  }
{
  # latest_parse() for quotes

  my $symbol = 'NAB.AX';
  my $filename = "$ENV{HOME}/chart/samples/yahoo/daily.csv";
  require HTTP::Response;
  my $resp = HTTP::Response->new();
  my $content = slurp ($filename);
  $resp->content($content);
  $resp->content_type('text/html; charset=utf-8');
  my $h = App::Chart::Yahoo::latest_parse
    ($symbol, $resp, App::Chart::ymd_to_tdate_floor(2017,9,1));
  print Dumper(\$h);
  # App::Chart::Download::write_latest_group ($h);
  exit 0;

  # (chart-quote "NAB.AX")
  # (chart-latest "NAB.AX" 'last)
}

{
  # 13:30
  # -offset is 17:30
  # +offset is  9:30
  my $offset = -14400;
  print POSIX::asctime(POSIX::gmtime(1504099800 + $offset));
  print POSIX::asctime(POSIX::gmtime(1504272600 + $offset));

  # 14:32
  # +offset is 14:32
  $offset = 36000;
  print POSIX::asctime(POSIX::gmtime(1504845136 + $offset));
  exit 0;
}

{
  # kill the crumb
  App::Chart::Database->write_extra ('', 'yahoo-daily-cookies', undef);
  exit;
}


{
  # cf
  # https://gist.github.com/Mister-Meeseeks/df985c5e3abb1be88004319f11ebe3fb/raw/a6541d2a7cda6376ad0fc20fecd3388c7ada49ca/pullYahoo.sh
  #
  # "CrumbStore":{"crumb":"pwrULw9Alv\u002F"}

  require File::Slurp;
  require HTTP::Cookies;
  require App::Chart::UserAgent;

  my $symbol = 'GXY.AX';
  my $ua = App::Chart::UserAgent->instance;
  my $jar = HTTP::Cookies->new;
  $ua->cookie_jar ($jar);

  $ua->add_handler (request_send => sub {
                      my ($request, $ua, $headers) = @_;
                      print $request->method," ",$request->uri,"\n";
                      print $request->headers->as_string,"\n";
                      return;
                    });

  my $crumb;
  if (0) {
    my $url = "https://finance.yahoo.com/quote/$symbol/history?p=$symbol";
    my $resp = $ua->get($url);
    my $resp_size = length($resp->as_string);
    print "size $resp_size\n";
    print $resp->status_line,"\n";
    print $resp->headers->as_string;
    my $content = $resp->decoded_content (raise_error => 1, charset => 'none');
    File::Slurp::write_file('/tmp/x', {err_mode=>'carp'}, $content);
    $content = $resp->decoded_content (raise_error => 1);
    $content =~ /"CrumbStore":\{"crumb":"([^"]*)"}/;
    $crumb = $1;
    print "crumb raw     $crumb\n";
    $crumb = App::Chart::Yahoo::javascript_string_unquote($crumb);
    $jar->save('/tmp/cookie3.txt');
  } else {
    $crumb = 'GmF7zbT8OWV';
    $jar->load('/tmp/cookie3.txt');
  }
  print "crumb decoded $crumb\n";
  print "cookies\n";
  print $jar->as_string;
  print "\n";

  my $events;
  $events = 'history';
  $events = 'div';
  $events = 'split,history';

  print "now CSV\n";
  print "\n";
  my $end   = time();
  my $start = $end - 86400*5;
  my $url = "https://query1.finance.yahoo.com/v7/finance/download/$symbol?period1=$start&period2=$end&interval=1d&events=$events&crumb=$crumb";
  print "$url\n";
  my $resp = $ua->get($url);
  print "\n";

  my $resp_size = length($resp->as_string);
  print "size $resp_size\n";
  print $resp->status_line,"\n";
  print $resp->headers->as_string;
  my $content = $resp->decoded_content (raise_error => 1, charset => 'none');
  File::Slurp::write_file('/tmp/y', {err_mode=>'carp'}, $content);
  $content = $resp->decoded_content (raise_error => 1);
  print $content;

  exit 0;
}
{



( run in 0.524 second using v1.01-cache-2.11-cpan-39bf76dae61 )