۱. مقدمه


آخرین بهروزرسانی: 2022-05-11
به پیامهای تجاری خوش آمدید!
این آزمایشگاه کد مقدمهای بر ادغام با Business Messages است که به مشتریان اجازه میدهد از طریق جستجوی گوگل و نقشهها با کسبوکارهایی که شما مدیریت میکنید ارتباط برقرار کنند. ممکن است شما صاحب کسبوکاری باشید که میخواهید مستقیماً با Business Messages ادغام شوید، یا شاید در یک فروشنده نرمافزار مستقل کار میکنید که در حال ساخت راهحلهای پیامرسانی برای کسبوکارهایی است که با آنها کار میکنید، یا شاید به طور اتفاقی با Business Messages آشنا شدهاید و میخواهید روی این پلتفرم کار کنید.
صرف نظر از اینکه چه چیزی شما را به اینجا آورده است، این codelab راهی فوقالعاده برای شروع است. در پایان آن، شما اولین عامل دیجیتالی خود را خواهید داشت که کاربران میتوانند با آن تعامل داشته باشند. وقتی پس از کمی ویرایش بیشتر، آماده راهاندازی پیامهای تجاری شوید، پتانسیل دسترسی به میلیونها مشتری را خواهید داشت.
چه چیزی یک نماینده دیجیتال خوب را میسازد؟
پیامهای تجاری یک سطح مکالمهای است که تجربهای شبیه به اپلیکیشن را در دستگاههای تلفن همراه ارائه میدهد و به مصرفکنندگان اجازه میدهد بدون نصب برنامه اضافی با کسبوکارها ارتباط برقرار کنند. عامل دیجیتال، قطعهای از منطق است که مشتریان شما با آن تعامل دارند. این منطق توسط یک برنامه وب مستقر در ابر یا در زیرساخت شما مدیریت میشود. کاملاً به شما بستگی دارد که چگونه به کاربر پاسخ میدهید. بهترین عاملها زمینه را برای تعیین انتظارات، حفظ تعامل مشتریان و ارائه قابلیتهایی برای پشتیبانی از نیازهای کاربران فراهم میکنند.
آنچه خواهید ساخت
در این آزمایشگاه کد، شما قرار است یک عامل دیجیتال بر روی پیامهای تجاری برای یک شرکت فرضی به نام Bonjour Meal بسازید. این عامل دیجیتال به چند سوال ساده مانند «چه ساعتی تعطیل میکنید؟» یا «آیا میتوانم آنلاین خرید کنم؟» پاسخ خواهد داد.
در این آزمایشگاه کد، کاربران شما قادر خواهند بود اقلام را از طریق عامل دیجیتال خریداری کنند، کاربر را برای جمعآوری پول به یک پردازنده پرداخت هدایت کنند و سپس برای تحویل گرفتن اقلام فرضی خود در فروشگاه برنامهریزی کنند.
در این آزمایشگاه کد، برنامه شما
- از طریق تراشه پیشنهاد به سوالات پاسخ دهید
- کاربر را راهنمایی کنید تا سوالاتی بپرسد که نماینده دیجیتال شما بتواند به آنها پاسخ دهد
- ویژگیهای مکالمهای غنی ارائه دهید تا کاربر را درگیر مکالمه نگه دارید.

آنچه یاد خواهید گرفت
- نحوه استقرار یک برنامه وب در App Engine در پلتفرم ابری گوگل. به عنوان یک روش جایگزین، میتوانید از ngrok برای آزمایش عمومی برنامه محلی خود استفاده کنید.
- نحوه پیکربندی حساب پیامهای تجاری خود با یک وبهوک برنامه وب برای دریافت پیام از کاربران
- نحوه ارسال ویژگیهای غنی مانند کارت، چرخ فلک و پیشنهادات مکالمه با API پیامهای تجاری
- چگونه پیامهای تجاری پیامهای شما را ارسال میکند
این آزمایشگاه کد بر ساخت اولین عامل دیجیتال شما متمرکز است.
آنچه نیاز دارید
- برای یک حساب کاربری توسعهدهنده ارتباطات تجاری رایگان ثبتنام کنید
- برای دستورالعملهای مربوط به نحوهی انجام این کار، به سایت توسعهدهندگان ما مراجعه کنید.
- یک دستگاه اندروید با نسخه ۵ یا بالاتر یا یک دستگاه iOS با برنامه Google Maps
- تجربه برنامه نویسی تحت وب
- یه اتصال اینترنتی!
۲. راهاندازی
فعال کردن APIها
برای این آزمایشگاه کد، از آنجایی که ما با یک برنامه Django کار خواهیم کرد، برای استقرار برنامه در App Engine به Cloud Build API تکیه خواهیم کرد. از طرف دیگر، اگر از ngrok استفاده میکنید، نیازی به فعال کردن Cloud Build API نیست.
برای فعال کردن API ساخت ابری:
- رابط برنامهنویسی کاربردی ساخت ابر (Cloud Build API) را در کنسول ابری گوگل (Google Cloud Console) باز کنید.
- روی فعال کردن کلیک کنید.
ایجاد حساب کاربری سرویس
برای دسترسی به APIهای Business Communications و Business Messages باید یک حساب کاربری سرویس ایجاد کنید. برای ایجاد یک حساب کاربری سرویس در کنسول توسعهدهندگان Business Communications، مراحل موجود در مستندات را دنبال کنید.
کد شروع EchoBot پایتون Django را مستقر کنید
در ترمینال، نمونه ربات Django Echo را با دستور زیر در دایرکتوری کاری پروژه خود کپی کنید:
$ 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
در یک ترمینال، به دایرکتوری مرحله ۱ نمونه بروید.
برای نصب نمونه، دستورات زیر را در ترمینال اجرا کنید:
$ gcloud config set project PROJECT_ID*
$ gcloud app create
$ gcloud app deploy
- PROJECT_ID شناسه پروژهای است که برای ثبت در APIها استفاده کردهاید.
به آدرس URL برنامهی اجرا شده در خروجی آخرین دستور توجه کنید:
Deployed service [default] to [https://PROJECT_ID.appspot.com]
کد آغازینی که شما پیادهسازی کردید شامل یک برنامه وب با یک وبهوک برای دریافت پیامها از Business Messages است. این برنامه پیامها را به کاربر بازمیگرداند و میتواند برخی از ویژگیهای غنی موجود در سطح مکالمه را نمایش دهد.
وببوک خود را پیکربندی کنید
اکنون که سرویس شما مستقر شده است، از URL برنامه برای تنظیم URL وبهوک خود در صفحه تنظیمات حساب در کنسول توسعهدهنده ارتباطات تجاری استفاده خواهید کرد.
آدرس وبهوک، آدرس برنامه به همراه "/callback/" خواهد بود. برای مثال، میتواند چیزی شبیه به این باشد: https://PROJECT_ID.appspot.com/callback/
به صفحه تنظیمات حساب کاربری کنسول ارتباطات تجاری بروید. در گوشه بالا سمت راست زیر نوار ناوبری، باید نام پروژه GCP خود را ببینید. اگر منوی کشویی میبینید، حتماً پروژه GCP خود را انتخاب کنید.
اطلاعات تماس بخش فنی را پر کنید و سپس Webhook را با URL وبهوک مربوط به برنامهی پیادهسازیشدهی خود بهروزرسانی کنید.

روی ذخیره در کنار مرجع پروژه GCP خود کلیک کنید.
۳. ایجاد اولین نماینده شما
استفاده از کنسول توسعهدهندگان ارتباطات تجاری
در کنسول ارتباطات تجاری، روی لوگوی بالا سمت چپ کلیک کنید تا به داشبورد کنسول برگردید، سپس روی ایجاد نماینده کلیک کنید. همزمان با ایجاد نماینده، یک برند نیز ایجاد میکنید. برای نوع نماینده، پیامهای تجاری را انتخاب کنید و مطمئن شوید که اطلاعات شریک صحیح است.
در قسمت «برند» ، نام برندی را که ایجاد میکنید، تایپ کنید. برند، کسبوکاری است که با آن کار میکنید و مصرفکنندگان میتوانند با نماینده تعامل مکالمهای داشته باشند. در قسمت «نام نماینده» ، مشخص کنید که میخواهید کاربران در مکالمه پیامهای تجاری چه چیزی را ببینند. در مورد Bonjour Meal فرضی، Bonjour Rail شرکت راهآهن است که رستورانهای Bonjour Meal را مدیریت میکند. بنابراین، Bonjour Rail را به عنوان برند و Bonjour Meal را به عنوان نماینده مشخص میکنم.
عامل، نهاد مکالمهای است که نماینده برند است.

روی ایجاد عامل کلیک کنید و بگذارید کنسول جادو کند. این درخواست چند ثانیه طول میکشد تا چندین درخواست به API ارتباطات تجاری برای ایجاد برند و عامل ارسال کند. میتوانید مستقیماً از API ارتباطات تجاری برای ایجاد یک عامل و ایجاد یک برند استفاده کنید. مستندات را بررسی کنید تا ببینید یک درخواست curl چگونه میتواند همان کارهایی را که کنسول انجام میدهد، انجام دهد.
اولین مکالمه خود را انجام دهید
عاملی را که تازه ایجاد کردهاید باز کنید، یک صفحه مرور کلی به شما نمایش داده میشود که به شما امکان میدهد جزئیات عامل خود را بررسی کنید. به URL های آزمایشی عامل نگاهی بیندازید. این URL ها برای فراخوانی سطح مکالمه در دستگاه شما استفاده میشوند.

میتوانید با کلیک روی هر یک از تراشهها، آدرس اینترنتی آزمایشی را کپی کنید. البته، آدرس اینترنتی آزمایشی دستگاهی را که برای آزمایش در اختیار دارید، کپی کنید. این پیام کپی شده را به هر روشی که میخواهید به دستگاه خود ارسال کنید.
وقتی روی دستگاه همراهتان هستید، با لمس لینک، لانچر عامل پیامهای تجاری (Business Messages Agent Launcher) با URL آزمایشی عامل شما که از قبل در آن قرار داده شده است، فراخوانی میشود.
برای فراخوانی صفحه مکالمه اپراتور خود، روی راهاندازی (Launch) ضربه بزنید.

با اپراتور تعامل کنید و از قابلیتهای آن مطلع شوید. در بیشتر موارد، باید متوجه شوید که سطح مکالمه فقط پیامهای شما را منعکس میکند. چیزی شبیه به «سلام دنیا!» برایش بفرستید و خواهید دید که اپراتور همان پیام را برای شما ارسال میکند.
برنامهی پیادهسازیشده همچنین شامل منطقی برای نمایش ویژگیهای غنی موجود در پیامهای تجاری است.
- اگر "کارت" ارسال کنید، یک کارت غنی (rich card) فراخوانی خواهید کرد.
- اگر «چیپس» ارسال کنید، چیپهای پیشنهادی را فراخوانی خواهید کرد
- اگر "carousel" ارسال کنید، یک چرخ و فلک از کارتهای غنی را فراخوانی خواهید کرد.
تبریک میگویم! این اولین گفتگوی نماینده شما با شماست!
هر یک از ویژگیهای غنی را میتوان برای ارائه زمینه بهتر به فردی که با نماینده شما در ارتباط است، استفاده کرد. برای انتقال بهتر ایدهها، تصاویر گرافیکی را در کارتهای غنی ارسال کنید، یا از تراشههای پیشنهادی برای هدایت مکالمه استفاده کنید.
بهروزرسانی پیام خوشآمدگویی و استفاده از تراشههای مکالمه
بیایید کمی با کنسول توسعهدهندگان تمرین کنیم، ببینیم چگونه پیام خوشآمدگویی اپراتور را ویرایش کنیم و از تراشههای پیشنهاد برای کمک به ارتباط کاربر استفاده کنیم.
به صفحه «نمای کلی نماینده» بروید و «اطلاعات نماینده» را انتخاب کنید. به پایین بروید تا به بخش «پیام خوشآمدگویی» و «آغازگرهای مکالمه» برسید.

پیام خوشامدگویی (فیلد ورودی زرد) را به صورت زیر بهروزرسانی کنید:
به عامل شروع غذای Bonjour خوش آمدید. من میتوانم پیامهای شما را تکرار کنم و برخی از ویژگیهای غنی پشتیبانی شده در پلتفرم را به شما نشان دهم، این پیشنهادات را امتحان کنید!
همانطور که در کادر بنفش تصویر بالا نشان داده شده است، برای اضافه کردن شروعکنندههای مکالمه جهت فراخوانی چیپهای پیشنهادی، چرخ فلک و کارت، روی + Add conversation starter کلیک کنید. شروعکنندههای مکالمهای که اضافه میکنید به یک کامپوننت متنی و یک کامپوننت postbackData نیاز دارند. متن چیزی است که به کاربر نمایش داده میشود در حالی که دادههای postBack چیزی است که به webhook نماینده شما ارسال میشود. webhook دادههای postback را تجزیه و تحلیل میکند و پاسخ مناسب را به کاربر ارسال میکند. 
اطلاعات Agent در کنسول پس از اصلاح به این شکل خواهد بود:

در سمت راست کنسول، پیشنمایشی از ظاهر عامل را مشاهده میکنید. توجه کنید که پیام خوشامدگویی چگونه آنچه را که به آن تغییر دادهاید و تراشههای پیشنهادی که در زیر آن قرار دارند را منعکس میکند؟
این یک ابزار عالی برای درک تجربه کاربری است. میتوانید از آن در حین ساخت عامل خود و برنامهریزی سفرهای کاربری که میخواهید پشتیبانی کنید، استفاده کنید.
متأسفانه، ما نمیتوانیم فوراً تأثیر این تغییرات را در مکالمه ببینیم، زیرا دادههای قبلی در زیرساخت پیامهای تجاری ذخیره میشوند. این حافظه پنهان تقریباً هر ۲ ساعت یکبار پاک میشود، بنابراین میتوانید فردا این را امتحان کنید.
در عین حال، بیایید نگاهی به نحوه عملکرد همه چیز در زیر کاپوت بیندازیم.
۴. تحلیل کد آغازین
نمای ۱۰،۰۰۰ فوتی از کد منبع
کد اولیهای که شما پیادهسازی کردهاید، پیامها را به کاربران بازمیگرداند و میتواند یک کارت غنی، یک چرخ فلک یا تراشههای پیشنهادی ارائه دهد. بیایید نگاهی عمیقتر به کد منبع بیندازیم تا بتوانیم نحوه کار آن را درک کنیم. سپس متوجه خواهیم شد که چه چیزی را باید تغییر دهیم.
کد آغازین یک پروژه جنگو است. در بخش بعدی این مجموعه کدنویسی، از Google Datastore برای ذخیره دادههایی مانند سبدهای خرید و مکالمات مرتبط استفاده خواهیم کرد. اگر قبلاً از جنگو استفاده نکردهاید نگران نباشید، این کار بسیار ساده است و در پایان این کدنویسی، نحوه کار آن را یاد خواهید گرفت.
در سطح بالا، جنگو URLها را به viewها هدایت میکند و منطق view یک قالب تولید میکند که در مرورگر رندر میشود. بیایید نگاهی به urls.py پروژه بیندازیم.
bm-django-echo-bot/bmcodelab/urls.py [خطوط ۳۱ تا ۳۷]
from django.urls import include, path
import bopis.views as bopis_views
urlpatterns = [
path('', bopis_views.landing_placeholder),
path('callback/', bopis_views.callback),
]
دو مسیر در اینجا تعریف شدهاند، و بنابراین جنگو میتواند در صورت شناسایی آن دو 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>.")
...
این بخش از منطق توسط وب سرور شما اجرا میشود، زمانی که یک درخواست وب دریافت میکند که به ریشه پروژه اشاره دارد. در اینجا اتفاق خاصی نمیافتد: ما به سادگی یک HTTPResponse حاوی مقداری 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.")
...
منطق اینجا بدنه درخواست را برای یک پیام یا یک SuggestResponse تجزیه میکند و آن اطلاعات را به تابعی به نام route_message ارسال میکند، سپس یک HttpResponse را به زیرساخت Business Messages برمیگرداند تا دریافت پیام را تأیید کند.
این یک تابع مهم است. این بخش از منطق، وبهوک برنامه وب شماست که پیامهایی را از کاربرانی که با عامل شما در تعامل هستند دریافت میکند. میتوانید وبهوک را گسترش دهید تا پیامهایی را به یک ابزار اتوماسیون مانند Dialogflow ارسال کند تا بفهمد کاربر چه میگوید و از آن استنتاج پاسخی تولید کند. همچنین میتوانید پیام را ارسال کنید تا کاربر بتواند با یک عامل زنده ارتباط برقرار کند. نمودار زیر را ببینید:

پیامهای تجاری، محتوای پیام را به عنوان یک JSON payload به وبهوک شما ارسال میکند که در آنجا به یک عامل زنده یا به یک منطق برای پاسخ دادن به عنوان یک ربات، مسیریابی میشود. این مکانیزم مسیریابی، در مورد ما، 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 ارسال میکند، که میتوانید تصور کنید... پیامها را echo میکند.
ارسال پیام
خب، تا الان باید ایدهای در مورد نحوه دریافت پیامها توسط برنامه وب داشته باشید. همه این کارها توسط وبهوک انجام میشود.
اما چگونه برنامه با استفاده از پیامهای تجاری، یک پیام خروجی برای کاربر ارسال میکند؟

وقتی زیرساخت شما به کاربر پاسخ میدهد، شما پاسخ را به API پیامهای تجاری ارسال میکنید که پیام را به کاربر تحویل میدهد.
API پیامهای تجاری دارای کتابخانههایی در پایتون، Node.js و جاوا است. ما همچنین یک API REST داریم که اگر زیرساخت شما به زبانی که ما کتابخانهای برای آن داریم نیست، میتوانید مستقیماً درخواستها را به آن ارسال کنید. برای دیدن نحوه استفاده از cURL برای ارسال پیام به یک شناسه مکالمه خاص، به بخش ارسال پیامها نگاهی بیندازید.
در این آزمایشگاه کد، ما بر استفاده از کتابخانه کلاینت پایتون که از قبل در کد آغازگر Bonjour Meal ادغام شده و در App Engine پروژه GCP شما مستقر شده است، یا اجرای محلی از طریق ngrok تمرکز خواهیم کرد.
بیایید نگاهی به تابع echo_message بیندازیم و ببینیم چگونه با API برای ارسال پیام به Business Messages تعامل میکنیم.
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 با متغیر message که به تابع 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 انجام میدهد این است که از اعتبارنامههای حساب سرویس شما استفاده میکند تا تأیید کند که میتوانید به این مکالمه پیام ارسال کنید، یک کلاینت Business Messages نمونهسازی میکند و درخواستی برای ارسال پیام به conversation ID داده شده ایجاد میکند.
ویژگیهای غنی نیز از این تابع send_message استفاده میکنند، اما پیامهایی که ایجاد میکنند مختص کارتهای غنی، چرخوفلکها و تراشههای پیشنهاد هستند. کارتها و چرخوفلکهای غنی ممکن است شامل دادههای گرافیکی باشند در حالی که تراشههای پیشنهاد دارای postback_data هستند تا منطق فراخوانی بتواند آن را به طور مناسب تجزیه کند.
حالا که نحوه ارسال پیام را دیدهایم، بررسی میکنیم که نمونه چگونه کارتهای غنی، چرخوفلکها و تراشههای پیشنهاد را ارسال میکند. در بخش بعدی، کد منبع را برای ارسال پیامهایی با برخی از این ویژگیهای غنی اصلاح خواهیم کرد.
وقتی آماده شدید، بیایید عامل Bonjour Meal را سفارشی کنیم.
۵. شخصیسازی نمایندهتان
اگر تا اینجای کار آزمایشگاه کد را دنبال کرده باشید، باید شاهد مامور زیبایمان باشیم.

باشه، خیلی زیبا نیست، در واقع کمی ساده به نظر میرسه و خیلی خوب کسب و کار ما رو نشون نمیده. خوشبختانه، ما دانش پایهای از کدی که از عامل پشتیبانی میکنه داریم و ابزارهای لازم برای سفارشیسازی عاملمون به هر شکلی که بخوایم رو داریم.
در ادامهی این آزمایشگاه کد، عامل را با موارد زیر گسترش خواهیم داد:
- یک لوگوی واقعی اضافه کنید
- پیام خوشامدگویی بهبود یافته
- ارائه اطلاعات در مورد ساعات کاری
- به کاربر اطلاع دهید که خرید اقلام آنلاین به زودی امکانپذیر است
- استفاده از تراشههای پیشنهاد مکالمه برای تسهیل مکالمه
ما از کنسول ارتباطات تجاری برای بهروزرسانی لوگو و پیام خوشآمدگویی استفاده خواهیم کرد، اما شما همیشه میتوانید مستقیماً از APIهای ارتباطات تجاری برای انجام همین کار استفاده کنید. سپس باید کد منبع را بهروزرسانی کنیم تا پیامهای مناسبی برای ارائه اطلاعات در مورد ساعات کاری ارسال شود و Bonjour Meal به زودی یک ویژگی خرید آنلاین ارائه خواهد داد. وقتی این کار انجام شد، به کنسول ارتباطات تجاری برمیگردیم و تراشههای پیشنهاد مکالمهای ایجاد میکنیم تا به هدایت مکالمه به سمت تجربیات مسیر شادی که عامل دیجیتال پشتیبانی میکند، کمک کنیم.
درج لوگو
از کنسول ارتباطات تجاری ، نماینده خود را انتخاب کنید و به بخش اطلاعات نماینده بروید. ما میخواهیم لوگوی تجاری را که در زیر با رنگ زرد مشخص شده است، بهروزرسانی کنیم.

روی آپلود کلیک کنید، و میتوانید تصویری را برای آپلود یا وارد کردن از یک URL انتخاب کنید.
برای آشنایی با بهترین شیوههای پیشنهادی ما برای استفاده از لوگوهای خودتان، به دستورالعملهای طراحی لوگو در مستندات نگاهی بیندازید.
بیایید لوگویی را که در کد منبعی که در ابتدای این codelab کپی کردهاید، قرار دارد، آپلود کنیم. میتوانید آن را در دایرکتوری ./assets/ مخزن پیدا کنید و نام فایل "bonjour_meal-logo.png" است. میتوانید فایل را به داخل پنجرهی نمایشی در مرورگر وب بکشید، یک ابزار ویرایش سبک برای دستکاری کیفیت تصویر و برش آن ارائه میشود. وضوح تصویر و برش را طوری تنظیم کنید که تصویر کمتر یا مساوی محدودیت ۵۰ کیلوبایت باشد. وقتی از تصویر راضی بودید، برای تأیید روی علامت تیک در دایره آبی کلیک کنید و در پایین پنجرهی نمایشی روی انتخاب کلیک کنید.

در نهایت، روی ذخیره در بالا سمت راست صفحه اطلاعات نماینده کلیک کنید. این تغییری است که مدتی طول میکشد تا در دستگاه شما اعمال شود، زیرا اطلاعات نماینده در سرورهای ما ذخیره شده است و باید ظرف دو ساعت پس از تغییر قابل مشاهده باشد.
بهروزرسانی پیام خوشآمدگویی
بهروزرسانی پیام خوشآمدگویی کاری است که قبلاً در این آزمایشگاه کد انجام دادهایم. بیایید دوباره این کار را انجام دهیم، اما این بار پیام خوشآمدگویی را طوری پیکربندی کنیم که بیشتر برای مسیر کاربر Bonjour Meal قابل استفاده باشد.
در کنسول ارتباطات تجاری، نماینده خود را انتخاب کنید و به بخش اطلاعات نماینده بروید. به پایین بروید تا فیلد ورود پیام خوشامدگویی را ببینید که در آنجا میتوانید پیام را بهروزرسانی کنید.

با دانستن اینکه قرار است شروعکنندههای مکالمه را اضافه کنیم، میتوانیم در پیام خوشامدگویی خود به آنها اشاره کنیم. در فیلد ورودی، بیایید آن را با متن زیر جایگزین کنیم:
«به Bonjour Meal خوش آمدید. من دستیاری هستم که میتوانم در مورد سوالاتی که ممکن است در مورد Bonjour Meal داشته باشید به شما کمک کنم. برخی از گزینههای زیر را امتحان کنید.»
در نهایت روی ذخیره در بالا سمت راست صفحه اطلاعات نماینده کلیک کنید. باز هم، به دلیل مکانیسم ذخیرهسازی ما برای اطمینان از عملکرد صحیح، اعمال این تغییر کمی طول خواهد کشید!
ارائه اطلاعات در مورد ساعات کاری
برای ارائه این اطلاعات به کاربران، ما با استفاده از API پیامهای تجاری، یک پیام سفارشی برای کاربر ارسال خواهیم کرد.
شاید به خاطر داشته باشید که پیامها در تابع route_message از views.py تجزیه و تحلیل میشوند. این تابع ابتدا رشته را نرمالسازی میکند و سپس شروع به بررسی این میکند که آیا پیام نرمالسازی شده با پارامترهای کدگذاری شده مطابقت دارد یا خیر. برای سادگی، بیایید یک شرط اضافی اضافه کنیم که در آن بررسی میکنیم آیا پیام نرمالسازی شده برابر با یک ثابت جدید است که آن را CMD_BUSINESS_HOURS_INQUIRY مینامیم و حاوی مقدار "business-hours-inquiry" خواهد بود یا خیر. اگر شرط درست باشد، تابعی به نام 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 و ارسال پیام با استفاده از 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)
...
با این کار، ربات ما باید بتواند هنگام ارسال پیام زیر به کاربر، با این ساعات کاری پاسخ دهد: "business-hours-inquiry". میتوانید چیزی شبیه به این را انتظار داشته باشید:

