Machen wir einen LINE Bot mit Ruby + Sinatra - Teil 2

Hallo. In dieser Serie habe ich Ruby und Sinatra mehrmals verwendet.

Ich möchte einen LINE Bot namens "Honmemo!"

Dieser Artikel ist eine Fortsetzung von Teil 1. Wenn Sie es noch nicht gelesen haben, lesen Sie es bitte!

0. Was in diesem Artikel zu machen

In diesem Artikel werde ich ein Programm schreiben, das Suchergebnisse mithilfe einer API zurückgibt, die tatsächlich Buchinformationen zurückgibt. Der Programmablauf ist wie folgt.

linebot.png

0_1. Einführung der Buchsuch-API

Dieses Mal verwenden wir "openBD". openBD ist eine API, die von Carlyl Co., Ltd. und dem Verlag dot com betrieben wird. Sie erhalten grundlegende Informationen zu Büchern und Schatten (Fotos auf dem Cover).

https://api.openbd.jp/v1/get?isbn=9784873113944

Wenn Sie isbn wie folgt übergeben, wird ein Array von Buchdaten im JSON-Format zurückgegeben. Sie können auch mehrere Bücher angeben, indem Sie sie durch Kommas trennen. Detaillierte API-Spezifikationen sind in OpenBD Bibliography API-Datenspezifikationen (v1) beschrieben.

Grundsätzlich können Sie in die Zusammenfassung schauen.

0_2. Tipps: Was ist ISBN?

ISBN ist eine Abkürzung für International Standard Book Number, eine 10- oder 13-stellige Nummer, die jedem Buch eindeutig zugeordnet ist. Es befindet sich auf der Rückseite der meisten Bücher und ist auch ein Barcode. Wenn es sich um ein altes Buch handelt, wird es möglicherweise nur im Impressum aufgeführt. Der Grund, warum Bücher einen zweistufigen Barcode haben, besteht darin, dass sie durch ISBN-Code und Buch-JAN-Code (Produktcode) getrennt sind.

1. Rufen Sie die openBD-API auf

Erstellen Sie eine Funktion, um Folgendes zu erhalten (Sie müssen den Kommentar nicht verschieben).

def getBookByISBN(isbn)
  return nil if !isbn.match(/^(\d{10}|978\d{10})$/) #Gibt null zurück, wenn nicht im ISBN-Format

  uri = URI.parse("https://api.openbd.jp/v1/get?isbn=" + isbn)
  res = Net::HTTP.get_response(uri) #Rufen Sie die API auf
  return nil if res.code != "200" #Gibt null zurück, wenn ein Fehler auftritt
  
  books = JSON.parse(res.body) #API-Ergebnisse als JSON-Format lesen
  return nil if books.length == 0 #Gibt null zurück, wenn die Anzahl der zutreffenden Bücher 0 ist
  
  return books[0] #Gibt das erste der API-Ergebnisse zurück
end

2. Lassen Sie uns die Buchsuchergebnisse im Web anzeigen

Letztes Mal gemacht

get '/' do
  "Hello wolrd!"
end

Lass uns ablenken. Dieses Mal möchte ich eine Spezifikation erstellen, die den Buchnamen zurückgibt, wenn auf "/? Isbn = 978xxxxxxxxxx" zugegriffen wird.

get '/' do
  book = getBookByISBN(params['isbn'])
  return book['summary']['title']
end

Wenn Sie jetzt schreiben können, greifen wir auf "http: // localhost: {PORT} /? Isbn = {ISBN}" Ihres Lieblingsbuchs zu. Wenn der Name des Buches herauskommt, ist es ein Erfolg! スクリーンショット 2020-07-26 0.22.12.png

3. Fügen Sie eine Funktion hinzu, um den Namen des Buches an LINE Bot zurückzugeben

Erinnern Sie sich an den LINE Bot-Code, den ich zuletzt geschrieben habe.

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

Das wichtigste davon

message = {
  type: 'text',
  text: event.message['text']
}
client.reply_message(event['replyToken'], message)

Es ist der Teil von. Dies ist der Vorgang, der ausgeführt werden muss, wenn eine "Textnachricht" vom Benutzer eingeht. Sie können die von event.message ['text'] gesendeten Textdaten erhalten. Sie können eine Antwort mit "client.reply_message (event ['replyToken'], message)" senden.

Lassen Sie uns diesen Code ein wenig verbessern, damit wir nach Büchern suchen können. if event.type === Line :: Bot :: Event :: MessageType :: Text Bitte schreiben Sie den Inhalt von bis end` wie folgt um.

book = getBookByISBN(event.message['text']) #Suchen Sie nach ISBN und weisen Sie Variablen Buchinformationen zu
messages = [] #Variablen für die zu antwortende Nachricht

if book.nil?
  #Wenn das Buch leer ist
  messages.push({
    type: 'text',
    text: 'Das Buch wurde nicht gefunden'
  })
else
  #Wenn ein Buch gefunden wird
  messages.push({
    type: 'text',
    text: book['summary']['title']
  })
end

client.reply_message(event['replyToken'], messages)

Bisher wurde client.reply_message ein Objekt mit den Namen "type" und "text" übergeben, aber diesmal habe ich versucht, ein Array zu übergeben, das das Nachrichtenobjekt enthält. Auf diese Weise können Sie auf mehrere Nachrichten antworten. Es wird beim Erstellen einer Funktion verwendet, um auf das Titelbild zu antworten, das im nächsten Kapitel erscheinen wird!

3_1. Lassen Sie uns bereitstellen

Die Funktionsaddition von LINE Bot ist übrigens abgeschlossen! Ich würde es gerne sofort ausprobieren, aber wie ich letztes Mal erklärt habe, kann ich es nur testen, wenn ich es bereitstelle. Geben Sie den folgenden Befehl ein, der bereitgestellt werden soll.

$ git add -A
$ git commit -m "add search book"
$ git push heroku master

Senden Sie nach Abschluss der Bereitstellung eine ISBN an LINE Bot. Wenn der Buchname wie im folgenden Screenshot gezeigt zurückgegeben wird, sind Sie erfolgreich!

IMG_0541.PNG

4. Fügen Sie eine Funktion hinzu, um das Bild des Buches an LINE Bot zurückzugeben

Als nächstes fügen wir eine Funktion hinzu, um das Titelbild des Buches zurückzugeben.

Das Titelbild kann mit "Buch [" Zusammenfassung "] [" Titel "]" erhalten werden. Da jedoch nicht alle Bücher Bilder enthalten, müssen Sie überprüfen, ob sie vorhanden sind.

Schreiben wir also wie folgt.

book = getBookByISBN(event.message['text']) #Suchen Sie nach ISBN und weisen Sie Variablen Buchinformationen zu
messages = [] #Variablen für die zu antwortende Nachricht

if book.nil?
  #Wenn das Buch leer ist
  messages.push({
    type: 'text',
    text: 'Das Buch wurde nicht gefunden'
  })
else
  #Wenn ein Buch gefunden wird
  if !book['summary']['cover'].empty? 
    #Wenn es ein Titelbild gibt
    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. Lassen Sie uns bereitstellen

Damit ist die Antwortfunktion für das Titelbild abgeschlossen! Geben Sie den folgenden Befehl ein, der bereitgestellt werden soll.

$ git add -A
$ git commit -m "add cover image"
$ git push heroku master

Senden Sie nach Abschluss der Bereitstellung eine ISBN an LINE Bot. Wenn das Titelbild und der Buchname wie im folgenden Screenshot gezeigt zurückgegeben werden, sind Sie erfolgreich!

IMG_0542.PNG

4_2. Nebenbei

Ich führe auch eine einfache Fehlerprüfung durch. Wenn ich also eine nicht vorhandene ISBN sende, wird ein Fehler ordnungsgemäß zurückgegeben.

image.png

Bei einem Buch ohne Titelbild sollte nur der Titel wie folgt zurückgegeben werden.

image.png

5. Zusammenfassung

In diesem Artikel habe ich einen Bot erstellt, der den Titel und das Bild des Buches basierend auf der gesendeten ISBN zurückgibt! Es enthält nützliche Teile zum Erstellen von Bot, z. B. das Senden mehrerer Nachrichten. Ich denke, es ist nützlich, sich daran zu erinnern!

Liste der serialisierten Artikel

  1. Machen wir einen LINE-Bot mit Ruby + Sinatra - Teil 1 - Machen wir einen Bot, der einen Papagei zurückgibt
  2. Machen wir einen LINE-Bot mit Ruby + Sinatra - Teil 2 - Bücher durchsuchen und Informationen zurückgeben ← Imakoko
  3. Machen wir einen LINE Bot mit Ruby + Sinatra - Teil 3 - Nehmen wir die gesuchten Bücher auf (geplant)

Recommended Posts

Machen wir einen LINE Bot mit Ruby + Sinatra - Teil 2
Machen wir einen LINE Bot mit Ruby + Sinatra - Teil 1
Machen Sie ein Tippspiel mit Ruby
Erstellen wir eine Buchverwaltungs-Webanwendung mit Spring Boot part1
Machen wir eine Weihnachtskarte mit Verarbeitung!
Lassen Sie uns mit Spring Boot part3 eine Webanwendung für die Buchverwaltung erstellen
Lassen Sie uns mit Ruby ~ Vorbereitung ~ Poker ziehen
Lassen Sie uns mit Spring Boot part2 eine Webanwendung für die Buchverwaltung erstellen
Erstellen Sie mit Sinatra eine Familien-ToDo-Liste
Extrahieren Sie einen Teil einer Zeichenfolge in Ruby
Lassen Sie uns mit Ruby ~ Test-Unit-Vorbereitung ~ Draw Poker machen
Lassen Sie uns eine Suchfunktion mit Rails (Ransack) machen
Ich habe einen LINE Bot mit Rails + Heroku gemacht
Einfacher LINE BOT mit Java Servlet
So erstellen Sie eine mit Ruby erstellte LINE-Messaging-Funktion
[Java-Grundlagen] Lassen Sie uns ein Dreieck mit einer for-Anweisung erstellen
Ruby mit AtCoder lernen 13 So erstellen Sie ein zweidimensionales Array
Erstellen wir eine einfache API mit EC2 + RDS + Spring Boot ①
Einfacher LINE BOT mit Java Servlet Teil 2: Ich habe versucht, Bildnachrichten und Vorlagen zu erstellen
Ein Hinweis, wenn der Heroku-Befehl nicht mehr verfügbar ist
Ich habe einen LINE Bot mit Rails + Heroku gemacht
Stellen Sie Line Bot mit Rails5 + Docker + Heroku Note bereit
Machen wir einen LINE Bot mit Ruby + Sinatra - Teil 2
Machen wir einen LINE Bot mit Ruby + Sinatra - Teil 1
[Schienen] Getriebe mit LINE Bot schieben
Machen Sie mit Ruby2D ein Labyrinth
Ich möchte mit link_to [Hinweis] eine Schaltfläche mit einem Zeilenumbruch erstellen.
Machen Sie eine Müllabfuhr mit line-bot-sdk-java
Erstellen Sie eine Listenkarte mit LazyMap
Gehen wir mit Watson Assistant (ehemals Conversation). ② Erstellen Sie einen Chatbot für die Hotelreservierung
Wenn Sie mit Ruby eine Zip-Datei erstellen möchten, ist dies Rubyzip.
[LINE BOT] Ich habe einen Ramen BOT mit Java (Maven) + Heroku + Spring Boot (1) gemacht.
Lassen Sie uns mit Ruby Draw Poker machen ~ Implementierung 1 (Karte) ~
Lassen Sie uns mit Ruby Draw Poker machen ~ Implementierung 4 (Deck) ~
Zeichnen Sie Diagramme mit Sinatra und Chartkick
Wie erstelle ich einen Discord Bot (Java)
Ich habe mit Ruby einen riskanten Würfel gemacht
Erstellen Sie trotzdem eine Anmeldefunktion mit Rails
[Docker] [Nginx] Erstellen Sie mit Nginx eine einfache ALB
Lassen Sie uns mit Ruby Draw Poker machen ~ Implementierung 3 (Spieler) ~
[Java] Erstellen wir eine DB-Zugriffsbibliothek!
Lassen Sie uns mit Ruby Draw Poker machen ~ Implementierung 2 (Rolle) ~
Lassen Sie uns mit Rails einen Fehlerbildschirm erstellen
[LINE @] Ich habe versucht, einen westlichen Kalender für einen japanischen Kalender zu konvertieren. BOT [Messaging API]
Erstellen wir eine Taschenrechner-App mit Java ~ Erstellen Sie einen Anzeigebereich im Fenster
Ich habe versucht, mit Javafx ein einfaches Spiel zu machen ① "Lass uns Glücksspiel finden" (unvollendet)
Linienbot
Beginnen wir mit Java-Create a Development Environment ②
Beginnen wir mit Java-Create a Development Environment ①
AtCoder Anfängerwettbewerb 169 A, B, C mit Rubin
Erstellen eines Browser-Automatisierungstools mit Ruby + Selenium
Lassen Sie uns mit Javas Timer einen zeitgesteuerten Prozess erstellen! !!
Verwaltung des Gesprächsstatus (Kontext) (Sitzungsverwaltung?) Mit LINE BOT
Machen wir eine Shopping-Site mit Streifen! (Kauf)
Machen Sie Java Stream Zeilenumbrüche mit Eclipse schön
Machen Sie System.out Mock mit dem Spock Test Framework
Stellen Sie Line Bot mit Rails5 + Docker + Heroku Note bereit
Ich habe mit Ruby On Rails ein Portfolio erstellt