سب کو سلام! ٹیلیگرامس کے لیے بوٹس بنانے کا موضوع کسی حد تک ہیکنی ہے، اور بہت ساری گائیڈز لکھی گئی ہیں (مثال کے طور پر، یہ ایک )۔ لہذا، ہم کسی تیسرے فریق API کے ساتھ کام کرنے پر گہری نظر ڈالیں گے، کیونکہ یہ کسی بھی ویب ڈویلپر کے لیے ایک اہم مہارت ہے۔ میں فوراً ہی کہوں گا کہ ایپلیکیشن سب سے زیادہ فعال اور مفید پیشن گوئی فراہم کرنے کے لیے تیار نہیں تھی؛ موسم کی سائٹس کے ساتھ مقابلہ کرنے کا کوئی فائدہ نہیں؛ یہ جاننا ضروری تھا کہ جاوا کا استعمال کرتے ہوئے ریموٹ کنکشن اور ڈیٹا پارس کے ساتھ کیسے کام کیا جائے۔ تو، آئیے پہلے معلوم کریں کہ ہمیں کیا ضرورت ہے۔ ہماری درخواست بنیادی طور پر تین منطقی حصوں پر مشتمل ہے:
- صارف سے پیغام قبول کریں۔
- پیغام پر کارروائی کریں، اور، اگر یہ ایک درست کمانڈ ہے، تو جواب کے لیے ڈیٹا تیار کریں۔ ہمارے معاملے میں، اگر صارف صحیح شہر میں داخل ہوا ہے تو موسم کی پیشن گوئی تیار کریں۔
- چیٹ میں صارف کو تیار معلومات بھیجیں۔
https://api.openweathermap.org/data/2.5/forecast?q=(город)&APPID=(уникальный токен, полученный при регистрации)
آپ براؤزر میں دیکھ سکتے ہیں کہ ایسی درخواست کا جواب کیسا لگتا ہے۔ جاوا کا استعمال کرتے ہوئے یہ سیکھنا باقی ہے۔ جاوا میں ایک سادہ 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();
اگر درخواست درست تھی اور سرور دستیاب تھا، تو ہمیں ڈیٹا کا ایک شیٹ ملے گا جس میں مفید معلومات کو ایسی معلومات کے ساتھ ملایا گیا ہے جس کی اب ضرورت نہیں ہے۔ JSON اور XML سے ضروری ڈیٹا آسانی سے نکالنے کے لیے، جاوا کے لیے ہر ذائقے کے مطابق بہت ساری لائبریریاں لکھی گئی ہیں۔ چونکہ میں نے 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}
پھر یہ ایک نوڈ ہے جسے "مین" کہا جاتا ہے۔ اس سے کوئی بھی ڈیٹا حاصل کرنے کے لیے، مثلاً سمندر کی سطح، درج ذیل کوڈ کافی ہے:
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();
اب ہم پیشن گوئی سے کوئی بھی ڈیٹا نکال سکتے ہیں، اور جو باقی رہ جاتا ہے وہ اسے اپنی مرضی کے مطابق جوڑ کر ٹیلی گرام میں صارف کو بھیجنا ہے۔ مکمل سورس کوڈ میرے گیتھب پر ہے، لیکن آپ لنک کا استعمال کرتے ہوئے ، یا ٹیلیگرام سرچ میں @denifoBot کو تلاش کرکے بوٹ کو ایکشن میں آزما سکتے ہیں ۔ شہر کا نام لاطینی نقل حرفی میں لکھا جانا چاہیے، مثال کے طور پر "کیو" یا "ماسکو"۔ آپ کا شکریہ، اگر آپ اسے آخر تک پہنچاتے ہیں، تو میں معقول تنقید کو قبول کرتا ہوں، کیونکہ میں صرف اپنے شہر کے بھوکے ٹیلنٹ کا مقابلہ کرنے کے لیے GitHub پر سادہ پروجیکٹس سیکھ رہا ہوں اور تیار کر رہا ہوں :) سب کو الوداع! PS مجھے یقین ہے کہ یہاں ٹائپنگ کی غلطیاں ہوسکتی ہیں، لہذا آپ سب کچھ نجی پیغام میں بھیج سکتے ہیں، یا اگر آپ واقعی ناراض ہیں تو تبصرہ میں :)
GO TO FULL VERSION