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

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

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

0. Was in diesem Artikel zu machen

In diesem Artikel erstellen wir einen LINE-Bot, der Papageien zurückgibt. Der Programmablauf ist wie folgt. (** Service ** ist das diesmal erstellte Programm) スクリーンショット 2020-07-12 3.23.08.png

1. Bereiten Sie das Projekt vor

Lassen Sie uns zunächst eine Vorlage für das Projekt erstellen. Wenn Sie bereits eine Vorlage haben oder diese in Ihren vorhandenen Code integrieren möchten, fahren Sie mit dem nächsten Kapitel fort.

Terminal


$ bundle init

Generieren Sie eine Gem-Datei mit dem Befehl bundle init. Und lassen Sie uns das folgende Juwel hinzufügen.

Gemfile


#Unterlassung
gem "sinatra"
gem "sinatra-contrib"
gem "dotenv"
gem "line-bot-api"

Installieren Sie die Beschreibung nach Abschluss mit dem Befehl "bundle".

Terminal


$ bundle

Als nächstes erstellen wir die Kerndatei. Diesmal lautet der Dateiname "app.rb".

app.rb


require 'bundler/setup'
Bundler.require
require 'sinatra/reloader' if development?

get '/' do
    "Hello world!"
end

Lassen Sie es uns jetzt ausführen und seine Funktion testen.

Terminal


$ ruby app.rb -o 0.0.0.0

Geben Sie den Befehl ein, um das Programm zu starten. Die Standardportnummer für Sinatra ist 4567, gehen wir also zu http: // localhost: 4567 /. Wenn "Hallo Welt!" Angezeigt wird, ist Sinatras Umgebungskonstruktion abgeschlossen! (Die Portnummern in den Screenshots sind unterschiedlich, weil Sie Docker beißen. Machen Sie sich also keine Sorgen>>)

スクリーンショット 2020-07-12 1.53.41.png

2. Registrieren Sie sich bei LINE Developers

2_1. Melden wir uns an

https://developers.line.biz/ja/ Gehen Sie zu und melden Sie sich an. Wenn Sie normalerweise LINE verwenden, können Sie sich mit einem QR-Code anmelden.

Wenn Sie sich anmelden, sollte ein Bildschirm wie der folgende angezeigt werden. Derzeit können Sie die Sprache über die Schaltfläche unten rechts ändern, um die Verwendung von Japanisch zu vereinfachen.

スクリーンショット 2020-07-12 1.56.50.png

2_2. Anbieter und Kanäle?

Wann immer Sie einen LINE Bot entwickeln, werden die Wörter "Provider" und "Channel" angezeigt. Diese können grob erklärt werden

Es bedeutet, dass · · · Anbieter werden in Einheiten wie Unternehmen, Einzelpersonen und Gruppen von Entwicklern erstellt, und Kanäle gehören zu einem Anbieter.

2_3. Machen wir einen Anbieter

Erstellen wir also zuerst einen Anbieter. Wenn Sie auf "Neuen Anbieter erstellen" klicken, wird ein Bildschirm zur Eingabe des Anbieternamens angezeigt. Geben Sie daher den gewünschten Anbieternamen ein.

スクリーンショット 2020-07-12 2.03.05.png

Der hier eingegebene Anbietername wird als Autor des Bots ** veröffentlicht **. Sie sollten Ihren richtigen Namen aufschreiben. Klicken Sie auf die Schaltfläche Erstellen, um den Anbieter zu erstellen.

2_4. Machen wir einen Kanal

Als nächstes erstellen wir einen Kanal, der ein Bot-Konto ist. Der von Bot verwendete Kanal ist "Messaging-API". Klicken Sie daher auf Messaging-API.

スクリーンショット 2020-07-12 2.05.33.png

Der Einstellungsbildschirm für den neu erstellten Kanal wird angezeigt. Füllen wir den notwendigen Inhalt aus.

