Bash skriptas akcijų informacijai gauti

 


Šiandien noriu pasidalinti įdomiu Bash skriptu, kuris naudoja nemokamą API iš https://site.financialmodelingprep.com/ svetainės (iki 250 užklausų per dieną), kurį pats naudoju savo kasdieninės informacijos pateikimo ir sistemos atsarginių kopijų funkcionalume. Šio API tikslas – gauti realaus laiko akcijų informaciją.

Skripto funkcionalumas:

  • Leidžia vartotojui pasirinkti akcijų simbolius, kuriems nori gauti informaciją.
  • Galima paleisti su argumentu, nurodančiu konkretų akcijų simbolį, arba be argumento – tokiu atveju vartotojas gali rinktis akcijas iš pateikto sąrašo.
  • Pateikia tokią informaciją kaip pavadinimą, biržą, naujausią kainą, kainos pokyčius ir kt.

Kaip veikia skriptas:

  1. Įtraukiamas konfigūracijos failas su API URL ir raktu.
  2. Sukuriamas masyvas su numatytaisiais akcijų simboliais.
  3. Funkcija getConfiguredClient() patikrina, ar sistemoje yra įdiegta curl arba wget programa, reikalinga HTTP užklausoms vykdyti.
  4. Funkcija httpGet() naudoja šias programas užklausoms atlikti.
  5. Funkcija checkInternet() patikrina, ar yra interneto ryšys.
  6. Pagrindinė funkcija printStockInformation() gauna ir išveda akcijų informaciją.
  7. Jei skriptas paleidžiamas be argumento, funkcija showStockList() pateikia sąrašą akcijų simbolių, iš kurio vartotojas gali pasirinkti.
  8. Jei nurodytas argumentas, tiesiog išvedama informacija apie tą akciją.

Pasiūlymai patobulinimui:

  • Išskaidyti kodą į atskirus failus ar funkcijas, kad būtų lengviau prižiūrėti ir modifikuoti.
  • Pridėti daugiau patikrinimų ir išimčių valdymą, kad skriptas būtų atsparus klaidoms.
  • Įtraukti papildomų funkcijų, tokių kaip akcijų palyginimas, istorinių duomenų gavimas ar grafinių ataskaitų generavimas.
  • Pagerinti vartotojo sąsają, pavyzdžiui, naudojant meniu sistemos ar interaktyvius pasirinkimus.
  • Pridėti galimybę išsaugoti vartotojo nustatymus arba mėgstamiausius akcijų simbolius.

Nauda:

Šis skriptas gali būti naudingas investuotojams, finansų analitikams ar tiesiog žmonėms, besidomintiems akcijų rinka. Jis leidžia greitai ir patogiai gauti realaus laiko akcijų informaciją.

Apibendrinimas:

Tai puikus pavyzdys, kaip Bash skriptai gali būti naudojami praktiniams tikslams ir sąveikauti su išoriniais šaltiniais, tokiais kaip API. Tikiuosi, kad šis įrašas buvo įdomus ir naudingas, o pateikti patobulinimo pasiūlymai padės tobulinti šio kodo funkcionalumą bei patogumą.


#!/usr/bin/env bash
# Įtraukiame konfigūracijos failą, kuriame yra API URL ir raktas.
source "$HOME/git/config.sh"
 
# Sukuriame masyvą, kuriame saugomi akcijų simboliai.
stocks=("TSLA" "NVDA" "AAPL" "F" "DIS" "META" "PFE" "NIO" "KO")
 
# Funkcija getConfiguredClient() tikrina, ar sistema turi įdiegtą curl arba wget programą, reikalingą HTTP užklausoms.
getConfiguredClient() {
  if command -v curl &>/dev/null; then
    configuredClient="curl"
  elif command -v wget &>/dev/null; then
    configuredClient="wget"
  else
    echo "Klaida: curl arba wget turi būti įdiegti." >&2
    exit 1
  fi
}
 
# Funkcija httpGet() vykdo HTTP GET užklausą naudodama nustatytą klientą (curl arba wget).
httpGet() {
  case "$configuredClient" in
    curl) curl -s "$@" ;;
    wget) wget -qO- "$@" ;;
  esac
}
 
