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!"
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)
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> <)
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.
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.
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.
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.
Ensuite, créons un canal qui sera un compte Bot. Le canal utilisé par Bot est "Messaging API", cliquez donc sur Messaging API.
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.
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
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.
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.
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.new
Et 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.
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é!
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.
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.
Vous êtes maintenant prêt à utiliser le webhook.
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!
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
Recommended Posts