به محض اینکه کد منبع را در GCP مستقر کنید، تغییرات بلافاصله قابل مشاهده خواهند بود. ما برنامه وب را در Google Cloud Platform به همان روشی که اطلاعات عامل ذخیره میشود، ذخیره نمیکنیم، بنابراین میتوانید این تجربه را فوراً آزمایش کنید.
در حالی که ما در حال ایجاد تغییرات در منبع هستیم، بیایید یک اصلاح دیگر ایجاد کنیم که به کاربر اجازه میدهد در مورد خرید آنلاین سوال بپرسد. نماینده دیجیتال شما پاسخ خواهد داد که این ویژگی هنوز در دسترس نیست، اما بعداً برمیگردد و بررسی میکند.
به کاربر اطلاع دهید که خرید آنلاین به زودی انجام میشود
ما همان تغییری را که برای اطلاعرسانی به کاربر در مورد ساعات کاری انجام دادیم، اعمال خواهیم کرد. این بار، بیایید اطلاعات را در یک کارت غنی به همراه یک تصویر جذاب قرار دهیم.
پیام نرمالسازی شده را تجزیه کنید و شرط ثابتی به نام CMD_ONLINE_SHOPPING_INQUIRY با مقدار تنظیم شده روی "online-shopping-inquiry" را بررسی کنید که در صورت درست بودن شرط، send_online_shopping_info_message را فراخوانی میکند.
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 . ما میخواهیم این پیام در یک کارت غنی (rich card) به همراه یک تصویر ارسال شود، بنابراین بیایید تابع send_rich_card را کپی کنیم تا به عنوان الگو برای تعریف send_online_shopping_info_message استفاده شود.
ابتدا باید متن جایگزین را بهروزرسانی کنیم تا یک پیام مناسب داشته باشیم. متن جایگزین در صورتی استفاده میشود که دستگاه به هر دلیلی نتواند کارت غنی (rich card) دریافت کند. در مرحله بعد، باید 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)
...
وای! نماینده دیجیتال ما اکنون میتواند به کاربرانی که در مورد خرید آنلاین سوال میکنند پاسخ دهد. در حال حاضر، نماینده دیجیتال ما هنوز از خرید آنلاین پشتیبانی نمیکند، بنابراین ما پیامی به کاربر ارائه میدهیم که به او اطلاع میدهد این ویژگی به زودی اضافه خواهد شد. این همان چیزی است که نماینده دیجیتال ما هنگام سوال کاربر در مورد خرید آنلاین به نظر میرسد.

درست مانند تغییر قبلی که برای امکان استعلام ساعات کاری توسط کاربر ایجاد کردیم، این تغییر را میتوان بلافاصله در صورت استفاده از ngrok یا به محض استقرار کد در GCP App Engine مشاهده کرد.
در بخش بعدی، از جملات آغازگر مکالمه و پیشنهادهای سازنده برای هدایت مکالمه به مسیر درست استفاده خواهیم کرد.
استفاده از تراشهها برای هدایت مکالمه
ما برخی تغییرات در کد منبع ایجاد کردهایم و عامل دیجیتال بهروزرسانیشده را مستقر کردهایم، اما هرگز انتظار نداریم که کاربران برای پرسیدن سوال در مورد کسبوکار، عباراتی مانند «پرسش ساعات کاری» یا «اطلاعات خرید آنلاین» را تایپ کنند. بیایید شروعکنندههای مکالمه را بهروزرسانی کنیم تا وقتی مکالمه شروع میشود، کاربر نه تنها با یک پیام خوشآمدگویی خوب مواجه شود، بلکه شروعکنندههای مکالمه نیز به او نمایش داده شوند.
به کنسول ارتباطات تجاری بروید و به صفحه اطلاعات نماینده خود دسترسی پیدا کنید. ما قبلاً شروعکنندههای مکالمه را برای "چیپس"، "کارت" و "چرخ فلک" تعریف کردهایم. در حالی که این موارد هنوز کار میکنند، دیگر به عملکرد تجاری ما ربطی ندارند. میتوانید آنها را برای نمایش این ویژگیهای غنی نگه دارید یا آنها را حذف کنید تا نماینده دیجیتال شما شروعکنندههای مکالمه را به طور خاص برای کسب و کار Bonjour Meal نمایش دهد.
ما دو شروعکننده مکالمه جدید ایجاد خواهیم کرد. برای شروعکننده مکالمه اول، متن را روی «ساعات کاری شما چیست؟» تنظیم کنید و دادههای Postback را روی «business-hours-inquiry» تنظیم کنید. برای شروعکننده مکالمه دوم، متن را روی «Can I make purchases here?» تنظیم کنید و دادههای Postback را روی «online-shopping-info» تنظیم کنید.
نتیجه باید پیکربندی مطابق تصویر زیر باشد:

همانند سایر تغییرات اعمال شده در کنسول ارتباطات تجاری، مدتی طول میکشد تا این تغییرات در دستگاه تلفن همراه شما منتشر شوند.
حالا که کارمان با شروعکنندههای مکالمه تمام شد، به دنبال راهی برای هدایت کاربر به مسیر درست پس از شروع مکالمه هستیم. میتوان پس از ارسال پیام، از چیپها به صورت زمینهای استفاده کرد تا کاربر را به سایر ویژگیهایی که عامل دیجیتال قادر به انجام آنهاست، هدایت کنیم. بنابراین کاری که ما انجام خواهیم داد این است که هر زمان کاربر در مورد ساعات کاری یا خرید آنلاین سؤالی میپرسد، پیامی با پیشنهاد انجام کار دیگری با عامل ارسال کنیم.
در انتهای تابع، عبارت زیر را اضافه کنید:
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 محدود به ۲۵ کاراکتر است، همانطور که در مستندات توضیح داده شده است.
با بهروزرسانی شروعکنندههای مکالمه و استفاده استراتژیک از تراشههای پیشنهاد، در اینجا چند اسکرینشات از تجربه کاربری مورد انتظار آورده شده است.

۶. تبریک
تبریک میگویم، شما با موفقیت اولین عامل دیجیتال پیامهای تجاری خود را ساختید!
شما یک برنامه وب را برای پشتیبانی از عامل دیجیتال خود در پیامهای تجاری مستقر کردید، از کنسول ارتباطات تجاری برای تغییر عامل استفاده کردید و با ایجاد تغییرات در کد منبع، تجربه کاربری را با یک عامل دیجیتال شکل دادید.
اکنون مراحل کلیدی مورد نیاز برای ایجاد یک تجربه پیامهای تجاری تعاملی را میدانید و امکانات از اینجا به بعد هیجانانگیز هستند. میتوان عامل شما را برای پشتیبانی از جستجوی موجودی یا معرفی سبد خرید برای ردیابی آنچه کاربر ممکن است به آن علاقهمند باشد، گسترش داد. میتوانید از یک چرخ فلک برای نمایش موارد در منو استفاده کنید و با استفاده از پیشنهادات، به کاربر اجازه دهید مواردی را که به آنها علاقه دارد انتخاب کند.
در اینجا یک تیزر از آنچه که احتمالاً میتواند به نظر برسد، آورده شده است.

