JavaRush /Java блогы /Random-KK /Біз бірнеше кеште Telegram үшін қарапайым ауа райы ботын ...
Philip J.
Деңгей
Днепр

Біз бірнеше кеште Telegram үшін қарапайым ауа райы ботын жасаймыз

Топта жарияланған
Бәріңе сәлем! Telegrams үшін боттарды жасау тақырыбы біршама бұзылған және көптеген нұсқаулықтар жазылған (мысалы, бұл ) . Сондықтан, біз кейбір үшінші тарап API интерфейсімен жұмыс істеуді мұқият қарастырғанымыз жөн, өйткені бұл кез келген веб-әзірлеуші ​​үшін өте маңызды дағды. Мен бірден айтамын, бұл қолданба ең функционалды және пайдалы болжамды қамтамасыз етуге арналмаған; ауа-райы сайттарымен бәсекелесудің қажеті жоқ; Java көмегімен қашықтағы қосылымдармен және деректерді талдаумен жұмыс істеуді үйрену маңызды болды. Ендеше, алдымен бізге не қажет екенін анықтап алайық. Біздің қосымшамыз негізінен үш логикалық бөліктен тұрады:
  • пайдаланушыдан хабарды қабылдау
  • хабарды өңдеңіз және егер ол жарамды пәрмен болса, жауап үшін деректерді дайындаңыз. Біздің жағдайда, егер пайдаланушы дұрыс қалаға кірген болса, ауа райы болжамын дайындаңыз
  • чатта пайдаланушыға дайын ақпаратты жіберу
Бірінші және үшінші тармақтар өте қарапайым және тек Telegram API-мен жұмыс істеуге қатысты; қызығушылық танытқандар жоғарыда қалдырылған сілтемені оқи алады. Біз екінші тармаққа тоқталамыз. API интерфейстері кейбір әзірлеушілер өз деректеріне басқа әзірлеушілерге рұқсат бергісі келгенде пайдаланылады. Мысалы, ВКонтакте желісін алайық. Әркімнің достарының тізімі бар, ол VK serverлеріндегі дерекқордың бір жерінде сақталады. Кейбір бағдарламашы достарымен дойбы ойынын жасауды шешті делік. Оның қолданбасы дұрыс жұмыс істеуі үшін бағдарлама кез келген ойыншының достарының тізімін ала алуы керек. Мұны істеу үшін бағдарламашы VK API құжаттамасын табады және осы тізімді алу үшін қандай сұраныс жасау керектігін қарастырады. Бұл сұрау HTTP сұрауы деп аталады. Және ең көп таралған екі HTTP сұрауы - GET және POST. Интернетте олар туралы жеткілікті, мен сізді тоқтатпаймын. Біздің мақсаттарымыз үшін, атап айтқанда, ауа райы болжамы деректерін алу үшін қарапайым GET сұрауы жеткілікті болады. Егер біз әдеттегі веб-serverге GET сұрауын жасасақ, ол көбінесе html codeын қайтарады, оны браузер стильдерді, сценарийлерді және т.б. қолдану арқылы ыңғайлы бетке түрлендіреді. Егер API serverіне осындай сұраныс жасасақ, жауап әдетте тек өңделмеген деректер мәнерлер мен сценарийлерсіз қайтарылады. Браузер терезесінде ол келесідей көрінеді: Біз бірнеше кеште Telegram үшін қарапайым ауа райы ботын жасаймыз - 1Бұл деректер адамдарға емес, басқа бағдарламаларға арналған, сондықтан мұндай беттерде ақпараттың өзінен басқа ештеңе жоқ. Шикі деректер көбінесе екі стандарттың бірі арқылы жіберіледі: JSON немесе XML. Әрқайсысының артықшылықтары мен кемшіліктері бар, бірақ екеуін де түсіну маңызды. Жоғарыдағы скриншотта сіз JSON файлын көрдіңіз және XML келесідей көрінеді: Бірнеше кеште Telegram үшін қарапайым ауа райы ботын жасаймыз - 2Қысқа іздеуден кейін minutesына 50-ден астам сұрау жасамасаңыз, деректерді тегін беретін ағылшын тіліндегі «Ашық ауа райы картасы» жобасы табылды. Бұл бізге жеткілікті, біз тіркелеміз, server біздің жалған емес, лайықты болашақ әзірлеушілер екенімізді білетін бірегей таңбалауыш (code) аламыз. Біз API құжаттамасы бар бетке өтеміз ( tyts ) және кез-келген қала үшін 5 күндік болжамды пішін сұрауын жіберу арқылы алуға болатындығын білеміз.
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, оң жақта - құрылымдық: Біз бірнеше кеште Telegram үшін қарапайым ауа райы ботын жасаймыз - 3 Жауап 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 Бұл жерде қателер болуы мүмкін деп ойлаймын, сондықтан сіз бәрін жеке хабарламаға жібере аласыз немесе шынымен ашулансаңыз, түсініктемеде жібере аласыз :)
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION