Eine Geschichte, die ein Ruby-Anfänger gemacht und einen LINE BOT veröffentlicht hat, der die Zugzeit in 2 Monaten erzählt

Änderungsprotokoll

  1. September 2020 Titel korrigiert
  2. September 2020 Kommentare und Korrekturen
  3. September 2020 Erstmals veröffentlicht in diesem Artikel

Einführung

Wir haben einen LINE Bot namens "Tell me Ayase" entwickelt. Es gibt noch viele unfertige Teile, aber da wir die Hauptfunktionen entwickelt haben, haben wir beschlossen, sie auf GitHub und Qiita zu veröffentlichen. In diesem Artikel werden die Funktionen und technischen Aspekte erläutert.

Klicken Sie hier, um Freunde hinzuzufügen <img src = "https://scdn.line-apps.com/n/line_add_friends/btn/ja.png " alt = "Freund hinzufügen" Höhe = "36" border = "0">

GitHub-Repository

https://github.com/Aseiide/ayase_bot

Sag mir Ayase, was bist du?

demo.gif

Entwicklungsgeschichte

千代田線.png

Die Universität, an der sich auch mein Zuhause befindet, liegt an der Chiyoda-Linie. Da sich die Chiyoda-Linie auf der JR Joban-Linie befindet, ist der Abstieg mit ziemlich weit entfernten Orten wie Matsudo, Kashiwa und Griffen verbunden, so dass der Abend la in der Hektik ziemlich überfüllt ist. Auf der anderen Seite haben die Züge nach Ayase und Kita Ayase kurze Ziele und die Wahrscheinlichkeit, überfüllt zu sein, ist sehr gering. Deshalb habe ich versucht, sie hierher zu bringen. Es war mühsam, die Uhrzeit mit der Transfer-App von Yahoo zu suchen und die Uhrzeit zu überprüfen. Deshalb habe ich mich entschlossen, an der Entwicklung von LINE Bot zu arbeiten.

Technische Erklärung

Technische Zusammensetzung

ayasebot-sequence.png

API, die Sie verwenden

LINE Messaging API

https://github.com/line/line-bot-sdk-ruby Ich hatte einen Bot für die Rückgabe von Papageien gemacht, also fuhr ich mit der Produktion fort, während ich mich auf das SDK und die Dokumente bezog.

Station Spa und Web Service (kostenloser Plan)

Wählen Sie diese API aus, die einzeln und kostenlos verwendet werden kann. Im kostenlosen Plan ist es nicht möglich, einfach die Zeit abzurufen, daher wird die URL, die durch Drücken der API zurückgegeben wird, abgekratzt, um die Zeit abzurufen.

Codekommentar

Konvertieren Sie den Stationsnamen in den Stationscode

station_code = {
  :Yoyogi Uehara=> "23044",
  :Yoyogi Park=> "23045",
  :Vor Meiji Jingu=> "23016",
  :Omotesando=> "22588",
  :Nogizaka=> "22893",
  :Akasaka=> "22485",
  :Parlament=> "22668",
  :Kasumi Seki=> "22596",
  :Hibiya=> "22951",
  :Vor der Doppelbrücke=> "22883",
  :Otemachi=> "22564",
  :Neues Ochanomizu=> "22732",
  :Yushima=> "23038",
  :Nezu=> "22888",
  :Sendagi=> "22782",
  :Nishi Nippori=> "22880",
  :Machiya=> "22978",
  :Kitasenju=> "22630",
  :Ayase=> "22499",
  :Kita Ayase=> "22627"
  }

Beim Aufrufen der API wird die vom Benutzer auf Japanisch eingegebene Station in den Stationscode konvertiert. Als Ergebnis verschiedener Versuche habe ich es als Symbol übergeben und in einen Stationscode einer Zeichenfolge konvertiert.

Empfangen Sie den zu sendenden Stationsnamen als Variable

@station_name = event.message["text"]

Da es notwendig war, es in einer Variablen in LINE zu speichern, wird es auf diese Weise in einer Variablen gespeichert. Zu Beginn der Entwicklung funktionierte es überhaupt nicht, da es auf `` `station_name = gets.chomp``` gesetzt war.

Befestigen Sie die Ankunftsstation an Ayase und werfen Sie eine Anfrage

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

Konvertieren Sie den von station_name empfangenen Stationsnamen in ein Symbol Ich treffe die API, indem ich das Symbol in Variablen erweitere.

Speichern Sie den getroffenen und zurückgegebenen JSON in Hash

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

Wenn Sie die API drücken

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

Da es in Form von zurückgegeben wird, wird es in einer Variablen namens url unter Verwendung eines Hashs gespeichert.

Speichern Sie den abgekratzten Text in einer Variablen

Vor der Korrektur


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

Überarbeitet


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

Selbst wenn ich den Xpath kopiere und einfüge, den das Entwicklertool von Chrome erhalten hat, funktioniert es nicht. Immerhin hat das Entfernen des ursprünglich enthaltenen tbody-Tags einwandfrei funktioniert. Da time außerhalb des ~~ Blocks verwendet wird, wird es als globale Variable gespeichert. (** Überprüfen Sie, ob Instanzvariablen gut funktionieren **) ~~ Ich habe den Code geändert, um den Umfang von "$ time" einzuschränken.

Schwierigkeiten

Was ich zum ersten Mal alleine von der Konzeption bis zur Entwicklung gemacht habe

Bis jetzt hatte ich mich nach einem Tutorial entwickelt, daher war es für mich das erste Mal, dass ich mit der Entwicklung fortfuhr, während ich von Grund auf neu recherchierte. Während ich nach Wörtern suchte, die ich nicht verstand, lernte ich von einem Ingenieur, von dem ich wusste, was ich im Implementierungsteil nicht verstand. Ich habe das Gefühl, dass ich die grundlegenden Teile gelernt habe, die in Büchern und online schwer zu erlernen sind, wie man in Text kommuniziert und Fragen stellt.

Entwicklung basierend auf Pull Request

Egal wie oft ich das Tutorial gemacht habe, ich fand es sehr schwierig, Git zu verstehen. Bis jetzt hatte ich nur die Erfahrung, die entwickelten auf GitHub zu übertragen, daher war es sehr schön, die Erfahrung zu haben, mit der Entwicklung fortzufahren, während ich Zweige schneide.

Verarbeitung, um zu empfangen, was in der LINE-Nachricht als Variable gesendet wurde

Es fiel mir schwer, den vom Benutzer gesendeten Stationsnamen in einer Variablen zu speichern, die ich in der Code-Erklärung erwähnt habe. Der Code ist sehr einfach, aber ich konnte ihn nicht in der Dokumentation finden und es hat lange gedauert, bis ich diese Schreibweise gefunden habe. Am Ende fand ich eine ähnliche Implementierung aus einem auf Qiita veröffentlichten Artikel und kam zu ihr.

Über Sinatra-Spezifikationen

Im Code

post '/callback' do
end

Es gibt einen Block namens. Es gab Zeiten, in denen es nicht funktionierte, weil ich nicht wusste, dass es während dieses Blocks jedes Mal ausgeführt wurde. (Ich habe die Quelle noch nicht gefunden) Das Schaben musste jedes Mal durchgeführt werden. Die Ruby-Community (Nishi Nippori.rb, Fukuoka.rb) hat mich über die Implementierung hier unterrichtet, und es funktioniert gut.

Impressionen

Es sind weniger als 100 Codezeilen, aber ich bin sehr froh, dass ich tatsächlich das verschieben kann, was ich machen wollte! Ich habe das Gefühl, dass ich noch nicht genug gelernt habe, aber ich denke, es war eine gute Lernerfahrung.

Zu implementierende Funktionen

--Senden Sie eine Liste der "Sender, die gesendet werden können", wenn Sie sich als Freund registrieren

Referenz

Beim Schreiben dieses Kommentarartikels habe ich auf den folgenden Artikel verwiesen https://qiita.com/shinbunbun_/items/00c4064c8133a34cf7c3 https://qiita.com/inoue2002/items/7e47283ba9affa0fac82

Recommended Posts

Eine Geschichte, die ein Ruby-Anfänger gemacht und einen LINE BOT veröffentlicht hat, der die Zugzeit in 2 Monaten erzählt
Eine Geschichte über einen Super-Anfänger, der zum ersten Mal am AtCoder-Wettbewerb teilnimmt (AtCoder-Anfängerwettbewerb 140)
[Lernaufzeichnung] Ich habe die aktuelle Zeit mit Ruby erhalten und für jedes Mal eine andere Begrüßung ausgegeben.
Die Geschichte, dass Tomcat in Eclipse unter einem Timeout-Fehler litt
Wie man IGV mit Socket-Kommunikation bedient und wie man einen Ruby Gem mit dieser Methode herstellt
Die Geschichte, zu vergessen, eine Datei in Java zu schließen und zu scheitern
Zeichnen Sie mit MPAndroidChart gleichzeitig Balkendiagramm und Liniendiagramm
Die Geschichte eines arithmetischen Überlaufs, der in Ruby nicht auftreten sollte
Nachdem ich das Montyhall-Problem mit Ruby überprüft hatte, war es eine Geschichte, die ich gut verstehen konnte und die ich nicht gut verstand