ISBN -> Pesquisa do BookData para preencher um banco de dados
-
20-09-2019 - |
Pergunta
Ok, eu querendo banco de dados uma pequena biblioteca.
Eu só tive experiência limitada com bancos de dados e nenhum com consultas de um servidor da web.
Vou querer recuperar informações como o título, o editor, talvez o autor, descrição da maneira mais simples que consigo pensar em fazer isso.
Eu já me deparei com o ISBNDB.com antes, mas a API para acessar isso parece bastante complexa.
Estou me perguntando como deveria fazer isso.
Solução
Recentemente, tive que fazer exatamente isso enquanto indexamos nossa biblioteca para fins de seguro. Abaixo está o código da classe VBA que hackeei:
Option Compare Database
dim BookTitle As String
dim BookTitleLong As String
dim BookAuthorsText As String
dim BookPublisherText As String
dim BookSummary As String
dim BookNotes As String
dim accessKey As String
Private Sub Class_Initialize()
'Your isbnDB access key'
accessKey = "PUT ACCESSKEY HERE"
End Sub
Property Get Title() As String
Title = BookTitle
End Property
Property Get TitleLong() As String
TitleLong = BookTitleLong
End Property
Property Get AuthorsText() As String
AuthorsText = BookAuthorsText
End Property
Property Get PublisherText() As String
PublisherText = BookPublisherText
End Property
Property Get Summary() As String
Summary = BookSummary
End Property
Property Get Notes() As String
Notes = BookNotes
End Property
Public Function Lookup(isbn As String) As Boolean
Lookup = False
Dim xmlhttp
Set xmlhttp = CreateObject("MSXML2.xmlhttp")
xmlhttp.Open "GET", "https://isbndb.com/api/books.xml?access_key=" & accessKey & "&results=texts&index1=isbn&value1=" & isbn, False
xmlhttp.send
'Debug.Print "Response: " & xmlhttp.responseXML.XML'
Dim xmldoc
Set xmldoc = CreateObject("Microsoft.XMLDOM")
xmldoc.async = False
'Note: the ResponseXml property parses the server's response, responsetext doesn't
xmldoc.loadXML (xmlhttp.responseXML.XML)
If (xmldoc.selectSingleNode("//BookList").getAttribute("total_results") = 0) Then
MsgBox "Invalid ISBN or not in database"
Exit Function
End If
If (xmldoc.selectSingleNode("//BookList").getAttribute("total_results") > 1) Then
MsgBox "Caution, got more than one result!"
Exit Function
End If
BookTitle = xmldoc.selectSingleNode("//BookData/Title").Text
BookTitleLong = xmldoc.selectSingleNode("//BookData/TitleLong").Text
BookAuthorsText = xmldoc.selectSingleNode("//BookData/AuthorsText").Text
BookPublisherText = xmldoc.selectSingleNode("//BookData/PublisherText").Text
BookNotes = xmldoc.selectSingleNode("//BookData/Notes").Text
BookSummary = xmldoc.selectSingleNode("//BookData/Summary").Text
Lookup = True
End Function
Obtenha uma chave da API, cole o código acima (com sua chave) em um novo módulo de classe no editor VBA (módulo de classe de inserção) e nomeie o módulo "ISBN". Você também precisa adicionar uma referência ao "Microsoft XML" no editor VBA (Ferramentas-> Referências)
Você pode testar que funciona com o trecho de código abaixo em um módulo VBA normal:
Public Function testlookup()
Dim book
Set book = New isbn
book.Lookup ("0007102968")
Debug.Print book.Title
Debug.Print book.PublisherText
End Function
Em seguida, basta digitar "TestLookup" na janela imediata (View-> Janela imediata). Você deve ver uma resposta de:
The Times book of quotations
[Glasgow] : Times Books : 2000.
O ISBNDB pode retornar mais do que os dados que coleciono na classe acima, leia a referência da API aqui: http://isbndb.com/docs/api/ e adapte a aula às suas necessidades.
Achei este artigo muito útil para explicar como usar o XMLHTTP do INFER ACCESS:http://www.15seconds.com/issue/991125.htm
As páginas do MSDN nos métodos XML DOM e o objeto xmlHttPrequest também foram úteis (porque sou um novo usuário, só posso postar dois links ativos, você precisará substituir os pontos nos URLs abaixo):
msdn Microsoft com/en-us/biblioteca/ms757828 (v = vs.85) .aspx
msdn Microsoft com/en-us/biblioteca/ms535874 (v = vs.85) .aspx
Outras dicas
Esta é uma resposta incompleta, mas deve começar (não trabalhei com dados XML como retorno).
Este código tem o básico:
Dim oHttp As Object
Set oHttp = CreateObject("Microsoft.XMLHTTP")
oHttp.Open "GET", "https://isbndb.com/api/books.xml?access_key=YourKey&results=texts&index1=isbn&value1=YourISBN", False
oHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
oHttp.Send vbNullString
Debug.Print oHttp.responseText
A resposta da página da web está na propriedade .ResponseText do objeto XMLHTTP. Como você processa isso está além de mim. Sei que um dos gurus do grupo de notícias Access publicou um tutorial sobre consumo de serviços da Web do Access, mas não consigo localizá -lo. Este artigo pode ter algo a ver com o problema:
A API do ISBNDB.com parece simples. A solicitação a seguir deve recuperar as informações que você deseja ... basta substituir sua chave de acesso por "YourKey" e o ISBN para "yourisbn".
https://isbndb.com/api/books.xml?access_key=YourKey&results=texts&index1=isbn&value1=YourISBN
A resposta é XML, que contém informações sobre o livro único cujo ISBN você enviou.
Você pode usar o Marc21 XML da Biblioteca do Congresso.
Fiz a mesma coisa que você, construindo um banco de dados para abrigar minha biblioteca. A digitalização no ISBN coleta os dados deste URLhttp://z3950.loc.gov:7090/voyager?version=1.1&operation=searchretrieve&query=your_isbn&maximumrecords=1
Os dados de resposta preenchem um formulário com todos os dados. Você não precisa de uma conta, apenas esse URL.
A resposta vem no XML (como mencionado) e você pode analisar a partir daí usando qualquer idioma que desejar (minha escolha é PHP).
Que linguagem você está usando? Você precisa de um programa/script para apresentar um formulário em que você possa inserir o ISBN, que obteria os dados do iSBNDB.com e preencher o banco de dados. Eu usei a API um pouco, mas não há algum tempo, e é bem direta.