Faisons un Bot LINE avec Ruby + Sinatra - Partie 2

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!

0. Que faire dans cet article

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.

linebot.png

0_1. Introduction de l'API de recherche de livres

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é.

0_2. Conseils: qu'est-ce que l'ISBN?

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).

1. Appelez l'API openBD

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

2. Affiche les résultats de la recherche de livres sur le Web

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! スクリーンショット 2020-07-26 0.22.12.png

3. Ajoutez une fonction pour renvoyer le nom du livre à LINE Bot

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!

3_1. Déployons

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!

IMG_0541.PNG

4. Ajoutez une fonction pour renvoyer l'image du livre à LINE Bot

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)

4_1. Déployons

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!

IMG_0542.PNG

4_2. À part

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.

image.png

De plus, dans le cas d'un livre sans image de couverture, seul le titre doit être retourné comme ceci.

image.png

5. Résumé

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!

Liste des articles sérialisés

  1. Faisons un Bot LINE avec Ruby + Sinatra - Partie 1 - Faisons un Bot qui renvoie un perroquet
  2. Faisons un Bot LINE avec Ruby + Sinatra - Partie 2 - Recherche de livres et retour d'informations ← Imakoko
  3. Faisons un bot LINE avec Ruby + Sinatra - Partie 3 - Enregistrons les livres recherchés (prévu)

Recommended Posts

Faisons un Bot LINE avec Ruby + Sinatra - Partie 2
Faisons un Bot LINE avec Ruby + Sinatra - Partie 1
Faites un jeu de frappe avec ruby
Créons une application Web de gestion de livres avec Spring Boot part1
Faisons une carte de Noël avec Processing!
Créons une application Web de gestion de livres avec Spring Boot part3
Faisons dessiner du poker avec du rubis ~ Préparation ~
Créons une application Web de gestion de livres avec Spring Boot part2
Faites une liste de choses à faire en famille avec Sinatra
Extraire une partie d'une chaîne en Ruby
Faisons Draw Poker avec Ruby ~ Préparation de l'unité de test ~
Faisons une fonction de recherche avec Rails (ransack)
J'ai créé un robot LINE avec Rails + heroku
Facile à créer LINE BOT avec Java Servlet
Comment créer une fonction de messagerie LINE avec Ruby
[Bases de Java] Créons un triangle avec une instruction for
Apprendre Ruby avec AtCoder 13 Comment créer un tableau à deux dimensions
Faisons une API simple avec EC2 + RDS + Spring boot ①
Facile à créer LINE BOT avec Java Servlet Partie 2: J'ai essayé des messages image et des modèles
Une note lorsque la commande heroku devient indisponible
J'ai créé un robot LINE avec Rails + heroku
Déployer le bot Line avec rails5 + Docker + Heroku Note
Faisons un Bot LINE avec Ruby + Sinatra - Partie 2
Faisons un Bot LINE avec Ruby + Sinatra - Partie 1
[Rails] Transmission push avec LINE Bot
Créez un labyrinthe de fouilles avec Ruby2D
Je veux créer un bouton avec un saut de ligne avec link_to [Note]
Faire un rappel de garbage avec line-bot-sdk-java
Créer une carte de liste avec LazyMap
C'est parti avec Watson Assistant (anciennement Conversation) ② Faire un chatbot de réservation d'hôtel
Si vous voulez créer un fichier zip avec Ruby, c'est rubyzip.
[LINE BOT] J'ai créé un Ramen BOT avec Java (Maven) + Heroku + Spring Boot (1)
Faisons tirer le poker avec ruby ~ Implémentation 1 (carte) ~
Faisons dessiner du poker avec ruby ~ Implémentation 4 (Deck) ~
Dessinez des graphiques avec Sinatra et Chartkick
Comment créer un robot Discord (Java)
J'ai fait une mort risquée avec Ruby
Créez quand même une fonction de connexion avec Rails
[docker] [nginx] Créer un ALB simple avec nginx
Faisons tirer le poker avec ruby ~ Implémentation 3 (joueur) ~
[Java] Créons une bibliothèque d'accès à la base de données!
Faisons dessiner du poker avec ruby ~ Implémentation 2 (rôle) ~
Faisons un écran d'erreur avec Rails
[LINE @] J'ai essayé de créer un BOT de conversion de calendrier occidental de calendrier japonais [API de messagerie]
Faisons une application de calculatrice avec Java ~ Créez une zone d'affichage dans la fenêtre
J'ai essayé de faire un jeu simple avec Javafx ① "Trouvons le jeu du bonheur" (inachevé)
bot de ligne
Commençons par Java - Créez un environnement de développement ②
Commençons par Java - Créez un environnement de développement ①
AtCoder Beginner Contest 169 A, B, C avec rubis
Création d'un outil d'automatisation de navigateur avec Ruby + Selenium
Créons un processus chronométré avec la minuterie de Java! !!
Gestion de l'état de la conversation (contexte) (gestion de session?) Avec LINE BOT
Faisons un site de shopping en utilisant Stripe! (Achat)
Rendre la ligne Java Stream agréable avec Eclipse
Rendre System.out Mock avec Spock Test Framework
Déployer le bot Line avec rails5 + Docker + Heroku Note
J'ai fait un portfolio avec Ruby On Rails