JavaRush /جاوا بلاگ /Random-UR /ہم چند شاموں میں ٹیلیگرام کے لیے ایک سادہ موسمی بوٹ بناتے...
Philip J.
سطح
Днепр

ہم چند شاموں میں ٹیلیگرام کے لیے ایک سادہ موسمی بوٹ بناتے ہیں۔

گروپ میں شائع ہوا۔
سب کو سلام! ٹیلیگرامس کے لیے بوٹس بنانے کا موضوع کسی حد تک ہیکنی ہے، اور بہت ساری گائیڈز لکھی گئی ہیں (مثال کے طور پر، یہ ایک )۔ لہذا، ہم کسی تیسرے فریق API کے ساتھ کام کرنے پر گہری نظر ڈالیں گے، کیونکہ یہ کسی بھی ویب ڈویلپر کے لیے ایک اہم مہارت ہے۔ میں فوراً ہی کہوں گا کہ ایپلیکیشن سب سے زیادہ فعال اور مفید پیشن گوئی فراہم کرنے کے لیے تیار نہیں تھی؛ موسم کی سائٹس کے ساتھ مقابلہ کرنے کا کوئی فائدہ نہیں؛ یہ جاننا ضروری تھا کہ جاوا کا استعمال کرتے ہوئے ریموٹ کنکشن اور ڈیٹا پارس کے ساتھ کیسے کام کیا جائے۔ تو، آئیے پہلے معلوم کریں کہ ہمیں کیا ضرورت ہے۔ ہماری درخواست بنیادی طور پر تین منطقی حصوں پر مشتمل ہے:
  • صارف سے پیغام قبول کریں۔
  • پیغام پر کارروائی کریں، اور، اگر یہ ایک درست کمانڈ ہے، تو جواب کے لیے ڈیٹا تیار کریں۔ ہمارے معاملے میں، اگر صارف صحیح شہر میں داخل ہوا ہے تو موسم کی پیشن گوئی تیار کریں۔
  • چیٹ میں صارف کو تیار معلومات بھیجیں۔
پہلا اور تیسرا نکات کافی آسان ہیں، اور صرف ٹیلیگرام API کے ساتھ کام کرنے کی فکر ہے؛ دلچسپی رکھنے والے اوپر دیئے گئے لنک کا مطالعہ کر سکتے ہیں۔ ہم دوسرے نکتے پر توجہ دیں گے۔ APIs کا استعمال اس وقت کیا جاتا ہے جب کچھ ڈویلپر دوسرے ڈویلپرز کو اپنے ڈیٹا تک رسائی فراہم کرنا چاہتے ہیں۔ آئیے مثال کے طور پر VKontakte لیتے ہیں۔ ہر ایک کے پاس دوستوں کی فہرست ہوتی ہے، یہ VK سرورز کے ڈیٹا بیس میں کہیں محفوظ ہوتی ہے۔ ہم کہتے ہیں کہ کچھ پروگرامر نے دوستوں کے ساتھ چیکرس گیم بنانے کا فیصلہ کیا۔ اس کی درخواست کے صحیح طریقے سے کام کرنے کے لیے، پروگرام کو کسی بھی کھلاڑی کے دوستوں کی فہرست حاصل کرنے کے قابل ہونا چاہیے۔ ایسا کرنے کے لیے، پروگرامر VK API کے لیے دستاویزات تلاش کرتا ہے اور دیکھتا ہے کہ اس فہرست کو حاصل کرنے کے لیے کیا درخواست کرنے کی ضرورت ہے۔ اس درخواست کو HTTP درخواست کہا جاتا ہے۔ اور دو سب سے عام HTTP درخواستیں GET اور POST ہیں۔ انٹرنیٹ پر ان کے بارے میں بھی کافی ہے، میں آپ کو نہیں روکوں گا۔ ہمارے مقاصد کے لیے، یعنی موسم کی پیشن گوئی کا ڈیٹا حاصل کرنے کے لیے، ایک سادہ GET درخواست کافی ہوگی۔ اگر ہم ایک باقاعدہ ویب سرور سے GET کی درخواست کرتے ہیں، تو یہ اکثر HTML کوڈ واپس کرے گا، جسے براؤزر صارف کے موافق صفحہ میں تبدیل کرتا ہے، طرزیں، اسکرپٹ وغیرہ کا اطلاق کرتا ہے۔ اگر ہم API سرور سے ایسی درخواست کرتے ہیں، تو جواب عام طور پر صرف خام ڈیٹا بغیر سٹائل اور اسکرپٹ کے واپس کیا جاتا ہے۔ براؤزر ونڈو میں یہ کچھ اس طرح نظر آتا ہے: ہم چند شاموں میں ٹیلیگرام کے لیے ایک سادہ موسمی بوٹ بناتے ہیں - 1یہ ڈیٹا لوگوں کے لیے نہیں ہے، بلکہ دوسرے پروگراموں کے لیے ہے، اس لیے اس طرح کے صفحات میں معلومات کے علاوہ کچھ اضافی نہیں ہے۔ خام ڈیٹا اکثر دو میں سے ایک معیار کا استعمال کرتے ہوئے بھیجا جاتا ہے: JSON یا XML۔ ہر ایک کے اپنے فوائد اور نقصانات ہیں، تاہم، دونوں کو سمجھنا ضروری ہے۔ آپ نے اوپر والے اسکرین شاٹ میں پہلے ہی JSON کو دیکھا ہے، اور XML اس طرح نظر آتا ہے: ہم چند شاموں میں ٹیلیگرام کے لیے ایک سادہ موسمی بوٹ بناتے ہیں - 2ایک مختصر تلاش کے بعد، انگریزی زبان کا اوپن ویدر میپ پروجیکٹ ملا، جو کہ مفت میں ڈیٹا فراہم کرتا ہے اگر آپ فی منٹ 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 پر سادہ پروجیکٹس سیکھ رہا ہوں اور تیار کر رہا ہوں :) سب کو الوداع! PS مجھے یقین ہے کہ یہاں ٹائپنگ کی غلطیاں ہوسکتی ہیں، لہذا آپ سب کچھ نجی پیغام میں بھیج سکتے ہیں، یا اگر آپ واقعی ناراض ہیں تو تبصرہ میں :)
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION