diff --git a/README.md b/README.md index 84c725d..9cdb837 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,8 @@ $ watch -n 5 -t -c ./ticker.sh AAPL MSFT GOOG BTC-USD $ while true; do clear; ./ticker.sh AAPL MSFT GOOG BTC-USD; sleep 5; done ``` +Please note that ticker.sh may require periodic updates of its session with Yahoo Finance. During these instances, the script may take slightly longer to complete. + This script works well with [GeekTool](https://www.tynsoe.org/v2/geektool/) and similar software: ```sh diff --git a/ticker.sh b/ticker.sh index 7606940..5c0dac7 100755 --- a/ticker.sh +++ b/ticker.sh @@ -4,6 +4,10 @@ set -e LANG=C LC_NUMERIC=C +SESSION_DIR="${TMPDIR}pstadler-ticker-sh" +COOKIE_FILE="${SESSION_DIR}/cookies.txt" +CRUMB_FILE="${SESSION_DIR}/crumb.txt" + SYMBOLS=("$@") if ! $(type jq > /dev/null 2>&1); then @@ -30,8 +34,27 @@ fi symbols=$(IFS=,; echo "${SYMBOLS[*]}") fields=$(IFS=,; echo "${FIELDS[*]}") -results=$(curl --silent "$API_ENDPOINT&fields=$fields&symbols=$symbols" \ - | jq '.quoteResponse .result') +[ ! -d "$SESSION_DIR" ] && mktemp -q -d "$SESSION_DIR" + +preflight () { + curl --silent --output /dev/null --cookie-jar "$COOKIE_FILE" "https://finance.yahoo.com" \ + -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" + curl --silent -b "$COOKIE_FILE" "https://query1.finance.yahoo.com/v1/test/getcrumb" \ + > "$CRUMB_FILE" +} + +fetch_quotes () { + curl --silent -b "$COOKIE_FILE" "$API_ENDPOINT&fields=$fields&symbols=$symbols&crumb=$(cat "$CRUMB_FILE")" +} + +[ ! -f "$COOKIE_FILE" -o ! -f "$CRUMB_FILE" ] && preflight +results=$(fetch_quotes) +if $(echo "$results" | grep -q '"code":"Unauthorized"'); then + preflight + results=$(fetch_quotes) +fi + +results=$(echo $results | jq '.quoteResponse .result') query () { echo $results | jq -r ".[] | select(.symbol == \"$1\") | .$2" @@ -82,4 +105,4 @@ for symbol in $(IFS=' '; echo "${SYMBOLS[*]}" | tr '[:lower:]' '[:upper:]'); do printf "$color%10.2f%12s$COLOR_RESET" $diff $(printf "(%.2f%%)" $percent) printf " %s\n" "$nonRegularMarketSign" fi -done +done \ No newline at end of file