JavaRush /Blog Jawa /Random-JV /Kita nggawe bot cuaca sing gampang kanggo Telegram ing sa...
Philip J.
tingkat
Днепр

Kita nggawe bot cuaca sing gampang kanggo Telegram ing sawetara sore

Diterbitake ing grup
Halo kabeh! Topik nggawe bot kanggo Telegram kaya-kaya diretas, lan akeh pandhuan sing wis ditulis (contone, iki ) . Mula, luwih becik kita nliti babagan nggarap sawetara API pihak katelu, amarga iki minangka katrampilan kritis kanggo pangembang web. Aku bakal langsung ujar manawa aplikasi kasebut ora nyedhiyakake ramalan sing paling fungsional lan migunani; ora ana gunane saingan karo situs cuaca; penting kanggo sinau cara nggarap sambungan remot lan parsing data nggunakake Jawa. Dadi, ayo goleki apa sing dibutuhake dhisik. Aplikasi kita ateges kasusun saka telung bagean logis:
  • nampa pesen saka pangguna
  • proses pesen, lan, yen prentah bener, nyiapake data kanggo respon. Ing kasus kita, nyiyapake ramalan cuaca yen pangguna mlebu kutha sing bener
  • ngirim informasi siap kanggo pangguna ing chatting
Poin pisanan lan katelu cukup prasaja, lan mung keprihatinan nggarap API Telegram; sing kasengsem bisa sinau link sing ditinggalake ing ndhuwur. Kita bakal fokus ing titik kapindho. API digunakake nalika sawetara pangembang pengin menehi akses menyang data menyang pangembang liyane. Ayo njupuk VKontakte, contone. Saben uwong duwe dhaptar kanca, disimpen ing endi wae ing database ing server VK. Contone, sawetara programmer mutusake nggawe game checkers karo kanca-kanca. Supaya aplikasi kasebut bisa digunakake kanthi bener, program kasebut kudu entuk dhaptar kanca saka pemain apa wae. Kanggo nindakake iki, programmer nemokake dokumentasi kanggo API VK lan ndeleng panjaluk apa sing kudu ditindakake kanggo entuk dhaptar iki. Panjaluk iki diarani panjalukan HTTP. Lan loro panjalukan HTTP sing paling umum yaiku GET lan POST. Ana uga cukup babagan ing Internet, aku ora bakal mungkasi sampeyan. Kanggo tujuan kita, yaiku entuk data ramalan cuaca, panjaluk GET sing gampang bakal cukup. Yen kita nggawe panjalukan GET menyang server web biasa, mesthine bakal ngasilake kode html, sing diowahi browser dadi kaca sing ramah pangguna, ngetrapake gaya, skrip, lan liya-liyane. biasane Mung data mentah sing bali tanpa gaya lan skrip. Ing jendhela browser katon kaya iki: Kita nggawe bot cuaca sing gampang kanggo Telegram ing sawetara sore - 1Data iki ora dimaksudake kanggo wong, nanging kanggo program liyane, mula ora ana apa-apa tambahan ing kaca kasebut kajaba informasi kasebut dhewe. Data mentah paling kerep dikirim nggunakake salah siji saka rong standar: JSON utawa XML. Saben duwe pro lan cons, Nanging, iku penting kanggo ngerti loro. Sampeyan wis ndeleng JSON ing gambar ing ndhuwur, lan XML katon kaya iki: Kita nggawe bot cuaca sing gampang kanggo Telegram ing sawetara sore - 2Sawise panelusuran singkat, proyek Peta Cuaca Terbuka basa Inggris ditemokake, sing nyedhiyakake data kanthi gratis yen sampeyan ora nggawe luwih saka 50 panjalukan saben menit. Iki cukup kanggo kita, kita ndhaptar, kita nampa token unik (kode) sing server bakal ngerti yen kita ora impostor, nanging pangembang mangsa sing prayoga. Kita pindhah menyang kaca kanthi dokumentasi API ( tyts ), lan ngerteni manawa ramalan 5 dina kanggo kutha apa wae bisa dipikolehi kanthi ngirim panjaluk formulir kasebut.
https://api.openweathermap.org/data/2.5/forecast?q=(город)&APPID=(уникальный токен, полученный при регистрации)
Sampeyan bisa ndeleng carane nanggepi panjalukan kasebut katon ing browser. Kita wis ngerti yen, nyatane, sampeyan mung kudu ngetutake link sing bener lan server bakal nyedhiyakake data sing dibutuhake. Sing isih ana yaiku sinau carane nindakake iki nggunakake Jawa. Panjaluk GET prasaja ing Jawa katon kaya iki:
//создаём строку со ссылкой на нужную 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();
Yen panjaluk kasebut bener lan server kasedhiya, kita bakal nampa lembaran data sing informasi migunani dicampur karo informasi sing ora dibutuhake saiki. Kanggo gampang ngekstrak data sing dibutuhake saka JSON lan XML, akeh perpustakaan wis ditulis kanggo Java sing cocog karo saben rasa. Awit aku seneng JSON, Aku milih perpustakaan banget populer disebut Jackson kanggo proses. Miturut cara, iki sinau sethitik ing JavaRush ing sawetara tingkat dhuwur. Kanggo ngolah data JSON kanthi jumlah gedhe, penting kanggo mangerteni struktur dokumen kasebut. Situs sing migunani kaya iki teka kanggo ngluwari . Ing sisih kiwa kita duwe JSON asli, ing sisih tengen - sing terstruktur: Kita nggawe bot cuaca sing gampang kanggo Telegram ing sawetara sore - 3 Bisa dideleng manawa respon kasebut kalebu 5 obyek JSON tingkat paling dhuwur, 2 sing kompleks lan minangka simpul kanggo cabang ing ngisor iki. Data sing kita minati disimpen ing simpul dhaptar . Dhaptar ing njero yaiku susunan 38 garis JSON, saben nggambarake cuaca ing wektu tartamtu. Yaiku, struktur kaya wit, ing endi ana oyod, cabang, ranting lan malah godhong :) Lan ing simpul kasebut ana cabang. Untunge, Jackson bisa makili JSON sing bener minangka wit. Mangkono, ngerti jeneng atribut sing kita butuhake (umpamane, suhu udhara), lan ing tingkat apa wit kasebut, entuk ora bakal dadi masalah. Pisanan, aku ngekstrak kabeh baris saka larik "dhaftar" lan ditambahake menyang dhaptar sing kapisah. Kira-kira, aku Cut sheet karo data menyang bêsik, saben kang minangka ramalan kapisah. bagean cilik luwih gampang kanggo mbudidaya lan operate karo.
//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());
            }
      }
}
Dadi, kita entuk dhaptar senar, sing saben baris nggambarake laporan cuaca JSON ing wektu tartamtu. Kabeh sing isih ana yaiku ngekstrak apa sing dikarepake lan format. Yen kita duwe baris kaya iki:
"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}
banjur iki simpul disebut "utama". Kanggo entuk data apa wae, contone level segara, kode ing ngisor iki cukup:
ObjectMapper objectMapper = new ObjectMapper();
//line - это наша JSON-строка
mainNode = objectMapper.readTree(line).get("main");
String seaLevel = mainNode.get("sea_level");
Jackson ngidini sampeyan langsung makili data ing format numerik:
double seaLevel = mainNode.get("sea_level").asDouble();
Saiki kita bisa ngekstrak data apa wae saka ramalan kasebut, lan sing isih ana yaiku nglebokake kaya sing dikarepake lan dikirim menyang pangguna ing Telegram. Kode sumber lengkap ana ing githubku , nanging sampeyan bisa nyoba bot ing tumindak nggunakake link , utawa nemokake @denifoBot ing panelusuran Telegram. Jeneng kutha kudu ditulis ing transliterasi Latin, contone "Kyiv" utawa "Moscow". Matur nuwun, yen sampeyan wis rampung, aku nampa kritik sing cukup, amarga aku mung sinau lan ngembangake proyek sing prasaja ing GitHub kanggo saingan karo bakat luwe saka kuthaku :) Bye everyone! PS Aku percaya yen ana kesalahan ketik ing kene, mula sampeyan bisa ngirim kabeh kanthi pesen pribadi, utawa ing komentar yen sampeyan nesu :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION