google-finance-ruby-client 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +47 -13
- data/CHANGELOG.md +4 -0
- data/README.md +52 -2
- data/lib/google-finance-ruby-client.rb +3 -1
- data/lib/google-finance/api.rb +2 -0
- data/lib/google-finance/api/get_prices.rb +46 -0
- data/lib/google-finance/api/index.rb +26 -0
- data/lib/google-finance/price.rb +13 -0
- data/lib/google-finance/prices.rb +97 -0
- data/lib/google-finance/quote.rb +1 -1
- data/lib/google-finance/quotes.rb +1 -1
- data/lib/google-finance/version.rb +1 -1
- data/spec/fixtures/google-finance/get_prices_goog_with_few_fields.yml +82 -0
- data/spec/fixtures/google-finance/get_prices_goog_with_options.yml +1818 -0
- data/spec/fixtures/google-finance/get_prices_invalid.yml +60 -0
- data/spec/fixtures/google-finance/get_prices_msft.yml +82 -0
- data/spec/google-finance/prices_spec.rb +87 -0
- metadata +17 -3
- data/lib/google-finance/resources.rb +0 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 463be825564f209ff8cec24ec5578bd4d9bdfcf2
|
4
|
+
data.tar.gz: aa5cf58b7ddbcf96b4e54c60c5a6ed08acc8840b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e062d6d86755af3769280155d65d81207417511a96d0cc19c6fe9c0252635c166a7d9ae91c8fb1bc31156115906d967d88e26b0f4948a4825c094fbf8449131e
|
7
|
+
data.tar.gz: 3a16a1a953473207ee55ce8149aeac605797d8af54013fb252094be6b1dc834c4c9a810fbeca6f5c257c34eeba0dc2483b1ccd2081901e00bcc0767c91087dd5
|
data/.rubocop_todo.yml
CHANGED
@@ -1,39 +1,61 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on 2017-12-
|
3
|
+
# on 2017-12-28 15:14:15 -0500 using RuboCop version 0.51.0.
|
4
4
|
# The point is for the user to remove these configuration records
|
5
5
|
# one by one as the offenses are removed from the code base.
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
7
7
|
# versions of RuboCop, may require this file to be generated again.
|
8
8
|
|
9
|
+
# Offense count: 8
|
10
|
+
Lint/AmbiguousOperator:
|
11
|
+
Exclude:
|
12
|
+
- 'spec/google-finance/prices_spec.rb'
|
13
|
+
|
9
14
|
# Offense count: 1
|
10
15
|
Lint/AmbiguousRegexpLiteral:
|
11
16
|
Exclude:
|
12
17
|
- 'lib/google-finance/faraday_middleware/preprocessor.rb'
|
13
18
|
|
14
|
-
# Offense count:
|
19
|
+
# Offense count: 1
|
20
|
+
# Cop supports --auto-correct.
|
21
|
+
# Configuration parameters: EnforcedStyleAlignWith, SupportedStylesAlignWith, AutoCorrect.
|
22
|
+
# SupportedStylesAlignWith: keyword, variable, start_of_line
|
23
|
+
Lint/EndAlignment:
|
24
|
+
Exclude:
|
25
|
+
- 'lib/google-finance/prices.rb'
|
26
|
+
|
27
|
+
# Offense count: 3
|
15
28
|
Metrics/AbcSize:
|
16
|
-
Max:
|
29
|
+
Max: 77
|
17
30
|
|
18
|
-
# Offense count:
|
31
|
+
# Offense count: 5
|
19
32
|
# Configuration parameters: CountComments, ExcludedMethods.
|
20
33
|
Metrics/BlockLength:
|
21
|
-
Max:
|
34
|
+
Max: 83
|
35
|
+
|
36
|
+
# Offense count: 1
|
37
|
+
# Configuration parameters: CountBlocks.
|
38
|
+
Metrics/BlockNesting:
|
39
|
+
Max: 4
|
22
40
|
|
23
|
-
# Offense count:
|
41
|
+
# Offense count: 1
|
42
|
+
Metrics/CyclomaticComplexity:
|
43
|
+
Max: 29
|
44
|
+
|
45
|
+
# Offense count: 26
|
24
46
|
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
|
25
47
|
# URISchemes: http, https
|
26
48
|
Metrics/LineLength:
|
27
|
-
Max:
|
49
|
+
Max: 153
|
28
50
|
|
29
|
-
# Offense count:
|
51
|
+
# Offense count: 4
|
30
52
|
# Configuration parameters: CountComments.
|
31
53
|
Metrics/MethodLength:
|
32
|
-
Max:
|
54
|
+
Max: 77
|
33
55
|
|
34
|
-
# Offense count:
|
56
|
+
# Offense count: 2
|
35
57
|
Metrics/PerceivedComplexity:
|
36
|
-
Max:
|
58
|
+
Max: 18
|
37
59
|
|
38
60
|
# Offense count: 1
|
39
61
|
# Configuration parameters: ExpectMatchingDefinition, Regex, IgnoreExecutableScripts, AllowedAcronyms.
|
@@ -42,17 +64,20 @@ Naming/FileName:
|
|
42
64
|
Exclude:
|
43
65
|
- 'lib/google-finance-ruby-client.rb'
|
44
66
|
|
45
|
-
# Offense count:
|
67
|
+
# Offense count: 9
|
46
68
|
Style/Documentation:
|
47
69
|
Exclude:
|
48
70
|
- 'spec/**/*'
|
49
71
|
- 'test/**/*'
|
72
|
+
- 'lib/google-finance/api/get_prices.rb'
|
73
|
+
- 'lib/google-finance/api/index.rb'
|
50
74
|
- 'lib/google-finance/errors/symbol_not_found_error.rb'
|
51
75
|
- 'lib/google-finance/errors/symbols_not_found_error.rb'
|
52
76
|
- 'lib/google-finance/faraday_middleware/preprocessor.rb'
|
77
|
+
- 'lib/google-finance/price.rb'
|
78
|
+
- 'lib/google-finance/prices.rb'
|
53
79
|
- 'lib/google-finance/quote.rb'
|
54
80
|
- 'lib/google-finance/quotes.rb'
|
55
|
-
- 'lib/google-finance/resources.rb'
|
56
81
|
|
57
82
|
# Offense count: 1
|
58
83
|
# Configuration parameters: MinBodyLength.
|
@@ -60,6 +85,15 @@ Style/GuardClause:
|
|
60
85
|
Exclude:
|
61
86
|
- 'lib/google-finance/quote.rb'
|
62
87
|
|
88
|
+
# Offense count: 1
|
89
|
+
# Cop supports --auto-correct.
|
90
|
+
# Configuration parameters: AutoCorrect, EnforcedStyle, SupportedStyles.
|
91
|
+
# SupportedStyles: predicate, comparison
|
92
|
+
Style/NumericPredicate:
|
93
|
+
Exclude:
|
94
|
+
- 'spec/**/*'
|
95
|
+
- 'lib/google-finance/prices.rb'
|
96
|
+
|
63
97
|
# Offense count: 1
|
64
98
|
# Cop supports --auto-correct.
|
65
99
|
# Configuration parameters: EnforcedStyle, SupportedStyles, AllowInnerSlashes.
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Google Finance Ruby Client
|
2
2
|
==========================
|
3
3
|
|
4
|
-
[](
|
4
|
+
[](https://badge.fury.io/rb/google-finance-ruby-client)
|
5
5
|
[](https://travis-ci.org/dblock/google-finance-ruby-client)
|
6
6
|
|
7
7
|
A Ruby client for the undocumented Google Finance web API that attempts to make sense of the data.
|
@@ -33,7 +33,7 @@ quote.change_in_percent # 0.11
|
|
33
33
|
quote.change_in_percent_s # "+0.11%"
|
34
34
|
```
|
35
35
|
|
36
|
-
See [quote.rb](lib/
|
36
|
+
See [quote.rb](lib/google-finance/quote.rb) for returned fields.
|
37
37
|
|
38
38
|
If a symbol cannot be found a [GoogleFinance::Errors::SymbolNotFound](lib/google-finance/errors/symbol_not_found_error.rb) is raised.
|
39
39
|
|
@@ -52,6 +52,56 @@ quotes[1] # GoogleFinance::Quote.get('AB')
|
|
52
52
|
|
53
53
|
If one of the symbols cannot be found a [GoogleFinance::Errors::SymbolsNotFound](lib/google-finance/errors/symbols_not_found_error.rb) is raised.
|
54
54
|
|
55
|
+
### Get Price History
|
56
|
+
|
57
|
+
Fetches price history for a ticker.
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
prices = GoogleFinance::Prices.get('MSFT')
|
61
|
+
|
62
|
+
prices.exchange # NASDAQ
|
63
|
+
|
64
|
+
# prices for the last month of open markets
|
65
|
+
prices.count # 21
|
66
|
+
|
67
|
+
# prices appear in reverse chronological order
|
68
|
+
prices.last #<GoogleFinance::Price close=85.71 date=2017-12-27 16:00:00 -0500 high=85.98 low=85.215 open=85.65 volume=14678025>
|
69
|
+
prices[-2] #<GoogleFinance::Price close=85.4 date=2017-12-26 16:00:00 -0500 high=85.5346 low=85.03 open=85.31 volume=9891237>
|
70
|
+
```
|
71
|
+
|
72
|
+
See [price.rb](lib/google-finance/price.rb) for returned fields.
|
73
|
+
|
74
|
+
If a symbol cannot be found a [GoogleFinance::Errors::SymbolNotFound](lib/google-finance/errors/symbol_not_found_error.rb) is raised.
|
75
|
+
|
76
|
+
The following options are supported.
|
77
|
+
|
78
|
+
* `exchange`: stock exchange symbol on which stock is traded, eg. `NASDAQ`
|
79
|
+
* `interval`: interval size in seconds
|
80
|
+
* `period`: period, a number followed by `d` (days) or `Y` (years)
|
81
|
+
* `fields`: array of data to return
|
82
|
+
* `date`: timestamp
|
83
|
+
* `open`: price at market open
|
84
|
+
* `close`: price at market close
|
85
|
+
* `volume`: volume
|
86
|
+
* `low`: low price
|
87
|
+
* `high`: high price
|
88
|
+
|
89
|
+
Retrieve prices for a year in 1 hour intervals.
|
90
|
+
|
91
|
+
```ruby
|
92
|
+
prices = GoogleFinance::Prices.get('GOOG', interval: 60 * 60, period: '1Y', fields: [:date, :close, :volume, :open, :high, :low])
|
93
|
+
|
94
|
+
prices.count # 1755
|
95
|
+
```
|
96
|
+
|
97
|
+
Retrieve only prices at market close.
|
98
|
+
|
99
|
+
```ruby
|
100
|
+
prices = GoogleFinance::Prices.get('GOOG', fields: [:days, :close])
|
101
|
+
|
102
|
+
prices.first # #<GoogleFinance::Price close=1047.41 date=2017-11-28 16:00:00 -0500>
|
103
|
+
```
|
104
|
+
|
55
105
|
## Contributing
|
56
106
|
|
57
107
|
See [CONTRIBUTING](CONTRIBUTING.md).
|
@@ -5,7 +5,9 @@ require 'hashie'
|
|
5
5
|
require_relative 'google-finance/version'
|
6
6
|
require_relative 'google-finance/faraday_middleware/preprocessor'
|
7
7
|
require_relative 'google-finance/errors'
|
8
|
-
require_relative 'google-finance/
|
8
|
+
require_relative 'google-finance/api'
|
9
9
|
require_relative 'google-finance/resource'
|
10
10
|
require_relative 'google-finance/quote'
|
11
11
|
require_relative 'google-finance/quotes'
|
12
|
+
require_relative 'google-finance/price'
|
13
|
+
require_relative 'google-finance/prices'
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module GoogleFinance
|
2
|
+
module Api
|
3
|
+
module GetPrices
|
4
|
+
#
|
5
|
+
# Retrieve prices.
|
6
|
+
#
|
7
|
+
# http://www.networkerror.org/component/content/article/1-technical-wootness/44-googles-undocumented-finance-api.html
|
8
|
+
# https://gist.github.com/lebedov/f09030b865c4cb142af1
|
9
|
+
#
|
10
|
+
# q: stock symbol
|
11
|
+
# x: stock exchange symbol on which stock is traded, eg. NASD
|
12
|
+
# i: interval size in seconds
|
13
|
+
# p: period, a number followed by d (days) or Y (years)
|
14
|
+
# f: data to return
|
15
|
+
# d: timestamp or interval
|
16
|
+
# c: close
|
17
|
+
# v: volume
|
18
|
+
# l: low
|
19
|
+
# o: open
|
20
|
+
# df: ?, eg. cpct
|
21
|
+
# auto: ?
|
22
|
+
# ei: ?
|
23
|
+
# ts: starting timetamp in unix format, default to today
|
24
|
+
#
|
25
|
+
# The output includes a header that describes the columns, timezone offset, and a few other interesting bits of information.
|
26
|
+
# The data rows are basically CSV format.
|
27
|
+
def self.fetch(params)
|
28
|
+
connection.get do |c|
|
29
|
+
c.params.merge!(params)
|
30
|
+
end.body
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.connection
|
34
|
+
Faraday.new(
|
35
|
+
url: 'https://finance.google.com/finance/getprices',
|
36
|
+
request: {
|
37
|
+
params_encoder: Faraday::FlatParamsEncoder
|
38
|
+
}
|
39
|
+
) do |c|
|
40
|
+
c.use Faraday::Response::RaiseError
|
41
|
+
c.use Faraday::Adapter::NetHttp
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module GoogleFinance
|
2
|
+
module Api
|
3
|
+
module Index
|
4
|
+
def self.get(params)
|
5
|
+
connection.get do |c|
|
6
|
+
c.params[:output] = :json
|
7
|
+
c.params.merge!(params)
|
8
|
+
end.body
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.connection
|
12
|
+
Faraday.new(
|
13
|
+
url: 'https://finance.google.com/finance',
|
14
|
+
request: {
|
15
|
+
params_encoder: Faraday::FlatParamsEncoder
|
16
|
+
}
|
17
|
+
) do |c|
|
18
|
+
c.use ::FaradayMiddleware::ParseJson
|
19
|
+
c.use GoogleFinance::FaradayMiddleware::Preprocessor
|
20
|
+
c.use Faraday::Response::RaiseError
|
21
|
+
c.use Faraday::Adapter::NetHttp
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
module GoogleFinance
|
2
|
+
class Prices < Array
|
3
|
+
extend Forwardable
|
4
|
+
|
5
|
+
def_delegators :@headers, :exchange, :market_open_minute, :market_close_minute, :interval, :columns, :timezone_offset
|
6
|
+
|
7
|
+
def initialize(headers, values = [])
|
8
|
+
@headers = OpenStruct.new(headers)
|
9
|
+
super values
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.get(symbol, params = {})
|
13
|
+
query = {}
|
14
|
+
params.each_pair do |k, v|
|
15
|
+
case k
|
16
|
+
when :exchange, :x then
|
17
|
+
query[:x] = v
|
18
|
+
when :interval, :i then
|
19
|
+
query[:i] = v
|
20
|
+
when :period, :p then
|
21
|
+
query[:p] = v
|
22
|
+
when :df then
|
23
|
+
query[:df] = v
|
24
|
+
when :auto then
|
25
|
+
query[:auto] = v
|
26
|
+
when :ei then
|
27
|
+
query[:ei] = v
|
28
|
+
when :fields, :f then
|
29
|
+
query[:f] = (v.is_a?(String) ? v.split(',').map(&:to_sym) : v).map do |f|
|
30
|
+
case f
|
31
|
+
when :date, :d then :d
|
32
|
+
when :open, :o then :o
|
33
|
+
when :close, :c then :c
|
34
|
+
when :volume, :v then :v
|
35
|
+
when :low, :l then :l
|
36
|
+
when :high, :h then :h
|
37
|
+
when :k then :k
|
38
|
+
else
|
39
|
+
raise ArgumentError, "Invalid fields: #{v}."
|
40
|
+
end
|
41
|
+
end.join(',')
|
42
|
+
else
|
43
|
+
raise ArgumentError, "Invalid parameter: #{k}."
|
44
|
+
end
|
45
|
+
end
|
46
|
+
data = GoogleFinance::Api::GetPrices.fetch({ q: symbol }.merge(query))
|
47
|
+
headers = {}
|
48
|
+
rows = []
|
49
|
+
start_ts = Time.at(0)
|
50
|
+
timezone_offset = 0
|
51
|
+
data.each_line do |line|
|
52
|
+
line = CGI.unescape(line)
|
53
|
+
if line =~ /(?<k>.+)\=(?<v>.*)/
|
54
|
+
k = Regexp.last_match[:k].downcase.to_sym
|
55
|
+
case k
|
56
|
+
when :columns then
|
57
|
+
headers[k] = Regexp.last_match[:v].split(',').map(&:downcase)
|
58
|
+
when :market_open_minute, :market_close_minute, :interval then
|
59
|
+
headers[k] = Regexp.last_match[:v].to_i
|
60
|
+
when :timezone_offset then
|
61
|
+
timezone_offset = Regexp.last_match[:v].to_i
|
62
|
+
else
|
63
|
+
headers[k] = Regexp.last_match[:v]
|
64
|
+
end
|
65
|
+
else
|
66
|
+
values = line.split(',')
|
67
|
+
raise "Unexpected number of columns, #{values.count} vs. #{headers[:columns].size}." if (headers[:columns] || []).size != values.count
|
68
|
+
row = {}
|
69
|
+
if headers[:columns]
|
70
|
+
headers[:columns].each_with_index do |name, ndx|
|
71
|
+
row[name] = case name
|
72
|
+
when 'date' then
|
73
|
+
if values[ndx] =~ /^a(?<ts>.*)/
|
74
|
+
# https://stackoverflow.com/questions/45897894/convert-timestamps-in-google-finance-stock-data-to-proper-datetime
|
75
|
+
#
|
76
|
+
# The full timestamps are denoted by the leading 'a'. Like this: a1092945600. The number after the 'a' is a Unix timestamp.
|
77
|
+
# The numbers without a leading 'a' are "intervals".
|
78
|
+
#
|
79
|
+
start_ts = Time.at(Regexp.last_match[:ts].to_i)
|
80
|
+
else
|
81
|
+
start_ts + (headers[:interval] || 1) * values[ndx].to_i
|
82
|
+
end
|
83
|
+
when 'volume' then
|
84
|
+
values[ndx].to_i
|
85
|
+
else
|
86
|
+
values[ndx].to_f
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
rows << GoogleFinance::Price.new({ 'timezone_offset' => timezone_offset }.merge(row))
|
91
|
+
end
|
92
|
+
end
|
93
|
+
raise GoogleFinance::Errors::SymbolNotFoundError.new(symbol, data) if rows.count == 0 && headers[:exchange] == 'UNKNOWN EXCHANGE'
|
94
|
+
new headers, rows
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
data/lib/google-finance/quote.rb
CHANGED
@@ -55,7 +55,7 @@ module GoogleFinance
|
|
55
55
|
end
|
56
56
|
|
57
57
|
def self.get(symbol)
|
58
|
-
data =
|
58
|
+
data = GoogleFinance::Api::Index.get(q: symbol)
|
59
59
|
if data.is_a?(Hash) && data.key?('searchresults')
|
60
60
|
if data['searchresults'].size >= 1
|
61
61
|
get(data['searchresults'].first['symbol'])
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module GoogleFinance
|
2
2
|
class Quotes
|
3
3
|
def self.search(*symbols)
|
4
|
-
results =
|
4
|
+
results = GoogleFinance::Api::Index.get(q: symbols.join(','))
|
5
5
|
if results.is_a?(Hash) && results.key?('searchresults')
|
6
6
|
searchresults = results['searchresults']
|
7
7
|
raise GoogleFinance::Errors::SymbolsNotFoundError.new(symbols, results) if searchresults.empty?
|
@@ -0,0 +1,82 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://finance.google.com/finance/getprices?f=d,c&q=GOOG
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.13.1
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
14
|
+
Accept:
|
15
|
+
- "*/*"
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Content-Type:
|
22
|
+
- text/plain; charset=ISO-8859-1
|
23
|
+
Cache-Control:
|
24
|
+
- private,max-age=60
|
25
|
+
Vary:
|
26
|
+
- Accept-Encoding
|
27
|
+
X-Content-Type-Options:
|
28
|
+
- nosniff
|
29
|
+
P3p:
|
30
|
+
- CP="This is not a P3P policy! See g.co/p3phelp for more info."
|
31
|
+
Date:
|
32
|
+
- Thu, 28 Dec 2017 19:36:34 GMT
|
33
|
+
X-Frame-Options:
|
34
|
+
- SAMEORIGIN
|
35
|
+
X-Xss-Protection:
|
36
|
+
- 1; mode=block
|
37
|
+
Server:
|
38
|
+
- GSE
|
39
|
+
Set-Cookie:
|
40
|
+
- NID=120=X3WsZT74lIH_zdo1Lkc0541rYVv4eRGFlj6oboyOy7VxYskGi4EKJr8ib7Ff904epoVUiQeYF9y6EP33iY5jZUp1krI4kWkIWW-h0KafjC_5xd1WMArpTK9zHyRZSf2C;Domain=.google.com;Path=/;Expires=Fri,
|
41
|
+
29-Jun-2018 19:36:34 GMT;HttpOnly
|
42
|
+
Alt-Svc:
|
43
|
+
- hq=":443"; ma=2592000; quic=51303431; quic=51303339; quic=51303338; quic=51303337;
|
44
|
+
quic=51303335,quic=":443"; ma=2592000; v="41,39,38,37,35"
|
45
|
+
Expires:
|
46
|
+
- Thu, 28 Dec 2017 19:36:34 GMT
|
47
|
+
Transfer-Encoding:
|
48
|
+
- chunked
|
49
|
+
body:
|
50
|
+
encoding: ASCII-8BIT
|
51
|
+
string: |
|
52
|
+
EXCHANGE%3DNASDAQ
|
53
|
+
MARKET_OPEN_MINUTE=570
|
54
|
+
MARKET_CLOSE_MINUTE=960
|
55
|
+
INTERVAL=86400
|
56
|
+
COLUMNS=DATE,CLOSE
|
57
|
+
DATA=
|
58
|
+
TIMEZONE_OFFSET=-300
|
59
|
+
a1511902800,1047.41
|
60
|
+
1,1021.66
|
61
|
+
2,1021.41
|
62
|
+
3,1010.17
|
63
|
+
6,998.68
|
64
|
+
7,1005.15
|
65
|
+
8,1018.38
|
66
|
+
9,1030.93
|
67
|
+
10,1037.05
|
68
|
+
13,1041.1
|
69
|
+
14,1040.48
|
70
|
+
15,1040.61
|
71
|
+
16,1049.15
|
72
|
+
17,1064.19
|
73
|
+
20,1077.14
|
74
|
+
21,1070.68
|
75
|
+
22,1064.95
|
76
|
+
23,1063.63
|
77
|
+
24,1060.12
|
78
|
+
28,1056.74
|
79
|
+
29,1049.37
|
80
|
+
http_version:
|
81
|
+
recorded_at: Thu, 28 Dec 2017 19:36:34 GMT
|
82
|
+
recorded_with: VCR 3.0.3
|