Бәріңе сәлем! Telegrams үшін боттарды жасау тақырыбы біршама бұзылған және көптеген нұсқаулықтар жазылған (мысалы, бұл ) . Сондықтан, біз кейбір үшінші тарап API интерфейсімен жұмыс істеуді мұқият қарастырғанымыз жөн, өйткені бұл кез келген веб-әзірлеуші үшін өте маңызды дағды. Мен бірден айтамын, бұл қолданба ең функционалды және пайдалы болжамды қамтамасыз етуге арналмаған; ауа-райы сайттарымен бәсекелесудің қажеті жоқ; Java көмегімен қашықтағы қосылымдармен және деректерді талдаумен жұмыс істеуді үйрену маңызды болды. Ендеше, алдымен бізге не қажет екенін анықтап алайық. Біздің қосымшамыз негізінен үш логикалық бөліктен тұрады:
- пайдаланушыдан хабарды қабылдау
- хабарды өңдеңіз және егер ол жарамды пәрмен болса, жауап үшін деректерді дайындаңыз. Біздің жағдайда, егер пайдаланушы дұрыс қалаға кірген болса, ауа райы болжамын дайындаңыз
- чатта пайдаланушыға дайын ақпаратты жіберу
https://api.openweathermap.org/data/2.5/forecast?q=(город)&APPID=(уникальный токен, полученный при регистрации)
Браузерде мұндай сұрауға жауап қалай көрінетінін көре аласыз.Шын мәнінде , сізге тек дұрыс сілтеме бойынша өту керек екенін және server қажетті деректерді беретінін білдік. Мұны Java арқылы қалай жасау керектігін үйрену ғана қалады. Java тіліндегі қарапайым GET сұрауы келесідей:
//создаём строку со ссылкой на нужную 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 жоғарғы деңгейлі JSON нысанынан тұратынын көруге болады, оның 2-і күрделі және келесі тармақтар үшін түйіндер. Бізді қызықтыратын деректер тізім түйінінде сақталады . Ішкі тізім - әрқайсысы белгілі бір уақыттағы ауа райын сипаттайтын 38 JSON жолының массиві. Яғни, тамыры, бұтақтары, бұтақтары және тіпті жапырақтары бар ағаш тәрізді құрылымның бір түрі :) Ал түйіндерде тармақтану орын алады. Бақытымызға орай, Джексон ағаш ретінде кез келген жарамды JSON көрсете алады. Осылайша, бізге қажет атрибуттың атын (мысалы, ауа температурасы) және ол ағаштың қандай деңгейінде орналасқанын білу, оны алу көп қиындық тудырмайды. Алдымен мен «тізім» массивінен барлық жолдарды шығарып, оларды бөлек тізімге қостым. Дөрекі айтқанда, мен деректер жазылған парақты кесіп тастадым, олардың әрқайсысы жеке болжам. Кішкентай бөлшектерді есте сақтау және пайдалану оңайырақ.
//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}
онда бұл «негізгі» деп аталатын түйін. Одан кез келген деректерді алу үшін, мысалы, теңіз деңгейі, келесі code жеткілікті:
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-да пайдаланушыға жіберу ғана қалады. Толық бастапқы codeы менің github сайтында, бірақ сілтеме арқылы немесе Telegram іздеуінде @denifoBot табу арқылы ботты әрекет етіп көруге болады . Қала атауы латын транслитерациясымен жазылуы керек, мысалы, «Киев» немесе «Мәскеу». Рахмет, егер сіз оны аяғына дейін жеткізсеңіз, мен орынды сынды қабылдаймын, өйткені мен GitHub-та өз қаламдағы аш таланттармен бәсекелесу үшін қарапайым жобаларды үйреніп, дамытып жатырмын :) Барлығына сау бол! PS Бұл жерде қателер болуы мүмкін деп ойлаймын, сондықтан сіз бәрін жеке хабарламаға жібере аласыз немесе шынымен ашулансаңыз, түсініктемеде жібере аласыз :)
GO TO FULL VERSION