JavaRush /Блоги Java /Random-TG /Мо дар чанд шом барои Telegram як боти оддии обу ҳаво эҷо...
Philip J.
Сатҳи
Днепр

Мо дар чанд шом барои Telegram як боти оддии обу ҳаво эҷод мекунем

Дар гурӯҳ нашр шудааст
Салом ба ҳама! Мавзӯи эҷоди ботҳо барои Telegrams то андозае ҳакерӣ аст ва дастурҳои зиёде навишта шудаанд (масалан, ин ) . Аз ин рӯ, мо беҳтар мебудем, ки кор бо API-и тарафи сеюмро бодиққат дида бароем, зеро ин барои ҳар як таҳиягари веб маҳорати муҳим аст. Ман дарҳол мегӯям, ки барнома пешгӯии аз ҳама функсионалӣ ва муфидро пешбинӣ накардааст; рақобат бо сайтҳои обу ҳаво ҳеҷ маъно надорад; омӯхтани тарзи кор бо пайвастҳои дурдаст ва таҳлor додаҳо бо истифода аз Java муҳим буд. Пас, биёед аввал бифаҳмем, ки ба мо чӣ лозим аст. Аризаи мо аслан аз се қисмати мантиқӣ иборат аст:
  • паёмро аз корбар қабул кунед
  • коркарди паём ва, агар он фармони дуруст бошад, маълумотро барои посух омода кунед. Дар ҳолати мо, агар корбар ба шаҳри дуруст ворид шуда бошад, пешгӯии обу ҳаво омода кунед
  • маълумоти тайёрро ба корбар дар чат фиристед
Нуқтаҳои якум ва сеюм хеле соддаанд ва танҳо ба кор бо API Telegram дахл доранд; хоҳишмандон метавонанд истиноди дар боло гузошташударо омӯзанд. Мо ба нуктаи дуюм тамаркуз мекунем. API-ҳо вақте истифода мешаванд, ки баъзе таҳиягарон мехоҳанд дастрасӣ ба маълумоти худро ба дигар таҳиягарон пешниҳод кунанд. Масалан, «ВКонтакте»-ро гирем. Ҳар як рӯйхати дӯстон дорад, он дар ҷое дар пойгоҳи додаҳо дар serverҳои VK нигоҳ дошта мешавад. Фарз мекунем, ки ягон барномасоз тасмим гирифт, ки бо дӯстон бозии шашка эҷод кунад. Барои дуруст кор кардани аризаи ӯ, барнома бояд рӯйхати дӯстони ягон бозигарро дастрас кунад. Барои ин, барномасоз ҳуҷҷатҳои API-и VK-ро пайдо мекунад ва мебинад, ки барои гирифтани ин рӯйхат чӣ дархост лозим аст. Ин дархост дархости HTTP номида мешавад. Ва ду дархости маъмултарини HTTP ин GET ва POST мебошанд. Дар Интернет низ дар бораи онҳо кофӣ аст, ман шуморо бозмедорам. Барои мақсадҳои мо, яъне гирифтани маълумоти пешгӯии обу ҳаво, дархости оддии GET кифоя хоҳад буд. Агар мо дархости GET-ро ба веб-serverи муқаррарӣ диҳем, он аксар вақт рамзи html-ро бармегардонад, ки браузер онро ба саҳифаи барои корбар дӯстона табдил дода, услубҳо, скриптҳо ва ғайраҳоро истифода мебарад. Агар мо ба serverи API чунин дархост пешниҳод кунем, ҷавоб одатан танҳо маълумоти хом бе услубҳо ва скриптҳо баргардонида мешавад. Дар равзанаи браузер чунин ба назар мерасад: Мо як боти оддии обу ҳаворо барои Telegram дар чанд шом эҷод мекунем - 1Ин маълумот на барои одамон, балки барои дигар барномаҳо пешбинӣ шудааст, аз ин рӯ дар ин саҳифаҳо ба ҷуз аз худи маълумот чизи иловагӣ вуҷуд надорад. Маълумоти хом аксар вақт бо истифода аз яке аз ду стандарт фиристода мешавад: JSON ё XML. Ҳар яке аз тарафҳои мусбат ва манфии худро дорад, аммо фаҳмидани ҳарду муҳим аст. Шумо аллакай JSON-ро дар скриншоти боло дидаед ва XML чунин менамояд: Мо дар чанд шом барои Telegram як боти оддии обу ҳаво эҷод мекунем - 2Пас аз ҷустуҷӯи кӯтоҳ лоиҳаи Харитаи обу ҳавои кушод бо забони англисӣ пайдо шуд, ки агар шумо дар як дақиқа зиёда аз 50 дархост дархост накунед, маълумотро ройгон пешкаш мекунад. Ин барои мо кофӣ аст, мо сабти ном мекунем, мо токен (code)-и беназир мегирем, ки тавассути он server медонад, ки мо фиребгарон нестем, балки таҳиягарони ояндаи арзанда ҳастем. Мо ба саҳифа бо ҳуҷҷатҳои API ( tyts ) меравем ва мефаҳмем, ки пешгӯии 5-рӯзаро барои ҳар як шаҳр тавассути фиристодани дархости шакл гирифтан мумкин аст.
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-и аслӣ дорем, дар тарафи рост - сохтори сохторӣ: Мо як боти оддии обу ҳаворо барои Telegram дар чанд шом эҷод мекунем - 3 Дидан мумкин аст, ки посух аз 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 Ман боварӣ дорам, ки дар ин ҷо хатогиҳои хаттӣ вуҷуд доранд, бинобар ин шумо метавонед ҳама чизро дар паёми хусусӣ ё дар шарҳ фиристед, агар шумо дар ҳақиқат хашмгин бошед :)
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION