JavaRush /Java Blog /Random-TK /Telegram üçin birnäçe agşam ýönekeý howa botyny döredýäri...
Philip J.
Dereje
Днепр

Telegram üçin birnäçe agşam ýönekeý howa botyny döredýäris

Toparda çap edildi
Hemmäňize salam! Telegramlar üçin bot döretmek mowzugy birneme döwüldi we köp gollanma ýazyldy (mysal üçin, şu ) . Şonuň üçin käbir üçünji tarap API-leri bilen has ýakyndan göz aýlasak gowy bolar, sebäbi bu islendik web dörediji üçin möhüm ussatlykdyr. Programmanyň iň amatly we peýdaly çaklamany üpjün etmändigini derrew aýdaryn; howa sahypalary bilen bäsleşmegiň manysy ýok; uzakdan birikmeler we Java ulanyp maglumatlary derňemek bilen işlemegi öwrenmek möhümdi. Şeýlelik bilen, ilki bilen nämä mätäçligimizi bileliň. Biziň amalymyz esasan üç logiki bölekden durýar:
  • ulanyjynyň habaryny kabul ediň
  • habary gaýtadan işle, we dogry buýruk bolsa, jogap üçin maglumatlary taýýarla. Biziň ýagdaýymyzda, ulanyjy dogry şähere giren bolsa, howa maglumatyny taýýarlaň
  • söhbetdeşlikde ulanyja taýýar maglumatlary iberiň
