إرسال الاستطلاعات لتتبُّع مدى رضا المستخدمين

استطلاع مخصَّص ضمن محادثة في ميزة "الرسائل التجارية"

لضمان تفاعل المستخدمين مع وكيلك بشكل مُرضٍ، تُجري Google يرسل استطلاعات الرأي إلى المستخدمين بعد انتهائهم من المحادثات مع وكيلك. في حال حذف تريد جمع البيانات بتوقيت مختلف، مثل نهاية يمكنك إرسال استطلاعات في سياق محادثة. تظهر الاستطلاعات في المحادثة وتسمح للمستخدمين بتقديمها ملاحظات مع مجموعة متنوعة من الخيارات اعتمادًا على السؤال.

يعتمد توقيت الاستطلاعات التي تجريها Google على مراسلات موظّف الدعم. مدى التوفّر:

مدى توفّر الخدمة توقيت الاستطلاع
روبوتات فقط 30 دقيقة بعد آخر رسالة
المحتوى البشري فقط 24 ساعة عمل بعد آخر رسالة
روبوت وإنسان 24 ساعة عمل بعد آخر رسالة

إذا كانت هناك < خلال 24 ساعة عمل خلال الأيام السبعة المقبلة، سنستخدم بدلاً من ذلك 24 ساعة.

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

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

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

إذا لم ترسِل الاستطلاعات إلى المستخدمين، سيستمرّ وكيلك في تلقّي الاستطلاعات. نتائج استطلاعات Google في الرد التلقائي على الويب، ويجب قبولها ومعالجتها وفقًا لذلك.

أسئلة

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

سؤال مطلوب

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

السؤال المطلوب: "هل لبّت خدمة المراسلة هذه احتياجاتك المتعلقة AGENT_NAME؟"

أسئلة النموذج

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

تتضمن أسئلة القالب

  • كيف كانت تجربتك في مراسلة "AGENT_NAME
  • ما مدى احتمالية أن تنصح صديقًا بـ "AGENT_NAME
  • في المرة القادمة التي تتواصل فيها مع AGENT_NAME، ما مدى احتمالية تواصلك مع اختيار المراسلة؟
  • بشكل عام، ما مدى سهولة التفاعل مع "AGENT_NAME
  • إلى أي مدى توافق أو لا توافق على العبارة التالية: سهّل عليّ "AGENT_NAME" معالجة مشكلتي.
  • يُرجى تقييم مدى رضاك بوجهٍ عام عن موظّف الدعم.
  • هل ساعدتك جلسة المحادثة هذه في تجنّب الاتصال برقم "AGENT_NAME

للاطّلاع على قائمة بجميع أسئلة النماذج المتاحة والحصول على أرقام تعريف النماذج،

  1. افتح مطوّر اتصالات Business وحدة التحكّم وسجِّل الدخول باستخدام حسابك على Google في ميزة "الرسائل التجارية"
  2. اختَر وكيلك.
  3. في شريط التنقّل الأيمن، انقر على استطلاع.

الأسئلة المخصصة

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

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

تخصيص استطلاع

من أجل تخصيص الاستطلاع لأحد موظفي الدعم،

  1. افتح مطوّر اتصالات Business وحدة التحكّم وسجِّل الدخول باستخدام حسابك على Google في ميزة "الرسائل التجارية"
  2. اختَر وكيلك.
  3. في شريط التنقّل الأيمن، انقر على استطلاع.
  4. أضف ما يصل إلى سؤالي قالب متاحين إلى الاستبيان.
  5. انقر على إنشاء سؤال مخصّص لإضافة أسئلة مخصّصة إلى الاستطلاع.

للحصول على خيارات التنسيق والقيمة، يمكنك الاطّلاع على surveyConfig

إرسال استطلاع

استطلاع

لإرسال استطلاع، شغِّل الأمر التالي. استبدال "CONVERSATION_ID" وتحمل معرّف المحادثة التي تريد إرسال الاستطلاع إليها SURVEY_ID بمعرّف فريد للاستطلاع.

cURL

# Copyright 2021 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at

#     https://www.apache.org/licenses/LICENSE-2.0

# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# This code sends a survey to the user:
# Read more: https://developers.google.com/business-communications/business-messages/guides/how-to/message/surveys?hl=en

# Replace the __CONVERSATION_ID__ with a conversation id that you can send messages to
# Make sure a service account key file exists at ./service_account_key.json

curl -X POST "https://businessmessages.googleapis.com/v1/conversations/__CONVERSATION_ID__/surveys?surveyId=f4bd7576-6c2e-4674-9db4-d697166f63ce" \
-H "Content-Type: application/json" \
-H "User-Agent: curl/business-messages" \
-H "$(oauth2l header --json ./service_account_key.json businessmessages)"

Node.js

/**
 * This code sends a survey to the user:
 * Read more: https://developers.google.com/business-communications/business-messages/guides/how-to/message/surveys?hl=en
 *
 * This code is based on the https://github.com/google-business-communications/nodejs-businessmessages Node.js
 * Business Messages client library.
 */

/**
 * Edit the values below:
 */
const PATH_TO_SERVICE_ACCOUNT_KEY = './service_account_key.json';
const CONVERSATION_ID = 'EDIT_HERE';

const businessmessages = require('businessmessages');
const uuidv4 = require('uuid').v4;
const {google} = require('googleapis');

// Initialize the Business Messages API
const bmApi = new businessmessages.businessmessages_v1.Businessmessages({});

// Set the scope that we need for the Business Messages API
const scopes = [
  'https://www.googleapis.com/auth/businessmessages',
];

// Set the private key to the service account file
const privatekey = require(PATH_TO_SERVICE_ACCOUNT_KEY);

/**
 * Posts a survey to the Business Messages API.
 *
 * @param {string} conversationId The unique id for this user and agent.
 */
async function sendSurvey(conversationId) {
  const authClient = await initCredentials();

  // Create the payload for creating a new survey
  const apiParams = {
    auth: authClient,
    parent: 'conversations/' + conversationId,
    surveyId: uuidv4(),
    resource: {}
  };

  // Call the message create function using the
  // Business Messages client library
  bmApi.conversations.surveys.create(apiParams,
    {auth: authClient}, (err, response) => {
    console.log(err);
    console.log(response);
  });
}

/**
 * Initializes the Google credentials for calling the
 * Business Messages API.
 */
 async function initCredentials() {
  // configure a JWT auth client
  const authClient = new google.auth.JWT(
    privatekey.client_email,
    null,
    privatekey.private_key,
    scopes,
  );

  return new Promise(function(resolve, reject) {
    // authenticate request
    authClient.authorize(function(err, tokens) {
      if (err) {
        reject(false);
      } else {
        resolve(authClient);
      }
    });
  });
}

sendSurvey(CONVERSATION_ID);

Java

import com.google.api.client.googleapis.services.AbstractGoogleClientRequest;
import com.google.api.client.http.HttpBackOffUnsuccessfulResponseHandler;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.util.ExponentialBackOff;
import com.google.api.services.businessmessages.v1.Businessmessages;
import com.google.api.services.businessmessages.v1.model.*;
import java.io.FileInputStream;
import java.util.Arrays;
import java.util.UUID;

class SendSurveySnippet {
  /**
   * Initializes credentials used by the Business Messages API.
   */
  private static Businessmessages.Builder getBusinessMessagesBuilder() {
    Businessmessages.Builder builder = null;
    try {
      GoogleCredential credential = GoogleCredential
            .fromStream(new FileInputStream("PATH_TO_SERVICE_ACCOUNT_KEY"));

      credential = credential.createScoped(Arrays.asList(
            "https://www.googleapis.com/auth/businessmessages"));

      credential.refreshToken();

      HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
      JacksonFactory jsonFactory = JacksonFactory.getDefaultInstance();

      // Create instance of the Business Messages API
      builder = new Businessmessages
        .Builder(httpTransport, jsonFactory, null)
        .setApplicationName("Sample Application");

      // Set the API credentials and endpoint
      builder.setHttpRequestInitializer(credential);
    } catch (Exception e) {
      e.printStackTrace();
    }

    return builder;
  }

