JavaRush /Java blogi /Random-UZ /Biz bir necha oqshomlarda Telegram uchun oddiy ob-havo bo...
Philip J.
Daraja
Днепр

Biz bir necha oqshomlarda Telegram uchun oddiy ob-havo botini yaratamiz

Guruhda nashr etilgan
Hammaga salom! Telegramlar uchun botlarni yaratish mavzusi biroz buzilgan va ko'plab qo'llanmalar yozilgan (masalan, bu ) . Shuning uchun, biz uchinchi tomon API bilan ishlashni batafsil ko'rib chiqamiz, chunki bu har qanday veb-ishlab chiquvchi uchun juda muhim mahoratdir. Darhol aytamanki, ilova eng funktsional va foydali prognozni taqdim etish uchun mo'ljallanmagan; ob-havo saytlari bilan raqobat qilishning ma'nosi yo'q; Java yordamida masofaviy ulanishlar va ma'lumotlarni tahlil qilish bilan qanday ishlashni o'rganish muhim edi. Shunday qilib, avvalo, bizga nima kerakligini bilib olaylik. Bizning ilovamiz asosan uchta mantiqiy qismdan iborat:
  • foydalanuvchidan xabarni qabul qilish
  • xabarni qayta ishlang va agar u to'g'ri buyruq bo'lsa, javob uchun ma'lumotlarni tayyorlang. Bizning holatda, agar foydalanuvchi to'g'ri shaharga kirgan bo'lsa, ob-havo prognozini tayyorlang
  • chatdagi foydalanuvchiga tayyor ma'lumotlarni yuborish
Birinchi va uchinchi nuqtalar juda oddiy va faqat Telegram API bilan ishlashga tegishli; qiziquvchilar yuqoridagi havolani o'rganishlari mumkin. Biz ikkinchi nuqtaga e'tibor qaratamiz. API-lar ba'zi ishlab chiquvchilar o'z ma'lumotlariga boshqa ishlab chiquvchilarga kirishni ta'minlamoqchi bo'lganda foydalaniladi. Masalan, VKontakte-ni olaylik. Har bir insonning do'stlari ro'yxati bor, u VK serverlarida ma'lumotlar bazasida saqlanadi. Aytaylik, qandaydir dasturchi do'stlari bilan shashka o'yinini yaratishga qaror qildi. Uning ilovasi to'g'ri ishlashi uchun dastur har qanday o'yinchining do'stlari ro'yxatini olish imkoniyatiga ega bo'lishi kerak. Buning uchun dasturchi VK API uchun hujjatlarni topadi va ushbu ro'yxatni olish uchun qanday so'rovni bajarish kerakligini ko'rib chiqadi. Ushbu so'rov HTTP so'rovi deb ataladi. Va ikkita eng keng tarqalgan HTTP so'rovlari - GET va POST. Internetda ular haqida ham etarli, men sizni to'xtatmayman. Bizning maqsadlarimiz uchun, ya'ni ob-havo ma'lumotlarini olish uchun oddiy GET so'rovi etarli bo'ladi. Agar biz oddiy veb-serverga GET so'rovini qilsak, u ko'pincha html kodini qaytaradi, brauzer uni foydalanuvchi uchun qulay sahifaga aylantiradi, uslublar, skriptlar va hokazolarni qo'llaydi. Agar API serveriga bunday so'rov yuborsak, javob Odatda faqat xom ma'lumotlar uslublar va skriptlarsiz qaytariladi. Brauzer oynasida u shunday ko'rinadi: Biz bir necha oqshomlarda Telegram uchun oddiy ob-havo botini yaratamiz - 1Bu ma'lumotlar odamlar uchun emas, balki boshqa dasturlar uchun mo'ljallangan, shuning uchun bunday sahifalarda ma'lumotlarning o'zidan tashqari ortiqcha narsa yo'q. Xom ma'lumotlar ko'pincha ikkita standartdan biri yordamida yuboriladi: JSON yoki XML. Har birining ijobiy va salbiy tomonlari bor, ammo ikkalasini ham tushunish muhimdir. Yuqoridagi skrinshotda siz allaqachon JSON-ni ko'rgansiz va XML quyidagicha ko'rinadi: Biz bir necha oqshomlarda Telegram uchun oddiy ob-havo botini yaratamiz - 2Qisqa qidiruvdan so'ng, agar siz daqiqada 50 dan ortiq so'rov yubormasangiz, ma'lumotlarni bepul taqdim etadigan ingliz tilidagi Open Weather Map loyihasi topildi. Bu biz uchun etarli, biz ro'yxatdan o'tamiz, biz noyob tokenni (kodni) olamiz, uning yordamida server biz yolg'onchilar emas, balki munosib kelajak ishlab chiquvchilar ekanligimizni bilib oladi. Biz API hujjatlari ( tyts ) bilan sahifaga o'tamiz va har qanday shahar uchun 5 kunlik prognozni ariza so'rovini yuborish orqali olish mumkinligini bilib olamiz.
https://api.openweathermap.org/data/2.5/forecast?q=(город)&APPID=(уникальный токен, полученный при регистрации)
Bunday so'rovga javob brauzerda qanday ko'rinishini ko'rishingiz mumkin.Biz allaqachon bilib oldikki, aslida siz faqat to'g'ri havolaga amal qilishingiz kerak va server kerakli ma'lumotlarni taqdim etadi. Faqat Java yordamida buni qanday qilishni o'rganish qoladi. Java-da oddiy GET so'rovi quyidagicha ko'rinadi:
//создаём строку со ссылкой на нужную 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();
Agar so'rov to'g'ri bo'lsa va server mavjud bo'lsa, biz foydali ma'lumotlar hozir kerak bo'lmagan ma'lumotlar bilan aralashtirilgan ma'lumotlar varag'ini olamiz. JSON va XML dan kerakli ma'lumotlarni qulay tarzda ajratib olish uchun Java uchun har qanday didga mos keladigan tonnalab kutubxonalar yozilgan. Men JSON-ni afzal ko'rganim uchun uni qayta ishlash uchun Jekson nomli juda mashhur kutubxonani tanladim. Aytgancha, u JavaRush-da biroz yuqori darajalarda o'rganilgan. Katta hajmdagi JSON ma'lumotlarini qayta ishlash uchun hujjatning tuzilishini tushunish muhimdir. Bu kabi foydali saytlar yordamga keladi . Chap tomonda bizda asl JSON, o'ngda - tuzilgan: Biz bir necha oqshomlarda Telegram uchun oddiy ob-havo botini yaratamiz - 3 Ko'rinib turibdiki, javob 5 ta yuqori darajadagi JSON obyektlaridan iborat bo'lib, ulardan 2 tasi murakkab va quyidagi filiallar uchun tugunlardir. Bizni qiziqtirgan ma'lumotlar ro'yxat tugunida saqlanadi . Ichki roʻyxat 38 ta JSON qatoridan iborat boʻlib, ularning har biri maʼlum bir vaqtda ob-havoni tavsiflaydi. Ya'ni, bu daraxtga o'xshash strukturaning bir turi bo'lib, u erda ildiz, shoxlar, novdalar va hatto barglar mavjud :) Va tugunlarda shoxlanish sodir bo'ladi. Yaxshiyamki, Jekson har qanday haqiqiy JSONni daraxt sifatida ko'rsatishi mumkin. Shunday qilib, bizga kerak bo'lgan atributning nomini (masalan, havo harorati) va u daraxtning qaysi darajasida joylashganligini bilish, uni olish unchalik muammo bo'lmaydi. Birinchidan, men barcha qatorlarni "ro'yxat" qatoridan chiqarib oldim va ularni alohida ro'yxatga qo'shdim. Taxminan aytganda, men ma'lumotlar bilan varaqni qismlarga ajratdim, ularning har biri alohida prognozdir. Kichik qismlarni yodda tutish va ular bilan ishlash osonroq.
//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());
            }
      }
}
Shunday qilib, biz satrlar ro'yxatini oldik, unda har bir satr ma'lum bir vaqtda JSON ob-havo hisobotini aks ettiradi. Faqat kerakli narsani chiqarib olish va uni formatlash qoladi. Agar bizda shunday qator bo'lsa:
"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}
keyin bu "asosiy" deb nomlangan tugun. Undan har qanday ma'lumotni olish uchun, masalan, dengiz sathi, quyidagi kod kifoya qiladi:
ObjectMapper objectMapper = new ObjectMapper();
//line - это наша JSON-строка
mainNode = objectMapper.readTree(line).get("main");
String seaLevel = mainNode.get("sea_level");
Jekson sizga ma'lumotlarni darhol raqamli formatda taqdim etish imkonini beradi:
double seaLevel = mainNode.get("sea_level").asDouble();
Endi biz prognozdan istalgan maʼlumotni ajratib olishimiz mumkin, qolgani esa uni xohlagancha yopishtirish va Telegram’da foydalanuvchiga yuborish. Toʻliq manba kodi mening githubimda , lekin siz botni amalda havola orqali yoki Telegram qidiruvida @denifoBot ni topish orqali sinab koʻrishingiz mumkin. Shahar nomi lotin transliteratsiyasida yozilishi kerak, masalan, "Kiyev" yoki "Moskva". Rahmat, agar siz oxirigacha yetib kelgan bo'lsangiz, men asosli tanqidni qabul qilaman, chunki men GitHub'da o'z shahrimdagi och iste'dodlar bilan raqobatlashish uchun oddiy loyihalarni o'rganyapman va ishlab chiqyapman :) Hammaga xayr! PS Menimcha, bu erda matn terish xatolari bo'lishi mumkin, shuning uchun siz hamma narsani shaxsiy xabarda yoki agar siz juda g'azablangan bo'lsangiz, sharhda yuborishingiz mumkin :)
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION