• User

    Interrogazione API Google Books - dati mancanti

    Ciao a tutti!

    Sto lavorando ad un progetto per la catalogazione dei libri che abbiamo a casa e sto cercando di usufruire delle API di Google Books per ricavare i dettagli di ogni libro tramite il codice ISBN.

    Nel particolare, tramite VBA interrogo le API e faccio il parsing del risultato JSON per trasformarlo in un normale dizionario che posso consultare per popolare i vari campi. A livello di procedura nessun problema, tuttavia ho notato che i risultati che ricavo con l'API sono solo parziali e mancano di informazioni essenziali, nella maggior parte dei casi non ho trovato la casa editrice per esempio.

    Il mio codice é quello che segue (VBA):

    Sub GoogleBooksAPI()
    
    #''//// Extract Details from Google Books API Based on ISBN ////''
    #'' Author: Toti Pappalardo
    #'' Date: 20/07/2020
    #'' Last Update: 21/11/2020
    
    Dim xml_obj As MSXML2.XMLHTTP60
    
    Set xml_obj = New MSXML2.XMLHTTP60
    
    base_url = "https://www.googleapis.com/books/v1/volumes?q=isbn:"
    ISBN = Sheets("Inserimento").Range("ISBN").Value #Viene preso dalla cella di riferimento nel foglio Excel
    
    #''Controllo che il campo ISBN non sia vuoto
    If ISBN = "" Then
        MsgBox ("Inserire un ISBN valido")
        Exit Sub
    End If
    
    api_url = base_url & ISBN
    
    xml_obj.Open bstrMethod:="GET", bstrURL:=api_url
    xml_obj.Send
    
    Debug.Print "Request Code: " & CStr(xml_obj.Status)
    Debug.Print xml_obj.responseText
    
    Dim Json As Object
    Dim result As Dictionary
    Dim Val As Variant
    Dim Val2 As Dictionary
    
    Dim Title, Subtitle, Author, Publisher, PubDate, Pages, Descr, Ctgr, img_url As String
    
    Set Json = JsonConverter.ParseJson(xml_obj.responseText)
    
    
    For Each result In Json("items")
        Title = result("volumeInfo")("title")
        Debug.Print Title
        Subtitle = result("volumeInfo")("subtitle")
        For Each Val In result("volumeInfo")("authors")
            Author = Author & Val & ", "
        Next
        Author = Left(Author, Len(Author) - 2)
        Publisher = result("volumeInfo")("publisher")
        PubDate = result("volumeInfo")("publishedDate")
        Pages = result("volumeInfo")("pageCount")
        Descr = result("volumeInfo")("description")
        img_url = result("volumeInfo")("imageLinks")("smallThumbnail")
    Next
    
    #'************** Creazione Userform con label dinamiche ***************'
    With Results_Form
        .Title.Caption = Title
        .Subtitle.Caption = Subtitle
        .Author.Caption = Author
        .Publisher.Caption = Publisher
        .Pub_Date.Caption = PubDate
        .Pages.Caption = Pages
        .Excerpt.Caption = Descr
        .Cover_img.Navigate img_url
    End With
    
    Results_Form.Show
    
    End Sub
    

    La procedura va a buon fine, ma come dicevo non tutti i parametri vengono popolati.

    Esempio pratico:

    Il codice ISBN 9788856658781 corrisponde al libro "Una Perfetta Sconosciuta", che su Google Books si trova a questa pagina

    Il JSON che ricevo dalla chiamata API con il parametro "isbn:9788856658781" é questo:

    {
      "kind": "books#volumes",
      "totalItems": 1,
      "items": [
        {
          "kind": "books#volume",
          "id": "IBoIMQAACAAJ",
          "etag": "15Q4/Obi0+k",
          "selfLink": "https://www.googleapis.com/books/v1/volumes/IBoIMQAACAAJ",
          "volumeInfo": {
            "title": "Una perfetta sconosciuta",
            "authors": [
              "Alafair Burke"
            ],
            "publishedDate": "2017-03-14",
            "industryIdentifiers": [
              {
                "type": "ISBN_10",
                "identifier": "885665878X"
              },
              {
                "type": "ISBN_13",
                "identifier": "9788856658781"
              }
            ],
            "readingModes": {
              "text": false,
              "image": false
            },
            "pageCount": 380,
            "printType": "BOOK",
            "categories": [
              "Fiction"
            ],
            "maturityRating": "NOT_MATURE",
            "allowAnonLogging": false,
            "contentVersion": "preview-1.0.0",
            "panelizationSummary": {
              "containsEpubBubbles": false,
              "containsImageBubbles": false
            },
            "imageLinks": {
              "smallThumbnail": "http://books.google.com/books/content?id=IBoIMQAACAAJ&printsec=frontcover&img=1&zoom=5&source=gbs_api",
              "thumbnail": "http://books.google.com/books/content?id=IBoIMQAACAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api"
            },
            "language": "it",
            "previewLink": "http://books.google.at/books?id=IBoIMQAACAAJ&dq=isbn:9788856658781&hl=&cd=1&source=gbs_api",
            "infoLink": "http://books.google.at/books?id=IBoIMQAACAAJ&dq=isbn:9788856658781&hl=&source=gbs_api",
            "canonicalVolumeLink": "https://books.google.com/books/about/Una_perfetta_sconosciuta.html?hl=&id=IBoIMQAACAAJ"
          },
          "saleInfo": {
            "country": "AT",
            "saleability": "NOT_FOR_SALE",
            "isEbook": false
          },
          "accessInfo": {
            "country": "AT",
            "viewability": "NO_PAGES",
            "embeddable": false,
            "publicDomain": false,
            "textToSpeechPermission": "ALLOWED",
            "epub": {
              "isAvailable": false
            },
            "pdf": {
              "isAvailable": false
            },
            "webReaderLink": "http://play.google.com/books/reader?id=IBoIMQAACAAJ&hl=&printsec=frontcover&source=gbs_api",
            "accessViewStatus": "NONE",
            "quoteSharingAllowed": false
          }
        }
      ]
    }
    

    Dove chiaramente mancano casa editrice e Trama che sono invece presenti sulla piattaforma.

    Qualcuno ha esperienze in merito e sa darmi informazioni su possibili soluzioni?

    Scusatemi se sono stato troppo lungo e GRAZIE se siete arrivati fin quaggiú a leggere 🙂


  • Moderatore

    Ciao
    il progetto è offline o online?


  • User

    Ciao Sermatica, tutto offline. si collega solo per ricavare le info del libro tramite API, ma il resto é tutto in local.