コーディング要素のコード
ここでは、コードエレメントを使用してさまざまなタスクを実行する方法の例を示します。
エンドユーザーの場所を緯度と経度に転送する
エンド ユーザーが場所を送信し、正確な緯度と経度を決定する場合。

const loc = attributeApi.get('Location');
attributeApi.set('latitude', loc.latitude);
attributeApi.set('longitude', loc.longitude);
営業時間の定義
エンド ユーザーがエージェントと対話する場合は、営業時間中にエージェントに連絡できます。ただし、営業時間外では、エンド ユーザーはエージェントにリダイレクトされません。
コーディングエレメントを使用して、これらの営業時間を定義し、それに応じてダイアログを設定することができます。

異なる タイムゾーン (opens in a new tab) を考慮に入れてください。
const Monday = { open: 8, close: 17 };
const Tuesday = { open: 8, close: 17 };
const Wednesday = { open: 8, close: 17 };
const Thursday = { open: 8, close: 17 };
const Friday = { open: 8, close: 17 };
const Saturday = { open: 0, close: 0 };
const Sunday = { open: 0, close: 0 };
const myTimeZone = 'Europe/Zagreb'; // This IANA time zone name
const workingHoursSchedule = [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday];
function isWorkingHours(now) {
const day = new Date(now).getDay();
const hours = new Date(now).getHours();
const daySchedule = workingHoursSchedule[day];
return hours >= daySchedule.open && hours < daySchedule.close;
}
const result = isWorkingHours(new Date().toLocaleString('en-US', {
timeZone: myTimeZone
}));
attributeApi.set('result', result);
受信したプロモーションメッセージに応じてダイアログを分岐
定義済み lastreceivedtextmessage 属性を使用して、受信メールにプロモーション コードが含まれているかどうかを確認します。

attributeApi.set('bonus_code', attributeApi.get('lastReceivedTextMessage') === 'promo code' ? true : false);
チャットボット属性を使用してパラメータを一度だけ初期化する
多くの場合、チャットボットを作成するときは、チャットボットがサポートするさまざまなユースケースに対して複数の API 呼び出しを行う必要があります。ベース URL、ユーザー名、パスワード、暗号化キー(該当する場合)などの API の詳細をハードコーディングする代わりに、これらのパラメーターごとにチャットボット属性を作成し、ユーザーがデフォルトのダイアログに入ったらコーディングエレメントを使用して初期化できます。

これは、値の初期化に使用できるコードです。
attributeApi.set('base_url', 'https://127.0.0.1:9030');
attributeApi.set('msisdn', attributeApi.get('phoneNumber'));
attributeApi.set('username', 'someUsername');
attributeApi.set('password', 'somePassword');
// or
attributeApi.set('password', encryptionUtils.sha1('somePassword'));
初期化された値は、チャットボットのすべてのダイアログで属性としてアクセスできます(使用する必要があるすべての場所でハードコーディングする必要はありません)。

チャットボット環境を開発から運用に変更する必要があり、API URLと資格情報が変更された場合は、コーディング エレメントでこれらの詳細を 1 回だけ変更するだけで済みます。
数値属性値の比較
たとえば、ローンを申し込む顧客がいて、その顧客がクレジット スコア (ローン限度額) を超えるローン金額を申請できないようにする必要がある場合です。このローン限度額は顧客によって異なり、ハードコーディングすることはできません。
-
スコープ Chatbot のブール属性 is_valid_loan_amount を作成します。
-
ユーザー借入するローン金額 (loan_amount) を入力した後、コーディングエレメントを使用してローン金額とローン限度額 (credit_score) を比較し、比較結果に応じてis_valid_loan_amountを true または false に設定します
javascriptconst creditScore = attributeApi.get('credit_score'); const loanAmount = attributeApi.get('loan_amount'); if (loanAmount <= creditScore) { attributeApi.set('is_valid_loan_amount', true); } else { attributeApi.set('is_valid_loan_amount', false); }
-
is_valid_loan_amount が true の場合はローン申請を続行し、それ以外の場合は、より少ない金額を申請するようにユーザーに通知するように、条件 エレメントを追加します。
動的に生成された API 応答から有効なオプションを選択する
たとえば、銀行のチャットボットがあり、エンドユーザーに取引元の口座番号のリストが表示された場合、リストから口座番号を1つ選択する必要があります。選択したアカウント番号が提供されたリストにない場合、チャットボットはエラーメッセージで応答する必要があります。
-
リスト属性response_accountsを作成して、API応答からユーザー銀行口座のリストを格納します。ユーザーが入力したアカウント番号を保持するaccount_number属性を定義します。
-
ユーザーが選択するアカウントの動的リストを表示します。ユーザー入力は account_number 属性に格納されます。
-
コーディングエレメントを使用して、ユーザー入力 (account_number) が有効な口座番号のリストに含まれているかどうかを検証します。
javascriptconst validAccounts = attributeApi.get('valid_accounts'); const userInput = attributeApi.get('account_number'); let accountNumber = null; const isUserInputValidAccount = validAccounts.indexOf(userInput) > -1; if (isUserInputValidAccount) { accountNumber = userInput; } else { const indexInArray = userInput - 1; const isUserInputValidArrayIndex = validAccounts.length > indexInArray && validAccounts[indexInArray] !== 'undefined'; if (isUserInputValidArrayIndex) { accountNumber = validAccounts[indexInArray]; } } attributeApi.set('account_number', accountNumber);
-
上記のコーディングエレメントでは、account_numberが有効でない場合(つまり、有効なリストにない場合)、nullに設定されます。
-
条件エレメントを使用して、account_number属性がnullの場合は、無効なアカウント番号のメッセージを表示し、そうでない場合は、チャットボットとの会話を続行します。
動的に生成された API 応答からの複数選択を許可する
オンボーディングチャットボットがあり、エンドユーザーに障害を選択させる場合は、動的に生成されたリストから選択できます(API呼び出しを使用)。各障害にはIDと名前があります。ユーザーが複数の値を選択できるようにするには、複数の数値をスペースで区切って入力します。2 番目の API を使用して、選択した障碍 ID (ユーザーが入力したオプションの数ではない) が、空白で区切られた 1 つのパラメーターとして渡されます。
-
次の属性を作成します。
disabilities_response – 選択する障害のリストを保持します (最初のAPIによって返されます)
ユーザーの選択 – ユーザーが選択した障碍のリストを保持します
disability_found –ユーザー入力が有効かどうかを追跡するブール属性
ユーザー入力 – ユーザーが入力する障害を格納します
api_response – ルート JSON パスでの完全な API 応答 ($.)
invalid_input – 予期される応答と一致しないユーザー入力
selected_ids – ユーザーが選択した障碍 ID
-
ユーザーが選択する障碍の動的リストを表示します。ユーザー入力は ユーザー_input 属性に格納されます。このユーザー入力は、数字とスペース (^[0-9\s]*$) のみを許可する正規表現を使用して検証されます
-
コーディングエレメントの使用:
a)スペースで区切られたユーザー入力を配列に変換して、処理を容易にします b)前の手順で生成された配列内の要素をループします。反復ごとに、現在のエレメント (ユーザー入力) が障害の一覧のインデックスであるかどうかを確認します。その場合は、手順 1 で定義した ユーザー_選択 リスト属性に、対応する障害を格納します。念のため、一致した障碍 ID を別のリスト selected_ids (手順 1 でも定義) に個別にプッシュできます。 c) selected_ids リストを、2 回目の API 呼び出しで想定されるスペース区切りの文字列に変換します。 最終的なコーディングエレメントは次のようになります。
javascript/** * This validates disability type based on user input **/ var user_input = attributeApi.get('user_input'); var disabilities = attributeApi.get('disabilities_response'); var inputs_array = user_input.split(" "); var selected_ids = []; attributeApi.set('inputs_array', inputs_array); var user_selection = []; var disability_found = true; var i = 0; for(i=0; i<inputs_array.length; i++){ var val = inputs_array[i]; var index = parseInt(val)-1; attributeApi.set('invalid_input', val); if(val == "") {//Means multiple white spaces between numbers //Pass }else if(typeof disabilities[index] == 'undefined') { disability_found = false; attributeApi.set('invalid_input', val); } else { //Found user_selection.push(disabilities[index]); selected_ids.push(disabilities[index].Id); } } attributeApi.set('disability_found', disability_found); attributeApi.set('user_selection', user_selection); attributeApi.set('selected_ids', selected_ids.join(" "));
-
エレメント条件を使用して、disability_found属性がTrueの場合はチャットボット 会話を続行し、そうでない場合は検証エラーメッセージを表示します。
ユーザーから送信された時刻と日付を必要なタイムゾーンと日付形式に転送します
次の例では、コーディングエレメントで受信した日時が再フォーマットされるタイムゾーンはアジア/コルカタです。
const date = new Date();
const year = new Intl.DateTimeFormat('en', { timeZone: 'Asia/Kolkata', year: 'numeric' }).format(date);
const month = new Intl.DateTimeFormat('en', { timeZone: 'Asia/Kolkata', month: '2-digit' }).format(date);
const day = new Intl.DateTimeFormat('en', { timeZone: 'Asia/Kolkata', day: '2-digit' }).format(date);
const hour = new Intl.DateTimeFormat('en', { timeZone: 'Asia/Kolkata', hour: '2-digit', hour12: false }).format(date);
const minute = new Intl.DateTimeFormat('en', { timeZone: 'Asia/Kolkata', minute: '2-digit' }).format(date);
const second = new Intl.DateTimeFormat('en', { timeZone: 'Asia/Kolkata', second: '2-digit' }).format(date);
const milli = date.getMilliseconds();
const formattedDate = `${year}-${month}-${day} ${hour}:${minute}:${second}.${milli}`;
attributeApi.set('Date', formattedDate);
メッセージ属性タイプを使用して複数のファイル・タイプを受信する
この例では、属性タイプ 'メッセージ' を持つ属性を使用して、エンド ユーザーからファイルを受信する方法を示します。この例では、Codeエレメントを使用して、ファイルの種類が画像かドキュメントかを識別します。
] ダイアログ

コード
var message = attributeApi.get ('MOMessage');
var format;
var type = message.type;
if ((type=="IMAGE"))
{
format="image";
}
else
{
format="document";
}
attributeApi.set ('message_type', format);
どこ
- MOMessage の属性タイプは Message です。
- message_type の属性タイプは Text です。
ダイアログとコードの説明
-
MOMessage 属性には、エンド ユーザーから送信されたファイルが格納されます。
-
コード エレメントは、次の処理を行います。
- var message = attributeApi.get('MOMessage'); 'attributeApi' オブジェクトを使用して、MOMessage 属性の値を取得します
- var 型 = message.type 'type' プロパティを使用してファイルの種類を抽出し、その値を変数 type に代入します。
- if-else ステートメントを使用して、'type' 変数が 'image' か 'document' かを識別します。image の場合、変数 format に値 'image' を代入します。それ以外の場合は、変数 format に値 'document' を代入します。
- attributeApi.set('message_type'、フォーマット); 'attributeApi' オブジェクトを使用して、'format' 変数の値を属性に設定しますmessage_type
-
条件 エレメントは 'format' 変数の値に応じてダイアログを分岐します。
WhatsAppメッセージの場合、この例のコードは、エンドユーザーがWhatsAppの正しいアイコンを使用してファイルを送信する場合にのみ機能します。エンドユーザーがWhatsAppの画像アイコンを使用して画像を送信すると、受信したファイルが画像として認識されます。ただし、終了ユーザーがWhatsAppの添付ファイルアイコンを使用して画像を送信した場合、受信したファイルは画像として認識されません。

日付形式を変更する
属性タイプ date を持つ標準属性は、日付を YYYY-MM-DD の形式で格納します。エンドユーザーが別の形式で日付を送信すると、無効な入力として扱われます。
この例では、コード エレメントを使用して、日付を DD-MM-YYYY の形式で保存する方法を示します。
属性の設定
次の図に示すように、属性を作成し、フィールドを構成します。

コード
const d = new Date(attributeApi.get('date'));
var day=d.getDate();
const m = new Date(attributeApi.get('date'));
var month=m.getMonth()+1;
const y = new Date(attributeApi.get('date'));
year = y.getFullYear();
if (day < 10) {
day = '0' + day;
}
if (month < 10) {
month = '0' + month;
}
var form= day +'-' + month + '-' + year;
attributeApi.set('day',day);
attributeApi.set('month', month);
attributeApi.set('year', year);
attributeApi.set('date_format', form);
] ダイアログ

シミュレーター

電話番号の形式を変更する
エンドユーザーから誤った形式で電話番号が送信された場合は、必要な形式に変換できます。この例では、次の操作を行う方法を示します。
- 番号が国コードで始まる場合、変更はありません。
- 番号が 0 で始まる場合は、0 が削除され、国コードが追加されます。
- 番号が国コードまたは 0 で始まらない場合は、国コードを追加します。
この例では、国コード 63 を使用します。
コード
var a= attributeApi.get('mobile_number');
if (a.startsWith("639")) {
attributeApi.set('new_number', a);
}
else if (a.startsWith("0")) {
var b="63" + a.substring(1);
attributeApi.set('new_number', b);
}
else if (a.startsWith("9")) {
var b="63" + a;
attributeApi.set('new_number', b);
}
] ダイアログ

最寄りの場所を探す
エンド ユーザーに最も近いサービスの場所を計算できます。例:最寄りのATMの場所。
属性の設定
次の図に示すように、属性を作成し、フィールドを構成します。

コード
var tempDataList = [
{'lat': -23.607171362032318, 'lon': -46.69675437970512, 'name': 'São Paulo'},
{'lat': -25.423777049024135, 'lon': -49.26882764791356, 'name': 'Curitiba'},
];
var locationClient = attributeApi.get('customerLocation');
var locationCode = {'lat': locationClient.latitude, 'lon': locationClient.longitude};
var i=1;
function distance(lat1, lon1, lat2, lon2) {
var radlat1 = Math.PI * lat1/180;
var radlat2 = Math.PI * lat2/180;
var theta = lon1 - lon2;
var radtheta = Math.PI * theta/180;
var minimalDistance = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
if (minimalDistance /> 1) {
minimalDistance = 1;
}
minimalDistance = Math.acos(minimalDistance);
minimalDistance = minimalDistance * 180/Math.PI;
minimalDistance = minimalDistance * 60 * 1.1515;
minimalDistance = minimalDistance * 1.609344;
return minimalDistance;
}
var minimalDistance = [];
tempDataList.forEach(myFunction);
function myFunction(value, index, array){
minimalDistance[index] = distance(locationCode.lat, locationCode.lon, value.lat, value.lon);
}
var closestDistance = Math.min.apply(null , minimalDistance);
var index = minimalDistance.indexOf(closestDistance);
attributeApi.set('nearestATMLat', tempDataList[index].lat);
attributeApi.set('nearestATMLon', tempDataList[index].lon);
attributeApi.set('nearestATMName', tempDataList[index].name);
] ダイアログ
以下は、ダイアログの例です。

シミュレーター
