الويدجت (Widget) هو مكوّن تفاعلي مضمّن مباشرة في رسالة البوت: رمز ترويجي مع زر نسخ، مؤقّت تنازلي، متتبّع حالة الطلب، اختبار، أو تقويم لاختيار التاريخ والوقت. عندما يتفاعل العميل مع الويدجت، يقوم البوت بتحديث نفس الرسالة في مكانها — دون إرسال رسائل جديدة أو عرض علامة "تم التعديل".

Promo code

هناك طريقتان لإرسال الويدجت:

  • قالب جاهز — سطر واحد في الحاسبة. التخطيط والوظائف منفّذة بالفعل.
  • ويدجت مخصص — اكتب كود HTML الخاص بك (أو اطلب من Mavi إنشاءه) وعالج التفاعلات باستخدام كتل تدفق البوت.

أين تعمل الويدجتات

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

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

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


القوالب الجاهزة

يتم إرسال جميع القوالب باستخدام دالة واحدة:

tg_send_widget(platform_id, template, params, caption)
المعامل الوصف
platform_id معرف المستلم. للعميل الحالي، استخدم متغير platform_id
template اسم القالب: promo, timer, order_status, faq, quiz, calendar
params قاموس يحتوي على إعدادات القالب
caption النص المعروض أسفل الويدجت. يراه العملاء أيضًا في قائمة الدردشات والإشعارات وإصدارات تيليجرام الأقدم، لذا يجب أن يكون ذا معنى بحد ذاته

تُرجع الدالة استجابة واجهة برمجة تطبيقات تيليجرام. معرف الرسالة المرسلة متاح في response['result']['message_id']. احفظه إذا كنت تخطط لتحديث الويدجت لاحقًا.

إذا أعادت الدالة نصًا بدلاً من استجابة تيليجرام، فقد حدث خطأ: قالب غير معروف، معامل غير صالح أو مفقود، أو ويدجت يتجاوز حد الحجم. يشرح نص الخطأ ما حدث.

كيفية بناء المعاملات

أنشئ قاموسًا وخصص كل معامل في سطر منفصل:

p = {}
p["code"] = "WIDGET10"
p["title"] = "رمزك الترويجي"
p["note"] = "خصم 10% على أي طلب"
w = tg_send_widget(platform_id, "promo", p, "رمزك الترويجي WIDGET10 — خصم 10%")

أدخل الكود في حقل الحاسبة في الكتلة. تُظهر لقطة الشاشة كتلة شرط البدء التي ترسل ويدجت حالة الطلب عندما يرسل العميل عبارة "ويدجت الطلب".

Widget in the bot builder

في الكتلة التي ترسل الويدجت، عادةً ما تضبط حقل الاستجابة على #{none}. لا ترسل الكتلة رسالة نصية منفصلة لأن نص الويدجت يعمل كنص الرسالة.

اللغة

تتضمن القوالب نص واجهة مدمج، مثل تسميات الأزرار، وأسماء الأشهر وأيام الأسبوع، و"انتهى الوقت"، ورسائل أخرى.

اللغة الافتراضية في Mavibot هي الإنجليزية (en).

لاستخدام لغة أخرى، حدد معامل lang:

p["lang"] = "de"

اللغات المدعومة:

ru, en, de, es, fr, pt, tr, uk, kk, ms, th, ar.

النصوص التي تقدمها بنفسك — العناوين والأسئلة والخطوات والنصوص التوضيحية — تُعرض تمامًا كما أدخلتها ولا تتم ترجمتها تلقائيًا.


رمز ترويجي — promo

يعرض رمزًا ترويجيًا مع زر ينسخه بنقرة واحدة.

Promo code

المعامل الوصف
code الرمز الترويجي. مطلوب
title النص المعروض فوق الرمز
note النص المعروض أسفل الرمز، مثل تاريخ انتهاء الصلاحية
button تسمية الزر. الافتراضي: "نسخ الرمز الترويجي"
used_text النص المعروض عند تحديد الرمز كمستخدم
p = {}
p["code"] = "WIDGET10"
p["title"] = "رمزك الترويجي"
p["note"] = "خصم 10% على أي طلب"
p["button"] = "نسخ الرمز"
w = tg_send_widget(platform_id, "promo", p, "رمزك الترويجي WIDGET10 — خصم 10%")
client.promo_widget_id = w['result']['message_id']

لتحديد الرمز كمستخدم، مما يشطب الرمز ويزيل الزر:

p = {}
p["used"] = 1
t = tg_edit_widget_data(platform_id, client.promo_widget_id, p)

مؤقّت تنازلي — timer

يعرض عدّادًا تنازليًا حتى تاريخ ووقت محددين.

يعمل العدّاد التنازلي على جهاز العميل. لا يشارك البوت في تحديث المؤقّت.

Countdown timer

المعامل الوصف
until التاريخ والوقت المستهدفان بتنسيق "DD.MM.YYYY HH:MM"، باستخدام المنطقة الزمنية للمشروع
seconds بدلاً من ذلك، عدد الثواني من لحظة إرسال الويدجت
title عنوان المؤقّت. الافتراضي: "ينتهي العرض في"
done النص المعروض عند انتهاء العدّاد
text النص المعروض أسفل العدّاد
button, url تسمية الزر وعنوان URL الوجهة (https:// فقط)
hide_button اضبطه على 1 لإخفاء الزر عند انتهاء العدّاد

يجب عليك توفير إما until أو seconds.

p = {}
p["seconds"] = 7200
p["title"] = "ينتهي العرض في"
p["button"] = "زيارة الموقع"
p["url"] = "https://salebot.pro"
w = tg_send_widget(platform_id, "timer", p, "ينتهي العرض خلال ساعتين")

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


حالة الطلب — order_status

يعرض قائمة بمراحل الطلب مع تمييز المرحلة الحالية.

يمكن للبوت تحديث المرحلة في مكانها، بحيث يرى العميل دائمًا نفس الرسالة.

Order status: first stage

المعامل الوصف
title عنوان الويدجت
steps قائمة المراحل، من 1 إلى 12. الافتراضي: تم الاستلام، قيد التحضير، تم التسليم إلى الساعي، في الطريق، تم التوصيل
step رقم المرحلة الحالية، بدءًا من 1
text النص المعروض أسفل المراحل

إرسال الويدجت:

p = {}
p["title"] = "حالة الطلب"
p["steps"] = ["تم الاستلام", "قيد التحضير", "تم التوصيل"]
p["step"] = 1
p["text"] = "تم استلام طلبك وهو قيد التحضير"
w = tg_send_widget(platform_id, "order_status", p, "طلبك")
client.order_widget_id = w['result']['message_id']

الانتقال إلى المرحلة التالية من أي كتلة أخرى، مثل عندما تتغير مرحلة الصفقة، أو يرسل المدير أمرًا، أو يتم تشغيل مؤقّت:

p = {}
p["step"] = 2
p["text"] = "طلبك قيد التحضير وسيتم تسليمه إلى الساعي قريبًا"
t = tg_edit_widget_data(platform_id, client.order_widget_id, p)

Order status: second stage

النص التوضيحي أسفل الويدجت لا يتغير عند تحديث المرحلة. استخدم نصًا توضيحيًا محايدًا مثل "طلبك" بدلاً من "الحالة: تم الاستلام".


الأسئلة الشائعة — faq

يعرض قائمة بالأسئلة. يمكن للعملاء النقر على سؤال لتوسيع إجابته.

FAQ widget

المعامل الوصف
title عنوان الويدجت
items قائمة أزواج الأسئلة والأجوبة. مطلوب
p = {}
p["title"] = "الأسئلة الشائعة"
p["items"] = [["كيف يمكنني الدفع؟", "يمكنك الدفع بالبطاقة. سيتم إرسال رابط الدفع إلى هذه الدردشة."], ["كم تستغرق مدة التوصيل؟", "عادةً ما يستغرق التوصيل 1-2 يوم محليًا و3-7 أيام على مستوى الدولة."], ["هل يمكنني إرجاع عنصر؟", "نعم، خلال 14 يومًا."]]
w = tg_send_widget(platform_id, "faq", p, "إجابات على الأسئلة الشائعة")

يتم عرض النص كنص عادي. لا تتم معالجة وسوم HTML أو أي ترميز آخر.


اختبار واستطلاع — quiz

يعرض أسئلة مع إجابات متعددة الخيارات، سؤال واحد في كل مرة.

إذا تم تحديد إجابات صحيحة، يعمل الويدجت كاختبار ويحسب النتيجة. بدون إجابات صحيحة، يعمل كاستطلاع.

Quiz question

المعامل الوصف
title العنوان المعروض فوق الأسئلة
questions قائمة الأسئلة. مطلوب
retry اضبطه على 1 لعرض زر "إعادة المحاولة" في النهاية
callback نص رد اتصال مخصص بدلاً من widget_quiz_finished

كل سؤال هو قاموس يحتوي على:

  • q — نص السؤال
  • options — خيارات الإجابة
  • correct — الإجابة الصحيحة، محددة بفهرسها (بدءًا من 1) أو نصها الدقيق
p = {}
p["title"] = "اختبار: اختبر معرفتك"
p["retry"] = 1
p["questions"] = [{"q": "ما هو 2 + 2؟", "options": ["3", "4", "5"], "correct": 2}, {"q": "ما هي عاصمة فرنسا؟", "options": ["لندن", "باريس", "برلين"], "correct": "باريس"}]
w = tg_send_widget(platform_id, "quiz", p, "قم بهذا الاختبار المكوّن من سؤالين!")

لإنشاء استطلاع بدون تسجيل نقاط، احذف correct من كل سؤال.

يتم التحقق من الإجابات الصحيحة بواسطة المنصة ولا يتم إرسالها إلى جهاز العميل.

ما يستقبله تدفق البوت

لا يتم إرسال إجابات الأسئلة الفردية إلى المحادثة.

عندما يجيب العميل على السؤال الأخير، يستقبل البوت رد اتصال widget_quiz_finished ويتم تعبئة المتغيرات التالية:

المتغير القيمة
widget_quiz_score عدد الإجابات الصحيحة؛ فارغ للاستطلاعات
widget_quiz_total إجمالي عدد الأسئلة
widget_quiz_answers فهارس الخيارات المحددة، مثل [2,2]

لمعالجة النتيجة، أنشئ اتصالًا من الكتلة التي أرسلت الاختبار أو استخدم كتلة شرط البدء بشرط widget_quiz_finished.

مثال على الرد:

نتيجتك: #{widget_quiz_score} من #{widget_quiz_total} إجابات صحيحة

Quiz result and bot response


التقويم — calendar

يعرض تقويمًا شهريًا حيث يمكن للعملاء تحديد تاريخ ثم فترة زمنية.

يستبدل صفحات متعددة من أزرار التاريخ والوقت، بما في ذلك التنقل "رجوع" و"التالي".

Calendar: selecting date and time

يدعم التقويم ثلاثة أوضاع.

تواريخ وأوقات مخصصة

يتم دائمًا تمرير الأوقات المتاحة عبر معامل slots.

نفس الفترات الزمنية كل يوم — قدم قائمة بالأوقات ونطاقًا زمنيًا:

p = {}
p["title"] = "حدد تاريخًا ووقتًا"
p["name"] = "استشارة"
p["days"] = 10
p["slots"] = ["10:00", "12:00", "15:00"]
w = tg_send_widget(platform_id, "calendar", p, "اختر تاريخًا ووقتًا")

فترات زمنية مختلفة لتواريخ محددة — قدم قاموسًا يربط التواريخ بقوائم الأوقات. يتم أخذ التواريخ المتاحة من مفاتيح القاموس:

p = {}
p["slots"] = {"20.11.2026": ["10:00", "12:00"], "21.11.2026": ["15:00"]}
w = tg_send_widget(platform_id, "calendar", p, "اختر تاريخًا ووقتًا")
المعامل الوصف
slots الأوقات المتاحة، كقائمة أو قاموس مجمّع حسب التاريخ
days عدد الأيام المتاحة بدءًا من اليوم
date_from, date_to بدلاً من ذلك، حدود نطاق التاريخ بتنسيق "DD.MM.YYYY"
dates بدلاً من ذلك، قائمة بتواريخ محددة
weekdays_off أيام الأسبوع غير المتاحة: 1 = الاثنين حتى 7 = الأحد
title تلميح معروض أسفل شبكة التقويم
name اسم العنصر أو الخدمة التي يتم حجزها؛ يُعرض بعد التحديد
change اضبطه على 1 لعرض زر "اختيار وقت آخر" بعد التحديد
callback نص رد اتصال مخصص بدلاً من widget_calendar_selected

التاريخ فقط

لا تمرر slots إذا كان العميل يحتاج فقط إلى تحديد تاريخ.

p = {}
p["days"] = 45
p["weekdays_off"] = [7]
w = tg_send_widget(platform_id, "calendar", p, "اختر تاريخًا")

الحجز عبر الإنترنت

قم بتوفير فرع وخدمة، وسيقوم التقويم تلقائيًا باسترداد التواريخ والأوقات المتاحة من وحدة الخدمات.

cal = {}
cal["company_id"] = comp_id
cal["service_ids"] = serv_id
cal["days_limit"] = 30
cal["name"] = serv_title
w = tg_send_widget(platform_id, "calendar", cal, serv_title)
المعامل الوصف
company_id معرف الفرع
service_ids الخدمة أو قائمة الخدمات
employee_id معرف الموظف؛ إذا تم حذفه، يتم استخدام أي موظف متاح
days_limit عدد الأيام المستقبلية للبحث عن التوفر. الافتراضي: 14
people_count عدد الأماكن المطلوبة لخدمة جماعية
auto_booking اضبطه على 1 للسماح للمنصة بإنشاء الحجز تلقائيًا

هذه المعاملات هي نفسها المستخدمة في get_dates_for_booking وget_slots_for_booking.

ما يستقبله تدفق البوت

لا يتم إرسال تحديدات التاريخ الفردية إلى المحادثة.

عندما يحدد العميل فترة زمنية، أو تاريخًا إذا كان التقويم لا يحتوي على فترات زمنية، يستقبل البوت رد الاتصال widget_calendar_selected ويتم ملء المتغيرات التالية:

المتغير القيمة
widget_date التاريخ المحدد بتنسيق DD.MM.YYYY
widget_time الوقت المحدد بتنسيق HH:MM؛ فارغ للتقويمات التي تحدد التاريخ فقط
widget_message_id معرف الرسالة التي تحتوي على الأداة

التقويم: اكتمل التحديد

تنسيقات التاريخ والوقت هي نفسها المقبولة في create_booking وmodify_booking_time.


الحجز عبر الإنترنت باستخدام التقويم: مثال كامل

تتعامل الأداة مع تحديد التاريخ والفترات الزمنية والتنقل، مما يقلل من عدد كتل البوت المطلوبة.

الكتلة 1. اختيار الخدمة

استخدم كتلة شرط البدء مع الشرط "حجز موعد".

الرد: "اختر خدمة:"

اضبط حقل الأزرار على #{srv_buttons}.

comp_id = 8
srv_data = get_services_for_booking(comp_id)
srv_kb = tools_make_button_str_checker(srv_data, 'title', 1)
srv_buttons = srv_kb['buttons']
srv_checker = srv_kb['checker']

الكتلة 2. التقويم

الرد: #{none}.

اربط الكتلة 1 بالكتلة 2 باستخدام الشرط #{srv_checker}.

serv_id = tools_check_user_input(srv_data, question, 'title', 'id')
serv_title = tools_check_user_input(srv_data, question, 'title', 'title')
cal = {}
cal["company_id"] = comp_id
cal["service_ids"] = serv_id
cal["days_limit"] = 30
cal["name"] = serv_title
cal_sent = tg_send_widget(platform_id, "calendar", cal, serv_title)

الكتلة 3. إنشاء الحجز

الرد: #{none}.

اربط الكتلة 2 بالكتلة 3 باستخدام الشرط widget_calendar_selected مع مطابقة تامة.

booking_date = widget_date
booking_time = widget_time
booking_result = create_booking(comp_id, serv_id, booking_date, booking_time, '')
booking_ok = booking_result['status']

الكتلة 4. تم تأكيد الحجز

اربط الكتلة 3 بالكتلة 4 باستخدام شرط المتغير booking_ok == True مع تأخير ثانية واحدة.

الرد:

تم تأكيد موعدك: #{serv_title}, #{booking_date} في #{booking_time}. نراكم قريبًا!

الكتلة 5. الفترة الزمنية لم تعد متاحة

الرد: #{none}.

اربط الكتلة 3 بالكتلة 5 باستخدام شرط المتغير booking_ok != True مع تأخير ثانية واحدة.

تعيد هذه الكتلة تعيين التقويم الحالي، مما يسمح للعميل باختيار وقت آخر وعرض رسالة خطأ.

fix = {}
fix["reset"] = 1
fix["error"] = "تم حجز هذه الفترة الزمنية للتو. يرجى اختيار فترة أخرى."
t = tg_edit_widget_data(platform_id, widget_message_id, fix)

أضف اتصالًا آخر من الكتلة 5 إلى الكتلة 3 بشرط widget_calendar_selected.

يمكن للعميل الآن اختيار وقت آخر في نفس التقويم.

خيار أبسط: الحجز التلقائي

أضف المعامل التالي إلى إعدادات التقويم:

cal["auto_booking"] = 1

ستقوم المنصة بإنشاء الحجز فورًا عندما يحدد العميل وقتًا.

إذا أصبحت الفترة الزمنية المحددة غير متاحة، تعرض الأداة خطأً مباشرةً.

يتم إرسال رد الاتصال widget_calendar_selected فقط بعد حجز ناجح، مع المتغير widget_booking_id.

مع هذا النهج، ليست هناك حاجة للكتلتين 3 و5.

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


تحديث أداة مرسلة

استخدم الدالة التالية لتحديث بيانات الأداة:

tg_edit_widget_data(platform_id, message_id, data)
المعامل الوصف
message_id معرف رسالة الأداة، المحفوظ عند إرسالها أو الحصول عليه من widget_message_id بعد تفاعل
data قاموس يحتوي على القيم الجديدة

يمكن تحديث بيانات الأداة فقط. لا يمكنك تغيير تخطيط أداة مرسلة بالفعل. لاستخدام تخطيط مختلف، أرسل أداة جديدة.

كيف يتم تطبيق التحديثات:

  • رمز الخصم، المؤقت، حالة الطلب، الأسئلة الشائعة: البيانات الجديدة تحل محل التحديث السابق تمامًا. أي حقول مفقودة تعود إلى القيم الأصلية المقدمة عند إرسال الأداة. لذلك، قم بتضمين كل حقل يجب أن يختلف عن البيانات الأولية، مثل كل من step وtext.
  • الاختبار والتقويم: يتم تطبيق البيانات الجديدة فوق حالة الأداة الحالية.

معاملات التحديث الخاصة:

القالب البيانات النتيجة
promo {"used": 1} يحدد رمز الخصم كمستخدم
timer {"seconds": 600} أو {"until": "…"} يعيد تشغيل العد التنازلي
calendar {"reset": 1, "error": "message"} يمسح التحديد، ويعيد فتح التقويم، ويعرض رسالة

الأدوات المخصصة

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

أداة مخصصة: تقييم بالنجوم

كيف تعمل

  1. أنشئ أداة كملف HTML واحد يحتوي على أنماطه وجافا سكريبت.
  2. احفظ الكود كملف .txt في قسم الملفات بالمشروع وانسخ رابط الملف. لا يقبل نظام التخزين ملفات .html.
  3. ترسل كتلة بوت الأداة باستخدام الرابط وتمرر بياناتها الأولية.
  4. عندما يتفاعل العميل مع الأداة، يستقبل البوت رد اتصال يحتوي على النص المحدد في كود الأداة.
  5. تحسب كتلة المعالج البيانات الجديدة وترسلها مرة أخرى إلى الأداة، التي تقوم بتحديث واجهتها الخاصة.

إرسال أداة مخصصة

tg_send_widget_file(platform_id, url, data, caption)

مثال:

st = {}
st["rating"] = 0
w = tg_send_widget_file(platform_id, "https://files.mavibot.ai/…/rating.txt", st, "قيّم طلبك — اضغط على نجمة")

المعامل data هو قاموس يحتوي على الحالة الأولية المستخدمة لعرض الأداة.

التعامل مع التفاعلات

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

يتم أيضًا ملء المتغيرات التالية:

المتغير القيمة
widget_data نص الطلب المرسل من الأداة، مثل rate:4
widget_message_id معرف الرسالة التي حدث فيها التفاعل
widget_query_id معرف الطلب

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

يجب أن يطابق الشرط نص طلب الأداة.

يعمل هذا النوع من الكتل بغض النظر عن موضع العميل الحالي في تدفق البوت ولا يبعده عن خطوته الحالية.

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

مثال معالج تقييم:

الشرط (تعبير نمطي):

^rate:[1-5]$

الآلة الحاسبة:

local a = splitter(widget_data, ":")
client.widget_rating = a[1]
st = {}
st["rating"] = client.widget_rating
t = tg_edit_widget_data(platform_id, widget_message_id, st)

يتم استبدال بيانات الأداة المخصصة بالكامل أثناء التحديثات. أرسل دائمًا الحالة الكاملة بدلاً من الحقل المتغير فقط.

الحد الأقصى لحجم البيانات هو 1024 بايت.

احتفظ بمجموعات البيانات الكبيرة والثابتة (مثل كتالوجات المنتجات) داخل كود الأداة، وأرسل فقط القيم التي تتغير عبر بيانات الأداة.

الرد على طلب الأداة

افتراضيًا، تتلقى الأداة فورًا ردًا فارغًا، وتصل البيانات المحدثة عبر تحديث منفصل للأداة.

إذا كانت الأداة بحاجة إلى تلقي البيانات مباشرة في الرد على طلبها، يجب أن يبدأ نص الطلب بـ ?، على سبيل المثال:

?price

في هذه الحالة، يجب على كتلة المعالج استدعاء الدالة التالية خلال 15 ثانية:

tg_answer_widget_query(data)

وإلا، تعرض الأداة خطأ انتهاء المهلة.

الحد الأقصى لحجم الرد هو 1024 بايت.

متطلبات الكود

  • ملف واحد: قم بتضمين الأنماط داخل <style> وجافا سكريبت داخل <script>. لا يمكن تحميل البرامج النصية أو أوراق الأنماط أو الخطوط أو الصور الخارجية. يجب تضمين الصور باستخدام عناوين data: أو SVG.
  • حدود الحجم: بحد أقصى 32 كيلوبايت قبل الضغط و4 كيلوبايت بعد الضغط.
  • لا حقول إدخال: تتم إزالة عناصر input وselect وtextarea وform. يتم دعم عناصر <button> فقط كعناصر تحكم تفاعلية.
  • لا طلبات شبكة: لا تعمل fetch وواجهات برمجة تطبيقات مماثلة. الطريقة الوحيدة للتواصل مع البوت هي عبر TelegramWidget.request("text")، بحجم طلب يتراوح بين 1-64 بايت.
  • لا تمرير داخلي: الحد الأقصى لارتفاع الأداة هو 600 بكسل. أي شيء يتجاوز ذلك يتم قصه. لإنشاء دائري، حرك صفًا من البطاقات بدلاً من استخدام التمرير.
  • الوصول إلى العناصر: استخدم document.getElementById. الوصول إلى العناصر كمتغيرات عامة بناءً على معرفاتها لا يعمل.
  • سمة Telegram: استخدم متغيرات سمة Telegram مثل var(--tg-theme-text-color) بحيث تبدو الأداة صحيحة في كل من السمة الفاتحة والداكنة.
  • بيانات الأداة: اقرأ البيانات من TelegramWidget.chatData وأعد رسم الأداة عند حدوث حدث chatDataChanged.
  • الطلبات: استدعِ request مباشرة داخل معالج تفاعل المستخدم. يُسمح بطلب واحد فقط لكل تفاعل.

لا تعرض الأداة أخطاء الترميز. تتم إزالة العناصر غير المدعومة بصمت، وقد يؤدي خطأ جافا سكريبت إلى أداة فارغة. اختبر الأداة دائمًا في Telegram بعد إجراء التغييرات.

مثال أدنى لأداة مخصصة

يعرض المثال أدناه منتجًا، وزرًا يرسل طلبًا إلى البوت، وعداد سلة يعتمد على بيانات الأداة.

<style>
body{margin:0;padding:14px}
.h{color:var(--tg-theme-hint-color);font-size:.85em}
button{width:100%;margin-top:8px}
</style>

<b>مارغريتا · 10 دولارات</b>
<div class="h" id="c"></div>
<button id="add">أضف إلى السلة</button>
<div class="h" id="e"></div>

<script>
var W=window.TelegramWidget,$=function(i){return document.getElementById(i)},busy=0;

function draw(){
  var s={};
  try{s=JSON.parse(W.chatData)||{}}catch(e){}
  $('c').textContent='في السلة: '+(s.count||0)
}

$('add').onclick=function(){
  if(busy)return;
  busy=1;
  $('e').textContent='';
  W.request('cart_add').then(
    function(){busy=0},
    function(x){
      busy=0;
      $('e').textContent='خطأ: '+x.code
    }
  )
};

W.onEvent('chatDataChanged',draw);
draw();
</script>

Mavi والأدوات (Widgets)

يمكن لـ Mavi إنشاء تدفقات بوت كاملة مع الأدوات تلقائيًا.

ببساطة قم بوصف ما تحتاجه بلغة واضحة.

على سبيل المثال:

  • "عندما يرسل العميل 'order'، اعرض أداة حالة الطلب بثلاث مراحل. عندما يرسل 'ready'، انقل الطلب إلى المرحلة الثانية."
  • "أنشئ تدفق حجز خدمة: يختار العملاء خدمة باستخدام الأزرار، ثم يحددون تاريخًا ووقتًا باستخدام أداة التقويم."
  • "أنشئ أداة تقييم بالنجوم للطلبات واحفظ التقييم المحدد في متغير عميل."

يقوم Mavi تلقائيًا بتكوين القوالب الجاهزة.

بالنسبة للأدوات المخصصة، يكتب Mavi الكود ويتحقق منه، ويحفظ ملف الأداة في المشروع، وينشئ الكتل اللازمة لإرسال الأداة والتعامل مع تفاعلات العملاء.


مرجع

الدوال

الدالة الوصف
tg_send_widget(platform_id, template, params, caption) يرسل قالب أداة جاهز
tg_send_widget_file(platform_id, url, data, caption) يرسل أداة مخصصة من ملف
tg_edit_widget_data(platform_id, message_id, data) يحدّث البيانات في أداة موجودة
tg_answer_widget_query(data) يستجيب لطلب أداة مخصص يبدأ بـ ?

الاستدعاءات والمتغيرات

الحدث الاستدعاء المتغيرات
اكتمال الاختبار widget_quiz_finished widget_quiz_score, widget_quiz_total, widget_quiz_answers
تحديد التاريخ والوقت في التقويم widget_calendar_selected widget_date, widget_time; أيضًا widget_booking_id عند تفعيل auto_booking
تفاعل الأداة المخصصة نص الطلب المحدد في كود الأداة widget_data, widget_message_id, widget_query_id

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

القيود

  • تعمل الأدوات فقط في المحادثات الخاصة على تيليجرام بين العميل والبوت.
  • يتم الاحتفاظ فقط بأحدث خمسة اختبارات وتقاويم لكل عميل. الأقدم منها يتوقف عن الاستجابة للتفاعلات.
  • مسح جميع متغيرات العميل في تدفق البوت يعطل الاختبارات والتقاويم المرسلة سابقًا.
  • بيانات الأداة محدودة بـ 1024 بايت.
  • طلبات الأدوات المخصصة محدودة بـ 64 بايت.
  • يجب الرد على طلبات الأدوات المخصصة التي تتطلب tg_answer_widget_query خلال 15 ثانية.

استكشاف الأخطاء وإصلاحها

المشكلة السبب / الحل
الأداة لا تُرسل والمتغير يحتوي على Unknown parameter… تلقى القالب معاملًا غير مدعوم. رسالة الخطأ تسرد المعاملات المسموح بها
يتوقف التقويم بعد تحديد التاريخ دون عرض الفترات الزمنية لم يتم توفير معامل slots
بعد التفاعل مع أداة، يتوقف البوت عن الاستجابة للأزرار في الخطوة الحالية يستخدم معالج التفاعل كتلة شرط البدء. استبدلها بكتلة غير حالة مع شرط
تظهر الأداة المخصصة فارغة يوجد خطأ في كود الأداة. سبب شائع هو الوصول إلى عنصر بواسطة معرفه دون استخدام document.getElementById
يعرض تيليجرام "Unsupported message" يستخدم العميل إصدارًا قديمًا من تيليجرام
Bad Request: chat not found تم إرسال الأداة خارج تيليجرام، على سبيل المثال من نافذة اختبار البوت