Birinji we üçünji nokatlar gaty ýönekeý we diňe Telegram API bilen işlemek bilen gyzyklanýar; gyzyklanýanlar ýokarda galan baglanyşygy öwrenip bilerler. Ikinji nokada ünsi jemläris. Käbir döredijiler öz maglumatlaryna beýleki işläp düzüjilere ygtyýar bermek islänlerinde API ulanylýar. Mysal üçin, VKontakte alalyň. Her kimiň dostlarynyň sanawy bar, VK serwerlerindäki maglumatlar bazasynda bir ýerde saklanýar. Käbir programmistleriň dostlary bilen barlaýjy oýun döretmek kararyna gelendigini aýdalyň. Programmasynyň dogry işlemegi üçin programma islendik oýunçynyň dostlarynyň sanawyny almagy başarmaly. Munuň üçin programmist VK API üçin resminamalary tapýar we bu sanawy almak üçin haýsy haýyş edilmelidigine seredýär. Bu haýyşa HTTP haýyşy diýilýär. Iň köp ýaýran HTTP haýyşlary bolsa GET we POST. Internetde olar hakda hem ýeterlik zat bar, men sizi saklamaryn. Maksatlarymyz üçin, ýagny howa maglumatyny almak üçin ýönekeý GET haýyşy ýeterlikdir. Adaty web serwerine GET haýyşy etsek, brauzer ulanyjy üçin amatly sahypa öwrülýän, stilleri, skriptleri we ş.m. ulanyp, html koduny yzyna gaýtaryp berer, eger API serwerine şeýle haýyş etsek, jogap köplenç diňe çig maglumatlar stil we skriptsiz gaýtarylýar. Brauzer penjiresinde şuňa meňzeş bir zat görünýär: Telegram üçin birnäçe agşam ýönekeý howa botyny döredýäris - 1Bu maglumatlar adamlar üçin däl-de, beýleki programmalar üçin niýetlenendir, şonuň üçin beýle sahypalarda maglumatlaryň özünden başga zat ýok. Çig maglumatlar köplenç iki standartyň birini ulanyp iberilýär: JSON ýa-da XML. Hersiniň gowy we erbet taraplary bar, ýöne ikisine-de düşünmek möhümdir. Aboveokardaky skrinshotda eýýäm JSON-y gördüňiz we XML şuňa meňzeýär: Telegram üçin birnäçe agşam ýönekeý howa botyny döredýäris - 2Gysga gözlegden soň, minutda 50-den köp haýyş etmeseňiz, mugt maglumat berýän iňlis dilinde açyk howa kartasy taslamasy tapyldy. Bu biziň üçin ýeterlikdir, hasaba alýarys, serweriň ýalançy däldigimizi, ýöne geljekde mynasyp işläp düzüjilerimiziň biljekdigini bilýän özboluşly bir belgi (kod) alýarys. API resminamalary ( tyts ) bilen sahypa girýäris we haýsydyr bir şäher üçin 5 günlük çaklamanyň blankanyň haýyşyny iberip boljakdygyny bilýäris.
https://api.openweathermap.org/data/2.5/forecast?q=(город)&APPID=(уникальный токен, полученный при регистрации)
Şeýle haýyşa jogapyň brauzerde nähili görünýändigini görüp bilersiňiz. Aslynda diňe dogry baglanyşyga eýermelidigiňize we serweriň zerur maglumatlary berjekdigine eýýäm göz ýetirdik . Galan zat, muny Java ulanyp nädip etmelidigini öwrenmek. Java-da ýönekeý GET haýyşy şuňa meňzeýär:
//создаём строку со ссылкой на нужную page,
//я тут её склеиваю из заранее определённых констант, меняя только сам город
String urlString = API_CALL_TEMPLATE + city + API_KEY_TEMPLATE;
//создаём an object который будет содержать ссылку
URL urlObject = new URL(urlString);
//создаём соединение, используя an object
HttpURLConnection connection = (HttpURLConnection) urlObject.openConnection();
//выбираем тип requestа (GET)
connection.setRequestMethod("GET");
//тут мы указываем, данные о себе, что мы можем принять всё то,
//что примет и любой современный браузер
connection.setRequestProperty("User-Agent", "Mozilla/5.0");
//В начало ответа server всегда вставляет число, по которому можно судить, прошло ли всё хорошо.
//200 - значит OK
int responseCode = connection.getResponseCode();
//на несуществующий город or город с опечаткой, 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();
Talap dogry bolsa we serwer elýeterli bolsa, peýdaly maglumatlar häzir zerur däl maglumatlar bilen garylan maglumatlary alarys. JSON we XML-den zerur maglumatlary aňsatlyk bilen çykarmak üçin Java üçin her tagamyna laýyk tonna kitaphanalar ýazyldy. JSON-y ileri tutanym üçin, ony gaýtadan işlemek üçin Jekson atly iň meşhur kitaphanany saýladym. Theeri gelende aýtsak, JavaRush-da käbir ýokary derejelerde azajyk öwrenilýär. Köp mukdarda JSON maglumatlary gaýtadan işlemek üçin resminamanyň gurluşyna düşünmek möhümdir. Şuňa meňzeş peýdaly saýtlar kömege gelýär . Çep tarapda asyl JSON, sagda - gurluşly: Telegram üçin birnäçe agşam ýönekeý howa botyny döredýäris - 3 Jogap 5 sany ýokary derejeli JSON obýektinden ybaratdygyny görmek bolýar, olaryň 2-si çylşyrymly we aşakdaky şahalar üçin düwünler. Bizi gyzyklandyrýan maglumatlar sanaw düwüninde saklanýar . Içerki sanawda 38 JSON setir bar, olaryň hersi belli bir wagtda howany suratlandyrýar. .Agny, kök, şahalar, şahalar we hatda ýapraklar bolan agaç ýaly bir görnüşdir :) Düwünlerde bolsa şahalar bolýar. Bagtymyza, Jekson agaç hökmünde islendik dogry JSON-y görkezip biler. Şeýlelik bilen, bize gerek bolan atributyň adyny (mysal üçin howanyň temperaturasy) we agajyň haýsy derejesinde ýerleşýändigini bilmek, ony almak gaty kyn bolmaz. Ilki bilen "sanaw" massiwinden ähli setirleri çykardym we olary aýratyn sanawa goşdum. Takyk aýdanymda, maglumatlar bilen sahypany böleklere böldüm, bularyň hersi aýratyn çaklama. Ownuk bölekleri ýatda saklamak we işlemek has aňsat.
//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());
            }
      }
}
Şeýlelik bilen, setirleriň sanawyny aldyk, onda her setir belli bir wagtda JSON howa hasabatyny görkezýär. Galan zat, isleýän zadyňyzy çykarmak we formatlamak. Şeýle setirimiz bar bolsa:
"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}
onda bu "esasy" diýilýän düwün. Ondan islendik maglumatlary almak üçin, mysal üçin deňiz derejesi, aşakdaky kod ýeterlikdir:
ObjectMapper objectMapper = new ObjectMapper();
//line - это наша JSON-строка
mainNode = objectMapper.readTree(line).get("main");
String seaLevel = mainNode.get("sea_level");
Jekson maglumatlary san görnüşinde derrew görkezmäge mümkinçilik berýär:
double seaLevel = mainNode.get("sea_level").asDouble();
Indi çaklamadan islendik maglumatlary çykaryp bileris, galan zat ony isleýşi ýaly ýelimlemek we Telegramdaky ulanyja ibermek. Doly çeşme kody meniň github- da, ýöne boty baglanyşyk arkaly ýa-da Telegram gözleginde @denifoBot tapyp bilersiňiz . Şäheriň ady latyn diline terjime edilmeli, mysal üçin "Kiýew" ýa-da "Moskwa". Sag boluň, ahyryna çenli eden bolsaňyz, dogry tankytlary kabul edýärin, sebäbi şäherimden aç zehinler bilen bäsleşmek üçin GitHub-da ýönekeý taslamalary öwrenýärin we ösdürýärin :) Hemmäňize hoşlaşyň! PS Bu ýerde ýazuwlaryň bolup biljekdigine ynanýaryn, şonuň üçin hemme zady şahsy habarda ýa-da hakykatdanam gaharly bolsaňyz teswirde iberip bilersiňiz :)
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION