10 septembre 2020 Titre corrigé 10 septembre 2020 Commentaires et corrections 9 septembre 2020 Publié pour la première fois dans cet article
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
https://github.com/Aseiide/ayase_bot
--Peut être utilisé sur la ligne Tokyo Metro Chiyoda
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.
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.
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.
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.
@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```.
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.
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.
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 ''.
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.
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.
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é.
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.
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.
--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
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