Artikel Inhalt
Kanaltyp Messaging API
Anbieter Was ich früher gemacht habe
Kanalsymbol Sie müssen es jetzt nicht einstellen
Kanal Name Bot Name
Kanal Beschreibung Bot Beschreibung
Großindustrie Bot-Genre
Kleinindustrie Detailliertes Genre von Bot
Mail Adresse Die E-Mail-Adresse, unter der Sie über Bot kontaktiert werden. Es ist eine gute Idee, eine E-Mail-Adresse zu verwenden, mit der Sie Kontakt aufnehmen können.
Datenschutz URL Sie müssen es jetzt nicht einstellen
Nutzungsbedingungen URL Sie müssen es jetzt nicht einstellen

Nachdem Sie den erforderlichen Bedingungen zugestimmt haben, klicken Sie auf die Schaltfläche Erstellen, um den Kanal zu erstellen.

3. Schreiben Sie die für den Bot benötigten Schlüssel in die ENV-Datei

Nachdem Sie die Kanäle haben, die Sie für Ihren Bot benötigen, schreiben wir die Schlüssel und Geheimnisse in die ENV-Datei. Sie können es direkt in das Programm schreiben, aber es ist aus Sicherheitsgründen nicht sehr gut.

.env


LINE_CHANNEL_ID=xxxxxxxxxx
LINE_CHANNEL_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
LINE_CHANNEL_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Kanal-ID und Kanalgeheimnis sind "Kanal-Grundeinstellungen" Das Kanal-Token ist in den "Messaging-API-Einstellungen" unter dem Namen "Kanalzugriffstoken (langfristig)" aufgeführt. Wenn es nicht angezeigt wird, klicken Sie auf die Schaltfläche "Veröffentlichen", um es zu veröffentlichen.

Schreiben Sie Dotenv.load unter require, damit die in .env beschriebenen Variablen im Programm verwendet werden können.

app.rb


require 'bundler/setup'
Bundler.require
require 'sinatra/reloader' if development?
Dotenv.load # <-Nachtrag

get '/' do
  "Hello world!"
end

4. Akzeptieren wir Webhooks

4_1 Was ist ein Webhook?

Webhook ist ein Mechanismus, mit dem der Inhalt des Ereignisses an die voreingestellte URL gesendet wird, wenn ein Ereignis im Dienst des anderen Teilnehmers auftritt (LINE in diesem Artikel).

Wenn Sie beispielsweise die URL / callback Ihres Dienstes auf den LINE-Kanal setzen, können Sie / callback den Inhalt der Nachricht POSTEN lassen, wenn eine Nachricht auf dem Kanal eintrifft.

Da es sich jedoch um eine URL handeln muss, auf die vom LINE-Server aus zugegriffen werden kann, funktioniert sie nicht ordnungsgemäß, wenn der Dienst nicht tatsächlich veröffentlicht wird. Beispielsweise ist localhost: 4567 in der Entwicklung eine URL, auf die nur von Ihrem eigenen PC aus zugegriffen werden kann. Selbst wenn eine Nachricht mit "localhost: 4567 / callback" eingestellt ist, wird "localhost: 4567 / callback" nicht aufgerufen.

Aufgrund dieser Spezifikation ist es grundsätzlich erforderlich, jedes Mal bei der Entwicklung eines LINE-Bots bereitzustellen. Wenn Sie den Port öffnen, können Sie die Probleme bei der Bereitstellung jedes Mal sparen, es besteht jedoch ein Sicherheitsrisiko, sodass wir ihn hier nicht vorstellen.

4_2 Webhook empfangen und beantworten

Es ist im Grunde dasselbe wie README auf GitHub, aber es ist ein einfacher Code ohne Bildverarbeitung. https://github.com/line/line-bot-sdk-ruby

app.rb


require 'bundler/setup'
Bundler.require
require 'sinatra/reloader' if development?
Dotenv.load

# ======Nachtrag von hier======

def client
  @client ||= Line::Bot::Client.new { |config|
    config.channel_id = ENV["LINE_CHANNEL_ID"]
    config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
    config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
  }
end

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

# ======Nachtrag bis hierher======

get '/' do
  "Hello wolrd!"
end

Ich werde den Code unten erklären.

4_3 Codeerklärung

def client
  @client ||= Line::Bot::Client.new { |config|
    config.channel_id = ENV["LINE_CHANNEL_ID"]
    config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
    config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
  }
end

Dies ist der Code, mit dem der "Client" den LINE-Bot bedienen kann (dies ist eine Funktion von "line-bot-api"). Sie können einen Client mit Line :: Bot :: Client.new erstellen, dieser wird jedoch wie folgt implementiert, da ein Client für einen Service ausreicht. ||=Mit dem Operator@Wenn der Client leer istLine::Bot::Client.newUnd gib es weiter.@Wenn der Client bereits angemeldet ist, übergeben Sie ihn. Die Verarbeitung wird realisiert.

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

Der Block "post" / callback'do ist etwas lang, daher werde ich ihn separat erläutern. body = request.body.read weist die gesendeten Daten nur der body-Variablen zu.

Nach der Signatur prüfen wir, ob die gesendeten Daten wirklich vom LINE-Server stammen. Die vom LINE-Server gesendeten Daten enthalten immer "HTTP_X_LINE_SIGNATURE". Sie können anhand des Inhalts überprüfen, ob es sich um die vom LINE-Server gesendeten Daten handelt. Die Bestätigung, ob es sich um einen LINE-Server handelt, ist in line-bot-api implementiert und kann über den zuvor erstellten Client verwendet werden. Der Überprüfungsprozess wird in dem Teil ausgeführt, der "client.validate_signature (body, Signatur)" heißt.

Dies ist ein wichtiger Code, der überprüft, ob eine böswillige Person den LINE-Server fälscht und eine Nachricht sendet.

  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

In "events = client.parse_events_from (body)" werden die gesendeten Daten in eine Form konvertiert, die mit Ruby einfach zu handhaben ist. Das Ergebnis der Konvertierung ist ein Array von Ereignissen, wie Sie anhand der Namensereignisse sehen können.

events.each do |event|Verarbeitet mehrere Ereignisse nacheinander. Dies liegt daran, dass möglicherweise mehrere Ereignisse gleichzeitig gesendet werden.

if event.is_a? (Line :: Bot :: Event :: Message) prüft, ob der Ereignistyp Message ist. Nicht-Nachrichtenereignisse umfassen "Freund hinzufügen" und "Blockierung aufheben".

if event.type === Line :: Bot :: Event :: MessageType :: Text bestätigt, dass der Nachrichtentyp Text ist. Zu den Nicht-Textnachrichtentypen gehören Bilder, Videos und Stempel.

Mit anderen Worten, der Code aus den oberen 4 Zeilen wird verwendet, um "die übertragenen Daten zu analysieren und nur die Textnachricht einzugrenzen".


Schauen wir uns als nächstes den Code in der if-Anweisung an

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

Die oberen vier Zeilen bilden die Nachricht, die an den LINE-Server gesendet werden soll, und die letzte Zeile sendet die Antwort. event ['replyToken'] ist das im Ereignis enthaltene Antworttoken.


Am Ende habe ich "OK" geschrieben, aber es folgt der Regel der LINE Bot API, dass es notwendig ist, die richtige Antwort zurückzugeben, wenn der Prozess normal erfolgreich ist. Es ist in Ordnung, etwas zurückzugeben.

4_4 Lassen Sie uns bereitstellen

Nachdem der Code vollständig ist, können wir ihn ausführen! Leider funktioniert es, wie ich zuvor erklärt habe, nicht, wenn es lokal ausgeführt wird. Also werde ich es dieses Mal für Heroku bereitstellen.

Ich werde die Details der Bereitstellung in Heroku weglassen, aber lassen Sie uns nur Procfile erstellen.

Procfile


web: bundle exec ruby app.rb -o 0.0.0.0 -p $PORT

Terminal


$ git init
$ git add -A
$ git commit -m "first commit"
$ heroku create
$ git push heroku master

Öffnen Sie nach der Bereitstellung die Anwendung. Wenn "Hallo Welt!" Angezeigt wird, ist die Bereitstellung abgeschlossen!

4_5 Richten wir einen Webhook ein

Gehen Sie zur LINE Developers-Site und zum Bildschirm mit den Kanaleinstellungen. Öffnen Sie die Messaging-API-Einstellungen und klicken Sie auf Webhook-URL bearbeiten. Ein Feld zur Eingabe der URL wird angezeigt. Geben Sie also "URL + / Rückruf" ein, den Sie gerade bereitgestellt haben, und klicken Sie auf die Schaltfläche "Aktualisieren".

Die bereitgestellte URL lautet beispielsweise https://xxxxxxx-yyyyyy-zzzzz.herokuapp.com Wenn ja https://xxxxxxx-yyyyyy-zzzzz.herokuapp.com/callback` Es wird sein.

Lassen Sie uns danach die Verwendung von Webhook überprüfen.

`![Screenshot 2020-07-12 4.14.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672451/d25d1f73-bcee-6424-c5f3 -0b65709b2414.png)

Sie können den Betrieb des Servers überprüfen, indem Sie auf die Bestätigungstaste klicken. Wenn es als erfolgreich angezeigt wird, gibt es kein Problem.


Außerdem können derzeit keine Bot-Nachrichten gesendet werden, da Nachrichten mit automatischer Antwort aktiviert sind. Deaktivieren Sie also die automatische Telefonzentrale.

スクリーンショット 2020-07-12 4.17.19.png

Klicken Sie in den Einstellungen der Messaging-API auf die Schaltfläche Antwortnachricht bearbeiten. Anschließend wird eine Seite mit den Namen Antworteinstellungen angezeigt, also in den folgenden detaillierten Einstellungen

Einstellen.

スクリーンショット 2020-07-12 4.18.33.png

Jetzt können Sie den Webhook verwenden.

5. Lass es uns versuchen

Nun, alles ist fertig! Fügen Sie Ihren Freunden einen Bot hinzu und senden Sie eine Nachricht! In den "Messaging-API-Einstellungen" befindet sich ein QR-Code. Lesen Sie ihn daher mit LINE. Sie sollten in der Lage sein, sich mit dem von Ihnen erstellten Bot anzufreunden.

Wenn Sie Freunde finden können, senden Sie eine Nachricht. Wenn Sie dieselbe Nachricht erhalten, die Sie gesendet haben, sind Sie erfolgreich! Danke für Ihre Unterstützung!

IMG_1505A6F48E6C-1.jpeg

6. Zusammenfassung

In diesem Artikel habe ich einen Bot erstellt, der einen Papagei der gesendeten Nachricht zurückgibt. Es ist sehr einfach, aber es enthält viele wichtige Codes, die für die Erstellung eines Bots unerlässlich sind. Es ist daher eine gute Idee, sich damit vertraut zu machen!

Der nächste Artikel ist hier

Liste der serialisierten Artikel

  1. Machen wir einen LINE-Bot mit Ruby + Sinatra - Teil 1 - Machen wir einen Bot, der einen Papagei zurückgibt ← Imakoko
  2. Lassen Sie uns mit Ruby + Sinatra einen LINE-Bot erstellen - Teil 2 - Nach Büchern suchen und Informationen zurückgeben
  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!
Erstellen Sie mit Sinatra eine Familien-ToDo-Liste
Erstellen Sie mit Sinatra eine Familien-ToDo-Liste
Extrahieren Sie einen Teil einer Zeichenfolge in Ruby
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
[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.
Erstellen Sie mit JavaFX ein Diashow-Tool
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.
Notieren Sie sich die Ruby-Schlüsselwortargumente
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]
Ich habe eine App für maschinelles Lernen mit Dash (+ Docker) Teil 3 ~ Übung ~ erstellt
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
Beachten Sie, dass ich feststeckte, als ein Papagei LINE Bot mit Heroku + Sinatra zurückgab
Lassen Sie uns einen Leistungsschalter für den Backend-Service mit Actuator of Spring Boot (Teil 1) herstellen.