Салом ба ҳама! Мавзӯи эҷоди ботҳо барои Telegrams то андозае ҳакерӣ аст ва дастурҳои зиёде навишта шудаанд (масалан, ин ) . Аз ин рӯ, мо беҳтар мебудем, ки кор бо API-и тарафи сеюмро бодиққат дида бароем, зеро ин барои ҳар як таҳиягари веб маҳорати муҳим аст. Ман дарҳол мегӯям, ки барнома пешгӯии аз ҳама функсионалӣ ва муфидро пешбинӣ накардааст; рақобат бо сайтҳои обу ҳаво ҳеҷ маъно надорад; омӯхтани тарзи кор бо пайвастҳои дурдаст ва таҳлor додаҳо бо истифода аз Java муҳим буд. Пас, биёед аввал бифаҳмем, ки ба мо чӣ лозим аст. Аризаи мо аслан аз се қисмати мантиқӣ иборат аст:
- паёмро аз корбар қабул кунед
- коркарди паём ва, агар он фармони дуруст бошад, маълумотро барои посух омода кунед. Дар ҳолати мо, агар корбар ба шаҳри дуруст ворид шуда бошад, пешгӯии обу ҳаво омода кунед
- маълумоти тайёрро ба корбар дар чат фиристед
https://api.openweathermap.org/data/2.5/forecast?q=(город)&APPID=(уникальный токен, полученный при регистрации)
Шумо метавонед бубинед, ки посух ба чунин дархост дар браузер чӣ гуна ба назар мерасад.Мо аллакай фаҳмидем, ки дар асл, шумо танҳо ба истиноди дуруст пайравӣ кардан лозим аст ва server маълумоти заруриро пешниҳод мекунад. Танҳо омӯхтани ин кор бо истифодаи Java аст. Дархости оддии GET дар Java чунин менамояд:
//создаём строку со ссылкой на нужную 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();
Агар дархост дуруст бошад ва server дастрас бошад, мо як варақи маълумот мегирем, ки дар он маълумоти муфид бо иттилооте, ки ҳоло лозим нест, омехта шудааст. Барои ба осонӣ истихроҷи маълумоти зарурӣ аз JSON ва XML, барои Java даҳҳо китобхонаҳо навишта шудаанд, то ба ҳар завқ мувофиқ бошанд. Азбаски ман JSON-ро афзалтар донистам, барои коркарди он китобхонаи хеле маъмул бо номи Ҷексонро интихоб кардам. Воқеан, он дар JavaRush каме дар сатҳи баланд омӯхта мешавад. Барои коркарди миқдори зиёди маълумоти JSON, фаҳмидани сохтори ҳуҷҷат муҳим аст. Сомонаҳои муфид ба монанди ин ба наҷот меоянд . Дар тарафи чап мо JSON-и аслӣ дорем, дар тарафи рост - сохтори сохторӣ: Дидан мумкин аст, ки посух аз 5 an objectи JSON-и сатҳи боло иборат аст, ки 2-тои онҳо мураккаб ва гиреҳ барои шохаҳои зерин мебошанд. Маълумоте, ки мо ба он таваҷҷӯҳ дорем, дар гиреҳи рӯйхат нигоҳ дошта мешавад . Рӯйхати дохилӣ массиви 38 хати JSON мебошад, ки ҳар кадоми онҳо обу ҳаворо дар вақти муайян тавсиф мекунанд. Яъне ин як навъ сохтори дарахтмонанд аст, ки дар он реша, шоха, навда ва ҳатто барг мавҷуд аст :) Ва дар гиреҳҳо шохабандӣ сурат мегирад. Хушбахтона, Ҷексон метавонад ҳама гуна JSON-и дурустро ҳамчун дарахт муаррифӣ кунад. Ҳамин тариқ, донистани номи атрибутие, ки ба мо лозим аст (масалан, ҳарорати ҳаво) ва дар кадом сатҳи дарахт ҷойгир аст, гирифтани он мушкor зиёд нахоҳад дошт. Аввалан, ман ҳамаи сатрҳоро аз массиви "рӯйхат" баровардам ва онҳоро ба рӯйхати алоҳида илова кардам. Тахминан, ман варақро бо маълумот пора-пора кардам, ки ҳар яки онҳо пешгӯии алоҳида аст. Қисмҳои хурд дар хотир нигоҳ доштан ва бо онҳо кор кардан осонтаранд.
//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());
}
}
}
Ҳамин тавр, мо рӯйхати сатрҳоро гирифтем, ки дар онҳо ҳар як сатр гузориши обу ҳавои JSON-ро дар вақти муайян ифода мекунад. Танҳо он чизе, ки шумо мехоҳед, истихроҷ кунед ва формат кунед. Агар мо чунин сатр дошта бошем:
"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}
пас ин гиреҳ бо номи "асосӣ" аст. Барои гирифтани ҳама гуна маълумот аз он, масалан, сатҳи баҳр, рамзи зерин кофӣ аст:
ObjectMapper objectMapper = new ObjectMapper();
//line - это наша JSON-строка
mainNode = objectMapper.readTree(line).get("main");
String seaLevel = mainNode.get("sea_level");
Ҷексон ба шумо имкон медиҳад, ки фавран маълумотро дар формати рақамӣ муаррифӣ кунед:
double seaLevel = mainNode.get("sea_level").asDouble();
Ҳоло мо метавонем ҳама гуна маълумотро аз пешгӯӣ истихроҷ кунем ва танҳо он боқӣ мемонад, ки онро мувофиқи дилхоҳ часпонед ва ба корбар дар Telegram ирсол кунед. Рамзи пурраи сарчашма дар github- и ман аст , аммо шумо метавонед ботро дар амал бо истифода аз истиноди , ё бо пайдо кардани @denifoBot дар ҷустуҷӯи Telegram санҷед. Номи шаҳр бояд бо транслитератсияи лотинӣ навишта шавад, масалан "Киев" ё "Москва". Ташаккур, агар шумо онро ба охир расондед, ман танқиди оқилонаро қабул мекунам, зеро ман ҳоло дар GitHub лоиҳаҳои оддиро меомӯзам ва таҳия мекунам, то бо истеъдодҳои гурусна аз шаҳри ман рақобат кунам :) Салом ба ҳама! PS Ман боварӣ дорам, ки дар ин ҷо хатогиҳои хаттӣ вуҷуд доранд, бинобар ин шумо метавонед ҳама чизро дар паёми хусусӣ ё дар шарҳ фиристед, агар шумо дар ҳақиқат хашмгин бошед :)
GO TO FULL VERSION