چگونه یک تجربه مکالمه عالی ایجاد کنم؟
بهترین کارشناسان، اطلاعات زمینهای را در اختیار کاربر قرار میدهند و در عین حال از طریق مکالمه، قابلیتهایی را در اختیار او قرار میدهند تا بتواند با کسبوکار تعامل داشته باشد، همانطور که معمولاً از طریق تلفن یا حتی حضوری انجام میدهد. به این فکر کنید که چگونه موضوعات زیر میتوانند در مکالمهای که میخواهید با کسبوکاری که با آن کار میکنید داشته باشید، کاربرد داشته باشند.
زمینه را فراهم کنید و انتظارات را تعیین کنید
ارائه زمینه میتواند هر چیزی باشد، از بیان صریح اینکه چگونه میتوانید به کاربر کمک کنید تا معرفی نماینده دیجیتال با شخصیتی که کاربر بتواند با آن ارتباط برقرار کند. نمایندگان موفق در پیامهای تجاری از آواتار نمایشی برای نشان دادن اینکه با چه کسی صحبت میکنند، استفاده میکنند.
تعیین انتظارات به تجربه کاربری که ایجاد میکنید بستگی دارد. برای مثال، اگر نماینده شما از جستجوی موجودی پشتیبانی میکند، ابتدا قبل از ارائه پاسخ، به کاربر اطلاع دهید که ممکن است موجودی کم باشد.
ارائه قابلیت به کاربر
مصرفکنندگان همیشه با کسبوکارها در ارتباط هستند. از سوالاتی مانند بررسی وضعیت سفارش گرفته تا بررسی موجودی کالا، پیامهای تجاری میتوانند از تعاملات پیچیده کاربر پشتیبانی کنند. بسیاری از کاربران همچنان برای دریافت پاسخ سوالات خود از طریق تلفن با کسبوکارها تماس میگیرند، حتی اگر پاسخها در وبسایت کسبوکار موجود باشد. نتیجه این امر این است که کسبوکارها باید منابع بیشتری را برای مدیریت حجم تماسها، بهویژه در ایام تعطیلات، سرمایهگذاری کنند.
کاربر را درگیر نگه دارید
برای اینکه کاربر را درگیر مکالمه نگه دارید، نکات تماس مکالمهای ارائه دهید. در بین پیامها، میتوانید نشانگرهای تایپ را فعال کنید تا به کاربر اطلاع دهید که در حال پردازش پاسخی برای او هستید.
با ویژگیهای غنی مانند نشانگرهای تایپ، تراشههای پیشنهادی، کارتهای غنی و چرخ فلکها، میتوانید کاربر را از طریق تجربیات کاربری مسیر شاد هدایت کنید تا به آنها در انجام وظایف خاص مانند سفارش از منوی اقلام کمک کنید. هدف، کاهش ترافیک تماس به خط تلفن یک کسب و کار است.
بسیار مهم است که یک مکالمه، قابلیتی را برای کاربر فراهم کند. کاربرانی که از طریق پیامرسانی با یک کسبوکار ارتباط برقرار میکنند، انتظار دارند که به سرعت به سوالاتشان پاسخ داده شود. در یک موقعیت غیر ایدهآل، نماینده دیجیتال نمیتواند مکالمه را تسهیل کند که ممکن است منجر به یک تجربه کاربری بد شود. خوشبختانه، راههایی برای دور زدن این مشکل وجود دارد، مانند انتقال مکالمه به یک نماینده زنده که در یک آزمایشگاه کد آینده به آن خواهیم پرداخت.
بعدش چی؟
وقتی آماده شدید، برخی از مباحث زیر را بررسی کنید تا در مورد تعاملات پیچیدهتری که میتوانید در پیامهای تجاری به آنها دست یابید، اطلاعات کسب کنید.
اسناد مرجع
- پاسخ پیشنهادی
- سند مرجع پیامهای تجاری
- تعریف JSON برای RichCard