  public static void main(String args[]) {
    try {
      String conversationId = "CONVERSATION_ID";

      // Create client library reference
      Businessmessages.Builder builder = getBusinessMessagesBuilder();

      // Create a new survey to send to the user associated with the conversationId
      Businessmessages.Conversations.Surveys.Create request
          = bmBuilder.build().conversations().surveys()
          .create("conversations/" + conversationId,
              new BusinessMessagesSurvey());

      request.setSurveyId(UUID.randomUUID().toString());

      // Setup retries with exponential backoff
      HttpRequest httpRequest =
          ((AbstractGoogleClientRequest) request).buildHttpRequest();

      httpRequest.setUnsuccessfulResponseHandler(new
          HttpBackOffUnsuccessfulResponseHandler(
          new ExponentialBackOff()));

      // Execute request
      httpRequest.execute();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

Python

"""This code sends a survey to the user.

Read more: https://developers.google.com/business-communications/business-messages/guides/how-to/message/surveys?hl=en

This code is based on the https://github.com/google-business-communications/python-businessmessages
Python Business Messages client library.
"""

import uuid

from businessmessages import businessmessages_v1_client as bm_client
from businessmessages.businessmessages_v1_messages import BusinessmessagesConversationsSurveysCreateRequest
from businessmessages.businessmessages_v1_messages import BusinessMessagesSurvey
from oauth2client.service_account import ServiceAccountCredentials

# Edit the values below:
path_to_service_account_key = './service_account_key.json'
conversation_id = 'EDIT_HERE'

credentials = ServiceAccountCredentials.from_json_keyfile_name(
    path_to_service_account_key,
    scopes=['https://www.googleapis.com/auth/businessmessages'])

client = bm_client.BusinessmessagesV1(credentials=credentials)

# Create the survey request
survey_request = BusinessmessagesConversationsSurveysCreateRequest(
    surveyId=str(uuid.uuid4().int),
    parent='conversations/' + conversation_id,
    businessMessagesSurvey=BusinessMessagesSurvey())

# Send the survey
bm_client.BusinessmessagesV1.ConversationsSurveysService(
    client=client).Create(request=survey_request)

للحصول على خيارات التنسيق والقيمة، يمكنك الاطّلاع على conversations.surveys

تلقّي الردود على الاستطلاع

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

تتضمّن جميع الأسئلة في الاستطلاع قيمة surveyResponse.survey نفسها. في حال حذف يتضمّن الاستطلاع أسئلة متعددة، تأكَّد من أنّ البنية الأساسية تقبل ردودًا متعددة بنفس قيمة surveyResponse.survey وتحدد الأسئلة الفردية في الحقل surveyResponse.surveyQuestionId.

تظهر القيم النصية للردود على الاستطلاع في surveyResponse.questionResponseText بالنسبة للأسئلة المطلوبة والنموذجية، تعرض ميزة "الرسائل التجارية" الردّ "VERY_SATISFIED" والرمز "رائع" استجابة باسم VERY_DISSATISFIED. إذا كان الرد على السؤال المخصّص يتضمن إيموجي، فمن أفضل الممارسات الاعتماد على surveyResponse.questionResponsePostbackData بدلاً من محاولة تحليل قيمة Unicode.

تكون الردود على الاستطلاع بالتنسيق التالي.

{
  "agent": "brands/BRAND_ID/agents/AGENT_ID",
  "sendTime": "SEND_TIME",
  "conversationId": "CONVERSATION_ID",
  "requestId": "REQUEST_ID",
  "surveyResponse": {
    "survey": "conversations/CONVERSATION_ID/surveys/SURVEY_ID",
    "rating": "SURVEY_RATING",
    "createTime": "CREATE_TIME",
    "surveyQuestionId": "QUESTION_ID",
    "questionResponseText": "RESPONSE_TEXT",
    "questionResponsePostbackData": "RESPONSE_POSTBACK_DATA",
    "questionType": "QUESTION_TYPE",
    "questionIndex": QUESTION_INDEX,
    "totalQuestionCount": TOTAL_QUESTION_COUNT,
    "surveyTriggerSource": "TRIGGER_SOURCE"
  }
}

للحصول على خيارات التنسيق والقيمة، يمكنك الاطّلاع على UserMessage أو SurveyResponse