Hämta data från API:er med cURL och jq
Med cURL och jq går det att extrahera data från API:er direkt från kommandoraden. Jq är en JSON-tolkare och beskrivs av utvecklarna som sed och awk för JSON.
Bild: Pexels
Här kommer vi att extrahera aktuell temperatur med tidsstämpel från SMHIs öppna API. Detta är samma API som vi använde i Pythonmiljö i Docker.
API:et vi kommer hämta temperaturen från är http://opendata-download-metobs.smhi.se/api/version/1.0/parameter/1/station/62180/period/latest-hour/data.json.
För att slippa ange den långa adressen till API:et varenda
gång vi ska laborera med jq
kommer vi att spara ner svaret i en variabel.
$> smhidata=$(curl -s http://opendata-download-metobs.smhi.se/api/version/1.0/parameter/1/station/62180/period/latest-hour/data.json)
Skriver vi ut innehållet från variabeln är det oformaterad JSON, vilket är väldigt svårläst.
$> echo $smhidata
{"value":[{"date":1659776400000,"value":"16.0","quality":"G"}],"updated":1659776400000,"parameter":{"key":"1","name":"Lufttemperatur","summary":"momentanvärde, 1 gång/tim","unit":"degree celsius"},"station":{"key":"62180","name":"Ängelholm-Barkåkra Flygplats","owner":"...
Vi börjar därför med att skriva ut JSON-filen med hjälp av jq
så att den blir
snyggt formaterad. Vi skriver ut innehållet med echo $smhidata | jq
. Början
av innehållet ser ut som nedan (innehållet är längre än vad som visas här):
{
"value": [
{
"date": 1659776400000,
"value": "16.0",
"quality": "G"
}
],
"updated": 1659776400000,
"parameter": {
"key": "1",
"name": "Lufttemperatur",
"summary": "momentanvärde, 1 gång/tim",
"unit": "degree celsius"
},
"station": {
"key": "62180",
"name": "Ängelholm-Barkåkra Flygplats",
"owner": "Ängelholm Helsingborgs flygplats Holding AB",
"ownerCategory": "CLIMATE",
"measuringStations": "CORE",
"height": 2
},
Det som vi är intresserade av är bara temperaturen och tidsstämpeln. Dessa ligger i den yttre nivån i value. Vi börjar därför med att skriva ut endast detta:
$> echo $smhidata | jq -r '.value'
[
{
"date": 1659776400000,
"value": "16.0",
"quality": "G"
}
]
Temperaturen och tidsstämpeln ligger här på den andra nivån, det vill säga innanför []
.
För att komma åt dessa värden behöver vi således först ta oss ner den nivån.
Det gör vi genom att lägga till just []
efter value:
$> echo $smhidata | jq -r '.value[]'
{
"date": 1659776400000,
"value": "16.0",
"quality": "G"
}
Nu kan vi fortsätta med att extrahera value, alltså temperaturen:
$> echo $smhidata | jq -r '.value[].value'
16.0
Tidsstämpeln kommer vi åt på samma sätt:
$> echo $smhidata | jq -r '.value[].date'
1659776400000
Notera dock att tidsstämpeln är i UNIX epoch time. Ett tidsformat som mäter
antalet sekunder som förfallit sedan midnatt den 1 januari 1970 UTC. Men i
detta fallet är formatet i millisekunder, vilket ställer till det vid
omvandlingen till vanligt datumformat. Vi behöver därför först dividera talet
med 1000 så att vi får det i sekunder. Till detta kan vi använda verktyget
bc
som står för Basic
Calculator.
För att sedan omvandla
från UNIX epoch time till vanligt datumformat använder vi date
-kommandot.
I Linux gör vi omvandlingen med date -d @$timestamp
. Men under macOS
använder vi istället date -r $timestamp
.
$> timestamp=$(echo $smhidata | jq -r '.value[].date')
$> timestamp=$(echo "$timestamp / 1000" | bc)
$> date -d @$timestamp
lör 6 aug 2022 11:00:00 CEST
Vi kan också skriva ut flera fält samtidigt med jq
. Vi behöver således
inte skriva ut temperaturen och tidsstämpeln var för sig. Vi separar dem då
med ett kommatecken.
$> echo $smhidata | jq -r '.value[].value, .value[].date'
16.0
1659776400000
Ett skript
Det är dags att sätta samman allting i ett skript. Här använder vi xargs
för att göra hela omvandlingen från UNIX epoch time till vanligt datum på en
och samma rad. xargs -I %
talar om att vi vill föra in utdatan (tidsstämpeln
utan millisekunder) vid platsen för procenttecknet, vilket här blir direkt
efter @-tecknet för date
-kommandot.
#!/bin/bash
PATH="/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin"
## Spara båda värdena till en variabel. De hamnar som en sträng efter varandra
smhidata=$(curl -s http://opendata-download-metobs.smhi.se/api/version/1.0/parameter/1/station/62180/period/latest-hour/data.json \
| jq -r '.value[].value, .value[].date')
## Första fältet i strängen är temperaturen
temperature=$(echo $smhidata | awk '{ print $1 }')
## Andra fältet i strängen är tidsstämpeln
timestamp=$(echo $smhidata | awk '{ print $2 }')
## Skriv ut resultatet och fixa tidsstämpeln med xargs för att slippa dubbla rader
echo "$temperature grader ($(echo $timestamp / 1000 | bc | xargs -I % date -d @%))"
När vi kör ovanstående skript får vi följande resultat:
$> ./get-smhi-data.sh
17.1 grader (lör 6 aug 2022 14:00:00 CEST)
Du hittar mer information om jq
på stedolan.github.io/jq.
Mer information om curl
hittar du på curl.se. Det finns
också mycket information i deras respektive manualsida, man jq
och man
curl
. För mer information om bc
och xargs
, se man bc
och man
xargs
. För mer information om awk
se man awk
.
Nyhetsbrev
Nyhetsuppdateringar från tidningen direkt till din inkorg, helt kostnadsfritt. Avsluta när du vill.
Kommentarer
Kommentarsfältet är modererat. Det innebär att alla kommentarer granskas av ansvarig utgivare före publicering.
Du väljer själv om du vill ange ditt riktiga namn, en pseudonym eller vara helt anonym. Ingen registrering behövs.
Relaterade artiklar
-
Avlyssna trafik på servern med Wireshark och TShark
Wireshark är ett ovärderligt verktyg för att felsöka nätverkskonfigurationer, applikationer, API:er, demoner och mycket annat. I kombination med
tshark
kan vi dessutom avlyssna trafiken på en server i realtid. -
Var försiktig med att curl:a skript som root
Att installera program i Linux genom att omdirigera utdata från Curl till skalet är snabbt och smidigt. Men det är ack så farligt om du inte känner till programmet eller dess ursprung.
-
Vidarebefordran av SSH-agenten
SSH agent forwarding, eller vidarebefordran av SSH-agenten, innebär att man kan vidarebefordra SSH-agenten till ett fjärrsystem. På så sätt behöver man inte kopiera sin privata SSH-nyckel till fjärrsystemet, eller skapa flera nycklar för olika system. Men det finns risker med det.
-
Jenkins som ett alternativ till Ansible Tower
Ansible Tower kommer med en stor prislapp, speciellt för ett mindre företag eller en privatperson. AWX å andra sidan är helt fritt, men kräver numera Kubernetes. För den som vill automatisera sina Ansible Playbooks går det dock bra att använda Jenkins som en ersättning för Tower och AWX.
Senaste nyheterna och inläggen
-
Avlyssna trafik på servern med Wireshark och TShark
Wireshark är ett ovärderligt verktyg för att felsöka nätverkskonfigurationer, applikationer, API:er, demoner och mycket annat. I kombination med
tshark
kan vi dessutom avlyssna trafiken på en server i realtid. -
Mysig stämning på sommarens första demoparty
I helgen var det Reunion 2024 i Kvidinge Folkets hus, sommarens första skånska demoparty. Partyt organiserades av Jesper “Skuggan” Klingvall. På plats fanns ett 30-tal besökare.
-
Sommarens skånska demopartyn
Årets sommar bjuder på två skånska demopartyn. Först ut är Reunion i Kvidinge den 28–30 juni. Därefter är det Pågadata i Örtofta den 9–11 augusti.
-
Riskerna med BankID som ingen pratar om
BankID är ett säkert och smidigt sätt att identifiera sig online. Men i takt med dess ökade popularitet och användning har det blivit en svag länk – en single point of failure – på mer än ett sätt.
-
Polisernas fängelsedomar står fast
Efter tre år är målet mot de två poliser som olovligen tog sig in i en berusad mans bostad i Landskrona och misshandlade honom klart. Högsta domstolen beslutade den sjätte mars att avvisa överklagan. Fängelsedomarna för poliserna står därmed fast.
Utvalda artiklar
-
Mysig stämning på sommarens första demoparty
I helgen var det Reunion 2024 i Kvidinge Folkets hus, sommarens första skånska demoparty. Partyt organiserades av Jesper “Skuggan” Klingvall. På plats fanns ett 30-tal besökare.
-
Datorparty i Landskrona
I helgen höll Syntax Society sitt årliga sommarparty. Platsen var en källarlokal i Landskrona där ett femtontal personer medverkade.
-
Det första Pågadata har ägt rum
I helgen ägde det första Pågadata rum – uppföljaren till Gubbdata. Platsen var Folkets Hus i Kvidinge. Organisatör av partyt var Johan “z-nexx” Osvaldsson med hjälp från Jesper “Skuggan” Klingvall. Partyt hade över 100 anmälda deltagare.
-
Även hovrätten fäller poliserna för att ha satt dit oskyldig
Hovrätten fastställer straffet för de två poliser som förra året dömdes till vardera ett års fängelse av Lunds tingsrätt för att ha misshandlat och satt dit en oskyldig man. De båda poliserna ska även betala skadestånd till mannen.
-
Retroloppis i Påarp
Idag var det retroloppis hos Andreas Nilsson i Påarp. På baksidan av huset fanns hundratals spel uppradade på långa bord. Trots friska vindar och sval temperatur var loppisen välbesökt.
CyberInfo Sverige är ett it- och medieföretag i nordvästra Skåne som tillhandahåller böcker, utbildningar, nyheter och konsulttjänster inom Linux, säkerhet och programmering.
CyberInfo Sverige är godkänd för F-skatt, är momsregistrerat och innehar
utgivningsbevis för webbplatsen www.cyberinfo.se.