Skip to content

Instantly share code, notes, and snippets.

@bpschuck
Last active May 3, 2024 16:30
Show Gist options
  • Save bpschuck/7c19064bccdf903de0977e59647813c4 to your computer and use it in GitHub Desktop.
Save bpschuck/7c19064bccdf903de0977e59647813c4 to your computer and use it in GitHub Desktop.
FinanceQuote
Gist for Finance::Quote
Test code snippets and other miscellaneous files.
#!/usr/bin/perl -w
# vi: set ts=2 sw=2 ic noai showmode showmatch:
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA
# Copyright (C) 2023, Bruce Schuck <bschuck@asgard-systems.com>
package Finance::Quote::CurrencyRates::YahooJSON;
use strict;
use warnings;
use constant DEBUG => $ENV{DEBUG};
use if DEBUG, 'Smart::Comments';
use JSON;
# VERSION
my $YIND_URL_HEAD = 'https://query2.finance.yahoo.com/v11/finance/quoteSummary/?symbols=';
my $YIND_URL_TAIL = '&modules=price';
my $browser = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36';
sub new
{
my $self = shift;
my $class = ref($self) || $self;
my $this = {};
bless $this, $class;
my $args = shift;
### YahooJSON->new args : $args
return $this;
}
sub multipliers
{
my ($this, $ua, $from, $to) = @_;
my $json_data;
my $rate;
my $cookie_jar = HTTP::Cookies->new();
$ua->cookie_jar( $cookie_jar );
$ua->agent($browser);
# get Yahoo cookies that are needed for crumb
my $reply = $ua->get('https://login.yahoo.com');
# get the crumb that corrosponds to cookies retrieved
$reply = $ua->get('https://query2.finance.yahoo.com/v1/test/getcrumb');
my $crumb = $reply->content;
$reply = $ua->get($YIND_URL_HEAD
. ${from}
. ${to}
. '%3DX'
. '&crumb=' . $crumb
. $YIND_URL_TAIL);
### HTTP Status: $reply->code
return unless ($reply->code == 200);
my $body = $reply->content;
$json_data = JSON::decode_json $body;
### JSON: $json_data
if ( !$json_data || !$json_data->{'quoteSummary'}->{'result'}->[0]->{'price'}->{'regularMarketPrice'}{'raw'} ) {
return;
}
$rate =
$json_data->{'quoteSummary'}->{'result'}->[0]->{'price'}->{'regularMarketPrice'}{'raw'};
### Rate from JSON: $rate
return unless $rate + 0;
# For small rates, request the inverse
if ($rate < 0.001) {
### Rate is too small, requesting inverse : $rate
my ($a, $b) = $this->multipliers($ua, $to, $from);
return ($b, $a);
}
return (1.0, $rate);
}
1;
=head1 NAME
Finance::Quote::CurrencyRates::YahooJSON - Obtain currency rates from
https://query2.finance.yahoo.com/v11/finance/quoteSummary/...?modules=price
=head1 SYNOPSIS
use Finance::Quote;
$q = Finance::Quote->new(currency_rates => {order => ['YahooJSON']});
$value = $q->currency('18.99 EUR', 'USD');
=head1 DESCRIPTION
This module fetches currency rates from
https://query2.finance.yahoo.com/v11/finance/quoteSummary/...?modules=price
provides data to Finance::Quote to convert the first argument to the equivalent
value in the currency indicated by the second argument.
This module is not the default currency conversion module for a Finance::Quote
object.
=head1 Terms & Conditions
Use of https://query2.finance.yahoo.com/v11/finance/quoteSummary/...?modules=price is
governed by any terms & conditions of that site.
Finance::Quote is released under the GNU General Public License, version 2,
which explicitly carries a "No Warranty" clause.
=cut
#!/usr/bin/perl -w
# vi: set ts=2 sw=2 ic noai showmode showmatch:
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA
# Copyright (C) 2023, Bruce Schuck <bschuck@asgard-systems.com>
# Changes:
# 2024-04-13 - Changed to use
# https://query1.finance.yahoo.com/v8/finance/chart/
package Finance::Quote::CurrencyRates::YahooJSON;
use strict;
use warnings;
use constant DEBUG => $ENV{DEBUG};
use if DEBUG, 'Smart::Comments';
use JSON;
# VERSION
my $YIND_URL_HEAD = 'https://query1.finance.yahoo.com/v8/finance/chart/';
my $YIND_URL_TAIL = '?metrics=high&interval=1d&range=1d';
sub new
{
my $self = shift;
my $class = ref($self) || $self;
my $this = {};
bless $this, $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($YIND_URL_HEAD
. ${from}
. ${to}
. '%3DX'
. $YIND_URL_TAIL);
### HTTP Status: $reply->code
return unless ($reply->code == 200);
my $body = $reply->content;
$json_data = JSON::decode_json $body;
### JSON: $json_data
if ( !$json_data || !$json_data->{'chart'}->{'result'}->[0]->{'meta'}->{'regularMarketPrice'} ) {
return;
}
$rate =
$json_data->{'chart'}->{'result'}->[0]->{'meta'}->{'regularMarketPrice'};
### Rate from JSON: $rate
return unless $rate + 0;
# For small rates, request the inverse
if ($rate < 0.001) {
### Rate is too small, requesting inverse : $rate
my ($a, $b) = $this->multipliers($ua, $to, $from);
return ($b, $a);
}
return (1.0, $rate);
}
1;
=head1 NAME
Finance::Quote::CurrencyRates::YahooJSON - Obtain currency rates from
https://query2.finance.yahoo.com/v11/finance/quoteSummary/...?modules=price
=head1 SYNOPSIS
use Finance::Quote;
$q = Finance::Quote->new(currency_rates => {order => ['YahooJSON']});
$value = $q->currency('18.99 EUR', 'USD');
=head1 DESCRIPTION
This module fetches currency rates from
https://query2.finance.yahoo.com/v11/finance/quoteSummary/...?modules=price
provides data to Finance::Quote to convert the first argument to the equivalent
value in the currency indicated by the second argument.
This module is not the default currency conversion module for a Finance::Quote
object.
=head1 Terms & Conditions
Use of https://query2.finance.yahoo.com/v11/finance/quoteSummary/...?modules=price is
governed by any terms & conditions of that site.
Finance::Quote is released under the GNU General Public License, version 2,
which explicitly carries a "No Warranty" clause.
=cut
#!/usr/bin/perl -w
# vi: set ts=2 sw=2 noai ic showmode showmatch:
#
# Copyright (C) 2023, Bruce Schuck <bschuck@asgard-systems.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA
#
package Finance::Quote::FooBar;
use strict;
use warnings;
use Encode qw(decode);
use HTTP::Request::Common;
use constant DEBUG => $ENV{DEBUG};
use if DEBUG, 'Smart::Comments', '###';
# VERSION
my $BVB_URL = 'https://bvb.ro/FinancialInstruments/Details/FinancialInstrumentsDetails.aspx?s=';
sub methods {
return (bvb => \&foobar,
romania => \&foobar,
tradeville => \&foobar,
europe => \&foobar);
}
our @labels = qw/symbol name open high low last bid ask date currency method/;
sub labels {
return (foobar => \@labels,
romania => \@labels,
tradeville => \@labels,
europe => \@labels);
}
sub foobar {
my $quoter = shift;
my @stocks = @_;
my (%info, $tree, $table, $pricetable, $url, $reply);
my $ua = $quoter->user_agent();
foreach my $stock (@stocks) {
$url = $BVB_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 = decode('UTF-8', $reply->content);
### Body: $body
my ($name, $bid, $ask, $last, $open, $high, $low, $date);
$info{ $stock, "symbol" } = $stock;
if ( $code == 200 ) {
# Use HTML::TreeBuilder to parse HTML in $body
$tree = HTML::TreeBuilder->new;
if ($tree->parse($body)) {
$tree->eof;
if ( $tree->look_down(_tag => 'div', id => 'ctl00_body_divNoData') ) {
$info{ $stock, "success" } = 0;
$info{ $stock, "errormsg" } =
"Error retrieving quote for $stock. No data returned";
next;
}
$name = $tree->look_down(_tag => 'h2', class => qr/^mBot0 large textStyled/)->as_text;
$info{ $stock, 'success' } = 1;
($info{ $stock, 'name' } = $name) =~ s/^\s+|\s+$//g ;
$info{ $stock, 'currency' } = 'RON';
$info{ $stock, 'method' } = 'bvb';
$table = $tree->look_down(_tag => 'table', id => qr/^ctl00_body_ctl02_PricesControl_dvCPrices/)->as_HTML;
$pricetable = HTML::TableExtract->new();
$pricetable->parse($table);
foreach my $row ($pricetable->rows) {
if ( @$row[0] =~ m/Ask$/ ) {
($bid, $ask) = @$row[1] =~ m|^\s+([\d\.]+)\s+\/\s+([\d\.]+)|;
$info{ $stock, 'bid' } = $bid;
$info{ $stock, 'ask' } = $ask;
}
elsif ( @$row[0] =~ m|^Date/time| ) {
($date) = @$row[1] =~ m|^([\d/]+)\s|;
$quoter->store_date(\%info, $stock, {usdate => $1}) if $date =~ m|([0-9]{1,2}/[0-9]{2}/[0-9]{4})|;
}
elsif ( @$row[0] =~ m|^Last price| ) {
($last) = @$row[1] =~ m|^([\d\.]+)|;
$info{ $stock, 'last' } = $last;
}
elsif ( @$row[0] =~ m|^Open price| ) {
($open) = @$row[1] =~ m|^([\d\.]+)|;
$info{ $stock, 'open' } = $open;
}
elsif ( @$row[0] =~ m|^High price| ) {
($high) = @$row[1] =~ m|^([\d\.]+)|;
$info{ $stock, 'high' } = $high;
}
elsif ( @$row[0] =~ m|^Low price| ) {
($low) = @$row[1] =~ m|^([\d\.]+)|;
$info{ $stock, 'low' } = $low;
}
}
} else {
$tree->eof;
$info{ $stock, "success" } = 0;
$info{ $stock, "errormsg" } =
"Error retrieving quote for $stock. Could not parse HTML returned from $url.";
}
} else { # HTTP Request failed (code != 200)
$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;
__END__
=head1 NAME
Finance::Quote::FooBar - Obtain quotes from FooBar Stock Exchange.
=head1 SYNOPSIS
use Finance::Quote;
$q = Finance::Quote->new;
%info = $q->fetch("foobar", "tlv"); # Only query foobar
%info = $q->fetch("romania", "brd"); # Failover to other sources OK.
=head1 DESCRIPTION
This module fetches information from L<https://foobar.ro/>.
This module is loaded by default on a Finance::Quote object. It's also possible
to load it explicitly by placing "foobar" in the argument list to
Finance::Quote->new().
This module provides "foobar", "tradeville", "romania", and "europe"
fetch methods. It was written to replace a non-working Tradeville.pm
module.
Information obtained by this module may be covered by Bucharest Stock
Exchange terms and conditions.
=head1 LABELS RETURNED
The following labels are returned:
=over
=item name
=item symbol
=item open
=item high
=item low
=item price
=item bid
=item ask
=item date
=item currency
=back
This file has been truncated, but you can view the full file.
View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

@bpschuck
Copy link
Author

Site with trading hours for multiple markets - https://www.tradinghours.com/markets

@bpschuck
Copy link
Author

To fix Bloomberg.pm, need to figure out how to get the cookies used in this curl command:

curl 'https://www.bloomberg.com/quote/PCAR:US' --compressed -H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' -H 'Accept-Language: en-US,en;q=0.5' -H 'Accept-Encoding: gzip, deflate, br' -H 'Connection: keep-alive' -H 'Cookie: __sppvid=59a3ff1d-6301-49e7-9950-45a0ad1d9040; seen_uk=1; table: 0x7f6b48db19e8; __sppvid=c83e0394-5538-418c-9a35-abaa509996d4; country_code=US; exp_pref=AMER; agent_id=ce9bd7ab-f083-439e-bd94-057c7aa0aed2; session_id=b02e4525-623d-4662-920b-89bf6d0ad908; session_key=bbb458b5d9b7791ece3adede5ea62093474318b9; gatehouse_id=31efd99e-a64b-4151-9d80-a3975ff5643a; geo_info=%7B%22countryCode%22%3A%22US%22%2C%22country%22%3A%22US%22%2C%22cityId%22%3A%225392423%22%2C%22provinceId%22%3A%225332921%22%2C%22field_p%22%3A%22E99644%22%2C%22field_d%22%3A%22comcast.net%22%2C%22field_mi%22%3A12%2C%22field_n%22%3A%22hf%22%2C%22trackingRegion%22%3A%22US%22%2C%22cacheExpiredTime%22%3A1690666074576%2C%22region%22%3A%22US%22%2C%22fieldMI%22%3A12%2C%22fieldN%22%3A%22hf%22%2C%22fieldD%22%3A%22comcast.net%22%2C%22fieldP%22%3A%22E99644%22%7D%7C1690666074576; _reg-csrf-token=HTzQ0IfT-nrFZ1hBN87Gl2L0F8Z_CaYgqUj4; _reg-csrf=s%3A2fjaX9E-MV4WO6wFKnGnzRHA.B%2FQEf8z51RFgYiAs%2BcrTHVP4Uxpbd1IuWDp3UBP1KZ0; _user-data=%7B%22status%22%3A%22anonymous%22%7D; _last-refresh=2023-7-22%2021%3A27; pxcts=9ed35c2f-28d6-11ee-8fbd-5563524b4d6c; _pxvid=9ed34fbb-28d6-11ee-8fbd-721f349f61ab; _pxde=3321f55a32496b4246fcca1046748508597b9c6b696b209ee63b42621bb02959:eyJ0aW1lc3RhbXAiOjE2OTAwNjEzNjcxNTUsImZfa2IiOjAsImlwY19pZCI6W119; geo_info={%22country%22:%22US%22%2C%22region%22:%22US%22%2C%22cityId%22:%225392423%22%2C%22provinceId%22:%225332921%22%2C%22fieldP%22:%22E99644%22%2C%22fieldD%22:%22comcast.net%22%2C%22fieldMI%22:12%2C%22fieldN%22:%22hf%22}|1690666075991; _sp_krux=false; _sp_v1_ss=1:H4sIAAAAAAAAAItWqo5RKimOUbLKK83J0YlRSkVil4AlqmtrlXRGlQ0dZbEAf3mLbNUBAAA%3D; _sp_v1_p=77; _sp_v1_data=585912; _sp_su=false; ccpaUUID=58f20873-0269-4957-b730-591fe7c5f85e; dnsDisplayed=true; ccpaApplies=true; signedLspa=false; bbgconsentstring=req1fun1pad1; _gcl_au=1.1.816872108.1690061277; bdfpc=004.7138066349.1690061276561; _ga_GQ1PBLXZCT=GS1.1.1690061276.1.1.1690061291.0.0.0; _ga=GA1.2.518652684.1690061277; _rdt_uuid=1690061276791.1cb2a473-8e16-4ec5-8cf4-270b339c0e48; _px3=ffd23c83c2738d13d3c4ded180138a4c548cd294c5a7d176442ac56e3237795a:+O8vawzcWlXyNiaCINkgojeRNldhLHSkew4f+DsS8rvX/dBl/X0O5Doley2eLySrf30s/9gse8rW9TLWDWpy9w==:1000:Nw0BOeNFCYatNhMBND/VX6tGu3tJgbU8PAbFr3809PinWfRa+GXeNUgdbIjOz7P5EX5zDBu6V1+LA/qzWJnU6lnuR3s4T+011AJnLAPeULW8IazL1zsT9K/3UufNvdLqfpO2IFCm/j6t9CFrL88FxfApVqjEJU8NKcnS6xGwundhmBLFxs07awrOQYOpny4k89Q2TtW8wdIxPBqcAV7AWQ==; _px2=eyJ1IjoiYTcyOWYwNDAtMjhkNi0xMWVlLThhNzktZWZjODBlODJhYWMwIiwidiI6IjllZDM0ZmJiLTI4ZDYtMTFlZS04ZmJkLTcyMWYzNDlmNjFhYiIsInQiOjE2OTAwNjE1OTAyMTAsImgiOiJiNDJlYzQwMGE4OGI1NWIxNzBmNTY3ZTdiMzU0OWI1OWUyNjY2MWNjZmE3MDZlNjhmYzVmMzA1ODA4MmZmYTVkIn0=; _scid=020faed6-5b32-4a74-92c8-4c1f9a1a94a2; _cc_id=b0a1d53bdc8c780f9435c15ca5818bd5; _cc_cc=ACZ4XmNQSDJINEwxNU5KSbZINrcwSLM0MTZNNjRNTjS1MLRISjFlAIKUPZ6vPv%2F%2F%2F58fxAED6Ydr7kszHopj%2BM%2FIyLDl7B4dGPv1KoT4HyT25pUI8eW3Z4rD1K9djxCftAnBXoOkt611mQFM%2FSYkcxYisT9cnWQIdwMS%2B%2FD0A0ww8dunHrHB2Hc%2FWMKN%2FFMIYz5bPIcFxn4%2FtYcRxj539BAzjH0eSc1hJPaXyw%2F1YWrWdGvBmA3%2FNWHMo2ufcsPYAO2Thdo%3D; _cc_aud=ABR4XmNgYGBI2eP5CkhBABMDa2YRiMmaWQgkAUtIBBU%3D; panoramaId_expiry=1690666090168; panoramaId=55957def679f632c667bd9f6387e4945a7025a7455190abd463ce51edbc5474c; panoramaIdType=panoIndiv; _gid=GA1.2.2011490682.1690061278; __gads=ID=62800114a4ab1277:T=1690061277:RT=1690061277:S=ALNI_MZPufkvkc8ElON02gsLgFGK7SkRTQ; __gpi=UID=000009ab87507766:T=1690061277:RT=1690061277:S=ALNI_MYOPvOsm8LRJo-vRwPolnc1Wnm0bg; _sctr=1%7C1690009200000; ln_or=eyI0MDM1OTMiOiJkIn0%3D; afUserId=866ea76c-7c3a-4021-9d7d-8480040987fb-p; AF_SYNC=1690061279396; _scid_r=020faed6-5b32-4a74-92c8-4c1f9a1a94a2; _uetsid=a041c04028d611eea5f61d6ac28c5401; _uetvid=a041d4a028d611ee9e41ab83f4c04b41; __stripe_mid=919cd9e2-b407-43e8-a094-da0faa3867fd24c3e5; __stripe_sid=b27062c1-1e1e-4ef8-90b0-41d0ac25e963ee0009' -H 'Upgrade-Insecure-Requests: 1' -H 'Sec-Fetch-Dest: document' -H 'Sec-Fetch-Mode: navigate' -H 'Sec-Fetch-Site: none' -H 'Sec-Fetch-User: ?1' -H 'TE: trailers'
# or
curl 'https://www.bloomberg.com/quote/PCAR:US' --compressed \
-H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0' \
-H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' \
-H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate, br' \
-H 'Connection: keep-alive;' \
-H 'Cookie: __sppvid=59a3ff1d-6301-49e7-9950-45a0ad1d9040' \
-H 'Cookie: seen_uk=1' \
-H 'Cookie: table: 0x7f6b48db19e8' \
-H 'Cookie: __sppvid=c83e0394-5538-418c-9a35-abaa509996d4' \
-H 'Cookie: country_code=US' \
-H 'Cookie: exp_pref=AMER' \
-H 'Cookie: agent_id=ce9bd7ab-f083-439e-bd94-057c7aa0aed2' \
-H 'Cookie: session_id=b02e4525-623d-4662-920b-89bf6d0ad908' \
-H 'Cookie: session_key=bbb458b5d9b7791ece3adede5ea62093474318b9' \
-H 'Cookie: gatehouse_id=31efd99e-a64b-4151-9d80-a3975ff5643a' \
-H 'Cookie: geo_info=%7B%22countryCode%22%3A%22US%22%2C%22country%22%3A%22US%22%2C%22cityId%22%3A%225392423%22%2C%22provinceId%22%3A%225332921%22%2C%22field_p%22%3A%22E99644%22%2C%22field_d%22%3A%22comcast.net%22%2C%22field_mi%22%3A12%2C%22field_n%22%3A%22hf%22%2C%22trackingRegion%22%3A%22US%22%2C%22cacheExpiredTime%22%3A1690666074576%2C%22region%22%3A%22US%22%2C%22fieldMI%22%3A12%2C%22fieldN%22%3A%22hf%22%2C%22fieldD%22%3A%22comcast.net%22%2C%22fieldP%22%3A%22E99644%22%7D%7C1690666074576' \
-H 'Cookie: _reg-csrf-token=HTzQ0IfT-nrFZ1hBN87Gl2L0F8Z_CaYgqUj4' \
-H 'Cookie: _reg-csrf=s%3A2fjaX9E-MV4WO6wFKnGnzRHA.B%2FQEf8z51RFgYiAs%2BcrTHVP4Uxpbd1IuWDp3UBP1KZ0' \
-H 'Cookie: _user-data=%7B%22status%22%3A%22anonymous%22%7D' \
-H 'Cookie: _last-refresh=2023-7-22%2021%3A27' \
-H 'Cookie: pxcts=9ed35c2f-28d6-11ee-8fbd-5563524b4d6c' \
-H 'Cookie: _pxvid=9ed34fbb-28d6-11ee-8fbd-721f349f61ab' \
-H 'Cookie: _pxde=3321f55a32496b4246fcca1046748508597b9c6b696b209ee63b42621bb02959:eyJ0aW1lc3RhbXAiOjE2OTAwNjEzNjcxNTUsImZfa2IiOjAsImlwY19pZCI6W119' \
-H 'Cookie: geo_info={%22country%22:%22US%22%2C%22region%22:%22US%22%2C%22cityId%22:%225392423%22%2C%22provinceId%22:%225332921%22%2C%22fieldP%22:%22E99644%22%2C%22fieldD%22:%22comcast.net%22%2C%22fieldMI%22:12%2C%22fieldN%22:%22hf%22}|1690666075991' \
-H 'Cookie: _sp_krux=false' \
-H 'Cookie: _sp_v1_ss=1:H4sIAAAAAAAAAItWqo5RKimOUbLKK83J0YlRSkVil4AlqmtrlXRGlQ0dZbEAf3mLbNUBAAA%3D' \
-H 'Cookie: _sp_v1_p=77' \
-H 'Cookie: _sp_v1_data=585912' \
-H 'Cookie: _sp_su=false' \
-H 'Cookie: ccpaUUID=58f20873-0269-4957-b730-591fe7c5f85e' \
-H 'Cookie: dnsDisplayed=true' \
-H 'Cookie: ccpaApplies=true' \
-H 'Cookie: signedLspa=false' \
-H 'Cookie: bbgconsentstring=req1fun1pad1' \
-H 'Cookie: _gcl_au=1.1.816872108.1690061277' \
-H 'Cookie: bdfpc=004.7138066349.1690061276561' \
-H 'Cookie: _ga_GQ1PBLXZCT=GS1.1.1690061276.1.1.1690061291.0.0.0' \
-H 'Cookie: _ga=GA1.2.518652684.1690061277' \
-H 'Cookie: _rdt_uuid=1690061276791.1cb2a473-8e16-4ec5-8cf4-270b339c0e48' \
-H 'Cookie: _px3=ffd23c83c2738d13d3c4ded180138a4c548cd294c5a7d176442ac56e3237795a:+O8vawzcWlXyNiaCINkgojeRNldhLHSkew4f+DsS8rvX/dBl/X0O5Doley2eLySrf30s/9gse8rW9TLWDWpy9w==:1000:Nw0BOeNFCYatNhMBND/VX6tGu3tJgbU8PAbFr3809PinWfRa+GXeNUgdbIjOz7P5EX5zDBu6V1+LA/qzWJnU6lnuR3s4T+011AJnLAPeULW8IazL1zsT9K/3UufNvdLqfpO2IFCm/j6t9CFrL88FxfApVqjEJU8NKcnS6xGwundhmBLFxs07awrOQYOpny4k89Q2TtW8wdIxPBqcAV7AWQ==' \
-H 'Cookie: _px2=eyJ1IjoiYTcyOWYwNDAtMjhkNi0xMWVlLThhNzktZWZjODBlODJhYWMwIiwidiI6IjllZDM0ZmJiLTI4ZDYtMTFlZS04ZmJkLTcyMWYzNDlmNjFhYiIsInQiOjE2OTAwNjE1OTAyMTAsImgiOiJiNDJlYzQwMGE4OGI1NWIxNzBmNTY3ZTdiMzU0OWI1OWUyNjY2MWNjZmE3MDZlNjhmYzVmMzA1ODA4MmZmYTVkIn0=' \
-H 'Cookie: _scid=020faed6-5b32-4a74-92c8-4c1f9a1a94a2' \
-H 'Cookie: _cc_id=b0a1d53bdc8c780f9435c15ca5818bd5' \
-H 'Cookie: _cc_cc=ACZ4XmNQSDJINEwxNU5KSbZINrcwSLM0MTZNNjRNTjS1MLRISjFlAIKUPZ6vPv%2F%2F%2F58fxAED6Ydr7kszHopj%2BM%2FIyLDl7B4dGPv1KoT4HyT25pUI8eW3Z4rD1K9djxCftAnBXoOkt611mQFM%2FSYkcxYisT9cnWQIdwMS%2B%2FD0A0ww8dunHrHB2Hc%2FWMKN%2FFMIYz5bPIcFxn4%2FtYcRxj539BAzjH0eSc1hJPaXyw%2F1YWrWdGvBmA3%2FNWHMo2ufcsPYAO2Thdo%3D' \
-H 'Cookie: _cc_aud=ABR4XmNgYGBI2eP5CkhBABMDa2YRiMmaWQgkAUtIBBU%3D' \
-H 'Cookie: panoramaId_expiry=1690666090168' \
-H 'Cookie: panoramaId=55957def679f632c667bd9f6387e4945a7025a7455190abd463ce51edbc5474c' \
-H 'Cookie: panoramaIdType=panoIndiv' \
-H 'Cookie: _gid=GA1.2.2011490682.1690061278' \
-H 'Cookie: __gads=ID=62800114a4ab1277:T=1690061277:RT=1690061277:S=ALNI_MZPufkvkc8ElON02gsLgFGK7SkRTQ' \
-H 'Cookie: __gpi=UID=000009ab87507766:T=1690061277:RT=1690061277:S=ALNI_MYOPvOsm8LRJo-vRwPolnc1Wnm0bg' \
-H 'Cookie: _sctr=1%7C1690009200000' \
-H 'Cookie: ln_or=eyI0MDM1OTMiOiJkIn0%3D' \
-H 'Cookie: afUserId=866ea76c-7c3a-4021-9d7d-8480040987fb-p' \
-H 'Cookie: AF_SYNC=1690061279396' \
-H 'Cookie: _scid_r=020faed6-5b32-4a74-92c8-4c1f9a1a94a2' \
-H 'Cookie: _uetsid=a041c04028d611eea5f61d6ac28c5401' \
-H 'Cookie: _uetvid=a041d4a028d611ee9e41ab83f4c04b41' \
-H 'Cookie: __stripe_mid=919cd9e2-b407-43e8-a094-da0faa3867fd24c3e5' \
-H 'Cookie: __stripe_sid=b27062c1-1e1e-4ef8-90b0-41d0ac25e963ee0009' \
-H 'Upgrade-Insecure-Requests: 1' \
-H 'Sec-Fetch-Dest: document' \
-H 'Sec-Fetch-Mode: navigate' \
-H 'Sec-Fetch-Site: none' \
-H 'Sec-Fetch-User: ?1' \
-H 'TE: trailers'

The bloomberg-session.chls CharlesProxy capture may contain helpful information for this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment