JavaRush /جاوا بلاگ /Random-SD /اسان ڪجھ شامن ۾ ٽيليگرام لاءِ ھڪڙو سادو موسم وارو بوٽ ٺاھ...
Philip J.
سطح
Днепр

اسان ڪجھ شامن ۾ ٽيليگرام لاءِ ھڪڙو سادو موسم وارو بوٽ ٺاھيو آھي

گروپ ۾ شايع ٿيل
هيلو سڀ! ٽيليگرامس لاءِ بوٽس ٺاهڻ جو موضوع ڪجهه حد تائين ڇڪيل آهي، ۽ تمام گهڻيون هدايتون لکيون ويون آهن (مثال طور، هي هڪ ). تنهن ڪري، اسان بهتر طور تي ڪجهه ٽئين پارٽي API سان ڪم ڪرڻ تي هڪ ويجهي نظر رکون ٿا، ڇاڪاڻ ته هي ڪنهن به ويب ڊولپر لاء هڪ نازڪ مهارت آهي. مان فوري طور تي چوندس ته ايپليڪيشن سڀ کان وڌيڪ ڪارائتو ۽ ڪارائتو اڳڪٿي مهيا ڪرڻ لاءِ تيار نه ڪئي وئي آهي؛ موسم جي سائيٽن سان مقابلو ڪرڻ ۾ ڪو به مقصد ناهي؛ اهو سکڻ ضروري هو ته ريموٽ ڪنيڪشن سان ڪيئن ڪم ڪجي ۽ جاوا استعمال ڪندي ڊيٽا پارس ڪرڻ. سو، اچو ته معلوم ڪريون ته اسان کي پهرين ڪهڙي ضرورت آهي. اسان جي ايپليڪيشن بنيادي طور تي ٽن منطقي حصن تي مشتمل آهي:
  • صارف کان پيغام قبول ڪريو
  • پيغام کي پروسيس ڪريو، ۽، جيڪڏهن اهو صحيح حڪم آهي، جواب لاء ڊيٽا تيار ڪريو. اسان جي حالت ۾، موسم جي اڳڪٿي تيار ڪريو جيڪڏهن صارف صحيح شهر ۾ داخل ٿيو
  • چيٽ ۾ استعمال ڪندڙ کي تيار معلومات موڪليو
