Bonjour. Dans cette série, j'ai utilisé Ruby et Sinatra plusieurs fois.
--Envoyez le code ISBN au dos du livre pour rechercher et afficher l'image du livre
Je voudrais créer un Bot LINE appelé "Honmemo!"
Cet article est une suite de la Partie 1. Si vous ne l'avez pas encore lu, veuillez le lire!
Dans cet article, j'écrirai un programme qui renvoie les résultats de la recherche à l'aide d'une API qui renvoie réellement des informations sur le livre. Le déroulement du programme est le suivant.
Cette fois, nous utiliserons "openBD". openBD est une API exploitée par Carlyl Co., Ltd. et l'éditeur dot com, et vous pouvez obtenir des informations de base sur les livres et les ombres (photos sur la couverture).
https://api.openbd.jp/v1/get?isbn=9784873113944
Si vous passez isbn comme ceci, un tableau de données de livre sera renvoyé au format JSON. Vous pouvez également spécifier plusieurs livres en les séparant par des virgules. Les spécifications détaillées de l'API sont décrites dans OpenBD Bibliography API Data Specifications (v1).
En gros, vous pouvez regarder à l'intérieur du résumé.
ISBN est une abréviation pour International Standard Book Number, qui est un numéro à 10 ou 13 chiffres attaché de manière unique à n'importe quel livre. Il se trouve au dos de la plupart des livres et est également un code à barres. S'il s'agit d'un vieux livre, il ne peut figurer que dans l'empreinte. Les livres ont un code à barres à deux niveaux car ils sont séparés par le code ISBN et le code JAN du livre (code produit).
Créez une fonction pour obtenir comme suit (vous n'avez pas à déplacer le commentaire).
def getBookByISBN(isbn)
return nil if !isbn.match(/^(\d{10}|978\d{10})$/) #Renvoie nil si ce n'est pas au format ISBN
uri = URI.parse("https://api.openbd.jp/v1/get?isbn=" + isbn)
res = Net::HTTP.get_response(uri) #Appelez l'API
return nil if res.code != "200" #Renvoie nil si une erreur se produit
books = JSON.parse(res.body) #Lire les résultats de l'API au format JSON
return nil if books.length == 0 #Renvoie nil si le nombre de livres applicables est égal à 0
return books[0] #Renvoie le premier des résultats de l'API
end
Fait la dernière fois
get '/' do
"Hello wolrd!"
end
Détournons-nous.
Cette fois, je voudrais en faire une spécification qui renvoie le nom du livre lorsque /? Isbn = 978xxxxxxxxxx
est accédé.
get '/' do
book = getBookByISBN(params['isbn'])
return book['summary']['title']
end
Maintenant, si vous pouvez écrire jusqu'à présent, accédons à http: // localhost: {PORT} /? Isbn = {ISBN}
de votre livre préféré.
Si le nom du livre sort, c'est une réussite!
Rappelez-vous le code du bot LINE que j'ai écrit la dernière fois.
post '/callback' do
body = request.body.read
signature = request.env['HTTP_X_LINE_SIGNATURE']
unless client.validate_signature(body, signature)
error 400 do 'Bad Request' end
end
events = client.parse_events_from(body)
events.each do |event|
if event.is_a?(Line::Bot::Event::Message)
if event.type === Line::Bot::Event::MessageType::Text
message = {
type: 'text',
text: event.message['text']
}
client.reply_message(event['replyToken'], message)
end
end
end
"OK"
end
Le plus important d'entre eux
message = {
type: 'text',
text: event.message['text']
}
client.reply_message(event['replyToken'], message)
C'est la partie de.
C'est le processus à effectuer lorsqu'un "message texte" arrive de l'utilisateur.
Vous pouvez obtenir les données texte envoyées par ʻevent.message ['text'] . Vous pouvez envoyer une réponse avec
client.reply_message (event ['replyToken'], message)`.
Améliorons un peu ce code afin de pouvoir rechercher des livres.
ʻSi event.type === Line :: Bot :: Event :: MessageType :: Réécrit le contenu de Text en ʻend
comme suit.
book = getBookByISBN(event.message['text']) #Rechercher un ISBN et attribuer des informations sur le livre à des variables
messages = [] #Variables pour le message à répondre
if book.nil?
#Si le livre est vide
messages.push({
type: 'text',
text: 'Le livre n'a pas été trouvé'
})
else
#Si un livre est trouvé
messages.push({
type: 'text',
text: book['summary']['title']
})
end
client.reply_message(event['replyToken'], messages)
Jusqu'à présent, client.reply_message recevait un objet avec un message appelé type
et text
, mais cette fois j'ai essayé de passer un tableau contenant l'objet message.
Cela vous permettra de répondre à plusieurs messages. Il sera utilisé lors de la création d'une fonction pour répondre à l'image de couverture qui apparaîtra dans le chapitre suivant!
Au fait, l'ajout de fonctions de LINE Bot est terminé! J'aimerais l'essayer immédiatement, mais comme je l'ai expliqué la dernière fois, je ne peux pas le tester à moins de le déployer. Entrez la commande suivante pour déployer.
$ git add -A
$ git commit -m "add search book"
$ git push heroku master
Une fois le déploiement terminé, envoyons un ISBN à LINE Bot. Si le nom du livre est renvoyé comme indiqué dans la capture d'écran ci-dessous, vous avez réussi!
Ensuite, ajoutons une fonction pour renvoyer l'image de couverture du livre.
L'image de couverture peut être obtenue avec livre ['résumé'] ['couverture']
.
Cependant, tous les livres ne contiennent pas d'images, vous devez donc vérifier si elles existent.
Alors, écrivons comme suit.
book = getBookByISBN(event.message['text']) #Rechercher un ISBN et attribuer des informations sur le livre à des variables
messages = [] #Variables pour le message à répondre
if book.nil?
#Si le livre est vide
messages.push({
type: 'text',
text: 'Le livre n'a pas été trouvé'
})
else
#Si un livre est trouvé
if !book['summary']['cover'].empty?
#S'il y a une image de couverture
messages.push({
type: 'image',
originalContentUrl: book['summary']['cover'],
previewImageUrl: book['summary']['cover'],
})
end
messages.push({
type: 'text',
text: book['summary']['title']
})
end
client.reply_message(event['replyToken'], messages)
Ceci termine la fonction de réponse pour l'image de couverture! Entrez la commande suivante pour déployer.
$ git add -A
$ git commit -m "add cover image"
$ git push heroku master
Une fois le déploiement terminé, envoyons un ISBN à LINE Bot. Si l'image de couverture et le nom du livre sont renvoyés comme indiqué dans la capture d'écran ci-dessous, vous avez réussi!
Je fais également un simple contrôle d'erreur, donc si j'envoie un ISBN qui n'existe pas, une erreur sera renvoyée correctement.
De plus, dans le cas d'un livre sans image de couverture, seul le titre doit être retourné comme ceci.
Dans cet article, j'ai réalisé un Bot qui renvoie le titre et l'image du livre en fonction de l'ISBN envoyé! Il contient des parties utiles pour créer Bot, comme l'envoi de plusieurs messages, donc je pense qu'il est utile de s'en souvenir!
Recommended Posts