JavaRush /مدونة جافا /Random-AR /نقوم بإنشاء روبوت طقس بسيط لـ Telegram في أمسيات قليلة
Philip J.
مستوى
Днепр

نقوم بإنشاء روبوت طقس بسيط لـ Telegram في أمسيات قليلة

نشرت في المجموعة
أهلاً بكم! موضوع إنشاء الروبوتات لـ Telegrams مبتذل إلى حد ما، وقد تمت كتابة الكثير من الأدلة (على سبيل المثال، هذا ) . لذلك، من الأفضل أن نلقي نظرة فاحصة على العمل مع بعض واجهات برمجة التطبيقات التابعة لجهات خارجية، نظرًا لأن هذه مهارة بالغة الأهمية لأي مطور ويب. سأقول على الفور أن التطبيق لم يهدف إلى توفير التنبؤات الأكثر وظيفية وإفادة، فلا فائدة من التنافس مع مواقع الطقس، كان من المهم معرفة كيفية العمل مع الاتصالات عن بعد وتحليل البيانات باستخدام Java. لذلك، دعونا معرفة ما نحتاج إليه أولا. يتكون طلبنا بشكل أساسي من ثلاثة أجزاء منطقية:
  • قبول رسالة من المستخدم
  • معالجة الرسالة، وإذا كانت أمرًا صالحًا، قم بإعداد البيانات للرد. في حالتنا، قم بإعداد توقعات الطقس إذا قام المستخدم بإدخال المدينة الصحيحة
  • إرسال معلومات جاهزة للمستخدم في الدردشة
النقطتان الأولى والثالثة بسيطة للغاية، وتتعلقان فقط بالعمل مع Telegram API، ويمكن للمهتمين دراسة الرابط الموجود أعلاه. وسوف نركز على النقطة الثانية. يتم استخدام واجهات برمجة التطبيقات عندما يرغب بعض المطورين في توفير الوصول إلى بياناتهم لمطورين آخرين. لنأخذ فكونتاكتي، على سبيل المثال. كل شخص لديه قائمة بالأصدقاء، يتم تخزينها في مكان ما في قاعدة بيانات على خوادم VK. لنفترض أن أحد المبرمجين قرر إنشاء لعبة لعبة الداما مع الأصدقاء. لكي يعمل تطبيقه بشكل صحيح، يجب أن يكون البرنامج قادرًا على الحصول على قائمة أصدقاء أي لاعب. للقيام بذلك، يبحث المبرمج عن وثائق VK API وينظر في الطلب الذي يجب تقديمه للحصول على هذه القائمة. يسمى هذا الطلب طلب HTTP. وطلبا HTTP الأكثر شيوعًا هما GET وPOST. هناك أيضًا ما يكفي عنها على الإنترنت، ولن أمنعك. لأغراضنا، وهي الحصول على بيانات توقعات الطقس، سيكون طلب GET البسيط كافيًا. إذا قدمنا ​​طلب GET إلى خادم ويب عادي، فغالبًا ما يُرجع كود html، والذي يحوله المتصفح إلى صفحة سهلة الاستخدام، ويطبق الأنماط والبرامج النصية وما إلى ذلك. إذا قدمنا ​​مثل هذا الطلب إلى خادم API، فإن الاستجابة عادةً ما يتم إرجاع البيانات الأولية فقط بدون الأنماط والبرامج النصية. في نافذة المتصفح يبدو الأمر كما يلي: نقوم بإنشاء روبوت طقس بسيط لـ Telegram في بضعة أمسيات - 1هذه البيانات ليست مخصصة للأشخاص، بل للبرامج الأخرى، لذلك لا يوجد شيء إضافي في مثل هذه الصفحات باستثناء المعلومات نفسها. غالبًا ما يتم إرسال البيانات الأولية باستخدام أحد المعيارين: JSON أو XML. ولكل منها إيجابيات وسلبيات، ولكن من المهم أن نفهم كليهما. لقد رأيت بالفعل JSON في لقطة الشاشة أعلاه، ويبدو XML كما يلي: نقوم بإنشاء روبوت طقس بسيط لـ Telegram في بضعة أمسيات - 2بعد بحث قصير، تم العثور على مشروع Open Weather Map باللغة الإنجليزية، والذي يوفر البيانات مجانًا إذا لم تقم بإجراء أكثر من 50 طلبًا في الدقيقة. هذا يكفي بالنسبة لنا، نقوم بالتسجيل، ونحصل على رمز مميز (رمز) فريد من خلاله سيعرف الخادم أننا لسنا محتالين، ولكننا مطورين مستقبليين لائقين. نذهب إلى الصفحة التي تحتوي على وثائق API ( tyts )، ونكتشف أنه يمكن الحصول على توقعات لمدة 5 أيام لأي مدينة عن طريق إرسال طلب من النموذج.
https://api.openweathermap.org/data/2.5/forecast?q=(город)&APPID=(уникальный токен, полученный при регистрации)
يمكنك أن ترى كيف تبدو الاستجابة لمثل هذا الطلب في المتصفح، لقد اكتشفنا بالفعل أنه في الواقع، ما عليك سوى اتباع الرابط الصحيح وسيوفر الخادم البيانات اللازمة. كل ما تبقى هو معرفة كيفية القيام بذلك باستخدام Java. يبدو طلب GET البسيط في Java كما يلي:
//создаём строку со ссылкой на нужную 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 بسهولة، تمت كتابة العديد من المكتبات لـ Java لتناسب كل الأذواق. وبما أنني فضلت JSON، فقد اخترت مكتبة مشهورة جدًا تسمى Jackson لمعالجتها. بالمناسبة، تمت دراستها قليلاً في JavaRush في بعض المستويات العالية. لمعالجة كميات كبيرة من بيانات JSON، من المهم فهم بنية المستند. المواقع المفيدة مثل هذا الموقع تأتي للإنقاذ . على اليسار لدينا JSON الأصلي، على اليمين - الكائن المنظم: نقوم بإنشاء روبوت طقس بسيط لـ Telegram في بضعة أمسيات - 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();
الآن يمكننا استخراج أي بيانات من التوقعات، وكل ما تبقى هو لصقها معًا حسب الرغبة وإرسالها إلى المستخدم في Telegram. كود المصدر الكامل موجود على موقع github الخاص بي ، ولكن يمكنك تجربة الروبوت أثناء العمل باستخدام الرابط ، أو من خلال العثور على @denifoBot في بحث Telegram. يجب كتابة اسم المدينة بالحروف اللاتينية، على سبيل المثال "كييف" أو "موسكو". شكرًا لك، إذا وصلت إلى النهاية، فأنا أقبل النقد المعقول، لأنني أتعلم فقط وأطور مشاريع بسيطة على GitHub للتنافس مع المواهب المتعطشة من مدينتي :) وداعًا للجميع! ملاحظة: أعتقد أنه قد تكون هناك أخطاء مطبعية هنا، لذا يمكنك إرسال كل شيء في رسالة خاصة، أو في تعليق إذا كنت غاضبًا حقًا :)
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION