كيفية إنشاء ونشر Telegram بوت؟

في هذه المقالة، ستقوم ببناء روبوت Telegram (تيليجرام) باستخدام Node.js و Back4app’s backend-as-a-service. ثم ستنشره باستخدام حاويات Back4app.

الروبوتات هي برمجيات يمكنها تنفيذ مهام متكررة تلقائيًا عبر شبكة أو على منصة ما. تُنشأ روبوتات Telegram باستخدام واجهة برمجة تطبيقات Telegram الآلية (Telegram bot API) وهي مصممة خصيصًا للعمل على Telegram.

يمكنك تصميم روبوتات Telegram لأداء مهام مختلفة على Telegram، مثل استرجاع معلومات مثل تحديثات الطقس أو عناوين الأخبار واستضافة مسابقات للتسلية.

ويمكنها أيضاً أتمتة مهام مثل جدولة التذكيرات وإجراء مصادقة بسيطة للمستخدم، من بين أمور أخرى.

إعداد بيئة التطوير الخاصة بك

يعرض هذا المقال روبوت Telegram الذي يُمكّن المستخدمين من إعداد تحديثات الطقس التلقائية لمدينتهم المفضلة كل 6 ساعات أو الحصول على معلومات فورية عن حالة الطقس لأي مدينة يختارونها.

لإعداد دليل المشروع الخاص بك، قم بتشغيل الأوامر أدناه:

# إنشاء دليل المشروع الخاص بك
mkdir telegram-weather-bot

# cd إلى دليل المشروع الخاص بك
cd telegram-weather-bot

# قم بتهيئة npm
npm init -y

الأوامر أعلاه تُنشئ دليل برقية-روبوت-طقس-روبوت، وتنتقل إليه، وتهيئ npm فيه.

في ملف package.json الخاص بك، أضف نص البدء التالي لتشغيل الروبوت الخاص بك:

"start": "node server.js"

بعد ذلك، قم بتشغيل الأمر أدناه لتثبيت الحزم المطلوبة لهذا المشروع:

npm install axios node-telegram-bot-api dotenv node-schedule parse

قام الأمر أعلاه بتثبيت الحزم التالية:

  • أكسيوس: ستستخدم هذه المكتبة لتقديم طلبات HTTP إلى واجهة برمجة تطبيقات الطقس.
  • node-telegram-bot-API: تبسّط هذه المكتبة التفاعل مع واجهة برمجة تطبيقات Telegram بوت.
  • dotenv: ستساعدك هذه الحزمة على تحميل متغيرات البيئة من ملف .env.
  • جدولة العقدة: ستحتاج إلى هذه الحزمة لجدولة المهام وأتمتة تحديثات الطقس الخاصة بك.
  • Parse: ستحتاج إلى هذه الحزمة للتفاعل مع Back4app Parse Backend.

الآن، لقد قمت بإعداد بيئة التطوير الخاصة بك. بعد ذلك، تحتاج إلى إنشاء حساب بوت على Telegram.

إنشاء حسابك على Telegram بوت

سيكون حساب بوت Telegram بمثابة هوية البوت الخاص بك على منصة Telegram سيتمكن المستخدمون من التفاعل مع البوت من خلال هذا الحساب.

لإنشاء روبوت Telegram الخاص بك، شغّل تطبيق Telegram، أدخل “BotFather” في شريط البحث، وانقر على النتيجة الأعلى التي تم التحقق منها.

صفحة البداية الأب الروبوت

BotFather هو روبوت Telegram يسمح لك بتطوير روبوتات أخرى بسرعة. اكتب الأمر /الروبوت الجديد لبدء عملية إنشاء روبوتك. ستقدم اسمًا واسم مستخدم فريد لروبوتك.

تيليجرام بوتفاذر

بمجرد أن تقدم اسم الروبوت واسم المستخدم الخاص بك، سيوفر لك BotFather رمزًا مميزًا فريدًا يسمح لك بالتفاعل مع حساب الروبوت وإدارته.

قم بتخزين رمز الروبوت في مشروعك عن طريق إنشاء ملف .env في الدليل الجذر ولصق رمز الروبوت في الملف. هكذا

TELEGRAM_BOT_TOKEN = <YOUR_BOT_TOKEN>

الآن وبعد حصولك على رمز البوت الخاص بك وتخزينه في مشروعك، يمكنك إنشاء بوت Telegram الخاص بك.

بناء روبوت Telegram

سيرشدك هذا القسم إلى كيفية إنشاء روبوت الطقس في Telegram ودمج المكتبات التي ثبّتها لأداء وظائف مثل التعامل مع الأوامر، وإدارة حالة المستخدم، واسترجاع البيانات من واجهة برمجة تطبيقات الطقس.

قم ببناء دليل الروبوت الخاص بك بشكل مشابه للدليل أدناه لبدء عملية الإنشاء:

telegram-weather-bot/
├── node_modules/          
├── src/                        
|   ├── bot.js                    # ملف لمعالجة تفاعل البوت مع المستخدم
|   ├── weather.js                # وحدة لجلب بيانات الطقس 
|   ├── stateManager.js           # وحدة لإدارة حالة المستخدم باستخدام Back4App
|   └── cityManager.js            # يدير إعدادات مدينة المستخدم ويرسل تحديثات الطقس
├── .env                        
├── package.json                  
├── server.js                     # نقطة الدخول لتطبيقك
└── package-lock.json            

الحصول على معلومات الطقس

للحصول على معلومات الطقس، ستستخدم واجهة برمجة تطبيقات OpenWeatherMap.

يتطلب إجراء طلبات إلى واجهة برمجة التطبيقات هذه مفتاح واجهة برمجة التطبيقات. للحصول على مفتاح واجهة برمجة التطبيقات هذا، قم بتسجيل الدخول إلى حسابك (أو قم بإنشاء حساب إذا لم يكن لديك حساب).

بعد ذلك، انتقل إلى قسم “مفاتيح API الخاصة بي” في ملفك الشخصي وانسخ مفتاح API الخاص بك.

OpenWeatherMap API

قم بتخزين مفتاح API الخاص ب OpenWeatherMap في ملف .env الخاص بك:

OPENWEATHERMAP_TOKEN = <YOUR_OPEN_WEATHER_MAP_APIKEY>

بما أن وظيفة الروبوت تتمحور حول الحصول على معلومات الطقس، حدِّد دالة تقوم بإجراء طلب GET إلى واجهة برمجة تطبيقات OpenWeatherMap لاسترداد معلومات الطقس باستخدام طريقة axios.get.

أضف الكتلة البرمجية أدناه إلى ملف weather.js الخاص بك لإجراء طلب GET للحصول على معلومات الطقس من واجهة برمجة تطبيقات OpenWeatherMap:

const axios = require('axios');
const apiKey = process.env.OPENWEATHERMAP_TOKEN;

async function getWeather(city) {
  try {
    const url = `https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${apiKey}&units=metric`;
    const response = await axios.get(url);
    const temp = response.data.main.temp;  
    const description = response.data.weather[0].description;  
    return `The weather in ${city} is ${temp}°C with ${description}.`;
  } catch (error) {
    console.error('Error fetching weather:', error);
    throw error;
  }
}

module.exports = { getWeather } 

تُعرّف كتلة التعليمات البرمجية أعلاه دالة getWeather التي تأخذ اسم المدينة كوسيطة لها وتُرجع درجة الحرارة ووصف الطقس من استجابة واجهة برمجة التطبيقات.

لتزويد المستخدمين بتحديثات منتظمة للطقس كل 6 ساعات، ستحتاج إلى تنفيذ دالة جدولة تقوم بتشغيل دالة getWeather لإرجاع تحديثات الطقس للمدينة المفضلة.

جدولة تحديثات الطقس

لجدولة مهمة إرجاع تحديثات الطقس لمدينة مفضلة، أضف كتلة التعليمات البرمجية أدناه في cityManager.js:

const schedule = require('node-schedule');
const weather = require('./weather');

let userCities = {};

function setCity(chatId, city) {
  userCities[chatId] = city;
}

function init(bot) {
  schedule.scheduleJob('0 */6 * * *', function() {
    for (let chatId in userCities) {
      const city = userCities[chatId];
      weather.getWeather(city).then(response => {
        bot.sendMessage(chatId, response);
      }).catch(error => {
        bot.sendMessage(chatId, "Failed to retrieve weather.");
      });
    }
  });
}

module.exports = { setCity, init };

تنشئ الكتلة البرمجية أعلاه دالتين: setCity و init.

تُعلن كتلة التعليمات البرمجية كائن userCities لتتبع المدن التي يهتم بها مستخدمو البوت من خلال تعيين معرّفات دردشة Telegram الخاصة بهم إلى أسماء المدن باستخدام دالة setCity.

تتيح هذه الوظيفة للبوت الخاص بك استمرار تفضيلات المستخدم بشأن المدينة التي يرغب في تلقي تحديثات الطقس فيها.

تقوم دالة البدء في كتلة التعليمات البرمجية بإعداد مهمة مجدولة كل 6 ساعات تقوم بتكرار جميع معرّفات الدردشة المخزنة في userCities. تستخدم دالة البدء وحدة الطقس لجلب حالة الطقس الحالية لتلك المدينة.

يحتاج الروبوت الخاص بك إلى استمرار حالة المستخدم لتتبع مستخدميه المختلفين ومدنهم المفضلة. يمكنك تحقيق ذلك باستخدام الواجهة الخلفية لـ Back4app كخدمة.

لجعل الروبوت الخاص بك يتتبع المستخدمين المختلفين ومدنهم المفضلة، قم بتخزين المدينة المفضلة لمستخدم الروبوت باستخدام الواجهة الخلفية لـ Back4app كخدمة.

إنشاء خلفية Back4app

لاستخدام خلفية Back4app كخدمة، تحتاج إلى حساب Back4app. إذا لم يكن لديك حساب، يمكنك التسجيل مجاناً.

سجّل الدخول إلى حسابك وانقر على زر “تطبيق جديد” في الزاوية العلوية اليمنى. قم بتسمية تطبيقك وانقر على زر “إنشاء”.

إنشاء تطبيق Back4app جديد

بعد النقر على زر “إنشاء”، سيقوم Back4app بإنشاء تطبيقك وتوجيهك إلى لوحة تحكم التطبيق.

لوحة معلومات تطبيق Back4app

يتطلب منك الاتصال بمثيل تطبيقك على Back4App من مشروع Node.js الخاص بك تهيئة مجموعة أدوات تطوير البرمجيات التي قمت بتثبيتها باستخدام بيانات اعتماد تطبيق Back4App الخاص بك: معرّف التطبيق ومفتاح جافا سكريبت.

احصل على معرّف التطبيق ومفتاح جافا سكريبت من Back4app بالانتقال إلى قسم “الأمان والمفاتيح” بالنقر على “إعدادات التطبيق” على الشريط الجانبي.

قم بتخزينها في ملف .env الخاص بك . يجب أن يكون ملف .env الحالي لديك مشابه للملف أدناه:

TELEGRAM_BOT_TOKEN= "<YOUR_TELEGRAM_BOT_TOKEN_HERE>"
OPENWEATHERMAP_TOKEN= "<YOUR_OPENWEATHERMAP_TOKEN_HERE>"
BACK4APP_APP_ID= "<YOUR_BACK4APP_APP_ID_HERE>"
BACK4APP_JAVASCRIPT_KEY= "<YOUR_BACK4APP_JAVASCRIPT_KEY_HERE>"

بعد ذلك، تحتاج إلى إنشاء فئة “UserState” جديدة تحتوي على حقلين: معرف المستخدم (سلسلة) والحالة (كائن). ستستخدم وكيل الذكاء الاصطناعي الخاص ب Back4app لإنجاز هذه المهمة.

لإنشاء هذه الفئة مع الحقول ذات الصلة، انتقل إلى علامة التبويب “وكيل الذكاء الاصطناعي” على شاشتك وأعطِ الوكيل المطالبة أدناه:

Create a new class, "UserState," in my Back4app application with the APP ID “<YOUR_BACK4APP_APP_ID_HERE>”. The "UserState" class will have two fields: userId (string) and state (object).

يجب أن تحصل على رد مشابه للصورة أدناه:

استجابة وكيل الذكاء الاصطناعي

إذا تحققت من لوحة تحكم Back4app، يجب أن ترى فئة UserState التي تم إنشاؤها بنجاح.

إدارة حالة المستخدم في روبوت Telegram الخاص بك

لإدارة تدفق التفاعل بين مستخدم الروبوت والبوت تحتاج إلى تحديد حالة المستخدم التي تشير إلى الأمر الذي يتوقعه الروبوت من المستخدم.

بصرف النظر عن الأمر /بدء، يفهم البوت أمرين رئيسيين. يؤدي كل تفاعل للمستخدم (بما في ذلك الأوامر) إلى تشغيل تحديث لحالة المستخدم، يتم تخزينه مع معرّف الدردشة الخاص به في فئة UserState.

تسمح إدارة الحالة هذه للروبوت بتذكر تفاصيل معينة لكل مستخدم داخل المحادثة، مثل المدينة التي يفضلها للحصول على تحديثات الطقس.

لبدء تتبع حالات المستخدم باستخدام فئة UserState التي قمت بإنشائها في قاعدة بيانات Back4App، تحتاج إلى تهيئة Parse SDK ببيانات الاعتماد الخاصة بك.

أضف كتلة التعليمات البرمجية أدناه إلى stateManager.js لتهيئة Parse SDK ببيانات الاعتماد المطلوبة للاتصال ب Back4app Parse Backend:

// stateManager.js
const Parse = require('parse/node');

Parse.initialize(
  process.env.BACK4APP_APP_ID,
  process.env.BACK4APP_JAVASCRIPT_KEY
);

Parse.serverURL = '<https://parseapi.back4app.com/>';

بعد ذلك، عرّف كائن Parse في ملف stateManager.js الخاص بك لتمثيل مخطط فئة UserState في الواجهة الخلفية ل Back4app Parse، مما يسمح للبوت الخاص بك بالتفاعل مع حالة المستخدم المخزنة في قاعدة البيانات.

هكذا

// stateManager.js
const UserState = Parse.Object.extend('UserState');

بعد ذلك، ستحتاج إلى تمكين الروبوت الخاص بك من استرداد حالة المحادثة الحالية لمستخدم معين استنادًا إلى معرّف المستخدم المخزّن في قاعدة البيانات.

لاسترداد حالة المستخدم، ستحتاج إلى تشغيل استعلام على فئة UserState باستخدام معرّف المستخدم للعثور على الحالة المحفوظة في قاعدة البيانات.

هكذا

// stateManager.js
async function getUserState(userId) {
  const query = new Parse.Query(UserState);
  query.equalTo('userId', userId.toString());
  const userState = await query.first();
  return userState ? userState.get('state') : null;
}

تُعرِّف الكتلة البرمجية أعلاه دالة getUserState التي تجلب بيانات حالة المستخدم بشكل غير متزامن.

تُنشئ الدالة استعلامًا للعثور على كائن حالة المستخدم استنادًا إلى الوسيطة(userId) وتسترجع حالة المستخدم إذا وجدت.

بعد استرداد حالة المستخدم، ستحتاج إلى تمكين الروبوت الخاص بك من تحديث حالة المحادثة المرتبطة بهذا المستخدم بناءً على معرّف المستخدم الخاص به ومعلومات الحالة المقدمة.

على سبيل المثال، سيؤدي تحديث حالة المحادثة إلى تمكين الروبوت من تحديث المدينة المفضلة للحصول على تحديثات منتظمة للطقس.

هكذا

// stateManager.js
async function setUserState(userId, state) {
  const query = new Parse.Query(UserState);
  query.equalTo('userId', userId.toString());
  let userState = await query.first();

  if (!userState) {
    userState = new UserState();
    userState.set('userId', userId.toString());
  }

  userState.set('state', state);
  await userState.save();
}

تُنشئ الدالة في كتلة التعليمات البرمجية أعلاه استعلامًا للعثور على كائن حالة المستخدم استنادًا إلى معرّف المستخدم، وتنشئ كائن UserState جديدًا في حال عدم وجوده، وتعيّن سمة الحالة، وتحفظ الكائن في قاعدة البيانات.

بعد ذلك، عرِّف دالة لإعادة تعيين حالة المستخدم عن طريق إضافة الكتلة البرمجية التالية أدناه إلى ملف stateManager.js:

// stateManager.js
async function resetUserState(userId) {
  await setUserState(userId, {});
}

تقوم دالة إعادة تعيين حالة المستخدم بشكل غير متزامن بتعيين حالة المستخدم إلى كائن فارغ {} لإعادة تعيين حالة المستخدم في قاعدة البيانات.

تأكد من وجود كائن الحالة دائمًا لتتبع إجراءات مستخدم الروبوت السابق والجديد. أضف الكتلة البرمجية التالية أدناه إلى ملف stateManager.js:

// stateManager.js
async function ensureUserState(userId) {
  let state = await getUserState(userId);
  if (!state) {
    await setUserState(userId, {});
  }
}

تُعرّف كتلة التعليمات البرمجية دالة ensureUserState التي تسترجع كائن الحالة بناءً على معرّف المستخدم، مع التأكد من وجود بيانات حالة المستخدم لمعرّف المستخدم في فئة UserState في الواجهة الخلفية ل Back4app Parse.

تقوم بجلب حالة المستخدم باستخدام الدالة getUserState، وفي حال عدم وجود حالة، تقوم بتعيين الحالة إلى كائن فارغ {} باستخدام الدالة setUserState.

قم بتصدير جميع الدوال لتمكينك من الاستفادة منها في ملفات مصدر جافا سكريبت الأخرى:

// stateManager.js
module.exports = {
  getUserState,
  setUserState,
  resetUserState,
  ensureUserState,
};

التعامل مع تفاعل المستخدم مع الروبوت

للسماح للروبوت الخاص بك بالاستماع إلى أوامر البدء، والحصول على الطقس، وتعيين المدينة، ستحدد مستمعي الأحداث لمطابقة النص مع الأوامر الثلاثة لتشغيل دوال رد الاتصال.

سيسمح ذلك للبوت بتنفيذ المهام المتعلقة بالأوامر.

للتفاعل مع واجهة برمجة تطبيقات Telegram بوت لتمكينك من تحديد سلوك الروبوت الخاص بك، استورد صنف Telegram بوت من مكتبة node-telegram-bot-api وأنشئ مثيلًا جديدًا للصنف:

// bot.js
const TelegramBot = require('node-telegram-bot-api');
const token = process.env.TELEGRAM_BOT_TOKEN;
const bot = new TelegramBot(token, { polling: true });

يُنشئ الشيفرة البرمجية أعلاه نسخة جديدة من صنف TelegramBot مع وسيطين: رمز الروبوت المميز وكائن.

يعيّن الكائن قيمة الاستطلاع إلى صواب لتمكين البوت من التحقق باستمرار من الرسائل والتحديثات من خوادم Telegram.

بعد ذلك، استورد الوحدات التي أنشأتها في هذا المشروع. ستستخدم هذه الوحدات لتنفيذ وظائف الروبوت، مثل الحصول على تحديثات الطقس، وتعيين المدينة المفضلة، وإدارة حالة المستخدم.

أضف الشيفرة التالية أدناه لاستيراد الوحدات النمطية اللازمة:

// bot.js
const weather = require('./weather');
const cityManager = require('./cityManager');
const stateManager = require('./stateManager');

يستورد مكوِّن الشيفرة أعلاه الدوال التي أنشأتها في جميع الملفات المصدرية، مما يسمح لك باستدعاء هذه الدوال في ملف bot.js الخاص بك.

لإعداد أمر، يمكنك استخدام طريقة onText المتوفرة في صنف TelegramBot. يقوم هذا الأسلوب بإعداد مستمع لتنفيذ دالة رد نداء لتنفيذ بعض المنطق.

أضف كتلة التعليمات البرمجية أدناه إلى ملف bot.js الخاص بك لإعداد معالج الأوامر /بدء التشغيل الذي سيستمع إليه الروبوت بنشاط باستخدام طريقة onText:

// bot.js

bot.onText(/\\/start/, async (msg) => {
    const welcomeMessage = "Welcome to the Weather Bot! Use the commands below to interact:\\n" +
    "/setCity - Set your preferred city for weather updates.\\n" +
    "/getWeather - Get instant weather information for any city.\\n";
    await bot.sendMessage(msg.chat.id, welcomeMessage);
    stateManager.ensureUserState(msg.chat.id);
});

ستسمح كتلة التعليمات البرمجية أعلاه للبوت بتشغيل دالة رد اتصال، وإرسال رسالة ترحيبية إلى المستخدم توضح بالتفصيل كيفية عمل البوت.

يقوم الروبوت بتعيين الحالة الأولية للمستخدم باستخدام الدالة ensureUserState، مما يضمن صفحة نظيفة لكل تفاعل للمستخدم.

بعد ذلك، أضف كتلة التعليمات البرمجية أدناه إلى ملف bot.js الخاص بك لإعداد معالج الأوامر /setCity الذي سيستمع إليه الروبوت بنشاط باستخدام طريقة onText:

// bot.js

bot.onText(/\\/setCity$/, async (msg) => {
    stateManager.setUserState(msg.chat.id, { expect: 'SET_CITY' });
    bot.sendMessage(msg.chat.id, "Which city do you want to set as your preferred city for weather updates?");
});

تسمح كتلة التعليمات البرمجية أعلاه للمستخدمين بتحديد مدينتهم المفضلة لتحديثات الطقس باستخدام الأمر"/setCity“.

عند تلقي هذا الأمر، يقوم الروبوت بتحديث حالة المستخدم إلى “SET_CITY” باستخدام دالة SetUserState ويطالب المستخدم بإدخال المدينة التي يريدها.

أضف كتلة التعليمات البرمجية أدناه إلى ملف bot.js الخاص بك لإعداد معالج أمر /getWeather سيستمع إليه الروبوت بنشاط باستخدام طريقة onText:

// bot.js
bot.onText(/\\/getWeather$/, async (msg) => {
    stateManager.setUserState(msg.chat.id, { expect: 'GET_WEATHER' });
    bot.sendMessage(msg.chat.id, "Which city do you want to get weather information for?");
});

يقوم الأمر “/getWeather” بتشغيل الروبوت لتحديث حالة المستخدم إلى “GET_WEATHER” ويطالبه بتقديم المدينة التي يريد معلومات عن الطقس لها على الفور.

التعامل مع الرسائل الواردة

للتعامل مع الرسائل الواردة لروبوت Telegram الخاص بك، ستحتاج إلى إعداد مُستمع للأحداث يُفعّل دالة ردّ استدعاء عندما يتلقى الروبوت رسالة جديدة.

أضف كتلة التعليمات البرمجية أدناه إلى ملف bot.js الخاص بك لإعداد معالج رسائل للاستماع إلى الأوامر واستجابات المستخدم:

// bot.js

// Handle incoming messages
bot.on('message', async (msg) => {
    if (msg.text.startsWith('/')) {
        // If the message is a command, reset the user state
        stateManager.resetUserState(msg.chat.id);
    } else {
        // If it's not a command, check user state
        const state = await stateManager.getUserState(msg.chat.id);
        if (state && state.expect === 'SET_CITY') {
            // If expecting SET_CITY, set city and reset state
            const city = msg.text;
            cityManager.setCity(msg.chat.id, city);
            bot.sendMessage(msg.chat.id, `City set to ${city}. You will receive weather updates every 2 minutes.`);
            stateManager.resetUserState(msg.chat.id);
        } else if (state && state.expect === 'GET_WEATHER') {
            // If expecting GET_WEATHER, get weather and reset state
            const city = msg.text;
            weather.getWeather(city).then(response => {
                bot.sendMessage(msg.chat.id, response);
            }).catch(error => {
                bot.sendMessage(msg.chat.id, "Failed to retrieve weather.");
            });
            stateManager.resetUserState(msg.chat.id);
        }
    }
});

// Initialize the init function from cityManager.js for regular weather updates
cityManager.init(bot);

تقوم كتلة التعليمات البرمجية بإعداد معالج رسائل عام يستمع إلى الرسائل النصية المرسلة إليه ويعمل كنواة لمنطق التفاعل.

إذا كانت الرسالة تبدأ بشرطة مائلة للأمام (“/”)، فإنها تعتبر أمرًا. في هذه الحالة، يقوم المعالج بإعادة تعيين حالة المستخدم لضمان بداية جديدة للأمر الجديد.

بخلاف ذلك، يتحقق المعالج من حالة المستخدم الحالية(stateManager.getUserState) لفهم نيته.

إذا مرر المستخدم الأمر “/ setCity”، يستخدم معالج الروبوت cityManager.setCity لتخزين المدينة المختارة ويؤكد التحديث.

إذا قام المستخدم بتمرير الأمر “/getWeather“، يسترجع المعالج معلومات الطقس للمدينة المقدمة باستخدام الدالة weather.getWeather ويرسل الرد إلى المستخدم.

تقوم كتلة الشيفرة أعلاه بعد ذلك بتشغيل cityManager.init(bot) لتشغيل المهمة المجدولة لاسترداد تحديثات الطقس للمدينة المفضلة.

الآن بعد أن انتهيت من التعامل مع منطق الروبوت الخاص بك، قم بإعداد خادم للسماح بتشغيله عند نشره في حاوية Back4app.

إنشاء ملف الدخول

ستقوم بإنشاء ملف إدخال سيهيئ تطبيق الروبوت بأكمله. سيخدم هذا الملف وظيفتين.

  • سيقوم ملف الإدخال بتشغيل منطق البوت من خلال طلب ملف جافا سكريبت الذي يتعامل مع كيفية تفاعل البوت مع واجهة برمجة تطبيقات Telegram ويستجيب لرسائل المستخدم.
  • سيقوم ملف الإدخال أيضًا بإعداد خادم للسماح بتشغيل الروبوت الخاص بك على حاوية Back4app. تتطلب حاويات Back4app منافذ مكشوفة لنجاح نشر تطبيقك.

انتقل إلى ملف server.js داخل دليل مشروعك. سيتعامل هذا الملف مع إنشاء الخادم. أضف كتلة الشيفرة أدناه إلى ملف server.js:

const http = require('http');
require('./src/bot'); // Import bot logic
const port = 3000;

http
  .createServer((req, res) => {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end('My Telegram bot is running\\n');
  })
  .listen(port, () => {
    console.log(`Server running on port ${port}`);
  });

تُنشئ الشيفرة البرمجية أعلاه روبوت Telegram ليعمل من خلال إنشاء خادم HTTP بسيط. يعمل هذا الخادم كنقطة دخول، مما يسمح للبوت بالعمل داخل بيئة الحاوية.

يستورد النص البرمجي المنطق الأساسي لروبوتك ويحدد منفذ Back4app للسماح بنشر روبوتك على حاوية Back4app.

بعد إنشاء ملف الإدخال، يمكنك اختبار روبوت Telegram محليًا قبل نشره في حاوية Back4app.

اختبار روبوت Telegram

ابدأ تشغيل روبوت Telegram الخاص بك عن طريق تشغيل الأمر أدناه:

node server.js

للتفاعل مع البوت الخاص بك، افتح تطبيق Telegram وابحث عن اسم البوت الخاص بك في شريط البحث. ادخل إلى الدردشة مع البوت الخاص بك وأرسل الأمر / ابدأ.

يجب أن يستجيب الروبوت برسالة ترحيب وقائمة بالأوامر. أرسل أمرًا إلى الروبوت.

معلومات الطقس لبوت تيليجرام

يسمح لك الروبوت بتعيين مدينتك المفضلة وتلقي تحديثات منتظمة للطقس باستخدام الأمر / setCity.

يمكن للأمر /getWeather، كما هو موضح في الصورة أعلاه، الحصول على معلومات الطقس لمدينة معينة على الفور.

يجب أن يتصرف الروبوت بشكل مشابه لما هو موضح في الصورة أعلاه، ويستجيب لأوامرك ويتفاعل معك على النحو المنشود.

نشر روبوت Telegram في حاويات Back4App

بعد اختبار الروبوت الخاص بك والتأكد من أنه يعمل بشكل صحيح، يمكنك نشره على حاويات Back4app. للقيام بذلك، ستحتاج أولاً إلى إنشاء ملف Dockerfile لمشروعك.

في الدليل الجذري لمشروعك، أنشئ ملف Dockerfile وأضف إليه الكتلة البرمجية أدناه:

# Specify base image
FROM node:18-alpine

# Specify the working directory
WORKDIR /app

# Copy package.json and package-lock.json
COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 3000

# Run the app
CMD ["npm", "start"]

بعد إنشاء ملف Dockerfile، ادفع مستودعك المحلي إلى GitHub لجعله متاحًا للنشر على حاويات Back4app.

بعد ذلك، قم بتثبيت تطبيق Back4App Containers GitHub على حساب GitHub الخاص بك ومنح التطبيق الأذونات اللازمة المطلوبة للوصول إلى مستودع التعليمات البرمجية لتطبيقك.

بمجرد الانتهاء من تهيئة GitHub، انتقل إلى الصفحة الرئيسية لتطبيق Back4app وانقر على زر “تطبيق جديد” في الزاوية العلوية اليمنى من الشاشة.

سينقلك هذا إلى شاشة التهيئة، حيث ستحتاج إلى اختيار نوع التطبيق الذي تريد إنشاءه. حدد خيار وكيل Back4app، كما هو موضح في الصورة أدناه.

إنشاء تطبيق جديد على Back4app

عند تحديد خيار وكيل Back4app، ستتم إعادة توجيهك إلى صفحة وكيل Back4app AI.

أدخل المطالبة أدناه لنشر تطبيقك على حاويات Back4app:

Deploy my "YOUR_REPOSITORY_URL" repository on GitHub to Back4App Containers.
Here are the required environmental variables:
TELEGRAM_BOT_TOKEN = "TELEGRAM_BOT_TOKEN"
OPENWEATHERMAP_TOKEN = "WEATHER_API_TOKEN"
BACK4APP_APP_ID = "BACK4APP_APP_ID"
BACK4APP_JAVASCRIPT_KEY = "BACK4APP_JAVASCRIPT_KEY"

استبدل العناصر النائبة بقيمها الفعلية. ستبدأ المطالبة أعلاه عملية النشر. عند اكتمالها، سيستجيب وكيل الذكاء الاصطناعي، مشيراً إلى نجاح عملية النشر أو إلى عملية نشر معلقة.

يجب أن تحصل على رد مشابه للرد أدناه:

استجابة وكيل الذكاء الاصطناعي

إذا حصلت على عملية نشر معلقة، يمكنك مراقبة حالة نشر تطبيقك على لوحة معلومات حاوية Back4app. بدلاً من ذلك، يمكنك نشر تطبيقك يدوياً على حاويات Back4app.

الخاتمة

تعلمت في هذه المقالة كيفية إنشاء بوت Telegram باستخدام Node.js. استكشفت كيفية إنشاء حساب بوت Telegram، التعامل مع أوامر البوت والتعامل مع تفاعلات المستخدم.

لقد أنشأت أيضًا واجهة خلفية للروبوت الخاص بك بمساعدة وكيل الذكاء الاصطناعي Back4app، مما مكنك من إدارة حالة المستخدم بفعالية وتخزين المعلومات في المحادثات، مثل المدينة المفضلة للمستخدم لتلقي تحديثات الطقس بانتظام.

يمكنك العثور على الكود الكامل في مستودع GitHub هذا.


Leave a reply

Your email address will not be published.