# Funkcija checkInternet() patikrina, ar yra interneto ryšys, pabandydama pasiekti github.com.
checkInternet() {
  httpGet github.com > /dev/null 2>&1 || { echo "Klaida: nėra interneto ryšio" >&2; exit 1; }
}
 
# Funkcija checkJsonField() patikrina, ar JSON laukas nėra null arba tuščias ir grąžina pranešimą.
checkJsonField() {
  fieldValue="$1"
  if [[ "$fieldValue" == "null" ]] || [[ -z "$fieldValue" ]]; then
    echo "Nėra duomenų"
  else
    echo "$fieldValue"
  fi
}
 
# Funkcija printStockInformation() gauna ir spausdina akcijų informaciją pagal jų simbolį.
printStockInformation() {
  stockSymbol="$1"
  stockProfile=$(httpGet "$API_URL/profile/$stockSymbol?apikey=$API_KEY")
  stockQuote=$(httpGet "$API_URL/quote/$stockSymbol?apikey=$API_KEY")
 
  # Patikrina, ar atsakymas turi klaidos pranešimą
  if echo "$stockProfile" | jq -e '.[0]? | has("Error Message")' > /dev/null; then
    echo "Klaida: $(echo "$stockProfile" | jq -r '.[0].["Error Message"]')"
    exit 1
  fi
 
  if [ "$(echo "$stockProfile" | jq -r 'type')" != "array" ] || [ "$(echo "$stockQuote" | jq -r 'type')" != "array" ]; then
    echo "Klaida: Klaidingas API atsakymas."
    exit 1
  fi
 
  # Patikrina, ar masyvas nėra tuščias
  if [ "$(echo "$stockProfile" | jq '. | length')" -eq 0 ] || [ "$(echo "$stockQuote" | jq '. | length')" -eq 0 ]; then
    echo "Klaida: API atsakymas tuščias."
    exit 1
  fi
 
  name=$(echo "$stockProfile" | jq -r '.[0].companyName' 2>/dev/null || echo "Nėra duomenų")
  exchangeName=$(echo "$stockProfile" | jq -r '.[0].exchange' 2>/dev/null || echo "Nėra duomenų")
  latestPrice=$(echo "$stockQuote" | jq -r '.[0].price' 2>/dev/null || echo "Nėra duomenų")
  range=$(echo "$stockProfile" | jq -r '.[0].range' 2>/dev/null || echo "Nėra duomenų")
  priceChange=$(echo "$stockQuote" | jq -r '.[0].change' 2>/dev/null || echo "Nėra duomenų")
  priceChangePercentage=$(echo "$stockQuote" | jq -r '.[0].changesPercentage' 2>/dev/null || echo "Nėra duomenų")
  volumeAvg=$(echo "$stockProfile" | jq -r '.[0].volAvg' 2>/dev/null || echo "Nėra duomenų")
 
 
  cat <&2
       exit 1
       ;;
  esac
done
 
# Funkcija checkInternet() patikrina, ar yra interneto ryšys pabandydama pasiekti github.com.
checkInternet || exit 1
 
if [[ $# -eq 1 ]]; then
  stockSymbol="$1"
  printStockInformation "$stockSymbol"
else
  while true; do
    showStockList
    read -rp "Pasirinkite numerį: " choice
 
    if [[ -z "$choice" ]]; then
      for stock in "${stocks[@]}"; do
        printStockInformation "$stock"
      done
      break
    elif [[ "$choice" =~ ^[0-9]+$ ]] && (( choice > 0 && choice <= ${#stocks[@]} )); then
      selectedStock="${stocks[$((choice-1))]}"
      printStockInformation "$selectedStock"
      break
    else
      echo "Neteisingas pasirinkimas. Bandykite dar kartą." >&2
    fi
  done
fi

Komentarai

Populiarūs šio tinklaraščio įrašai

Configuring a NixOS firewall for everyday use

Setting up syncthing as a service on openSUSE and other Linux distributions

Monitoring SFTP server updates with Python