Publicerat

bashskript_ksamsok

Eftersom K-samsök har ett gränssnitt  mot andra program (ett api) tillgängligt via http är man inte begränsad till att personligen besöka en webbsida för att hämta information därifrån. I stället kan man låta program kommunicera direkt med databasen. Men det behöver inte vara ett stort eller komplicerat program, ett snabbt i hopslängt bashskript duger gott.

Bash är den kommandotolk som används i de flesta GNU/Linuxdistributioner, i Mac OS X och den finns till och med portad till Windows. Bash har ett inbyggt skriptspråk som bland annat kan användas till att “klistra i hop“ olika andra program så att man kan göra nästan vad som helst med resultatet.

K-samsöks api fungerar som de flesta andra och är därför ganska enkelt att arbeta emot, principen är den samma oavsett om man t.ex. vill göra sökningar mot Twitter, Wikipedia eller K-samsök eftersom de alla kommunicerar på samma sätt. På grund av detta behöver man inte heller skriva särskilt mycket kod, det går bra att ta hjälp av redan befintliga program och funktioner, vilket ju är smidigt.

Med hjälp av de två fria programmen cURL och xmlstarlet kan man med några få rader kod komma åt K-samsöks api direkt från den egna kommandotolken.

Så här ser koden ut:

#!/bin/bash

function query()
{
echo ”Which is your query?”
read query
echo ”Number of results (500 max)?”
read number
curl -g ”http://kulturarvsdata.se/ksamsok/sru?operation=searchRetrieve&version=1.1&maximumRecords=$number&api=Test&query=text=$query”  -s \
| xmlstarlet sel -N pres=”http://kulturarvsdata.se/presentation#” -N srw=”http://www.loc.gov/zing/srw/” \
–template –match ”srw:searchRetrieveResponse/srw:records/srw:record/srw:recordData/pres:item” \
–sort A:T:- ”pres:organization” -v ”concat(pres:organization,’            ’,pres:id,’            ’,pres:type,’            ’,pres:entityUri)” –nl \
| sed -e ’s|/object/|/object/html/|g’ -e ’s|/media/|/media/html/|g’ -e ’s|/fmi/|/fmi/html/|g’ \
| grep -v ’^$’
}

query

Koden definierar en funktion som först frågar användaren vad denne vill söka efter och sedan hur många träffar man maximalt vill ha (det verkar finnas ett tak på 500 träffar när man söker mot api:t). Därefter använder cURL de svar som användaren givit till att skicka en förfrågan till api:t. Som svar kommer då en xml-fil från K-samsök som innehåller de träffar sökningen givit.

Med hjälp av programmet xmlstarlet kan man sedan plocka ut det man är intresserad av från xml-filen. I det här exemplet visas den institution som registrerat posten, id-  numret för posten, vilken typ av post det är och därefter URI:n till posten.

Slutligen kommer lite överkurs, länken ändras så att den går till webbsidan i stället för xml-representationen med programmet sed och tomma rader tas bort med programmet grep.

Det här är ett typiskt exempel på unixfilosofin där man anser att det bästa är att ha små program som gör en sak (och den saken skall programmet göra riktigt bra), det är också vanligt att unixprogram kommunicerar med varandra via vanlig text på det här sättet.

Läs mer:
Bash – http://www.gnu.org/software/bash/
cURL – http://curl.haxx.se/
xmlstarlet – http://xmlstar.sourceforge.net/

>> Micke Nordin är arkeolog och internaut anställd vid Sörmlands museum.