• Non ci sono risultati.

3.1 Implementazioni e strumenti nel Museo Virtuale in VR

3.1.3 Recupero delle informazioni da Google Images

In questo paragrafo verranno mostrate le funzioni per il recupero delle informazioni e per lo scaricamento delle risorse sulla piattaforma di Google Images. Non essendoci particolari metadati e funzioni per l’ottenimento delle informazioni, verranno riportate le funzioni dedite a scaricare le pagine delle ricerche e al parsing manuale dei risultati.

3.1.3.1 La funzione getGoogle()

La funzione getGoogle() serve a ottenere la pagina web di Google Images con il nome dell’artista da ricercare. Essa prende come parametro in entrata una stringa corrispondente al nome

function OnInit(params) {

//splitto la stringa dei parametri in entrata splitParams = Split(

params,

","

);

//Inizializzo le tipologie di funzioni in base alla reposirory scelta

switch(val(splitParams[2])){

case 1: caseGoogleImages(splitParams);break;

case 2: caseWikimedia(splitParams);break;

case 3: caseEuropeana(splitParams);break; }

71

dell’artista, contenuto nel primo indice dell’array (ovvero splitP[0]), ed effettua una ricerca all’interno di Google restituendo così la pagina contenenti i collegamenti delle immagini ad alta risoluzione.

All’interno della funzione vengono definite le direttive per includere una libreria esterna scritta in C++ denominata curlDll e per comporre un pattern di ricerca da passare a quest’ultima funzione. Esistono due ragioni principali per cui si fa ricorso a una libreria esterna in C++:

 La prima è dovuta al fatto che, trattandosi di motori di ricerca con connessione criptata, è necessario usare una libreria (nel nostro caso, libCurl) per poter effettuare delle richieste a protocolli HTTPS.76

 La seconda ragione è che con questa libreria è possibile definire dei valori importanti, che verranno spiegati successivamente, per effettuare le richieste e per ricevere correttamente i dati necessari.

3.1.3.1.1 Libreria esterna curlDll.dll

La libreria esterna77 è stata scritta nel linguaggio di programmazione C++ ed è stata realizzata con il software Microsoft Visual Studio 2017. Al suo interno è stata inclusa un’altra libreria esterna,

function getGoogle(string){ SETLOCALDIR();

//carico la libreria esterna

var libreria = CVmExternDLL("curlDll.dll"); //rendo esplicita la funzione della libreria

libreria.__AddFunction(C_PSTR, "decripta", C_PSTR); //array per contenere il body della pagina HTML var b = space(800000);

//pattern di ricerca var myurl =

"https://www.google.it/search?q="+string+"+painting&tbm=isch&source=lnt&tb s=isz:lt,islt:xga&sa=X&ved=0ahUKEwjumo6jrI7YAhXN6aQKHRsgA7sQpwUIHw";

//invoco la funzione e restituisco l’array di stringhe b = libreria.decripta(myurl);

return b; }

72

libCurl, che si occupa di effettuare la richiesta HTTP e salvare il contenuto della response in una stringa di caratteri.

Nella libreria è presente la funzione decripta() prende in input il pattern di ricerca di Google Images e restituisce la stringa contenente il body della pagina HTML. Le direttive principali della funzione sono le seguenti:

 Viene istanziato un oggetto curl e viene configurato per effettuare richieste a siti protetti da cifratura SSL;

 L’header viene configurato in modo da simulare una richiesta da un browser di ultima generazione per poter ricevere anche gli oggetti JSON con i link delle immagini ad alta risoluzione;

76 XVR non possiede una libreria per poter fare GET Request per protocolli criptati. 77 https://pastebin.com/kJ5t3PEf

curl_global_init(CURL_GLOBAL_ALL); //abilito supporto SSL curl = curl_easy_init(); //avvio la richiesta HTTP

//struttura dati di curl

struct curl_slist *chunk = NULL; //User Agent header

chunk = curl_slist_append(chunk, "User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36");

//Accept header

chunk = curl_slist_append(chunk, "Accept: text/html"); //Incapsulamento degli header

73

 Viene dichiarata una funzione per poter scrivere l’output della richiesta HTTP all’interno di una stringa di caratteri dedicata ad ospitare il body della pagina HTML;

 Il risultato viene convertito in un array di caratteri.

Nel file di intestazione viene specificata una direttiva per l’esportazione della funzione

decripta() in modo che questa possa essere accessibile all’esterno, ovvero al programma di XVR.

3.1.3.2 Funzioni dedicate al parsing

Una volta ottenuto il body della pagina HTML è necessario effettuare un parsing manuale per cercare di estrapolare i dati relativi alle immagini da scaricare per il museo virtuale. Nel caso di Google Images non è stato possibile utilizzare una libreria esterna in quanto l’architettura dei metadati non lo ha reso possibile; per tali ragioni sono state adottate tre funzioni, ovvero

splitInit(), getOuTag() e infine getPath().

//L’URL viene configurato come il pattern in entrata curl_easy_setopt(curl, CURLOPT_URL, s);

//Viene riferita la funzione di scrittura dei risultati curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); //Viene riferita la variabile dove scrivere i dati

curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);

//vettore di caratteri

const char *cstr = readBuffer.c_str(); //calcolo lunghezza del vettore int ii = strlen(cstr);

//copio il vettore su una stringa strcpy_s(returnval, cstr);

//restituisco array di caratteri return returnval;

//rendo visibile la funzione per gli altri programmi extern "C" __declspec(dllexport) char* decripta(char* s);

74 3.1.3.2.1 La funzione splitInit()

Questa funzione prende come parametro in entrata l’intero body della pagina HTML restituita da Google e procede a separare gli oggetti JSON contenenti i metadati delle immagini dai contenuti descrittivi della pagina web. Infine, viene restituito un array di stringhe.

3.1.3.2.2 La funzione getOuTag()

Questa funzione prende come parametro in entrata l’array contenente gli oggetti JSON che comprendono i metadati dei risultati di Google Images. Viene scansionato l’array e recuperate soltanto le stringhe che racchiudono il tag “ou”, in modo da prelevare successivamente i collegamenti diretti alle immagini, scartando tutti gli oggetti e i metadati che non contengono informazioni rilevanti.

function splitInit(string){

var arr;

//Divido il body della pagina inserendo soltanto gli oggetti JSON racchiusi nelle parentesi graffe arr = Split( string, "{" ); return arr; } function getOuTag(splitInit){

var skim = array(0);

for(var i = 0; i<len(splitInit); i++){

//cerco le stringhe che contengono il metadato “ou” if(str_contains(splitInit[i], "\"ou\":")){ aadd(skim, splitInit[i]); } } return skim; }

75 3.1.3.2.3 La funzione getPath()

Con questa funzione vengono estratti i collegamenti diretti alle immagini ad alta risoluzione scremando ulteriormente le stringhe prese in input dall’array ottenuto dalla funzione getOuTag(). Vengono effettuate tutta una serie di operazioni di splitting manuale per poter estrarre soltanto i collegamenti che contengono immagini con il formato JPEG, uno dei pochi supportati dal programma di XVR. Infine i collegamenti vengono aggiunti in un array che sarà utilizzato in seguito per scaricare le immagini.

Con l’analisi di queste funzioni si conclude il paragrafo relativo al recupero delle risorse di Google Images e si passa all’analisi del recupero delle informazioni provenienti da Wikimedia Commons.

function getPath(skimmed){

var pathImg = array(0);

for(var i = 0; i<skimmed; i++){ //si considera il tag “ou” var temp = Split(

skimming[i],

"\"ou\":"

);

//vengono scartate tutte le stringhe che continuano dopo il collegamento

var temp2 = Split( temp[1],

"\""

);

//si considerano soltanto le immagini in formato JPEG

var temp3 = Split( temp2[1],

".jpg"

);

//se un collegamento possiede un immagine JPEG l’array che lo contiene ha una lunghezza superiore a 1 if(len(temp3)>1){ aadd(pathImg, temp2[1]); } } return pathImg; }

76