Faisons un Bot LINE avec Ruby + Sinatra - Partie 1

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!"

0. Que faire dans cet article

Dans cet article, nous allons créer un Bot LINE qui renvoie les perroquets. Le déroulement du programme est le suivant. (** Service ** est le programme créé cette fois) スクリーンショット 2020-07-12 3.23.08.png

1. Préparez le projet

Commençons par créer un modèle pour le projet. Si vous avez déjà un modèle ou souhaitez l'intégrer dans votre code existant, passez au chapitre suivant.

Terminal


$ bundle init

Générez un Gemfile avec la commande bundle init. Et ajoutons le joyau suivant.

Gemfile


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

Après avoir terminé la description, installez-le avec la commande bundle.

Terminal


$ bundle

Ensuite, nous allons créer le fichier de base. Cette fois, le nom du fichier est ʻapp.rb`.

app.rb


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

get '/' do
    "Hello world!"
end

Maintenant, exécutons-le et testons son fonctionnement.

Terminal


$ ruby app.rb -o 0.0.0.0

Entrez la commande pour démarrer le programme. Le numéro de port par défaut pour Sinatra est 4567, alors allons à http: // localhost: 4567 /. Lorsque "Hello world!" S'affiche, la construction de l'environnement de Sinatra est terminée! (Les numéros de port dans les captures d'écran sont différents parce que vous mordez Docker, alors ne vous inquiétez pas trop> <)

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

2. Inscrivez-vous auprès des développeurs LINE

2_1. Connectons-nous

https://developers.line.biz/ja/ Accédez à et connectez-vous. Si vous utilisez normalement LINE, vous pouvez vous connecter avec un code QR.

Lorsque vous vous connectez, vous devriez voir un écran comme celui ci-dessous. Pour le moment, vous pouvez changer la langue à partir du bouton en bas à droite, il est donc plus facile d'utiliser le japonais.

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

2_2. Fournisseurs et canaux?

Chaque fois que vous développez un Bot LINE, les mots «fournisseur» et «canal» apparaissent. Ceux-ci peuvent être expliqués grossièrement

--Fournisseur: compte développeur --Channel: compte Bot

Cela signifie que · · · Les fournisseurs sont créés dans des unités telles que des entreprises, des individus et des groupes de développeurs, et les canaux appartiennent à un fournisseur.

2_3. Faisons un fournisseur

Alors créons d'abord un fournisseur. Lorsque vous cliquez sur "Créer un nouveau fournisseur", un écran pour saisir le nom du fournisseur apparaîtra, alors entrez le nom du fournisseur que vous aimez.

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

Le nom du fournisseur que vous entrez ici sera ** publié ** en tant qu'auteur du Bot. Vous devriez écrire votre vrai nom. Appuyez sur le bouton Créer pour créer le fournisseur.

2_4. Créons une chaîne

Ensuite, créons un canal qui sera un compte Bot. Le canal utilisé par Bot est "Messaging API", cliquez donc sur Messaging API.

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

L'écran de réglage du canal nouvellement créé apparaît. Remplissons le contenu nécessaire.

article Contenu
Type de canal Messaging API
Fournisseur Ce que j'ai fait plus tôt
Icône de chaîne Vous n'êtes pas obligé de le configurer maintenant
Nom du canal Nom du robot
Description de la chaîne Description du bot
Grande industrie Genre de bot
Petite industrie Genre détaillé de Bot
adresse mail L'adresse e-mail à laquelle vous serez contacté à propos de Bot. C'est une bonne idée d'utiliser une adresse e-mail que vous pouvez contacter.
URL de la politique de confidentialité Vous n'êtes pas obligé de le configurer maintenant
URL des conditions d'utilisation Vous n'êtes pas obligé de le configurer maintenant

Après avoir accepté les conditions requises, appuyez sur le bouton Créer pour créer la chaîne.

3. Écrivez les clés nécessaires au Bot dans le fichier .env

Maintenant que vous disposez des canaux dont vous avez besoin pour votre Bot, écrivons les clés et les secrets dans le fichier .env. Vous pouvez l'écrire directement dans le programme, mais ce n'est pas très bon compte tenu de la sécurité.

.env


LINE_CHANNEL_ID=xxxxxxxxxx
LINE_CHANNEL_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
LINE_CHANNEL_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

L'ID de chaîne et le secret de la chaîne sont des "Paramètres de base de la chaîne" Le jeton de canal est répertorié dans les «Paramètres de l'API de messagerie» sous le nom «Jeton d'accès au canal (à long terme)». S'il n'est pas affiché, appuyez sur le bouton de publication pour le publier.

Écrivez Dotenv.load sous require pour que les variables décrites dans .env puissent être utilisées dans le programme.

app.rb


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

get '/' do
  "Hello world!"
end

4. Acceptons les webhooks

4_1 Qu'est-ce qu'un webhook?

Webhook est un mécanisme pour que le contenu de l'événement soit POSTÉ sur l'URL prédéfinie lorsqu'un événement se produit dans le service de l'autre partie (LINE dans cet article).

Par exemple, si vous définissez l'URL «/ callback» de votre service sur le canal LINE, vous pouvez avoir «/ callback» POST le contenu du message lorsqu'un message arrive sur le canal.

Cependant, comme il doit s'agir d'une URL accessible à partir du serveur LINE, elle ne fonctionnera pas correctement lorsque le service n'est pas réellement publié. Par exemple, localhost: 4567 en cours de développement est une URL accessible uniquement à partir de votre propre PC, donc même si un message contient localhost: 4567 / callback défini, localhost: 4567 / callback ne sera pas appelé.

En raison de cette spécification, il est fondamentalement nécessaire de déployer à chaque fois lors du développement d'un Bot LINE. Si vous ouvrez le port, vous pouvez éviter les problèmes de déploiement à chaque fois, mais il existe un risque de sécurité, nous ne l'introduirons donc pas ici.

4_2 Recevoir et répondre au Webhook

C'est fondamentalement le même que README sur GitHub, mais c'est un code simple sans traitement d'image. https://github.com/line/line-bot-sdk-ruby

app.rb


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

# ======Post-scriptum d'ici======

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

# ======Postscript jusqu'à ici======

get '/' do
  "Hello wolrd!"
end

Je vais vous expliquer le code ci-dessous.

4_3 Explication du code

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

Ceci est le code permettant au "client" de faire fonctionner le Bot LINE (c'est une fonction de line-bot-api). Vous pouvez créer un client avec Line :: Bot :: Client.new, mais il est implémenté comme ceci car un client suffit pour un service. ||=En utilisant l'opérateur@Lorsque le client est videLine::Bot::Client.newEt transmettez-le.@Si le client est déjà entré, transmettez-le. Le traitement est réalisé.

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

Le bloc post '/ callback'do est un peu long, je vais donc l'expliquer séparément. body = request.body.read affecte simplement les données envoyées à la variable body.

Après la signature, nous vérifions si les données envoyées proviennent bien du serveur LINE. Les données envoyées par le serveur LINE contiennent toujours quelque chose appelé "HTTP_X_LINE_SIGNATURE", et vous pouvez vérifier s'il s'agit des données envoyées par le serveur LINE en regardant le contenu. La confirmation de savoir s'il s'agit d'un serveur LINE est implémentée dans line-bot-api et peut être utilisée via le client créé précédemment. Le processus de vérification est exécuté dans la partie appelée client.validate_signature (corps, signature).

Il s'agit d'un code important qui vérifie si une personne malveillante usurpe le serveur LINE et envoie un message.

  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

Dans ʻevents = client.parse_events_from (body) `, les données envoyées sont converties sous une forme facile à manipuler avec ruby. Le résultat de la conversion est un tableau d'événements, comme vous pouvez le voir à partir des événements de nom.

events.each do |event|Traite plusieurs événements un par un. En effet, plusieurs événements peuvent être envoyés en même temps.

ʻSi event.is_a? (Line :: Bot :: Event :: Message) `vérifie si le type d'événement est Message. Les événements sans message incluent "Ajouter un ami" et "Débloquer".

ʻSi event.type === Line :: Bot :: Event :: MessageType :: Text` confirme que le type de message est du texte. Les types de messages non textuels incluent des images, des vidéos et des tampons.

En d'autres termes, le code des 4 premières lignes est utilisé pour "analyser les données transmises et affiner uniquement le message texte".


Ensuite, regardons le code dans l'instruction if

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

Les quatre premières lignes composent le message à envoyer au serveur LINE et la dernière ligne envoie la réponse. event ['replyToken'] est le jeton de réponse inclus dans l'événement.


A la fin, j'ai écrit `` OK '', mais il suit la règle de l'API LINE Bot qu'il est nécessaire de renvoyer la bonne réponse si le processus réussit normalement. Il est normal de retourner quoi que ce soit.

4_4 Déployons

Maintenant que le code est complet, exécutons-le! Malheureusement, comme je l'ai expliqué plus tôt, cela ne fonctionne pas lorsqu'il est exécuté localement. Donc, cette fois, je vais le déployer sur Heroku.

Je vais omettre les détails du déploiement sur heroku, mais créons uniquement Procfile.

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

Après le déploiement, ouvrons l'application. Si "Hello wolrd!" S'affiche, le déploiement est terminé!

4_5 Configurons un webhook

Accédez au site LINE Developers et accédez à l'écran des paramètres du canal. Ouvrez les paramètres de l'API de messagerie et cliquez sur Modifier l'URL du Webhook. Une boîte pour entrer l'URL apparaîtra, alors entrez ʻURL + / callback` que vous venez de déployer et appuyez sur le bouton de mise à jour.

Par exemple, l'URL déployée est https://xxxxxxx-yyyyyy-zzzzz.herokuapp.com Si c'est le cas https://xxxxxxx-yyyyyy-zzzzz.herokuapp.com/callback` Ce sera.

Après cela, vérifions l'utilisation de Webhook.

`![Capture d'écran 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)

Vous pouvez vérifier le fonctionnement du serveur en appuyant sur le bouton de vérification. S'il est affiché comme réussi, il n'y a pas de problème.


De plus, les messages Bot ne peuvent pas être envoyés pour le moment car les messages de réponse automatique sont activés. Désactivez donc le standard automatique.

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

Cliquez sur le bouton Modifier le message de réponse dans les paramètres de l'API de messagerie. Ensuite, une page appelée paramètres de réponse sera affichée, donc dans les paramètres détaillés ci-dessous

Ensemble.

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

Vous êtes maintenant prêt à utiliser le webhook.

5. Essayons

Eh bien, tout est prêt! Ajoutez un Bot à vos amis et envoyez un message! Il y a un code QR dans "Paramètres de l'API de messagerie", alors lisons-le avec LINE. Vous devriez pouvoir vous lier d'amitié avec le Bot que vous avez créé.

Si vous pouvez vous faire des amis, envoyez un message. Si vous recevez le même message que vous avez envoyé, vous réussissez! Merci pour votre soutien!

IMG_1505A6F48E6C-1.jpeg

6. Résumé

Dans cet article, j'ai créé un Bot qui renvoie un perroquet du message envoyé. C'est très simple, mais il contient beaucoup de code important qui est essentiel pour créer un Bot, c'est donc une bonne idée de vous familiariser avec lui!

Le prochain article est ici

Liste des articles sérialisés

  1. Faisons un Bot LINE avec Ruby + Sinatra - Partie 1 - Faisons un Bot qui renvoie un perroquet ← Imakoko
  2. Créons un Bot LINE avec Ruby + Sinatra - Partie 2 - Recherche de livres et retour d'informations
  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!
Faites une liste de choses à faire en famille avec Sinatra
Faites une liste de choses à faire en famille avec Sinatra
Extraire une partie d'une chaîne en Ruby
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
[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]
Créer un outil de diaporama avec JavaFX
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)
Notez les arguments de mot-clé Ruby
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]
J'ai créé une application d'apprentissage automatique avec Dash (+ Docker) part3 ~ Practice ~
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
Notez que je suis resté bloqué lors de la création d'un robot LINE de retour de perroquet avec Heroku + Sinatra
Faisons un disjoncteur pour le service backend à l'aide de l'actionneur de Spring Boot (partie 1)