جسر محادثة Discourse-Telegram

:information_source: ملخص جسر ثنائي الاتجاه في الوقت الفعلي بين دردشة Discourse و Telegram، مع دعم من الدرجة الأولى لمواضيع منتديات Telegram
:hammer_and_wrench: رابط المستودع GitHub - babylai/discourse-telegram-chat-bridge: Real-time two-way bridge between Discourse Chat and Telegram (design phase / POC) · GitHub
:open_book: دليل التثبيت كيفية تثبيت الإضافات في Discourse

الميزات

يتم ربط كل قناة دردشة في Discourse بدردشة Telegram — إما مجموعة عادية، أو موضوع محدد في مجموعة فائقة مع تفعيل ميزة المواضيع. تظهر الرسالة المنشورة من جانب ما على الجانب الآخر خلال ثانية أو ثانيتين.

Discourse → Telegram Telegram → Discourse
نص (مع تنسيق) :white_check_mark: تنسيق HTML حقيقي :white_check_mark: كيانات → Markdown
إيموجي :white_check_mark: :white_check_mark:
ردود :white_check_mark: :white_check_mark:
تعديلات :white_check_mark: :white_check_mark:
عمليات حذف :white_check_mark: :cross_mark: (قيد واجهة برمجة تطبيقات البوت، انظر أدناه)
صور :white_check_mark: صور وألبومات :white_check_mark: تم تنزيلها وإعادة رفعها
ملفات أخرى :white_check_mark: :white_check_mark: مستندات، فيديو، صوت، رسالة صوتية
ملصقات :white_check_mark: ثابتة كصورة؛ المتحركة تتحول إلى إيموجيها
  • نسبة الرسالة للكاتب: لا يمكن للبوتات انتحال هوية المستخدمين على أي من المنصتين، لذا تحمل الرسائل اسم الكاتب كبادئة عريضة — **ماريا:** مرحباً في Discourse، maria: في Telegram.
  • آمن من الحلقات: الرسائل المنشورة بواسطة الجسر نفسه لا تُعاد إرسالها أبداً.
  • مهام متكررة: إعادة المحاولة وإعادة توصيل نقاط النهاية لا تنتج رسائل مكررة.
  • مراعاة حدود المعدل: عند حدوث خطأ HTTP 429، تُعاد المهمة إلى قائمة الانتظار بعد وقت الانتظار الذي تطلبه Telegram بالضبط.
  • تدهور سلس: الملفات التي تتجاوز حدود واجهة برمجة تطبيقات البوت (20 ميجابايت للتنزيل / 50 ميجابايت للرفع) تتحول إلى ملاحظة [ملف محذوف: الاسم (الحجم)]؛ التنسيق غير المدعوم يتحول إلى نص عادي.
  • أمر الإعداد /id: اكتب /id في أي مجموعة أو موضوع يمكن للبوت رؤيته، وسيرد بأرقام التعريف بالإضافة إلى سطر ربط جاهز للنسخ.

القيود المعروفة

  • عمليات الحذف في Telegram لا تُزامن مع Discourse — لا يوجد حدث حذف في واجهة برمجة تطبيقات بوت Telegram. هذه قيود المنصة، وليس مشكلة في التكوين.
  • يسمح Telegram للبوتات بتعديل رسائلها الخاصة لمدة 48 ساعة فقط؛ تعديلات Discourse للرسائل القديمة لا تنعكس في جانب Telegram.
  • لا يتم جسر التفاعلات.
  • لا يتم ربط خيط دردشة Discourse بمواضيع Telegram؛ يتم جسر ردود الخيط بشكل مسطح.

التكوين

1. إنشاء بوت Telegram

  1. أنشئ بوتاً عبر @BotFather وانسخ الرمز.
  2. عطّل وضع الخصوصية (/setprivacy → تعطيل)، وإلا لن يرى البوت سوى /الأوامر. :warning: إذا كان البوت موجوداً بالفعل في مجموعة، أزل وأعد إضافته — التغيير لا ينطبق على العضويات الموجودة مسبقاً.
  3. أضف البوت إلى مجموعتك كـ مشرف (يحتاج حذف الرسائل لمزامنة الحذف).
  4. لجسر إلى مواضيع محددة، فعّل المواضيع في إعدادات المجموعة.

2. تكوين إعدادات الموقع (المسؤول → الإضافات → جسر Telegram): فعّل الإضافة، الصق رمز البوت، واعدد رمز سري عشوائي لنقطة النهاية (مثل openssl rand -hex 24).

3. تسجيل نقطة النهاية — أسهل طريقة من خلال عميل الإضافة نفسه، الذي يضبط allowed_updates الصحيحة لك:

cd /var/discourse
./launcher enter app
rails runner "puts DiscourseTelegramChatBridge::TelegramClient.new.set_webhook(
  url: 'https://YOUR-SITE/telegram-bridge/webhook',
  secret_token: SiteSetting.telegram_bridge_webhook_secret)"

:warning: allowed_updates موجود في تسجيل نقطة النهاية المخزن في Telegram، وليس في كود الإضافة. إذا قمت بالتسجيل يدوياً وأهملت edited_message، فلن تقوم Telegram بتسليم التعديلات بصمت.

4. ربط القنوات — اكتب /id في كل مجموعة/موضوع، ثم أضف سطر واحد لكل قناة مجسرة إلى telegram_bridge_mappings:

chat_channel_id:telegram_chat_id:telegram_thread_id

رقم تعريف قناة Discourse هو الرقم في نهاية عنوان القناة (/chat/c/<slug>/<id>)؛ اترك رقم تعريف الخيط فارغاً لموضوع عام أو مجموعة عادية. في كل تشغيل وتغيير في الربط، تسجل الإضافة سطر ملخص واحد active mappings يمكنك البحث فيه للتأكد مما يتم جسره.

5. التحقق — أرسل رسالة في كل اتجاه. إذا لم يحدث شيء، تحقق بالترتيب: سطر سجل active mappings، معلومات نقطة النهاية (get_webhook_info)، ووضع الخصوصية.

الإعدادات

الاسم الوصف
telegram_bridge_enabled مفتاح التشغيل/الإيقاف الرئيسي للجسر.
telegram_bridge_bot_token رمز واجهة برمجة تطبيقات بوت Telegram، صادر من @BotFather (سري).
telegram_bridge_webhook_secret رمز سري يتم التحقق منه ضد رأس X-Telegram-Bot-Api-Secret-Token في طلبات نقطة النهاية الواردة (سري).
telegram_bridge_mappings ربط القنوات، سطر واحد لكل قناة: chat_channel_id:telegram_chat_id:telegram_thread_id (رقم تعريف الخيط اختياري).

:lock: ملاحظة الخصوصية: محتوى القنوات المجسرة يغادر مثيل Discourse الخاص بك ويُخزن مع Telegram (والعكس صحيح). فقط القنوات المدرجة صراحةً في الربط يتم جسرها — لكن أخبر أعضاء تلك القنوات.

إعجاب واحد (1)