پهريون ۽ ٽيون نقطا بلڪل سادو آهن، ۽ صرف ٽيليگرام API سان ڪم ڪرڻ جي ڳڻتي؛ جيڪي دلچسپي رکن ٿا انهن کي مٿي ڇڏيل لنڪ جو مطالعو ڪري سگهن ٿا. اسان ٻئي نقطي تي ڌيان ڏينداسين. APIs استعمال ڪيا ويندا آهن جڏهن ڪجهه ڊولپرز ٻين ڊولپرز کي انهن جي ڊيٽا تائين رسائي فراهم ڪرڻ چاهيندا آهن. اچو ته وٺو VKontakte، مثال طور. هر ڪنهن وٽ دوستن جي هڪ فهرست آهي، اهو VK سرور تي ڊيٽابيس ۾ ڪٿي ذخيرو ٿيل آهي. اچو ته چوندا آهن ته ڪجهه پروگرامر دوستن سان گڏ چيڪرز راند ٺاهڻ جو فيصلو ڪيو. هن جي اپليڪيشن لاء صحيح ڪم ڪرڻ لاء، پروگرام کي ڪنهن به رانديگر جي دوستن جي لسٽ حاصل ڪرڻ جي قابل هوندو. هن کي ڪرڻ لاء، پروگرامر VK API لاء دستاويز ڳولي ٿو ۽ ڏسي ٿو ته هن فهرست کي حاصل ڪرڻ لاء ڪهڙي درخواست جي ضرورت آهي. هن درخواست کي HTTP درخواست سڏيو ويندو آهي. ۽ ٻه عام HTTP درخواستون آهن GET ۽ POST. انٽرنيٽ تي انهن جي باري ۾ پڻ ڪافي آهي، مان توهان کي نه روڪيندس. اسان جي مقصدن لاءِ، يعني موسم جي اڳڪٿي واري ڊيٽا حاصل ڪرڻ لاءِ، هڪ سادي GET درخواست ڪافي هوندي. جيڪڏهن اسان هڪ باقاعده ويب سرور ڏانهن GET درخواست ڪريون ٿا، اهو اڪثر ڪري html ڪوڊ واپس ڪندو، جنهن کي برائوزر صارف دوست صفحي ۾ تبديل ڪري ٿو، اسٽائل، اسڪرپٽ وغيره لاڳو ڪري ٿو. جيڪڏهن اسان API سرور کي اهڙي درخواست ڪريون ٿا، جواب عام طور تي صرف خام ڊيٽا بغير طرز ۽ اسڪرپٽ جي موٽائي ويندي آهي. برائوزر ونڊو ۾ اهو ڪجهه هن طرح نظر اچي ٿو: اسان ڪجھ شامن ۾ ٽيليگرام لاءِ ھڪڙو سادو موسم وارو بوٽ ٺاھيون ٿا - 1هي ڊيٽا ماڻهن لاءِ نه آهي، پر ٻين پروگرامن لاءِ، تنهن ڪري اهڙين صفحن ۾ معلومات کان سواءِ ٻيو ڪجهه به ناهي. خام ڊيٽا اڪثر ڪري موڪليو ويندو آهي ٻن معيارن مان هڪ استعمال ڪندي: JSON يا XML. هر هڪ پنهنجي نفعو ۽ نقصان آهي، جڏهن ته، اهو ضروري آهي ته ٻنهي کي سمجهڻ لاء. توھان اڳ ۾ ئي مٿي ڏنل اسڪرين شاٽ ۾ JSON ڏٺو آھي، ۽ XML ھن طرح نظر اچي ٿو: اسان ڪجھ شامن ۾ ٽيليگرام لاءِ ھڪڙو سادو موسم وارو بوٽ ٺاھيو آھي - 2ٿوري ڳولا کان پوءِ، انگريزي ٻوليءَ جو Open Weather Map پروجيڪٽ مليو، جيڪو مفت ۾ ڊيٽا مهيا ڪري ٿو جيڪڏھن توھان 50 کان وڌيڪ درخواستون في منٽ نه ٿا ڏيو. اهو اسان لاءِ ڪافي آهي، اسان رجسٽر ڪريون ٿا، اسان کي هڪ منفرد ٽوڪن (ڪوڊ) ملي ٿو جنهن جي ذريعي سرور کي خبر پوندي ته اسين ٺڳي ڪندڙ نه آهيون، پر مهذب مستقبل جا ڊولپر آهيون. اسان API دستاويزن سان صفحي تي وڃون ٿا ( tyts )، ۽ معلوم ڪريو ته ڪنهن به شهر لاءِ 5 ڏينهن جي اڳڪٿي فارم جي درخواست موڪلڻ سان حاصل ڪري سگهجي ٿي.
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 آھي، ساڄي پاسي - ھڪڙي ترتيب ڏنل: اسان ڪجھ شامن ۾ ٽيليگرام لاءِ ھڪڙو سادو موسم وارو بوٽ ٺاھيو ٿا - 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}
پوء اهو هڪ نوڊ سڏيو ويندو آهي "مکيه". ان مان ڪا به ڊيٽا حاصل ڪرڻ لاءِ، مثال طور سمنڊ جي سطح، هيٺ ڏنل ڪوڊ ڪافي آهي:
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 تي سادي منصوبن کي سکي رهيو آهيان ۽ ترقي ڪري رهيو آهيان ته جيئن منهنجي شهر جي بکايل صلاحيتن سان مقابلو ڪرڻ لاءِ :) الوداع هر ڪنهن کي! پي ايس مان سمجهان ٿو ته هتي ٽائپس ٿي سگهي ٿي، تنهنڪري توهان هر شي کي ذاتي پيغام ۾، يا تبصري ۾ موڪلي سگهو ٿا جيڪڏهن توهان واقعي ناراض آهيو :)
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION