لاستضافة بوت teloxide على مدار الساعة 24/7 تشغّله على جهاز يبقى قيد التشغيل دائمًا: خادم VPS بنظام Linux مع خدمة systemd تعيد تشغيله عند توقفه، أو خطة بوتات لدى PlayNHost (ابتداءً من US$1.99 شهريًا)، حيث ترفع البرنامج الجاهز فتمنحه اللوحة الرمز وتعيد تشغيله إذا تعطل. في اختبارنا استهلك بوت teloxide 0.17.0 نحو 13 MB من الذاكرة. يُبنى بوت Rust على حاسوبك الشخصي كبرنامج واحد لنظام Linux x86-64: لا شيء يُترجم على الخادم. تقرأ Bot::from_env() في teloxide الرمز من TELOXIDE_TOKEN، وهو اسم تضبطه اللوحة لك. الخطوات على PlayNHost:
- ابنِ بوتك لنظام Linux x86-64 على حاسوبك كما هو موضح أدناه تحت البناء لنظام Linux.
- في صفحة استضافة بوتات Telegram انقر أنشئ سيرفرًا على إحدى الخطط. في نافذة الطلب أجب عن لأي منصة بوتك؟ بـ Telegram واختر Rust.
- افتح سيرفرك في اللوحة. تفتح بطاقة إعداد بوتك في نظرة عامة عند الاتصال بـ Telegram؛ وخطوتها الأولى ما الذي يعمل يجب أن تعرض يشغّل هذا البوت Rust Bot.
- عند الاتصال بـ Telegram الصق الرمز الذي حصلت عليه من @BotFather تحت الصق رمز بوتك، وانقر الاتصال، وتحقق من اسم البوت المعروض، ثم انقر نعم، متابعة.
- عند كودك انقر رفع الملفات، ثم في Files انقر رفع واختر برنامجك المسمى
bot. أو دع السيرفر يجلبه بنفسه: في صفحة بوت، قسم الكود، بطاقة الإعدادات، اضبط رابط التنزيل (اختياري) على رابط https للبرنامج وانقر حفظ. - انقر تشغيل البوت وافتح Console. بعد
[PlayNHost] Starting your botيطبع بوتكLogged in as @your_bot، وتتحول الشارة في نظرة عامة إلى متصل في Telegram. - في صفحة بوت، قسم Telegram، انقر افتح في Telegram وأرسل إلى بوتك
/start.
يُشرح إنشاء البوت في @BotFather وبطاقة الإعداد في كيف تستضيف بوت Telegram. أما نوع Rust Bot نفسه (ملف البدء ووسائط التشغيل (اختياري) ورابط التنزيل) فهو نفسه لبوتات Discord وTelegram: كيف تستضيف بوت Discord بلغة Rust. تتناول هذه الصفحة teloxide: ما الذي يستهلكه على الخادم وما ينبغي معرفته قبل استضافته.
ما الذي قسناه
| المكتبة | الإصدار | الذاكرة دون حمل | من البدء إلى رد المنصة | حجم البرنامج |
|---|---|---|---|---|
| teloxide (Telegram) | 0.17.0 | 13 MB | 0.1 ث | 3.0 MB |
| serenity (Discord) | 0.12.5 | 10 MB | 0.4 ث | 13.4 MB |
الطريقة: على عقدتنا الخاصة، في حاوية مؤقتة مضبوطة كخطة بوتات بسعة 1 GB ومعالج واحد، وبصورة Debian التي يعمل عليها نوع Rust Bot لدينا، استدعى كل برنامج Telegram أو Discord برمز مزيف فرُفض. الذاكرة هي الذاكرة المقيمة بعد 15 ثانية من ذلك الرد، ويُحسب زمن البدء من التشغيل حتى الرد، وكل رقم هو وسيط التشغيلات من 2 إلى 4. بُني البرنامجان بإصدار Rust المستقر وcargo build --release على الصورة نفسها، مع إضافة pkg-config وlibssl-dev للبناء؛ واستغرق بناء teloxide مدة 107 ثانية بمعالج واحد شاملةً التنزيلات، فاعتبر ذلك رقمًا تقريبيًا.
هذه حدود دنيا: برنامج بلا محادثات وبلا بيانات بعد. تُضاف إليها شيفرتك وما تحتفظ به في الذاكرة وعدد المحادثات، لذلك يستخدم برنامج teloxide البسيط جزءًا صغيرًا من خطة STARTER بسعة 0.5 GB.
بوت teloxide بسيط
يرد على /start، ويقرأ الرمز الذي تمنحه إياه اللوحة، ويطبع سطر الجاهزية، ويقول بوضوح عندما ترفض Telegram الرمز. أنشئ مشروعًا بالأمر cargo new bot واستخدم هذين الملفين. اسم الحزمة bot يجعل البرنامج bot، وهو ملف البدء الافتراضي.
Cargo.toml
[package]
name = "bot"
version = "0.1.0"
edition = "2021"
[dependencies]
teloxide = { version = "0.17", features = ["macros"] }
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }
pretty_env_logger = "0.5"
src/main.rs
use teloxide::{prelude::*, utils::command::BotCommands, ApiError, RequestError};
#[derive(BotCommands, Clone)]
#[command(rename_rule = "lowercase")]
enum Command {
/// Say hello.
Start,
}
async fn answer(bot: Bot, msg: Message, cmd: Command) -> ResponseResult<()> {
match cmd {
Command::Start => {
bot.send_message(msg.chat.id, "Hello! I am running on PlayNHost.").await?;
}
}
Ok(())
}
#[tokio::main]
async fn main() {
// Prints teloxide's errors, such as a 409 Conflict while polling. Without a logger they are silent.
pretty_env_logger::init();
// Reads TELOXIDE_TOKEN, which the panel sets from the token on the Telegram pane.
let bot = Bot::from_env();
match bot.get_me().await {
Ok(me) => println!("Logged in as @{}", me.username()),
Err(RequestError::Api(ApiError::InvalidToken)) => {
println!("Telegram did not accept the bot token. Paste the current one from @BotFather, then restart.");
std::process::exit(1);
}
Err(err) => {
println!("Could not start the bot: {err}");
std::process::exit(1);
}
}
// Long polling: removes a webhook left on the bot, then asks Telegram for messages.
Command::repl(bot, answer).await;
}
السطر Logged in as @your_bot هو ما يحوّل الشارة إلى متصل في Telegram. يستمر Command::repl في العمل حتى يتوقف البوت. تتبع الشيفرة مثال الأوامر في مستودع teloxide نفسه؛ وpretty_env_logger هو أداة التسجيل التي تستخدمها أمثلة teloxide.
البناء لنظام Linux
يشغّل الخادم برنامجك على Debian 13 مع glibc 2.41 وOpenSSL 3. لا يعمل هناك ملف .exe لنظام Windows ولا بناء لنظام macOS: عندئذ تعرض وحدة التحكم [PlayNHost] bot is not a Linux program. Build it for Linux x86-64 (not Windows or macOS) and upload it again. هناك طريقتان للبناء:
على Linux، بميزات teloxide الافتراضية
sudo apt install build-essential pkg-config libssl-dev
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
cargo build --release
البرنامج هو target/release/bot. تستخدم ميزات teloxide الافتراضية native-tls، الذي يربط على Linux مكتبة OpenSSL الخاصة بالنظام، لذلك يحتاج البناء إلى pkg-config وlibssl-dev؛ والخادم لديه OpenSSL 3. ابنِ على Debian 12 أو 13، أو Ubuntu 22.04 أو 24.04: فإصدارات glibc فيها (2.36 و2.41 و2.35 و2.39) ليست أحدث من إصدار الخادم. قد يطلب برنامج بُني على نظام أحدث، مثل Ubuntu 26.04 مع glibc 2.43، دوالّ ليست موجودة على الخادم، فيتوقف عند البدء بخطأ يقول إن إصدار GLIBC_ غير موجود. ويتجنب بناء musl ذلك.
من Windows أو macOS أو أي Linux: بناء musl
برنامج musl ملف واحد مكتفٍ بذاته لا يعتمد على مكتبات نظام الخادم. بدّل teloxide من OpenSSL إلى rustls، الذي لا يحتاج إلى OpenSSL ويحمل قائمة شهاداته الموثوقة الخاصة. في Cargo.toml استبدل سطر teloxide بما يلي:
teloxide = { version = "0.17", default-features = false, features = ["macros", "ctrlc_handler", "rustls"] }
أبقِ ctrlc_handler في القائمة: فـ teloxide لا يبني repl إلا بهذه الميزة. ثم ابنِ بواسطة cargo-zigbuild، الذي يستخدم Zig رابطًا (تثبيته عبر pip يثبّت Zig أيضًا):
rustup target add x86_64-unknown-linux-musl
pip install cargo-zigbuild
cargo zigbuild --release --target x86_64-unknown-linux-musl
يوجد البرنامج في target/x86_64-unknown-linux-musl/release/bot. يذكر teloxide 0.17 أن الحد الأدنى هو Rust 1.82، وقد تطلب الحزم التي يستخدمها إصدارًا أحدث، لذلك نفّذ rustup update stable قبل البناء.
إذا كان الرمز خاطئًا
في اختبارنا، ومع رمز مزيف، أعاد bot.get_me() هذا الخطأ (طبعه برنامج الاختبار بعد نوع الخطأ):
teloxide::RequestError: A Telegram's error: Invalid bot token
يحوّل teloxide رد Telegram Unauthorized، والرد Not Found الذي يناله الرمز سيئ الصياغة، إلى ApiError::InvalidToken. يتحقق البوت أعلاه من ذلك قبل أن يبدأ الاستطلاع، ويطبع Telegram did not accept the bot token. Paste the current one from @BotFather, then restart. ثم يتوقف. وبدون هذا التحقق يوقف Command::repl البرنامج بخطأ panic، Couldn't prepare dispatching context: Api(InvalidToken). تتعرف اللوحة على الحالتين وتعرض اللافتة لم يقبل Telegram رمز بوتك فوق Console.
للإصلاح أرسل في @BotFather الأمر /mybots، واختر بوتك، ثم API Token، وانسخ الرمز من جديد. في صفحة بوت، قسم Telegram، انقر استبدال الرمز، والصقه، وانقر حفظ الرمز، ثم إعادة التشغيل الآن.
ما ينبغي معرفته عن teloxide على الخادم
- اسم الرمز. يقرأ
Bot::from_env()المتغيرTELOXIDE_TOKENويتوقف بخطأ panic معCannot get the TELOXIDE_TOKEN env variableعندما يكون مفقودًا. تضبطه اللوحة بمجرد حفظ رمز في قسم Telegram، معTELEGRAM_BOT_TOKENوBOT_TOKENوTOKENوTELEGRAM_TOKEN. ويقرأfrom_env()أيضًاTELOXIDE_API_URLوTELOXIDE_PROXYإن كانا مضبوطين؛ فاتركهما لتتصل بـ Telegram مباشرة. - لا أداة تسجيل، لا أخطاء. يبلّغ teloxide عن المشكلات عبر الحزمة
log، لذلك لا يطبع برنامج بلا أداة تسجيل شيئًا عندما يفشل الاستطلاع. يُظهرpretty_env_logger::init()الأخطاء فقط، وهذا كافٍ: فعندما تستطلع نسخة أخرى من البوت بالرمز نفسه، تتلقى وحدة التحكم سطرًا ينتهي بـAn error from the update listener: Api(TerminatedByOtherGetUpdates)وتعرض اللوحة بوتك يعمل في مكان آخر أيضًا. وللمزيد من التفاصيل، في صفحة بوت، قسم البيئة، أضف المتغيرRUST_LOGبالقيمةinfo(إضافة متغير) وأعد التشغيل. - الاستطلاع لا يستسلم أبدًا. عندما يفشل طلب الرسائل من Telegram ينتظر teloxide ويحاول مجددًا، فيضاعف الانتظار من 1 ثانية إلى 64 ثانية، أو للمدة التي تطلبها Telegram بعد
429 Too Many Requests. ولا تُوقف نسخة ثانية من البوت أو رمز أُلغي أثناء التشغيل البرنامج: يستمر في العمل لكنه يتلقى رسائل قليلة أو لا يتلقى شيئًا، ولا يكشف السبب إلا الخطأ المسجَّل:Api(TerminatedByOtherGetUpdates)لنسخة ثانية، وApi(InvalidToken)لرمز ملغى. راجع إصلاح خطأ 409 Conflict في بوت Telegram. - يُزال لك أي webhook تُرك على البوت. يبدأ
replوDispatcher::dispatch()استطلاعًا طويلًا بمهلة 10 ثوانٍ ويستدعيان أولًاdeleteWebhookعند وجود webhook، مع الإبقاء على الرسائل المنتظرة. تحتاج ميزاتwebhooksفي teloxide إلى عنوان HTTPS عام، وخططنا لا تتضمنه بعد، لذلك استخدمreplأوdispatch(). - إيقاف نظيف. توقف اللوحة بوت Rust بالاختصار Ctrl+C (
SIGINT). يفعّلreplمعالج Ctrl+C في teloxide، الذي يوقف الاستطلاع ويخبر Telegram بالرسائل التي استلمها فعلًا، فلا يتلقاها البدء التالي مرة أخرى. ومعDispatcherالخاص بك، أضف.enable_ctrlc_handler()إلى الـ builder كما تفعل أمثلة teloxide. - التحديثات. لا يحتوي نوع Rust Bot على حقل الحزم ولا على مصدر Git: حزمك (crates) داخل البرنامج. للتحديث احذف البرنامج القديم في Files، وارفع البناء الجديد وأعد التشغيل. ومع رابط تنزيل، انشر البناء الجديد على ذلك الرابط، واحذف البرنامج في Files واضغط تشغيل.
استضفه بنفسك على VPS بنظام Linux
انسخ البرنامج الذي بنيته إلى الـ VPS؛ فلا حاجة إلى Rust هناك. يحتاج البرنامج المبني بالميزات الافتراضية إلى OpenSSL 3، الموجود في Debian 12 و13 وUbuntu 22.04 و24.04، وإلى glibc لا يقل حداثة عن النظام الذي بنيت عليه. أما بناء musl فلا يحتاج إلى أيٍّ منهما.
أنشئ مستخدمًا للبوت، وضع البرنامج في مجلده، واحتفظ بالرمز في ملف لا يقرؤه إلا root:
sudo useradd --system --create-home --home-dir /opt/mybot mybot
sudo install -o mybot -m 755 bot /opt/mybot/bot
sudo sh -c 'echo "TELOXIDE_TOKEN=123456789:your-token" > /etc/mybot.env'
sudo chmod 600 /etc/mybot.env
أنشئ /etc/systemd/system/mybot.service:
[Unit]
Description=teloxide Telegram bot
Wants=network-online.target
After=network-online.target
[Service]
User=mybot
WorkingDirectory=/opt/mybot
EnvironmentFile=/etc/mybot.env
ExecStart=/opt/mybot/bot
Restart=always
RestartSec=5
KillSignal=SIGINT
[Install]
WantedBy=multi-user.target
شغّله الآن وعند كل إقلاع، ثم تابع مخرجاته:
sudo systemctl daemon-reload
sudo systemctl enable --now mybot
sudo journalctl -u mybot -f
يجعل KillSignal=SIGINT الأمر systemctl stop يرسل Ctrl+C، وهو ما يلتقطه معالج teloxide لإيقاف نظيف؛ أما الإعداد الافتراضي في systemd، SIGTERM، فينهي البرنامج فورًا. ويعيد Restart=always تشغيل البوت بعد تعطل أو خروج. أوقف أي نسخة أخرى أولًا، وإلا ردّت Telegram بـ 409 Conflict.
الاستضافة الذاتية أو خطة بوتات
على VPS تديره بنفسك:
- تحديثات نظام التشغيل وأمانه، وإصدارات OpenSSL وglibc المطابقة لبنائك.
- نسخ كل بناء جديد وملف الخدمة وملف الرمز وأذوناتهما.
- قراءة
journalctlلمعرفة سبب توقف البوت. - نسخ احتياطية لبيانات البوت.
في المقابل يشغّل الـ VPS أي شيء، ويمكنك أن تمنحه نطاقًا مع HTTPS لاستخدام webhook.
في خطة بوتات PlayNHost تتولى اللوحة ذلك عنك:
- صورة Debian تشغّل برنامج Linux x86-64، وفحص عند البدء يخبرك بذلك عندما يكون الملف بناءً لنظام Windows أو macOS.
- الرفع في Files، أو رابط تنزيل يجلبه الخادم عند البدء.
- الرمز، بعد التحقق منه مع Telegram، يُخزَّن مشفرًا ويُمرَّر إلى برنامجك باسم
TELOXIDE_TOKEN. - إعادة تشغيل البوت بعد التعطل. وإذا تعطل مجددًا خلال دقيقة يبقى متوقفًا وتبيّن Console السبب.
- لافتات فوق Console تسمّي السبب عندما ترفض Telegram الرمز أو تعمل نسخة أخرى، وزر إزالة الـ webhook في قسم Telegram.
أسئلة يطرحها الناس
لماذا لا يطبع بوت teloxide الخاص بي شيئًا على الإطلاق؟
يكتب teloxide عبر الحزمة log ولا يطبع شيئًا حتى تُعدّ أداة تسجيل. استدعِ pretty_env_logger::init() (أو أداة تسجيل أخرى) في أول main كما يفعل البوت أعلاه. أما أسطر println! الخاصة بك فتظهر دائمًا في Console.
هل أحتاج إلى ميزة webhooks في teloxide؟
لا. يحتاج الـ webhook إلى عنوان HTTPS عام، وخططنا لا تتضمنه بعد. يستخدم repl وdispatch() الاستطلاع الطويل، الذي لا يحتاج إلى عنوان: يطلب البوت من Telegram الرسائل الجديدة. كما يزيلان أي webhook تركه مضيف قديم على البوت.
هل يستطيع الخادم ترجمة شيفرة Rust الخاصة بي؟
لا. يشغّل نوع Rust Bot برنامجًا جاهزًا ولا يترجم شيئًا، لذلك تذهب كل ذاكرة خطتك إلى البوت. ابنِ على حاسوبك، أو في سير عمل GitHub Actions، وأرفق البرنامج بإصدار (release) وضع رابط الملف في رابط التنزيل (اختياري).
هل يستهلك بوت teloxide ذاكرة أقل من بوت Python؟
قارن الأرقام: في الاختبار نفسه استهلك python-telegram-bot 22.8 ما قدره 44 MB واستهلك aiogram 3.31.0 ما قدره 173 MB، مقابل 13 MB لـ teloxide. تتسع الثلاثة في خطة STARTER بسعة 0.5 GB مع متسع لشيفرتك، لذلك اختر اللغة التي تريد الكتابة بها.
هل أنت جاهز لتشغيل بوت teloxide الخاص بك على مدار الساعة؟ اطلع على الخطط في استضافة بوتات Telegram.



