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
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: 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 :)
GO TO FULL VERSION