Haven't got time to look at your code in detail, but stabbing blindly in the dark - have you tried double quoting your URL? See the following StackOverflow question and answer: https://stackoverflow.com/questions/55753504/reading-csv-file-from-a-a-secured-link-with-j
On Mon, Nov 25, 2019 at 3:36 PM Henry Rich <henryhr...@gmail.com> wrote: > Do you have an example of a script where you can see correct data going > in and a bad result coming out? > > Henry Rich > > On 11/24/2019 9:30 PM, Thomas McGuire wrote: > > The following J script, patterned after Brad Lucas’ Bash script ( > http://blog.bradlucas.com/posts/2017-06-02-new-yahoo-finance-quote-download-url/ > < > http://blog.bradlucas.com/posts/2017-06-02-new-yahoo-finance-quote-download-url/>), > doesn’t seem to work. I won’t go into the history of the yahoo and the > change in their website except to say that by making a double access with > curl and pulling out elements of the first response to use in the second > access you should be able to programmatically get historical price quotes. > > > > I believe I have set up the URLs properly. I am using cookies with > web/gethttp function. I see the cookie file get created and I receive a > first response from the yahoo website. From there you need to find the > ‘crumb’ in the response and use that to build a URL to request the > historical stock prices. The crumb can sometimes contain \u00xx unicode > escape characters. These need to be translated into a character. Bash has a > built in echo command (different than the linux echo command) that will > translate this properly. In J I use reapply to translate these sequences. > The Bash version redirects the output of the second curl call to a file. I > am just trying to get the data to print in Jqt where I run the script. > > > > I will show the output and the J script will follow. I tried this with > 2!:0 foreign conjunction to run curl directly and have the same problem. > The first call to curl gets an appropriate response and the second call > gets an error stating invalid cookie. This error is not displayed in J I > modified the code to log the errors to a file and found it there. > > > > OUTPUT: > > gethistorical 'AAPL';'11/23/2018';'11/23/2019' > > start URL = https://finance.yahoo.com/quote/AAPL/history?p=AAPL > > raw crumb string = > "}}}}},"CrumbStore":{"crumb":"34jVbQ1iOCI"},"StreamStore":{" > > final crumb string = 34jVbQ1iOCI > > > https://query1.finance.yahoo.com/v7/finance/download/AAPL?period1=1543010400&period2=1574546400&interval=1d&events=history&crumb=34jVbQ1iOCI > > > > OUTPUT (with unicode escape sequence): > > gethistorical 'AAPL';'11/23/2018';'11/23/2019' > > start URL = https://finance.yahoo.com/quote/AAPL/?p=AAPL > > raw crumb string = > "}}}}},"CrumbStore":{"crumb":"yw3klV8Pa\u002Fc"},"StreamStor > > final crumb string = yw3klV8Pa/c > > > https://query1.finance.yahoo.com/v7/finance/download/AAPL?period1=1543010400&period2=1574546400&interval=1d&events=history&crumb=yw3klV8Pa/c > > > > > > > > JCODE: > > NB. Navigating yahoo.com to programmatically get historical stock prices > > NB. > > require 'web/gethttp' > > require 'regex' > > > > NB.require 'types/datetime' > > NB. time stamp functions > > NB. jts =: 6!:0 > > NB. epoch =: todayno 1970 01 01 > > NB. linuxts =: 13 : '(((toDayNo y)-epoch)*24*60*60)' > > > > NB. use the linux date command to create a linux time stamp > > epochtime =: 3 : 0 > > 2!:0 'date -jf ''%m/%d/%Y %H:%M:%S %p'' ''',y,' 05:00:00 PM'' ''+%s''' > > ) > > > > NB. precision functions > > ppq =: 9 !: 10 NB. print-precision query > > pps =: 9 !: 11 NB. print-precision set > > NB. I set the precision to 16 to ensure full printing of the linux > timestamps > > HEX=:16#.'0123456789abcdef'i.] > > > > xutf =: 3 : 0 > > u: HEX tolower 2 }. y > > ) > > > > crumbstr =: '"CrumbStore":{"crumb":"' > > NB. the crumb is on the page with the link to downloading the historical > > NB. data. If you call the correct first page you only need to search > > NB. for the above crumbstr there will be only one. > > getcrumb =: 3 : 0 > > sidx =. (#crumbstr)+({: I. crumbstr E. y) > > sstr =. (sidx + i. 30){y > > > > smoutput 'raw crumb string = ',(sidx + _30 + i.60){y > > > > eidx =. {. I. '"' E. sstr > > > > NB. using rxapply convert all \u00xx unicode escape sequences > > crumb =. '(\\u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])' xutf > rxapply (i.eidx){sstr > > ) > > > > financeURL =: 'https://finance.yahoo.com/quote/' NB. > AAPL/history?p=AAPL' > > histURL =: 'https://query1.finance.yahoo.com/v7/finance/download/' > > NB. the histURL needs to have a ticker symbol followed by: > > NB. ?period1=<unixts for p1>&period2=<unixts for > p2&interval=1d&events=history&crumb=<crumbval> > > > > NB. > https://query1.finance.yahoo.com/v7/finance/download/AAPL?period1=1543024670&period2=1574560670&interval=1d&events=history&crumb=jZO816Y7CSK > > > > gethistorical=: 3 : 0 > > 'symbol d1 d2' =. y > > > > NB. Create start URL at the start page with the crumb to get historical > downloadNN > > NB. a BASH implementation uses the commented out format > > NB. sURL =. financeURL,symbol,'/?p=',symbol > > > > NB. But the link to the download of historical prices is really here: > > sURL =. financeURL,symbol,'/history?p=',symbol > > > > smoutput 'start URL = ',sURL > > > > NB. Get the response using gethttp. --cookie-jar cookie.txt will open a > cookie file > > res =: '-s -c cookie.txt' gethttp sURL > > > > NB. tried with curl through the 2!:0 interface with the same results > > NB. res =: 2!:0 'curl -s -c cookie.txt ',sURL > > > > crumb =. getcrumb res > > smoutput 'final crumb string = ',crumb > > > > qstr =. '?period1=',(}:epochtime d1),'&period2=',(}:epochtime > d2),'&interval=1d&events=history&crumb=',crumb > > smoutput URL=. histURL,symbol,qstr > > > > res2 =: '-s -b cookie.txt ' gethttp URL > > NB. res2 =: 2!:0 'curl -s -b cookie.txt ',URL > > > > res2 > > ) > > > > ---------------------------------------------------------------------- > > For information about J forums see http://www.jsoftware.com/forums.htm > > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm