Digitale leeromgeving   |   Werken bij   |   OSINT vacatures   |   Contact   |   
Python resultaat

Hoe kunt u uw Flickr-zoekslagen automatiseren?

In deel 1 van van deze blogpost hebben wij u laten zien hoe u gebruikers op Flickr kunt vinden aan de hand van een e-mailadres. Wij hebben u laten zien dat u hiervoor de publieke API-sleutel van Flickr kunt gebruiken. In deze blogpost leggen wij u uit hoe u uw query kunt automatiseren aan de hand van uw eigen Python-script.

Allereerst: werkt de API-sleutel nog?

In de vorige blogpost hebben wij een query gebruikt om te controleren of er gebruikers op Flickr verbonden zijn aan het e-mailadres davidjones@yahoo.com. De query die wij daarvoor gebruikt hebben ziet u hieronder.

https://www.flickr.com/services/rest/?method=flickr.people.findByEmail&api_key=3aac009af063175e4bb3623f9d3c557b&find_email=davidjones%40yahoo.com&format=rest

In deze query is de publieke API-sleutel3aac009af063175e4bb3623f9d3c557b” van Flickr gebruikt. In onze vorige blogpost gaven wij al aan dat deze API-sleutel waarschijnlijk niet oneindig te gebruiken is. En dat blijkt ook, want als u bovenstaande query uitvoert krijgt u onderstaande foutmelding te zien. In deze foutmelding ziet u de err0r-code 100 staan, gevolgd door het bericht “Invalid API Key (Key not found)“. De publieke API-sleutel van Flickr blijkt dus niet meer te werken.

Invalid API Key

De houdbaarheid van een API-sleutel

De bovenstaande API-sleutel die wij op 23 april 2020 gebruikt hebben werkt vandaag, iets meer dan een maand later, helaas niet meer. Als u gebruikt maakt van publieke API-sleutels, dan zult u er vaker tegen aanlopen dat een API-sleutel op een gegeven moment niet meer werkt. De werking kan op verschillende manieren stoppen: zo kan het zijn dat een sleutel niet meer geldig is na een x aantal keren gebruik, of bijvoorbeeld omdat de bruikbaarheid na een bepaalde tijd stopt.

Twitter-gebruiker @OsintSupport (bekijk zeker ook zijn Chrome extensies!) heeft ons geïnformeerd dat de publieke API-sleutel steeds om de 8 uur wordt vervangen door een nieuwe API-sleutel. Dat betekent dus dat de sleutel ongeveer 8 uur geldig is. Het gebruik van de API-sleutel zou bovendien niet worden geblokkeerd op basis van herhaald gebruik door één gebruiker: de API-sleutel kan dus voor vele duizenden requests vanaf hetzelfde IP-adres gebruikt worden. En dat maakt het gebruik van de API-request interessant om te automatiseren.

Uw zoekslagen automatiseren

Wij zijn er groot voorstander van om OSINT-onderzoek handmatig uit te voeren. Wij vinden niet alleen dat u niet afhankelijk moet zijn van de tools die u gebruikt, ook hebben wij liever dat u snapt wat u aan het doen bent. Door te begrijpen wat u doet, heeft u vaak geen tools meer nodig of kunt u zelf tools ontwikkelen die precies doen wat u zelf wilt. Heel belangrijk is daarnaast dat u daarmee ook de controle heeft over de sporen die u op het internet achterlaat. Bovendien kan het ook juridisch gezien makkelijker te verantwoorden zijn als u kunt uitleggen wat u doet.

Toch kan het in sommige gevallen handig zijn om tools te gebruiken. Tools kunnen uw onderzoeken effectiever maken en tools kunnen u dingen laten zien die u met het blote oog niet kunt. Zeker voor het vergaren, verwerken en analyseren van grote hoeveelheden gegevens kunnen tools goed van pas komen. Hieronder leggen wij u uit hoe u zelf een eenvoudig Python-script kunt maken om te controleren of er een Flickr-account gekoppeld is aan een e-mailadres.

Aan de slag met Python

Allereerst: wat is ons doel? Het doel van het gebruik van een Python-script is om op een  geautomatiseerde manier te kunnen controleren of er e-mailadressen gekoppeld zijn aan gebruikers op het platform Flickr. Het is natuurlijk leuk om één e-mailadres te controleren, maar het is nog veel leuker om meerdere e-mailadressen te onderzoeken. U snapt het al: door dit geautomatiseerd te doen bespaart u een hoop tijd. Onderstaande stappen hebben betrekking op het gebruik van Python binnen een Windows-omgeving.

Stap 1: downloaden en installeren van Python

Om uw eigen Python-script te kunnen maken, dient u allereerst Python te downloaden. Python is een zogeheten open source programmeertaal waarmee u bijvoorbeeld applicaties, scripts en plug-ins van uzelf en derden kunt uitvoeren. Ga voor het downloaden van Python naar de website https://www.python.org/ en klik op de “Downloads” knop. Vervolgens selecteert u de meest recente versie van Python (in ons geval 3.8.2) en voert u het installatiebestand uit.

Python downloaden

In het onderstaande installatiescherm vinkt u de optie “Add Python 3.8 to PATH” aan. Deze optie zorgt ervoor dat u Python straks ook kunt gebruiken vanaf de Windows Command Prompt (CMD). Klik vervolgens op “Install Now” om Python te installeren.

Python installeren

In het volgende scherm klikt u op “Disable path length limit“. Deze optie zorgt ervoor dat het toevoegen van Python in een directory met een path-lengte groter dan 260 nog steeds blijft werken.

Python disable path lengt limit

Python is nu succesvol geïnstalleerd. Om te controleren of alles werkt kunt u uw Windows Command Prompt openen door in het start-menu de letters “cmd” in te toetsen en de “Opdrachtprompt” te openen. In het geopende venster typt u nu “python” in. U krijgt daarmee onderstaande te zien. U bent nu bijna klaar om uw eigen Python-script te gaan schrijven.

Windows CMD

Stap 2: Notepad++ downloaden

U heeft Python geïnstalleerd en u bent nu klaar om uw eigen Python-script te schrijven. Het is gebruikelijk om dit een speciale tekst- en broncode-bewerkingsprogramma’s te doen. In deze blogpost gebruiken wij het programma Notepad++. U kunt dit programma downloaden via https://notepad-plus-plus.org/downloads/. Uiteraard kunt u ook een speciale Python IDE als Pycharm gebruiken. Kies hier het programma dat u het meest prettig vindt werken.

Notepad++ downloaden

Open het programma Notepad++, klik op “Bestand” en vervolgens op “Opslaan als“. Kies een naam voor uw bestand (wij hebben de naam Flickr gekozen) en sla het bestand op als een “Python file (*.py,*.pyw)“.

Notepad++

U heeft hiermee een Python-bestand aangemaakt dat u straks kunt uitvoeren. Het bestand zelf zult u nu moeten gaan vullen met de inhoud van uw script.

Stap 3: de Request-library downloaden

Met de open source programmeertaal Python kunt u gebruik maken van bestaande code. Deze code is soms inbegrepen in Python en soms niet inbegrepen. Code die inbegrepen is kunt u direct gebruiken na de code te importeren, code die niet is inbegrepen dient u eerst te installeren.

De zogeheten Requests-library waarmee u HTTP-requests kunt verzenden is een voorbeeld van een code die niet standaard is inbegrepen in Python. Deze library moet u dus eerst installeren alvorens u deze library kunt gebruiken. Dat doet als volgt.

Open uw Windows Command Prompt en typ het volgende commando in:

Pip install requests

In uw scherm zal u nu veel beweging zien. U heeft namelijk in Python-ingebouwde programma PIP de opdracht gegeven om de “requests-library” te installeren. Wacht de installatie rustig af. In het onderstaande voorbeeld ziet u dat de Requests-library bij ons reeds geïnstalleerd is.

PIP install requests

Indien u gevraagd wordt om uw versie van PIP te updaten, dan voert u het onderstaande commando in.

python -m pip install --upgrade pip

Stap 4: de Requests-library importeren

U heeft in de volgende stap de Requests-library geïnstalleerd. Om de Requests-module te kunnen gebruiken moet u de module nog importeren. Wij adviseren u om voorafgaande uw code het #-symbool te gebruiken en een beschrijving van wat u gaat doen toe te voegen. Alles dat na het #-symbool staat wordt namelijk niet als code uitgevoerd. Open daarna uw Python-bestand en typ het volgende commando in:

import requests

Import requests

Stap 5: de URL specificeren

De Requests-library kunt u gebruiken op HTTP-requests mee te verzenden. In plaats van dat uw webbrowser een verzoek aan een webserver verstuurt, kunt u dit verzoek nu laten uitvoeren door uw Python-script. Wel dient u natuurlijk de URL van de website die u wenst te bezoeken te specificeren. De URL die u in dit geval wilt gebruiken is de query die we in de eerste blogpost hebben gebruikt:

https://www.flickr.com/services/rest/?method=flickr.people.findByEmail&api_key=3aac009af063175e4bb3623f9d3c557b&find_email=davidjones%40yahoo.com&format=rest

Omdat de API-sleutel van deze query echter niet meer geldig bleek te zijn, hebben wij hieronder een nieuwe query staan waarmee de request weer lukt. Wil u dit zelf doen, dan zal u steeds opnieuw de publieke API-sleutel van Flickr moeten gebruiken of zelf een privé sleutel moeten nemen.

https://www.flickr.com/services/rest/?method=flickr.people.findByEmail&api_key=f402aa5bec41484e322830c07b853ddc&find_email=davidjones%40yahoo.com&format=rest

In uw Python-script vult u het volgende commando in om de variabele “url” aan te maken en om een inhoud (de url) aan deze variabele toe te kennen:

url = 'https://www.flickr.com/services/rest/?method=flickr.people.findByEmail&api_key=b51834379b8a3b68db81bf2ea953a03e&find_email=davidjones%40yahoo.com&format=rest'

Python url

Stap 6: de request uitvoeren en het antwoord opslaan in een variabele

In deze stap gebruikt u de geïmporteerde Requests-module om een HTTP-request naar de webserver van Flickr te verzenden. De Requests-module heeft daarvoor speciaal de functie “requests.get(‘https://www.example.com’)” voor. Door deze functie uit te voeren zal er dus een HTTP-request verzonden worden naar de website www.example.com. Het antwoord van deze request willen we graag opslaan in een variabele. Gebruik onderstaande code om een request naar de door u gespecificeerde URL te maken en om het antwoord daarvan op te slaan in de variabele “response“.

#request uitvoeren en uitkomst in een variabele opslaan
response = requests.get(url)

Python antwoord in variabele opslaan

Stap 7: het resultaat printen

Met het bovenstaande script heeft u een request verzonden naar een webserver om een bepaalde webpagina op te halen. Deze webpagina heeft u vervolgens als het ware opgeslagen in de variabele “response”. Deze variabele kunt u vervolgens verder gebruiken en ook kunt u de inhoud van deze variabele printen. In Python gebruikt men de functie “print()” om een string of object te printen. Zo wordt er met de funtie “print(“Dit  is een test”)” de tekst “Dit is een test” uitgeprint. Om de inhoud van de variabele “response” de printen kunt u dus de volgende code gebruiken. Let erop dat u geen enkele of dubbele aanhalingstekens gebruikt, deze worden enkel gebruikt om een “string” (een stuk tekst) te printen.

#het resultaat printen (statuscode)
print(response)

Python print variabele

Wellicht is het u opgevallen dat wij in het bovenstaande script de opmerking “#het resultaat printen (statuscode)” hebben opgenomen. Door namelijk alleen de output van de HTTP-request te printen wordt niet de inhoud van de response getoond maar enkel de status code van de response. De Statuscode van de response is dus een antwoord van de webserver op onze request en geeft aan of de request bijvoorbeeld in goede orde ontvangen is (statuscode 2xx ) of dat er een fout bij de client (statuscode 4xx) of bij de webserver zit (statuscode 5xx).

Om ook de inhoud van de webpagina in tekstvorm te printen, gebruiken we daarom de volgende code.

#het resultaat printen (tekst)
print(response.text)

Python print variabele tekst

Stap 8: het Python-script uitvoeren

Met bovenstaande stappen heeft u een script geschreven waarmee één specifieke URL bij een webserver wordt opgevraagd. Het antwoord van de webserver (het resultaat) heeft u vervolgens opgeslagen in een variabele en deze variabele heeft u vervolgens geprint. Uw basis-script is daarmee in principe af, daarom is het tijd om te testen of uw script werkt. Dat doet u als volgt.

  1. Open de Windows Command Prompt;
  2. Typ het commando “cd Desktop” in*;
  3. Typ het commando “python Flickr.py” in.

Python bestand openen

* : in ons voorbeeld is het Python-script opgeslagen op het bureaublad. Met het commando “cd” (change directory) hebben wij de map “Desktop” (bureaublad) geopend. Indien uw script in een andere map is opgeslagen, navigeert u eerst naar deze map.

Stap 9: het resultaat bekijken

Door stap 8 uit te voeren, verkrijgt u het onderstaande resultaat. Allereerst ziet u het gedeelte “<Response [200]>” staan, hetgeen aangeeft dat de webserver uw verzoek in goede orde ontvangen heeft, begrepen heeft en geaccepteerd heeft. Dit resultaat correspondeert met uw “print(response)“-commando uit stap 7.

Direct daaronder ziet u het gedeelte “<?xml version=”1.0″ encoding =”utf-8″?>“, “< rsp stat=”ok”>“, “<user id=”72xxxxx07″ nsid=”72xxxxx07″>“, “<username>joxxxxx0</username>“, “</user>” en “</rsp>” staan. Dit gedeelte is de tekst van het resultaat, welk gedeelte correspondeert met uw “print(response.text)“-commando uit stap 7. Uit dit resultaat kunt u de gebruikersnaam en de gebruikers-ID van de gebruiker lezen die is gekoppeld aan het e-mailadres dat u heeft ingevoerd.

Python resultaat

En wat nu verder?

Met bovenstaande stappen heeft u een heel basaal Python-script gemaakt waarmee u kunt controleren of er een gebruiker op Flickr aan een e-mailadres is gekoppeld. Indien dat het geval is, krijgt u meteen de gebruikersnaam en de gebruikers-ID van de betreffende gebruiker te zien.

Het bovenstaande script is echter nog niet heel handig, want het handmatig gebruiken van de Flickr-API was waarschijnlijk sneller geweest dan dit script in elkaar zetten. Het is daarom nu de bedoeling om het script verder aan te passen zodat meerdere e-mailadressen ingevuld kunnen worden, de resultaten opgeschoond worden en de resultaten opgeslagen worden. Meer hierover leest u in onze volgende blogpost.

4 Comments

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *