هذه هي المقالة الأخيرة في سلسلتنا المكونة من ثلاثة أجزاء حول مشاركة العملاء على Discord. ناقشت مقالتنا الأولى “حدود جديدة لمشاركة العملاء” الانتشار المتزايد لـ Discord والفرص الجديدة التي يوفرها للعلامات التجارية لإنشاء والمشاركة في مجتمعاتها الإلكترونية الخاصة. في الجزء الثاني “كيفية إنشاء مجتمع Discord وروبوت لعلامتك التجارية”، قدمنا كيفية إنشاء خادم Discord لعلامتك التجارية وكيفية دمج الروبوتات لإدارة مراجعة الخادم والإعلانات وملاحظات المستخدمين وغير ذلك. أخيراً، في هذه المدونة، سنوضح كيف يمكن لـ Seasalt.ai دمج مركز اتصال كامل الوظائف في خادم Discord، مما يتيح للعلامات التجارية التعامل مع جميع جوانب خدمة العملاء على المنصة.
جدول المحتويات
- جدول المحتويات
- عرض توضيحي لخدمة العملاء على Discord
- Twilio Flex
- SeaX
- الخادم التجريبي
- الغوص التقني العميق
- الخلاصة
عرض توضيحي لخدمة العملاء على Discord
إذا كنت متشوقاً للوصول إلى النقطة الرئيسية ورؤية المنتج النهائي، سنعرض أولاً الفيديو التجريبي النهائي:
هدفنا هو توضيح كيفية دمج Discord مع برامج خدمة العملاء الموجودة (في هذه الحالة Twilio Flex) لزيادة القيمة المضافة لخوادم العلامة التجارية الرسمية. تابع القراءة للحصول على فهم أعمق لتنفيذنا.
Twilio Flex
Twilio هي شركة اتصالات ناضجة توفر APIs لإدارة الرسائل النصية والمكالمات الهاتفية ورسائل البريد الإلكتروني ورسائل الدردشة وغير ذلك. Flex هو أحد المنتجات الرئيسية لـ Twilio: مركز اتصال قابل للتوسع قائم على السحابة يمكنه توجيه الرسائل والمكالمات من أي مصدر إلى الوكلاء الافتراضيين والمباشرين. اخترنا Flex كأساس لتكامل مركز الاتصال لأنه يوفر بالفعل دعماً ممتازاً لمختلف القنوات مثل Facebook والرسائل النصية وWhatsApp.
SeaX
SeaX هو مركز اتصال سحابي متكامل بعمق مع وظائف الذكاء الاصطناعي المتقدمة للمساعدة في تحسين الإنتاجية ورضا العملاء. SeaX هو أحد المنتجات الرئيسية لـ Seasalt.ai وقد تم إطلاقه مع عملاء في أكثر من 150 دولة. منصة مركز الاتصال SeaX مبنية على Twilio Flex وتتضمن وظائف إضافية متنوعة تمكن الوكلاء المباشرين من مساعدة العملاء بشكل أفضل. بعض أكثر الوظائف فائدة تشمل النص إلى الكلام والكلام إلى النص الداخلي وقاعدة المعرفة المدعومة بالذكاء الاصطناعي ونظام إدارة الحالات المتكامل. لمزيد من المعلومات حول جميع وظائف منصة SeaX، يرجى زيارة الصفحة الرئيسية لـ SeaX.
الخادم التجريبي
الآن سنقدم كيفية إعداد خادم Discord الخاص بنا. لأغراض العرض التوضيحي، تخيلنا سيناريو حيث يتم استخدام خادمنا كمجتمع للعبة مثل Pokémon Go! يوضح الجدول أدناه بعض الوظائف التي نعرضها في خادم Discord التجريبي الخاص بنا.

نظرة عامة على وظائف خادم Discord التجريبي.
المساعدة من واحد إلى كثير: القنوات الرسمية
تم إعداد عدة قنوات في الخادم لتوفير تدفق مباشر بين المديرين/المطورين الرسميين واللاعبين. قناة الإعلانات يمكن فقط للمديرين والمشرفين النشر فيها، ويمكن أن تحتوي على منشورات (يدوية أو تلقائية) من حسابات Twitter أو المواقع الإلكترونية أو المصادر الرسمية الأخرى.

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

قناة #bug-report التجريبية على خادم Discord تحتوي على تقارير أخطاء مقدمة.
قناة طلبات الميزات تسمح للاعبين بمناقشة تغييرات اللعب وتحسينات جودة الحياة وإضافات المحتوى وما إلى ذلك التي يرغبون في رؤيتها في اللعبة. مثل قناة طلبات الأخطاء، يمكن رؤية مدخلاتهم من قبل مشرفي Discord الذين يمكنهم استخدام أمر الشرطة المائلة /new_feature
لتقديم طلب رسمي.

قناة #feature-request التجريبية على خادم Discord تحتوي على مستخدم ينفذ أمر الشرطة المائلة.
المساعدة من واحد إلى واحد: وكيل خدمة العملاء
يمكن للاعبين استخدام أمر الشرطة المائلة /helpme
لتفعيل رسائل مباشرة مع وكيل. يمكن أن يكون وكيل خدمة العملاء آلياً (وكيل افتراضي) أو يعمل بواسطة وكيل مباشر.
للعرض التوضيحي الخاص بنا، أعددنا روبوت FAQ بسيط يستفسر من قاعدة معرفة الشركة لتقديم اقتراحات المقالات ذات الصلة للمستخدمين. يمكن للمستخدمين أيضاً طلب وكيل مباشر وسيتم تحويلهم إلى وكيل مباشر على SeaX في نفس الدردشة.

قناة #feature-request التجريبية على خادم Discord تحتوي على مستخدم يفعّل DM.
قاعدة المعرفة
عندما يقدم المستخدم استفساراً لوكيل الخدمة الافتراضي، يمكن للوكيل إحالة المستخدم إلى المقالات ذات الصلة في قاعدة المعرفة.
تحويل الوكيل المباشر
بمجرد أن يبدأ المستخدم في الرسائل المباشرة مع الروبوت، يمكنه طلب وكيل مباشر. سيتلقى إشعاراً فورياً بأنه تم إنشاء حالة له وأنه يتم تحويله إلى وكيل مباشر. عندما ينضم الوكيل المباشر إلى الدردشة، سيتلقى إشعاراً أيضاً.

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

واجهة SeaX تعرض وجهة نظر الوكيل المباشر في محادثة مع مستخدم Discord.
إدارة الحالات
إحدى الوظائف التي نريد التأكيد عليها في هذا العرض التوضيحي هي إدارة الحالات. حل Discord الخاص بـ Seasalt.ai متكامل مع نظام إدارة الحالات SeaX لتتبع حالات المستخدمين المختلفة بشكل صحيح. عندما يتفاعل المستخدم مع روبوت Discord (مثل طلب وكيل مباشر أو الإبلاغ عن خطأ)، يمكننا فتح حالة جديدة تلقائياً وتسجيل جميع المعلومات المهمة حول المستخدم والمشكلة التي يواجهها. هذا يجعل من السهل على الوكلاء المباشرين الوصول إلى جميع المشاكل المبلغ عنها والتأكد من تتبعهم للمستخدم حتى يتم حل الحالة.

إنشاء حالة جديدة في نظام إدارة الحالات SeaX.

عرض الحالة الموجودة في نظام إدارة الحالات SeaX.
الغوص التقني العميق
الآن بعد أن رأينا المنتج النهائي وجميع الوظائف المتاحة لأعضاء الخادم والوكلاء المباشرين الذين يساعدونهم. لكن كيف يتم تنفيذ كل شيء فعلياً؟ في مقالتنا السابقة “كيفية إنشاء مجتمع Discord وروبوت لعلامتك التجارية”، قدمنا كيفية إنشاء خادم Discord لعلامتك التجارية وكيفية دمج روبوت Discord لإدارته. لدعم هذا العرض التوضيحي الأكثر تقدماً، استخدمنا أيضاً SeaChat، محرك الذكاء الاصطناعي المحادثي لـ Seasalt.ai، لبناء روبوت دردشة بسيط يسمح لروبوت Discord الخاص بنا بالتعامل مع استفسارات اللغة الطبيعية للمستخدمين.
في جانب SeaX، عمل فريقنا عن كثب مع Twilio لإنشاء حل مركز اتصال غني بالوظائف قائم على Twilio Flex. لمزيد من المعلومات حول Twilio Flex وكيفية عمل عملية الإعداد، يمكنك قراءة دليل البدء السريع لـ Twilio Flex.
بعد إعداد خادم Discord وروبوت Discord وروبوت الدردشة والتأكد من أن لدينا مثيل SeaX يعمل بشكل طبيعي، كان التحدي الأكبر هو كيفية توجيه الرسائل بشكل صحيح بين المستخدمين والروبوتات والوكلاء المباشرين على SeaX. Twilio ممتاز في التعامل مع توجيه الرسائل، لذا كان هدفنا التعامل مع جميع أوامر الشرطة المائلة في خادم روبوت Discord، ثم إعادة توجيه جميع الرسائل الأخرى (مثل الرسائل المباشرة المرسلة إلى روبوت الدردشة أو الوكيل المباشر) إلى Twilio.
تحديد تدفق Flex
الخطوة الأولى هي التأكد من أن أي رسالة نرسلها إلى Twilio سيتم توجيهها إلى المكان الصحيح. أعددنا تدفق Twilio بسيط يتحقق أولاً مما إذا كان المستخدم قد طلب وكيلاً مباشراً، وإذا كان الأمر كذلك، فإنه يوجه الرسائل التالية إلى SeaX. إذا لم يطلب المستخدم وكيلاً مباشراً، فإننا نوجه الرسالة إلى روبوت الدردشة للحصول على استجابة. لمزيد من المعلومات حول كيفية إعداد التدفق، راجع وثائق Twilio Studio Flow.

تدفق Flex Studio بسيط يوجه الرسائل الواردة إلى روبوت الدردشة أو SeaX.
إنشاء قناة مخصصة
إذن الآن نفهم كيف سيتم توجيه الرسائل الواردة. ومع ذلك، Discord ليس قناة مدعومة أصلاً من Twilio. لحسن الحظ، لدى Twilio برنامج تعليمي مفصل حول كيفية إضافة قناة دردشة مخصصة إلى Twilio Flex. بعد اتباع الدليل لإعداد قناة مخصصة جديدة على Twilio، نحتاج فعلياً إلى إعادة توجيه الرسائل من Discord إلى Twilio.
أولاً نضع عميل Twilio:
from twilio.rest import Client
twilio_client = Client(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN)
الآن، بمجرد أن نتلقى رسالة واردة من Discord، يمكننا إعادة توجيه تلك الرسالة إلى Twilio من خلال عميل Twilio. أولاً، يجب أن نتحقق من وجود المستخدم في نظام Twilio وما إذا كان لديه قناة دردشة مفتوحة.
# استدعاء طريقة get_user للتحقق من وجود المستخدم، وإنشاء مستخدم جديد إذا لم يكن موجوداً
user = await get_user(user_id, twilio_client, TWILIO_SERVICE_SID)
# الحصول على قنوات المستخدم
user_channels = twilio_client.chat \
.services(TWILIO_SERVICE_SID) \
.users(user_id) \
.user_channels \
.list()
إذا كان لدى المستخدم قناة دردشة مفتوحة موجودة، نحتاج إلى استخدامها حتى نتمكن من الوصول إلى سجل الدردشة. إذا لم تكن هناك قناة دردشة موجودة، فإننا ننشئ واحدة جديدة للمستخدم:
if user_channels:
channel_sid = user_channels[-1].channel_sid
else:
channel = twilio_client.flex_api \
.channel \
.create(
flex_flow_sid=FLEX_FLOW_ID,
chat_user_friendly_name=username,
chat_friendly_name=chat_name, # -> الاسم الودي لقناة الدردشة
target=conversation_id, # -> معرف فريد يحدد مستخدم الدردشة
identity=conversation_id, # -> المستخدم، على سبيل المثال / Discord DM ID
)
channel_sid = channel.sid
أخيراً، بمجرد إنشاء قناة دردشة مفتوحة بين مستخدم Discord وTwilio، يمكننا إعادة توجيه الرسالة الواردة إلى تدفق Twilio Studio.
message = twilio_client.chat \
.services(TWILIO_SERVICE_SID) \
.channels(channel_sid) \
.messages \
.create(
body=message_text,
from_=user_id,
x_twilio_webhook_enabled='true',
attributes=json.dumps(message_json) # إرسال الرؤوس كسمات حتى يمكن الوصول إليها لاحقاً
)
الآن يمكننا إعادة توجيه الرسائل الواردة من مستخدمي Discord مباشرة إلى تدفق Twilio Flex الخاص بنا. في جانب روبوت Discord، تأكد من إعادة توجيه جميع الرسائل المباشرة إلى Twilio. الآن يمكنك محاولة إرسال رسالة مباشرة إلى روبوت Discord، ويجب أن تراها تظهر في سجلات تدفق Twilio Studio - لكننا لم ننتهِ بعد!
إنشاء خادم HTTP لدعم التوجيه الأكثر تعقيداً
Webhook الرسائل الصادرة
إذن الآن نفهم كيف سيتم توجيه الرسائل الواردة. ومع ذلك، ما زلنا نفتقد بعض الأجزاء. أولاً، نعلم أنه يمكننا الآن إرسال الرسائل إلى Twilio، لكن كيف نرد على المستخدمين على Discord؟ روبوت Discord الخاص بنا هو الوحيد المصرح له بإرسال الرسائل إلى خادم Discord والمستخدمين، وTwilio لا يعرف أيضاً كيفية إعادة رسائلنا إلى خادم Discord. الحل هو أننا نحتاج إلى إعداد webhook للرسائل الصادرة يتم تفعيله كلما كانت هناك رسالة جديدة في قناة دردشة Twilio. في ذلك webhook، يمكننا بعد ذلك استخدام روبوت Discord الخاص بنا لإعادة توجيه الرسالة إلى خادمنا.
لهذا، سندمج روبوت Discord في خادم HTTP أقوى. استخدمنا FastAPI لإعداد نقطة نهاية POST بسيطة ستكون webhook الرسائل الصادرة الخاصة بنا. بمجرد إعداد الخادم وجعل روبوت Discord الخاص بنا يعمل معه، يمكننا تحديد نقطة النهاية POST.
ستستقبل هذه النقطة كل رسالة تضاف إلى قناة الدردشة، لذا نحتاج أولاً إلى تصفية كل شيء باستثناء الرسائل الصادرة من SeaX. بعد ذلك، نحتاج إلى الحصول على معرف القناة الصحيح من نص الرسالة حتى نعرف أين نعيد توجيه الرسالة. أخيراً، يمكننا استخدام عميل Discord لإعادة توجيه الرسالة إلى قناة Discord.
@app.post("/forward-to-discord", status_code=200)
async def forward_discord_message(request: Request, response: Response) -> None:
raw_body = await request.body()
body = urllib.parse.parse_qs(raw_body.decode())
# التركيز فقط على الرسائل من SDK (Flex، جميع الرسائل الأخرى ستأتي من API)
if not body.get('Source') == ['SDK']:
return
# الرسائل من Flex لا تحتوي على conversationId للرسالة الأصلية
# نحتاج إلى convId لإرسال الرسالة مرة أخرى إلى المحادثة على GBM
# الحصول على الرسالة السابقة واستخراج conversationId
message = twilio_client.chat \
.services(TWILIO_SERVICE_SID) \
.channels(body.get("ChannelSid")[0]) \
.messages.list(limit=1)[0]
attributes = json.loads(message.attributes)
channel = discord_client.get_channel(attributes.get("channel", {}).get("id"))
if channel:
await channel.send(body.get("Body", [""])[0].get("text"))
else:
logger.error(f"لم يتم العثور على قناة Discord بالمعرف {get_channel_id(req)}!")
response.status_code = 400
أخيراً، لإرسال الرسائل إلى نقطة النهاية الخاصة بنا، نحتاج إلى إخبار Twilio ما هو webhook الجديد الخاص بنا. كل قناة دردشة تحتاج إلى تكوين webhook الخاص بها. لذا إذا عدنا إلى المكان الذي أنشأنا فيه قناة دردشة جديدة للمستخدم في البداية، يمكننا إضافة بعض الكود الإضافي لتكوين webhook:
webhook = twilio_client.chat \
.services(TWILIO_SERVICE_SID) \
.channels(channel_sid) \
.webhooks \
.create(
type='webhook',
configuration_url=f"{SERVER_HOST}/forward-to-discord",
configuration_method="POST",
configuration_filters=["onMessageSent", "onMessageUpdated", "onMediaMessageSent"]
)
تكامل الروبوت
إذن الآن يجب أن تكون الرسائل الصادرة من SeaX موجهة بشكل صحيح إلى خادم Discord الخاص بنا. لكننا ما زلنا لا نتعامل مع الرسائل المرسلة إلى روبوت الدردشة. نحتاج إلى إعداد نقطة النهاية الأخيرة التي سيتم تفعيلها من تدفق Twilio Studio وستستقبل رسائل المستخدم وتستفسر من الروبوت وتعيد الاستجابة إلى Discord.
@app.post("/chatbot-to-discord", status_code=200)
async def receive_discord_message(request: Request, response: Response):
"""استقبال طلب POST من Twilio، استفسار من الروبوت، وإعادة الاستجابة إلى Discord."""
req = await request.body()
# فصل نص الرسالة الأصلي عن محتوى twilio
twilio_body, original_message_body = separate_original_message_body(req.decode())
bot_response = await query_bot(original_message_body, bot_info)
if bot_response:
channel = discord_client.get_channel(original_message_body.get("channel_id"))
if channel:
for item in bot_response:
await channel.send(item.get("text"))
تأكد من أن تدفق Twilio Studio لديه webhook صحيح لتوجيه الرسائل إلى الروبوت. الآن انتهينا من توجيه الرسائل! يمكننا رؤية النظرة العامة لجميع توجيه الرسائل في هذه الصورة:

رسم توجيه الرسائل.
الخلاصة
باختصار، في سلسلة المدونات هذه، ناقشنا الانتشار المتزايد لـ Discord والفرص التي يجلبها كمنصة جديدة للعلامات التجارية للتفاعل مع العملاء. قدمنا بعض الوظائف الأساسية لـ Discord لإظهار كيف يمكن للعلامات التجارية بناء مجتمعاتها الإلكترونية الخاصة، والوظائف الأكثر تقدماً التي تسمح للعلامات التجارية باستخدام روبوتات Discord لأتمتة المراجعة ودعم العملاء على خوادمها. أخيراً، شاركنا كيف دمجنا Discord مع منصة خدمة العملاء الخاصة بنا SeaX، مما يجلب وظائف متقدمة إلى مجتمعات Discord مثل تحويل الوكلاء المباشرين وإدارة الحالات والبحث في قاعدة المعرفة المدعوم بالذكاء الاصطناعي. للحصول على عرض توضيحي شخصي، أو لمعرفة كيف يمكن لـ Seasalt.ai مساعدتك في تلبية احتياجات عملك المحددة، يرجى ملء نموذج “حجز عرض توضيحي” الخاص بنا. لمزيد من المعلومات حول تكامل Flex/Discord أو للتواصل معنا، يرجى زيارة قائمة شركاء Twilio لـ Seasalt.ai.