JavaRush /Java-Blog /Random-DE /Wir erstellen in ein paar Abenden einen einfachen Wetterb...
Philip J.
Level 40
Днепр

Wir erstellen in ein paar Abenden einen einfachen Wetterbot für Telegram

Veröffentlicht in der Gruppe Random-DE
Hallo zusammen! Das Thema der Erstellung von Bots für Telegrams ist etwas abgedroschen und es wurden viele Anleitungen geschrieben (zum Beispiel diese ) . Daher sollten wir uns die Arbeit mit einer Drittanbieter-API genauer ansehen, da dies eine entscheidende Fähigkeit für jeden Webentwickler ist. Ich möchte gleich sagen, dass es der Anwendung nicht darum ging, die funktionellste und nützlichste Vorhersage zu liefern; es hat keinen Sinn, mit Wetterseiten zu konkurrieren; es war wichtig zu lernen, wie man mit Java mit Remote-Verbindungen und der Datenanalyse umgeht. Also lasst uns zuerst herausfinden, was wir brauchen. Unsere Bewerbung besteht im Wesentlichen aus drei logischen Teilen:
  • Nachricht vom Benutzer akzeptieren
  • Verarbeiten Sie die Nachricht und bereiten Sie Daten für die Antwort vor, wenn es sich um einen gültigen Befehl handelt. In unserem Fall erstellen Sie eine Wettervorhersage, wenn der Benutzer die richtige Stadt eingegeben hat
  • Senden Sie fertige Informationen an den Benutzer im Chat
Der erste und dritte Punkt sind recht einfach und betreffen nur die Arbeit mit der Telegram-API; Interessierte können den Link oben links studieren. Wir konzentrieren uns auf den zweiten Punkt. APIs werden verwendet, wenn einige Entwickler anderen Entwicklern Zugriff auf ihre Daten gewähren möchten. Nehmen wir zum Beispiel VKontakte. Jeder hat eine Freundesliste, sie wird irgendwo in einer Datenbank auf VK-Servern gespeichert. Nehmen wir an, ein Programmierer hat beschlossen, mit Freunden ein Damespiel zu entwickeln. Damit seine Anwendung ordnungsgemäß funktioniert, muss das Programm in der Lage sein, die Freundesliste eines beliebigen Spielers abzurufen. Dazu sucht der Programmierer die Dokumentation zur VK-API und schaut, welche Anfrage gestellt werden muss, um diese Liste zu erhalten. Diese Anfrage wird als HTTP-Anfrage bezeichnet. Und die beiden häufigsten HTTP-Anfragen sind GET und POST. Auch im Internet gibt es genug darüber, ich werde Sie nicht aufhalten. Für unsere Zwecke, nämlich den Erhalt von Wettervorhersagedaten, reicht eine einfache GET-Anfrage aus. Wenn wir eine GET-Anfrage an einen normalen Webserver stellen, wird dieser oft HTML-Code zurückgeben, den der Browser in eine benutzerfreundliche Seite umwandelt und dabei Stile, Skripte usw. anwendet. Wenn wir eine solche Anfrage an den API-Server stellen, ist die Antwort Normalerweise werden nur Rohdaten ohne Stile und Skripte zurückgegeben. Im Browserfenster sieht es etwa so aus: Wir erstellen in ein paar Abenden einen einfachen Wetter-Bot für Telegram – 1Diese Daten sind nicht für Personen, sondern für andere Programme bestimmt, daher gibt es auf solchen Seiten außer der Information selbst nichts extra. Rohdaten werden am häufigsten mit einem von zwei Standards gesendet: JSON oder XML. Jedes hat seine Vor- und Nachteile, es ist jedoch wichtig, beide zu verstehen. JSON haben Sie im obigen Screenshot bereits gesehen, und XML sieht so aus: Wir erstellen in ein paar Abenden einen einfachen Wetter-Bot für Telegram – 2Nach einer kurzen Suche wurde das englischsprachige Open Weather Map-Projekt gefunden, das Daten kostenlos zur Verfügung stellt, wenn Sie nicht mehr als 50 Anfragen pro Minute stellen. Das reicht uns völlig, wir registrieren uns, wir erhalten einen einzigartigen Token (Code), anhand dessen der Server weiß, dass wir keine Betrüger, sondern anständige zukünftige Entwickler sind. Wir gehen auf die Seite mit der API-Dokumentation ( tyts ) und finden heraus, dass durch Senden einer Anfrage des Formulars eine 5-Tage-Vorhersage für jede Stadt erhalten werden kann.
https://api.openweathermap.org/data/2.5/forecast?q=(город)&APPID=(уникальный токен, полученный при регистрации)
Wie die Antwort auf eine solche Anfrage aussieht, können Sie im Browser sehen. Wir haben bereits herausgefunden, dass Sie tatsächlich nur dem richtigen Link folgen müssen und der Server die erforderlichen Daten bereitstellt. Jetzt müssen Sie nur noch lernen, wie man dies mit Java macht. Eine einfache GET-Anfrage in Java sieht so aus:
//создаём строку со ссылкой на нужную Buchseite,
//я тут её склеиваю из заранее определённых констант, меняя только сам город
String urlString = API_CALL_TEMPLATE + city + API_KEY_TEMPLATE;
//создаём ein Objekt который будет содержать ссылку
URL urlObject = new URL(urlString);
//создаём соединение, используя ein Objekt
HttpURLConnection connection = (HttpURLConnection) urlObject.openConnection();
//выбираем тип Anfrageа (GET)
connection.setRequestMethod("GET");
//тут мы указываем, данные о себе, что мы можем принять всё то,
//что примет и любой современный браузер
connection.setRequestProperty("User-Agent", "Mozilla/5.0");
//В начало ответа Server всегда вставляет число, по которому можно судить, прошло ли всё хорошо.
//200 - значит OK
int responseCode = connection.getResponseCode();
//на несуществующий город oder город с опечаткой, Server выдаст Code ответа 404,
//бросаем на него исключение, чтобы обработать на уровне повыше и предложить
//пользователю ввести город заново
if (responseCode == 404) {
     throw new IllegalArgumentException();
}
// создаём поток, вычитываем все строки, и склеиваем в одну большую строку,
//которую будем потом обрабатывать в других методах
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
     response.append(inputLine);
}
in.close();
return response.toString();
Wenn die Anfrage korrekt war und der Server verfügbar war, erhalten wir ein Datenblatt, in dem nützliche Informationen mit Informationen gemischt sind, die jetzt nicht benötigt werden. Um die notwendigen Daten bequem aus JSON und XML zu extrahieren, wurden für Java unzählige Bibliotheken geschrieben, die für jeden Geschmack etwas bieten. Da ich JSON bevorzuge, habe ich für die Verarbeitung eine sehr beliebte Bibliothek namens Jackson ausgewählt. Übrigens wird es in JavaRush auf einigen hohen Ebenen ein wenig studiert. Um große Mengen an JSON-Daten zu verarbeiten, ist es wichtig, die Struktur des Dokuments zu verstehen. Hilfreiche Seiten wie diese hier helfen dabei . Links haben wir das ursprüngliche JSON, rechts das strukturierte: Wir erstellen in ein paar Abenden einen einfachen Wetter-Bot für Telegram – 3 Es ist zu erkennen, dass die Antwort aus 5 JSON-Objekten der obersten Ebene besteht, von denen 2 komplex sind und Knoten für die folgenden Zweige darstellen. Die für uns interessanten Daten werden im Listenknoten gespeichert . In der Liste befindet sich ein Array aus 38 JSON-Zeilen, die jeweils das Wetter zu einem bestimmten Zeitpunkt beschreiben. Das heißt, es handelt sich um eine Art baumartige Struktur, in der es eine Wurzel, Äste, Zweige und sogar Blätter gibt :) Und an den Knotenpunkten findet die Verzweigung statt. Glücklicherweise kann Jackson jedes gültige JSON als Baum darstellen. Wenn wir also den Namen des benötigten Attributs kennen (zum Beispiel die Lufttemperatur) und wissen, auf welcher Ebene des Baums es sich befindet, wird es kein großes Problem sein, es zu bekommen. Zuerst habe ich alle Zeilen aus dem Array „list“ extrahiert und sie einer separaten Liste hinzugefügt. Grob gesagt schneide ich das Blatt mit den Daten in Stücke, von denen jedes eine separate Prognose darstellt. Kleine Teile sind leichter im Auge zu behalten und leichter zu handhaben.
//JsonNode - это один из узлов в древовидной иерархии, от которого идут ветви
//получаем узел, который называется "list"
JsonNode arrNode = new ObjectMapper().readTree(data).get("list");
//если это действительно массив узлов
if (arrNode.isArray()) {
//выполняем для каждого узла, который содержится в массиве
      for (final JsonNode objNode : arrNode) {
//в атрибуте "dt_txt" каждого маленького узла хранилось время прогноза, я отобрал данные за 9 утра и 6 вечера
                String forecastTime = objNode.get("dt_txt").toString();
                if (forecastTime.contains("09:00") || forecastTime.contains("18:00")) {
                weatherList.add(objNode.toString());
            }
      }
}
Wir haben also eine Liste mit Zeichenfolgen erhalten, in denen jede Zeile einen JSON-Wetterbericht zu einem bestimmten Zeitpunkt darstellt. Jetzt müssen Sie nur noch das Gewünschte extrahieren und formatieren. Wenn wir eine Zeile wie diese haben:
"main":{"temp":261.45,"temp_min":259.086,"temp_max":261.45,"pressure":1023.48,"sea_level":1045.39,"grnd_level":1023.48,"humidity":79,"temp_kf":2.37}
dann ist dies ein Knoten namens „main“. Um beliebige Daten daraus zu erhalten, beispielsweise den Meeresspiegel, reicht der folgende Code aus:
ObjectMapper objectMapper = new ObjectMapper();
//line - это наша JSON-строка
mainNode = objectMapper.readTree(line).get("main");
String seaLevel = mainNode.get("sea_level");
Mit Jackson können Sie Daten sofort im numerischen Format darstellen:
double seaLevel = mainNode.get("sea_level").asDouble();
Jetzt können wir beliebige Daten aus der Prognose extrahieren und müssen sie nur noch nach Wunsch zusammenfügen und per Telegram an den Benutzer senden. Der vollständige Quellcode befindet sich auf meinem Github , aber Sie können den Bot über den Link in Aktion ausprobieren oder indem Sie @denifoBot in der Telegram-Suche suchen. Der Name der Stadt muss in lateinischer Transliteration geschrieben sein, zum Beispiel „Kiew“ oder „Moskau“. Vielen Dank, wenn Sie es bis zum Ende geschafft haben, akzeptiere ich berechtigte Kritik, da ich gerade einfache Projekte auf GitHub lerne und entwickle, um mit hungrigen Talenten aus meiner Stadt zu konkurrieren :) Auf Wiedersehen! PS: Ich glaube, dass es hier Tippfehler geben kann, also kannst du alles in einer privaten Nachricht senden, oder in einem Kommentar, wenn du wirklich wütend bist :)
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION