شراء استلام الطلب على الإنترنت من المتجر: وجبة Bonjour - الجزء 1 - البدء

1- مقدمة

637766505206e0a1.png c604dca3ca211399.png

تاريخ التعديل الأخير: 2022-05-11

مرحبًا بك في ميزة "الرسائل التجارية"

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

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

ما الذي يجعل الوكيل الرقمي جيدًا؟

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

ما ستنشئه

في هذا الدرس التطبيقي حول الترميز، ستنشئ وكيلاً رقميًا في ميزة "الرسائل التجارية" لشركة وهمية اسمها Bonjour Meal. يجيب هذا الوكيل الرقمي على بعض الأسئلة البسيطة مثل "متى يغلق متجرك؟" أو "هل يمكنني الشراء على الإنترنت؟".

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

في هذا الدرس التطبيقي حول الترميز، سيتعرّف تطبيقك على ما يلي:

  • الرد على الأسئلة من خلال شريحة اقتراحات
  • توجيه المستخدم لطرح الأسئلة التي يمكن للوكيل الرقمي الإجابة عنها
  • توفير ميزات محادثات ثرية للحفاظ على تفاعل المستخدم في المحادثة

883b5a7f9f266276.png

المعلومات التي ستطّلع عليها

  • كيفية نشر تطبيق ويب في App Engine على Google Cloud Platform. يمكنك بدلاً من ذلك استخدام ngrok لاختبار تطبيقك المحلي بشكل علني.
  • كيفية ضبط حسابك على "الرسائل التجارية" مع الرد التلقائي على الويب لتطبيق الويب على تلقّي الرسائل من المستخدمين
  • كيفية إرسال الميزات المنسّقة، مثل البطاقات ولوحات العرض الدوّارة واقتراحات المحادثات باستخدام Business Message API
  • الطريقة التي ترسل بها ميزة "الرسائل التجارية" رسائلك

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

المتطلبات

  • التسجيل للحصول على حساب مجاني لتطوير Business Communications
  • اطّلِع على الموقع الإلكتروني للمطوّرين للحصول على تعليمات حول كيفية
  • جهاز Android يعمل بالإصدار 5 أو إصدار أحدث أو جهاز iOS يستخدم تطبيق "خرائط Google"
  • خبرة في برمجة تطبيقات الويب
  • اتصال بالإنترنت!

2. بدء الإعداد

تفعيل واجهات برمجة التطبيقات

بالنسبة إلى هذا الدرس التطبيقي حول الترميز، سنعتمد على Cloud Build API لنشر التطبيق على App Engine لأنّنا سنعتمد على أحد تطبيقات Django. بدلاً من ذلك، إذا كنت تستخدم ngrok، لن تحتاج إلى تفعيل Cloud Build API.

لتفعيل Cloud Build API:

  1. افتح Cloud Build API في Google Cloud Console.
  2. انقر على تفعيل.

إنشاء حساب خدمة

عليك إنشاء حساب خدمة للوصول إلى Business Communications وواجهات Business Profile API. اتّبِع الخطوات الواردة في مستندات إنشاء حساب خدمة في وحدة تحكُّم المطوّرين في منتجات التواصل مع الأنشطة التجارية.

نشر رمز المبتدئين لخدمة Django Python

في وحدة طرفية، استنسِخ Django Echo Bot Sample إلى دليل عمل المشروع باستخدام الأمر التالي:

$ git clone https://github.com/google-business-communications/bm-bonjour-meal-django-starter-code

انسخ ملف بيانات اعتماد JSON الذي تم إنشاؤه لحساب الخدمة في مجلد موارد النموذج وأعِد تسمية بيانات الاعتماد إلى "bm-agent-service-account-credentials.json".

bm-bonjour-meal-django-starter-code/bonjourmeal-codelab/step-1/resources/bm-agent-service-account-credentials.json

في وحدة طرفية، انتقِل إلى دليل الخطوة 1 للنموذج.

شغِّل الأوامر التالية في وحدة طرفية لنشر النموذج:

$ gcloud config set project PROJECT_ID*
$ gcloud app create
$ gcloud app deploy
  • PROJECT_ID هو معرف المشروع للمشروع الذي استخدمته للتسجيل في واجهات برمجة التطبيقات.

اطّلِع على عنوان URL للتطبيق المنشور في نتيجة الأمر الأخير:

Deployed service [default] to [https://PROJECT_ID.appspot.com]

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

إعداد webbook

الآن وبعد نشر الخدمة، عليك استخدام عنوان URL للتطبيق من أجل ضبط عنوان URL للردّ التلقائي على الويب في صفحة إعدادات الحساب في وحدة تحكُّم المطوّرين في منتجات التواصل مع الأنشطة التجارية.

سيكون عنوان URL للردّ التلقائي على الويب هو عنوان URL للتطبيق + "/callback/". على سبيل المثال، قد يظهر الرابط التالي: https://PROJECT_ID.appspot.com/callback/

انتقل إلى صفحة إعدادات الحساب على وحدة تحكم Business Communications Console. في أعلى يسار الصفحة أسفل شريط التنقّل، من المفترض أن يظهر لك اسم مشروع Google Cloud Platform. إذا ظهرت لك قائمة منسدلة، تأكَّد من اختيار مشروعك على Google Cloud Platform.

املأ تفاصيل جهة التواصل الفنية، ثم عدِّل الردّ التلقائي على الويب باستخدام عنوان URL للردّ التلقائي على الويب لتطبيقك الذي تم نشره.

ceb66c905ded40be.png

انقر على حفظ بجانب مرجع مشروعك على Google Cloud Platform.

3. إنشاء وكيلك الأول

استخدام وحدة تحكّم المطوّرين في منتجات التواصل مع الأنشطة التجارية

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

في حقل العلامة التجارية، اكتب اسم العلامة التجارية التي تريد إنشاءها.تمثّل العلامة التجارية النشاط التجاري الذي تعمل معه، ويمكن للمستهلكين التفاعل مع الوكيل في المحادثات. في اسم الوكيل، حدِّد ما تريد أن يراه المستخدمون في محادثة "الرسائل التجارية". في حالة وجبة Bonjour Rail الوهمية، فإن Bonjour Rail هي شركة السكك الحديدية التي تدير مطاعم Bonjour Meal. لذلك سأحدد Bonjour Rail كالعلامة التجارية و Bonjour Meal كوكيل.

الوكيل هو الكيان الحواري الذي يمثّل العلامة التجارية.

88a9798e6546eb4e.png

انقر على إنشاء وكيل ودع وحدة التحكم تنفذ بعض التحسينات. يستغرق هذا الطلب بضع ثوانٍ لإرسال عدة طلبات إلى Business Communications API لإنشاء العلامة التجارية والوكيل. يمكنك استخدام Business Communications API مباشرةً لإنشاء وكيل وإنشاء علامة تجارية. يمكنك مراجعة المستندات للاطّلاع على طريقة تنفيذ طلب curl لتنفيذ الإجراءات نفسها التي تنفّذها وحدة التحكّم.

إجراء محادثتك الأولى

افتح الوكيل الذي أنشأته للتو، وستظهر لك صفحة نظرة عامة تتيح لك بدء مراجعة تفاصيل الوكيل. ألقِ نظرة على عناوين URL التجريبية للوكيل، فهي تُستخدَم لاستدعاء مساحة عرض المحادثات على جهازك.

f6bd8ded561db36f.png

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

بعد فتح الرابط على جهازك الجوّال، سيتم تشغيل مشغّل الوكلاء في ميزة "الرسائل التجارية" مع ملء عنوان URL التجريبي للوكيل.

انقر على تشغيل لاستدعاء مساحة المحادثة لوكيلك.

2bf9f282e09062de.png

تفاعَل مع موظّف الدعم وتعرَّف على المهام التي يمكنه تنفيذها. بالنسبة للجزء الأكبر، يُفترض أن تجد أن لوحة المحادثة لن تعكس سوى رسائلك. أرسِل إليه عبارة مثل "مرحبًا، بالعالم!"، وسيرى أن الوكيل سيرسل إليك الرسالة نفسها مرة أخرى.

يحتوي التطبيق المنشور أيضًا على بعض العوامل المنطقية لعرض الميزات الغنية المتوفرة في ميزة "الرسائل التجارية".

  • إذا أرسلت "بطاقة"، ستستدعي بطاقة تفاعلية
  • إذا أرسلت "شرائح"، سيتم استدعاء شرائح الاقتراحات.
  • إذا أرسلت "لوحة عرض دوّارة"، سيتمّ استدعاء لوحة عرض دوّارة للبطاقات التفاعلية.

تهانينا! هذه هي المحادثة الافتتاحية لوكيلك معك،

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

تعديل رسالة الترحيب واستخدام شرائح المحادثات

لنتعرّف على بعض التدريبات على وحدة تحكم المطوّرين، ونتعرّف على كيفية تعديل رسالة الترحيب للوكيل والاستفادة من شرائح الاقتراحات لمساعدة المستخدم على التواصل.

انتقِل إلى صفحة نظرة عامة على موظّف الدعم واختَر معلومات الوكيل. انتقِل للأسفل إلى قسم رسالة الترحيب وبدايات المحادثة.

4323f988216fa054.png

عدِّل رسالة الترحيب (حقل الإدخال الأصفر) لقراءة ما يلي:

مرحبًا بك في موظّف دعم المبتدئين لخدمة Bonjour Meal. يمكنني أن أعرض لك بعض الميزات التفاعلية المتوفّرة على المنصة. ما عليك سوى تجربة هذه الاقتراحات.

انقر على + إضافة إجراء تفعيل للمحادثة كما هو مُشار إليه في المربّع الأرجواني في الصورة أعلاه لإضافة بدايات محادثة لاستدعاء شرائح الاقتراحات ولوحة العرض الدوّارة وبطاقة. تتطلّب بدايات المحادثات التي تضيفها مكوِّنًا نصيًا ومكوِّنًا لبيانات الإحالات الناجحة. النص هو ما يتم عرضه للمستخدم في حين أن بيانات PostBack هي التي يتم إرسالها إلى الرد التلقائي على الويب الخاص بوكيلك. ويحلّل الردّ التلقائي على الويب بيانات الإبلاغ عن الإحالات الناجحة وسيرسل الرد المناسب إلى المستخدم. 906bc74668a1b215.png

تظهر معلومات الوكيل في وحدة التحكّم على النحو التالي بعد التعديل:

8e96b0a10edd20af.png

على الجانب الأيسر من وحدة التحكم، يمكنك رؤية معاينة للشكل الذي سيبدو عليه الوكيل. لاحظ كيف تعكس رسالة الترحيب ما غيّرته للتو وشرائح الاقتراحات التي تظهر أسفلها؟

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

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

في الوقت الحالي، لنلقِ نظرة على آلية عمل الميزات بالكامل.

4. تحليل رمز البدء

عرض رمز المصدر بمسافة 10,000 قدم

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

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

على مستوى عالٍ، سيوجِّه Django عناوين URL إلى طرق العرض، وينتج منطق العرض نموذجًا يتم عرضه في المتصفح. لنلقِ نظرة على urls.py للمشروع.

bm-django-echo-bot/bmcodelab/urls.py [السطور من 31 إلى 37]

from django.urls import include, path
import bopis.views as bopis_views

urlpatterns = [
    path('', bopis_views.landing_placeholder),
    path('callback/', bopis_views.callback),
]

يتم هنا تحديد مسارَين، وبالتالي يستطيع Django تنفيذ المنطق في حال التعرّف على عنوانَي URL هذين. بالنظر إلى عنوان URL للمشروع هو https://PROJECT_ID.appspot.com/، فإن المسارات التي يعرفها المشروع هي:

  • https://PROJECT_ID.appspot.com/
  • https://PROJECT_ID.appspot.com/callback/

يشير كلا مسارَي عنوانَي URL إلى bopis_views من bopis/views.py. لنلقِ نظرة على ما يجري في هذا الملف. لنبدأ أولاً بفهم bopis_views.landing_placeholder.

bm-django-echo-bot/bonjourmeal-codelab/step-1/bopis/views.py [الخطوط 302-309]

... 
def landing_placeholder(request):
    return HttpResponse("<h1>Welcome to the Bonjour Meal Codelab</h1>
    <br/><br/>
    To message your Bonjour Meal agent, go to the Developer Console and retrieve
    the Test URLs for the agent you have created as described in the codelab
    <a href='https://codelabs.developers.google.com/codelabs/'>here</a>.")
...

يتم تنفيذ هذا الجزء من المنطق بواسطة خادم الويب عندما يتلقى طلب ويب يشير إلى جذر المشروع. لا يوجد شيء مهم للغاية: ما علينا سوى إرجاع استجابة HTTP التي تحتوي على رمز HTML مرة أخرى إلى المتصفح الذي أرسل الطلب. إذن، يمكنك فتح عنوان URL الجذر للمشروع، ولكن لا حاجة إلى إجراء أي خطوات إضافية لأنّه سيعيدك إلى هذا الدرس التطبيقي حول الترميز.

يوجِّه عنوان URL الآخر إلى دالة تُسمى callback، أيضًا في bopis/views.py. إذًا، لنلقِ نظرة على هذه الدالة.

bm-django-echo-bot/bopis/views.py [السطور من 60 إلى 101]

...
def callback(request):
    """
    Callback URL. Processes messages sent from user.
    """
    if request.method == "POST":
        request_data = request.body.decode('utf8').replace("'", '"')
        request_body = json.loads(request_data)

        print('request_body: %s', request_body)

        # Extract the conversation id and message text
        conversation_id = request_body.get('conversationId')
        print('conversation_id: %s', conversation_id)

        # Check that the message and text body exist

        if 'message' in request_body and 'text' in request_body['message']:
            message = request_body['message']['text']

            print('message: %s', message)
            route_message(message, conversation_id)
        elif 'suggestionResponse' in request_body:
            message = request_body['suggestionResponse']['postbackData']

            print('message: %s', message)
            route_message(message, conversation_id)
        elif 'userStatus' in request_body:
            if 'isTyping' in request_body['userStatus']:
                print('User is typing')
            elif 'requestedLiveAgent' in request_body['userStatus']:
                print('User requested transfer to live agent')

        return HttpResponse("Response.")

    elif request.method == "GET":
        return HttpResponse("This webhook expects a POST request.")
...

يحلّل المنطق هنا نص الطلب لكل من رسالة أو suggestionResponse في نقل هذه المعلومات إلى دالة تُسمى route_message، ثم إرجاع HttpResponse إلى البنية الأساسية لميزة "الرسائل التجارية" للإقرار باستلام الرسالة.

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

b10113f9d037e6a5.png

تُرسِل ميزة "الرسائل التجارية" محتوى الرسالة في صورة حمولة JSON إلى تطبيق الردّ التلقائي على الويب حيث يتم توجيهها إلى موظّف دعم مباشر أو إلى بعض الإجراءات المنطقية للردّ عليها بصفتك برنامج تتبُّع. آلية التوجيه هذه، في حالتنا هنا، هي route_message. لنلق نظرة.

bm-django-echo-bot/bopis/views.py [السطور 105-122]

...
def route_message(message, conversation_id):
    '''
    Routes the message received from the user to create a response.

    Args:
        message (str): The message text received from the user.
        conversation_id (str): The unique id for this user and agent.
    '''
    normalized_message = message.lower()

    if normalized_message == CMD_RICH_CARD:
        send_rich_card(conversation_id)
    elif normalized_message == CMD_CAROUSEL_CARD:
        send_carousel(conversation_id)
    elif normalized_message == CMD_SUGGESTIONS:
        send_message_with_suggestions(conversation_id)
    else:
        echo_message(message, conversation_id)
...

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

bm-django-echo-bot/bopis/views.py [السطور من 40 إلى 42]

...
# Set of commands the bot understands
CMD_RICH_CARD = 'card'
CMD_CAROUSEL_CARD = 'carousel'
CMD_SUGGESTIONS = 'chips'
...

بتعبير آخر، يحلّل برنامج التتبُّع الرسائل التي تحتوي تحديدًا على أي من السلاسل التي وضعناها في postback_data بدايات المحادثة من الخطوة السابقة في هذا الدرس التطبيقي حول الترميز. إذا لم تظهر أي من هذه السلاسل، فإنها تمرر الرسالة ببساطة إلى دالة تسمى echo_message، والتي يمكنك أن تتخيلها... سيكون صدى الرسائل.

إرسال "الرسائل"

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

ولكن كيف يرسل التطبيق رسالة صادرة إلى مستخدم يستخدم ميزة "الرسائل التجارية"؟

a9475b1da93a83e8.png

عندما تردّ بنيتك الأساسية على المستخدم، يمكنك إرسال الردّ إلى واجهة برمجة تطبيقات ميزة "الرسائل التجارية" التي تعمل على تسليم الرسالة إلى المستخدم.

تحتوي واجهة برمجة التطبيقات للرسائل التجارية على مكتبات في Python وNode.js وJava. لدينا أيضًا واجهة برمجة تطبيقات REST يمكنك إرسال طلبات إليها مباشرةً إذا لم تكن بنيتك الأساسية بلغة تتوفّر لدينا مكتبة لها. يمكنك الاطّلاع على مقالة إرسال الرسائل للتعرّف على طريقة استخدام cURL لإرسال رسالة إلى معرِّف محادثة محدّد.

لغرض هذا الدرس التطبيقي حول الترميز، سنركّز على استخدام مكتبة عملاء لغة Python المدمجة حاليًا في رمز المبتدئين لخدمة Bonjour Meal الذي تمّ نشره في App Engine ضمن مشروع Google Cloud Platform الخاص بك، أو يتم تشغيله محليًا من خلال تطبيق ngrok.

لنلقِ نظرة على الدالة echo_message ونرى كيف نتفاعل مع واجهة برمجة التطبيقات لإرسال الرسالة إلى ميزة "الرسائل التجارية".

bm-django-echo-bot/bopis/views.py [السطور 199-212]

...
def echo_message(message, conversation_id):
    '''
    Sends the message received from the user back to the user.

    Args:
        message (str): The message text received from the user.
        conversation_id (str): The unique id for this user and agent.
    '''
    message_obj = BusinessMessagesMessage(
        messageId=str(uuid.uuid4().int),
        representative=BOT_REPRESENTATIVE,
        text=message)

    send_message(message_obj, conversation_id)
...

في هذه الدالة، يتم إنشاء مثيل BusinessMessagesMessage باستخدام متغير الرسالة الذي تم تمريره إلى الدالة echo_message. بعد إنشاء مثيل، يتم تمرير الكائن إلى send_message مع رقم تعريف المحادثة.

bm-django-echo-bot/bopis/views.py [السطور 214-236]

...
def send_message(message, conversation_id):
    '''
    Posts a message to the Business Messages API, first sending
    a typing indicator event and sending a stop typing event after
    the message has been sent.

    Args:
        message (obj): The message object payload to send to the user.
        conversation_id (str): The unique id for this user and agent.
    '''
    credentials = ServiceAccountCredentials.from_json_keyfile_name(
        SERVICE_ACCOUNT_LOCATION,
        scopes=['https://www.googleapis.com/auth/businessmessages'])

    client = bm_client.BusinessmessagesV1(credentials=credentials)

    # Create the message request
    create_request = BusinessmessagesConversationsMessagesCreateRequest(
        businessMessagesMessage=message,
        parent='conversations/' + conversation_id)

    bm_client.BusinessmessagesV1.ConversationsMessagesService(
        client=client).Create(request=create_request)
...

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

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

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

عندما تكون جاهزًا، خصص وكيل Bonjour Meal.

5. تخصيص وكيلك

إذا كنت قد اتّبعت الدرس التطبيقي حول الترميز حتى الآن، من المفترض أن نرى موظّف الدعم الرائع لدينا.

906bc74668a1b215.png

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

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

  • تضمين شعار فعلي
  • رسالة ترحيب محسَّنة
  • تقديم معلومات عن ساعات العمل
  • أخبِر المستخدم بأن شراء العناصر على الإنترنت ستتوفّر قريبًا.
  • استخدام شرائح الاقتراحات الحوارية لتسهيل المحادثة

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

من وحدة التحكم في Business Communications، اختَر الوكيل وانتقِل إلى معلومات الوكيل. سنحتاج إلى تعديل شعار النشاط التجاري، كما هو موضّح باللون الأصفر أدناه.

eb6b8ac6b62387ee.png

انقر على تحميل، وستتمكّن من تحديد صورة لتحميلها أو استيرادها من عنوان URL.

ألقِ نظرة على إرشادات تصميم الشعارات في المستندات للتعرّف على أفضل الممارسات التي ننصح بها لاستخدام شعاراتك الخاصة.

لنحمّل الشعار الموجود في رمز المصدر الذي نسخته في بداية هذا الدرس التطبيقي حول الترميز. ويمكنك العثور عليه في دليل ./assets/ للمستودع ويُطلق على الملف اسم "bonjour_meal-logo.png". يمكنك سحب الملف إلى النافذة المشروطة على متصفح الويب، وسيتم تقديم أداة تعديل خفيفة للتحكم في جودة الصورة واقتصاصها. اضبط درجة دقة الصورة وقم باقتصاصها بحيث تكون الصورة أقل من أو تساوي القيد الذي يبلغ 50 كيلوبايت. عندما تكون راضيًا عن الصورة، انقر على علامة الاختيار في الدائرة الزرقاء للتأكيد، ثم انقر على اختيار في أسفل النافذة.

1856081f59623ae2.png

أخيرًا، انقر على حفظ في أعلى يسار صفحة معلومات الوكيل. وسيستغرق ظهور هذا التغيير على جهازك بعض الوقت، حيث يتم تخزين معلومات الوكيل مؤقتًا في خوادمنا ومن المفترض أن تظهر خلال ساعتين من وقت التغيير.

تعديل رسالة الترحيب

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

في "وحدة التحكّم في منتجات التواصل مع الأنشطة التجارية"، اختَر الوكيل وانتقِل إلى معلومات الوكيل. انتقِل للأسفل إلى أن يظهر لك حقل إدخال رسالة الترحيب حيث يمكنك تعديل الرسالة.

6598fec47021136e.png

وبما أنّنا سنضيف بدايات محادثات، يمكننا الإشارة إليها في رسالة الترحيب. في حقل الإدخال، سنستبدله بالنص التالي:

"مرحبًا بك في وجبة Bonjour. أنا مساعد يمكنني مساعدتك في الإجابة عن الأسئلة التي قد تكون لديك حول وجبة Bonjour. جرِّب بعض الخيارات التالية".

أخيرًا، انقر على حفظ في أعلى يسار صفحة معلومات الوكيل. ومرة أخرى، سيستغرق ظهور هذا التغيير بعض الوقت بسبب آلية التخزين المؤقت الخاصة بنا للتأكد من أن كل شيء سريع!

تقديم معلومات عن ساعات العمل

لتقديم هذه المعلومات إلى المستخدمين، سنرسل رسالة مخصّصة إلى المستخدم باستخدام واجهة برمجة تطبيقات "الرسائل التجارية".

قد تتذكر أنّ الرسائل يتم تحليلها في دالة route_message في views.py. تعمل الدالة أولاً على تسوية السلسلة ثم تبدأ في التحقق مما إذا كانت الرسالة التي تمت تسويتها تتطابق مع أي من المعلمات الثابتة. ولتبسيط الأمر، لنضف شرطًا إضافيًا ونتحقّق من خلاله لمعرفة ما إذا كانت الرسالة التي تمّت تسويتها تساوي ثابتًا جديدًا سنسميه CMD_BUSINESS_HOURS_INQUIRY وستتضمّن القيمة "business-hours-inquiry". إذا تم تقييم الشرط إلى "true"، سيتم استدعاء دالة تسمى send_message_with_business_hours.

ستبدو الدالة route_message الآن على النحو التالي:

bm-django-echo-bot/bopis/views.py

...
def route_message(message, conversation_id):
    '''
    Routes the message received from the user to create a response.

    Args:
        message (str): The message text received from the user.
        conversation_id (str): The unique id for this user and agent.
    '''
    normalized_message = message.lower()

    if normalized_message == CMD_RICH_CARD:
        send_rich_card(conversation_id)
    elif normalized_message == CMD_CAROUSEL_CARD:
        send_carousel(conversation_id)
    elif normalized_message == CMD_SUGGESTIONS:
        send_message_with_suggestions(conversation_id)
    elif normalized_message == CMD_BUSINESS_HOURS_INQUIRY:
        send_message_with_business_hours(conversation_id)
    else:
        echo_message(message, conversation_id)
...

لكي يعمل الرمز البرمجي، علينا إجراء تغييرَين إضافيَّين: الأول هو تعريف CMD_BUSINESS_HOURS_INQUIRY مع الثوابت الأخرى، وثانيًا تحديد الدالة send_message_with_business_hours وإرسال رسالة باستخدام Business Message API.

لنبدأ أولاً بتعريف الثابت في أعلى الملف مع التعريفات الثابتة الأخرى:

bm-django-echo-bot/bopis/views.py

...
# Set of commands the bot understands
CMD_RICH_CARD = 'card'
CMD_CAROUSEL_CARD = 'carousel'
CMD_SUGGESTIONS = 'chips'
CMD_BUSINESS_HOURS_INQUIRY = 'business-hours-inquiry'
...

والآن، لنعرف send_message_with_business_hours. يمكنك تعريف هذه الدالة في أي مكان في الملف، باتباع بناء الجملة المناسب في بايثون. بما أنّ هذه الدالة ترسل رسالة، تشبه إلى حدّ كبير echo_message، يمكنك استخدامها كنموذج لتعريف هذه الدالة.

bm-django-echo-bot/bopis/views.py

...
def send_message_with_business_hours(conversation_id):

    message = '''Thanks for contacting us! The hours for the store are:\n
    MON 8am - 8pm\n
    TUE 8am - 8pm\n
    WED 8am - 8pm\n
    THU 8am - 8pm\n
    FRI 8am - 8pm\n
    SAT 8am - 8pm\n
    SUN 8am - 8pm
    '''

    message_obj = BusinessMessagesMessage(
        messageId=str(uuid.uuid4().int),
        representative=BOT_REPRESENTATIVE,
        text=message)

    send_message(message_obj, conversation_id)
...

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

125802166995afd5.png

بعد نشر رمز المصدر في Google Cloud Platform، ستظهر التغييرات على الفور. تجدر الإشارة إلى أنّه لا يتم التخزين المؤقت لتطبيق الويب في Google Cloud Platform بالطريقة نفسها التي يتم بها تخزين معلومات الوكيل في ذاكرة التخزين المؤقت، لذا سيكون بإمكانك اختبار هذه التجربة على الفور.

وعلى الرغم من أنّ لدينا بعض الزخم هنا لإجراء تغييرات على المصدر، فلنُجري تعديلاً آخر يسمح للمستخدم بالاستعلام عن التسوّق على الإنترنت. سيردّ عليك موظّف الدعم الرقمي قائلاً إنّ هذه الميزة غير متاحة بعد، ولكن عليك الرجوع إليها والتحقق لاحقًا.

إعلام المستخدم بتوفّر ميزة التسوّق على الإنترنت قريبًا

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

حلّل الرسالة التي تمت تسويتها وتحقَّق من شرط ثابت يُسمى CMD_ONLINE_SHOPPING_INQUIRY مع ضبط القيمة على "online-shopping-inquiry" الذي يستدعي send_online_shopping_info_message إذا كان الشرط true.

bm-django-echo-bot/bopis/views.py

...
# Set of commands the bot understands
CMD_RICH_CARD = 'card'
CMD_CAROUSEL_CARD = 'carousel'
CMD_SUGGESTIONS = 'chips'
CMD_BUSINESS_HOURS_INQUIRY = 'business-hours-inquiry'
CMD_ONLINE_SHOPPING_INQUIRY = 'online-shopping-inquiry'
...
...
...
def route_message(message, conversation_id):
    '''
    Routes the message received from the user to create a response.

    Args:
        message (str): The message text received from the user.
        conversation_id (str): The unique id for this user and agent.
    '''
    normalized_message = message.lower()

    if normalized_message == CMD_RICH_CARD:
        send_rich_card(conversation_id)
    elif normalized_message == CMD_CAROUSEL_CARD:
        send_carousel(conversation_id)
    elif normalized_message == CMD_SUGGESTIONS:
        send_message_with_suggestions(conversation_id)
    elif normalized_message == CMD_BUSINESS_HOURS_INQUIRY:
        send_message_with_business_hours(conversation_id)
    elif normalized_message == CMD_ONLINE_SHOPPING_INQUIRY:
        send_online_shopping_info_message(conversation_id)
    else:
        echo_message(message, conversation_id)
...

الآن لتعريف send_online_shopping_info_message. نريد إرسال هذه الرسالة في بطاقة تفاعلية تتضمّن صورة، لذا لننسخ دالة send_rich_card لاستخدامها كنموذج لتحديد send_online_shopping_info_message.

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

bm-django-echo-bot/bopis/views.py

...
def send_online_shopping_info_message(conversation_id):
    fallback_text = ('Online shopping will be available soon!')

    rich_card = BusinessMessagesRichCard(
        standaloneCard=BusinessMessagesStandaloneCard(
            cardContent=BusinessMessagesCardContent(
                title='Online shopping info!',
                description='Thanks for your business, we are located in SF near the Golden Gate Bridge. Online shopping is not yet available, please check back with us in a few days.',
                suggestions=[],
                media=BusinessMessagesMedia(
                    height=BusinessMessagesMedia.HeightValueValuesEnum.MEDIUM,
                    contentInfo=BusinessMessagesContentInfo(
                        fileUrl=SAMPLE_IMAGES[4],
                        forceRefresh=False
                    ))
                )))

    message_obj = BusinessMessagesMessage(
        messageId=str(uuid.uuid4().int),
        representative=BOT_REPRESENTATIVE,
        richCard=rich_card,
        fallback=fallback_text)

    send_message(message_obj, conversation_id)
...

رائع! يمكن لوكيلنا الرقمي الآن الردّ على المستخدمين الذين يستفسرون عن التسوّق على الإنترنت. في الوقت الحالي، لا يتيح وكيلنا الرقمي توفير ميزة التسوّق على الإنترنت، لذا نرسل رسالة إلى المستخدم لإعلامه بأنّ هذه الميزة ستصبح متوفّرة قريبًا. هكذا يبدو وكيلنا الرقمي عندما يستفسر المستخدم عن التسوّق على الإنترنت.

5cd63c57c1b84f9a.png

تمامًا مثل التغيير السابق الذي أجريناه للسماح للمستخدم بالاستعلام عن ساعات العمل، يمكن الاطّلاع على هذا التغيير فورًا في حال استخدام ngrok أو فور نشر الرمز في Google Cloud App Engine.

في الجزء التالي، سنستخدم بدايات المحادثات وشرائح الاقتراحات لتوجيه المحادثة إلى المسار الصحيح.

استخدام الشرائح لتوجيه المحادثة

لقد أجرينا بعض التغييرات على رمز المصدر ونشرنا الوكيل الرقمي المحدّث، ولكننا لا نتوقع أبدًا من المستخدمين كتابة "business-hours-inquiry" أو "online-shopping-info" للاستعلام عن النشاط التجاري. دعونا نحدث بدايات المحادثة بحيث لا يتم الترحيب بالمستخدم من خلال رسالة ترحيب لطيفة عند فتح المحادثة فحسب، بل يتم أيضًا عرضه ببدايات للمحادثة.

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

سنقوم بإنشاء بدايتين جديدتين للمحادثة. للخيار الأول، اضبط النص على "ما هي ساعات عمل نشاطك التجاري؟" واضبط بيانات الإبلاغ عن الإحالات الناجحة على "استعلام عن ساعات العمل". بالنسبة إلى إجراء التفعيل الثاني للمحادثة، اضبط النص على "هل يمكنني إجراء عمليات شراء هنا؟" واضبط بيانات الإبلاغ عن الإحالات الناجحة على "online-shopping-info".

من المفترض أن تكون النتيجة هي الإعدادات كلقطة الشاشة التالية:

ef6e6888acea93e3.png

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

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

في نهاية الدالة، أضِف ما يلي:

bm-django-echo-bot/bopis/views.py

...
def send_online_shopping_info_message(conversation_id):
...
    # at the end of the function, send a message with suggestions
    message_obj = BusinessMessagesMessage(
        messageId=str(uuid.uuid4().int),
        representative=BOT_REPRESENTATIVE,
        text='Let us know how else we can help you:',
        fallback='Please let us know how else we can help you.',
        suggestions=[
            BusinessMessagesSuggestion(
                reply=BusinessMessagesSuggestedReply(
                text='Business hours',
                postbackData='business-hours-inquiry')
            ),
        ])

    send_message(message_obj, conversation_id)
...

# Let's do the same with the business hours
def send_message_with_business_hours(conversation_id):
...
    # at the end of the function, send a message with suggestions
    message_obj = BusinessMessagesMessage(
        messageId=str(uuid.uuid4().int),
        representative=BOT_REPRESENTATIVE,
        text='Let us know how else we can help you:',
        fallback='Please let us know how else we can help you.',
        suggestions=[
            BusinessMessagesSuggestion(
                reply=BusinessMessagesSuggestedReply(
                text='Can I purchase online?',
                postbackData='online-shopping-inquiry')
            ),
        ])

    send_message(message_obj, conversation_id)
...

يُرجى العلم بأنّ حقل النص في BusinessMessagesSuggestion يقتصر على 25 حرفًا، كما هو موضّح في المستندات.

من خلال بدايات المحادثات المعدَّلة والاستخدام الاستراتيجي لشرائح الاقتراحات، إليك بعض لقطات الشاشة التي توضّح تجربة المستخدم المتوقّعة.

ef57695e2bacdd20.png

6. تهانينا

تهانينا، لقد نجحت في إنشاء أول وكيل رقمي لك في ميزة "الرسائل التجارية".

لقد نشرت تطبيق ويب لدعم وكيلك الرقمي في ميزة "الرسائل التجارية"، واستخدمت "وحدة التحكّم في اتصالات الأنشطة التجارية" لتعديل الوكيل، وشكّلت تجربة المستخدم مع الوكيل الرقمي من خلال إجراء تغييرات على رمز المصدر.

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

إليك إعلان تشويقي لما قد يبدو عليه هذا الأمر.

57d2bb7b0ec38c81.png

كيف يمكنني إنشاء تجربة محادثات رائعة؟

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

توفير السياق وتحديد التوقعات

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

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

توفير وظائف للمستخدم

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

الحفاظ على تفاعل المستخدمين

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

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

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

الخطوة التالية

عندما تكون مستعدًا، اطّلِع على بعض المواضيع التالية للتعرّف على التفاعلات الأكثر تعقيدًا التي يمكنك تحقيقها من خلال ميزة "الرسائل التجارية".

المستندات المرجعية