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ň
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: 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 :)
GO TO FULL VERSION