Une histoire qu'un débutant Ruby a fait et a publié un LINE BOT qui raconte l'heure du train en 2 mois

Journal des modifications

10 septembre 2020 Titre corrigé 10 septembre 2020 Commentaires et corrections 9 septembre 2020 Publié pour la première fois dans cet article

introduction

Nous avons développé un Bot LINE appelé "Tell me Ayase". Il reste encore de nombreuses parties inachevées, mais comme nous avons fini de développer les principales fonctions, nous avons décidé de les publier sur GitHub et Qiita. Dans cet article, nous expliquerons les fonctions et les aspects techniques.

Cliquez ici pour ajouter des amis Ajouter un ami

Dépôt GitHub

https://github.com/Aseiide/ayase_bot

Dis-moi Ayase, qu'est-ce que tu es?

demo.gif

--Peut être utilisé sur la ligne Tokyo Metro Chiyoda

Historique du développement

千代田線.png

L'université où je vais chez moi se trouve également le long de la ligne Chiyoda. Puisque la ligne Chiyoda est sur la ligne JR Joban, la descente est reliée à une distance considérable telle que Matsudo, Kashiwa et la poignée, donc la soirée est assez encombrée dans le sh. En revanche, les trains à destination d'Ayase et de Kita-Ayase ont des destinations courtes et la probabilité d'être bondé est très faible, j'ai donc essayé de monter ici. Il était difficile de rechercher l'heure avec l'application de transfert de Yahoo et de vérifier l'heure, j'ai donc décidé de travailler sur le développement de LINE Bot.

Explication technique

Composition technique

ayasebot-sequence.png

API que vous utilisez

LINE Messaging API

https://github.com/line/line-bot-sdk-ruby J'avais fait un bot pour rendre les perroquets, j'ai donc procédé à la production en me référant au SDK et aux documents.

Station Spa and Web Service (Plan gratuit)

Sélectionnez cette API qui peut être utilisée individuellement et gratuitement. Dans le plan gratuit, il n'est pas possible d'obtenir simplement l'heure, donc l'URL renvoyée en appuyant sur l'API est grattée pour obtenir l'heure.

Commentaire de code

Convertir le nom de la station en code de la station

station_code = {
  :Yoyogi Uehara=> "23044",
  :Parc Yoyogi=> "23045",
  :Devant Meiji Jingu=> "23016",
  :Omotesando=> "22588",
  :Nogizaka=> "22893",
  :Akasaka=> "22485",
  :Chambres du Parlement=> "22668",
  :Kasumi Seki=> "22596",
  :Hibiya=> "22951",
  :Devant le double pont=> "22883",
  :Otemachi=> "22564",
  :Nouvel Ochanomizu=> "22732",
  :Yushima=> "23038",
  :Nezu=> "22888",
  :Sendagi=> "22782",
  :Nishi Nippori=> "22880",
  :Machiya=> "22978",
  :Kitasenju=> "22630",
  :Ayase=> "22499",
  :Kita Ayase=> "22627"
  }

Lorsqu'il accède à l'API, la station saisie en japonais par l'utilisateur est convertie en code de station. À la suite de divers essais, je l'ai passé comme symbole et je l'ai converti en un code de station d'une chaîne de caractères.

Recevoir le nom de la station à envoyer sous forme de variable

@station_name = event.message["text"]

Puisqu'il était nécessaire de le stocker dans une variable dans LINE, il est stocké dans une variable de cette manière d'écrire. Au début du développement, cela ne fonctionnait pas du tout car il était défini comme `` `station_name = gets.chomp```.

Fixez la gare d'arrivée à Ayase et lancez une demande

res1 = Net::HTTP.get(URI.parse("http://api.ekispert.jp/v1/json/search/course/light?key=#{ENV['ACCESS_KEY']}&from=#{station_code[@station_name.to_sym]}&to=22499"))

Convertit le nom de la station reçu par station_name en symbole Je frappe l'API en développant le symbole en variables.

Stocker le JSON qui a été atteint et renvoyé dans le hachage

hash = JSON.parse(res1)
url = hash["ResultSet"]["ResourceURI"]

Lorsque vous frappez l'API

"ResultSet":~~
"ResourceURI":~~

Puisqu'il est renvoyé sous la forme de, il est stocké dans une variable appelée url à l'aide d'un hachage.

Stocker le texte gratté dans une variable

Avant correction


doc = Nokogiri::HTML.parse(html, nil, charset)
doc.xpath('/html/body/div[1]/div[4]/div/div[1]/div[2]/div/table/tr[1]/td[3]/p[1]').each do |node|
$time = node.inner_text
end

modifié


time = nil
doc.xpath('/html/body/div[1]/div[4]/div/div[1]/div[2]/div/table/tr[1]/td[3]/p[1]').each do |node|
time = node.inner_text
end

Même si je copie et colle le Xpath obtenu par l'outil de développement de chrome, cela ne fonctionne pas,. Après tout, la suppression de la balise tbody qui était initialement incluse fonctionnait bien. Puisque time est utilisé en dehors du bloc ~~, il est stocké en tant que variable globale. (** Vérifiez si les variables d'instance fonctionnent bien **) ~~ J'ai modifié le code pour restreindre la portée de `` $ time ''.

Des difficultés

Ce que j'ai fait seul pour la première fois de la conception au développement

Jusqu'à présent, j'avais développé selon un tutoriel, donc c'était la première fois pour moi de procéder au développement tout en recherchant à partir de zéro. En cherchant des mots que je ne comprenais pas, j'ai procédé en apprenant d'un ingénieur je savais ce que je ne comprenais pas dans la partie implémentation. J'ai le sentiment d'avoir appris les éléments de base difficiles à comprendre dans les livres et en ligne, comme comment communiquer dans un texte et comment poser des questions.

Développement basé sur Pull Request

Peu importe combien j'ai fait le tutoriel, j'ai trouvé très difficile de comprendre git. Jusqu'à présent, je n'avais que l'expérience de pousser les développés sur GitHub, donc c'était très agréable d'avoir l'expérience de procéder au développement tout en coupant des branches.

Traitement pour recevoir ce qui a été envoyé dans le message LINE en tant que variable

J'ai eu du mal à stocker le nom de la station envoyé par l'utilisateur dans une variable, que j'ai mentionnée dans la partie explication du code. Le code est très simple, mais je n'ai pas pu le trouver dans la documentation et il m'a fallu beaucoup de temps pour trouver cette façon d'écrire. Au final, j'ai trouvé une implémentation similaire à partir d'un article publié sur Qiita et j'y suis arrivé.

À propos des spécifications sinatra

Dans le code

post '/callback' do
end

Il y a un bloc appelé. Il y avait des moments où cela ne fonctionnait pas parce que je ne savais pas qu'il était ** exécuté à chaque fois ** pendant ce blocage. (Je n'ai pas encore trouvé la source) Le grattage devait être fait à chaque fois. La communauté Ruby (Nishi Nippori.rb, Fukuoka.rb) m'a parlé de l'implémentation ici, et cela fonctionne bien.

Impressions

C'est moins de 100 lignes de code, mais je suis très heureux de pouvoir réellement déplacer ce que je voulais faire! Je pense que je n'ai pas encore assez étudié, mais je pense que c'était une bonne expérience d'apprentissage.

Fonctionnalités à implémenter

--Envoyer une liste des "stations qui peuvent être envoyées" lors de l'inscription en tant qu'ami --Affichage du message d'erreur lorsqu'une station autre que la ligne Chiyoda est envoyée

référence

En écrivant cet article de commentaire, je me suis référé à l'article suivant https://qiita.com/shinbunbun_/items/00c4064c8133a34cf7c3 https://qiita.com/inoue2002/items/7e47283ba9affa0fac82

Recommended Posts

Une histoire qu'un débutant Ruby a fait et a publié un LINE BOT qui raconte l'heure du train en 2 mois
L'histoire d'un super débutant participant pour la première fois au concours AtCoder (AtCoder Beginner Contest 140)
[Enregistrement d'apprentissage] J'ai obtenu l'heure actuelle avec Ruby et j'ai sorti un message d'accueil différent à chaque fois.
L'histoire que Tomcat a souffert d'une erreur de timeout dans Eclipse
Comment faire fonctionner IGV en utilisant la communication par socket, et l'histoire de la création d'un Ruby Gem en utilisant cette méthode
L'histoire de l'oubli de fermer un fichier en Java et de l'échec
Dessinez un graphique à barres et un graphique linéaire en même temps avec MPAndroidChart
L'histoire de la rencontre d'un débordement arithmétique qui ne devrait pas être rencontré dans Ruby
Après avoir vérifié le problème de Montyhall avec Ruby, c'était une histoire que je pouvais bien comprendre et que je ne comprenais pas bien