2016-11-07 6 views
0

FBメッセンジャー、Wit.aiとnode.jsを使用してフローベースチャットボットを構築しました。うまくいきますが、インタラクションをより自然に見せるために、私のボットはしばらくポーズして、それぞれの回答を入力しているようです。Wit.aiからの各応答の前に 'typing_on'送信者アクションバブルを追加する

ボットが送信する各応答の前に「入力」バブルを短時間表示して、応答が送信される前にバブルが表示される時間を定義するのが理想的です。現時点では、ボットが連続したメッセージを送信し、すべてが一瞬ですばやく送信される、私の会話のセクションがあります。

FB Messenger Send APIには、either the 'message' or 'sender_action' property must be setと表示されています。私はそうのように両方を設定しようとしました:

const fbMessage = (id, text) => { 

if(fruits.apples.indexOf(text) >= 0 || fruits.oranges.indexOf(text) >= 0) { 

    var body = JSON.stringify({ 
     recipient: { id }, 
     "sender_action":"typing_on", 
     message: { 
      attachment: { 
        "type": "image", 
        "payload": { 
         "url": text 
        } 
       } 
      }, 
    }); 


} else { 
    var body = JSON.stringify({ 
     recipient: { id }, 
     "sender_action":"typing_on", 
     message: { text }, 
    }); 
} 

const qs = 'access_token=' + encodeURIComponent(FB_PAGE_TOKEN); 
return fetch('https://graph.facebook.com/me/messages?' + qs, { 
    method: 'POST', 
    headers: {'Content-Type': 'application/json'}, 
    body, 
}) 
.then(rsp => rsp.json()) 
.then(json => { 
    if (json.error && json.error.message) { 
    throw new Error(json.error.message); 
    } 
    return json; 
}); 
}; 

しかし、私は次のエラーを取得する:

enter image description here

私は何をする必要があるかわからない - 私は私がきたと仮定しています各会話の応答の前にトリガーされる何らかの「sender_action」ボットレスポンスを設定する必要がありますが、私はこれをどうやってやるのか分かりません。

答えて

0

を文書化されているが、それは働いて手に入れた、バブルタイミングを制御する方法を動作しますが、それは今のところ大丈夫ですができません。以下のコードは、私の会話の流れを乱さずに、私のボットの応答の前にタイピングバブルを短時間表示します。

FBメッセンジャーコード:

const typingBubble = (id, text) => { 

    var body = JSON.stringify({ 
     recipient: { id }, 
     "sender_action":"typing_on" 
    }); 

    const qs = 'access_token=' + encodeURIComponent(FB_PAGE_TOKEN); 
    return fetch('https://graph.facebook.com/me/messages?' + qs, { 
    method: 'POST', 
    headers: {'Content-Type': 'application/json'}, 
    body, 
    }) 
    .then(rsp => rsp.json()) 
    .then(json => { 
    if (json.error && json.error.message) { 
     throw new Error(json.error.message); 
    } 
    return json; 
    }); 
}; 

const fbMessage = (id, text) => { 

    if(scenarioCombos.trends.indexOf(text) >= 0 || scenarioCombos.disruptions.indexOf(text) >= 0) { 

    var body = JSON.stringify({ 
     recipient: { id }, 
     message: { 
      attachment: { 
        "type": "image", 
        "payload": { 
         "url": text 
        } 
       } 
      }, 
    }); 


    } else { 
    var body = JSON.stringify({ 
     recipient: { id }, 
     message: { text }, 
    }); 
    } 

    const qs = 'access_token=' + encodeURIComponent(FB_PAGE_TOKEN); 
    return fetch('https://graph.facebook.com/me/messages?' + qs, { 
    method: 'POST', 
    headers: {'Content-Type': 'application/json'}, 
    body, 
    }) 
    .then(rsp => rsp.json()) 
    .then(json => { 
    if (json.error && json.error.message) { 
     throw new Error(json.error.message); 
    } 
    return json; 
    }); 
}; 

Wit.aiはアクションコードを送信する([アクション]以内):

send({sessionId}, {text}) { 
    const recipientId = sessions[sessionId].fbid; 
    if (recipientId) { 
     return typingBubble(recipientId, text), fbMessage(recipientId, text) 
    .then(() => null) 
    .catch((err) => { 
     console.error(
     'Oops! An error occurred while forwarding the response to', 
     recipientId, 
     ':', 
     err.stack || err 
     ); 
    }); 
    } else { 
    console.error('Oops! Couldn\'t find user for session:', sessionId); 
    return Promise.resolve() 
    } 
}, 
0

入力バブルを表示するには、単に入力アクションを送信するだけです。これにより、最大20秒間タイピングインジケータが表示され、その間に送信する実際のメッセージが送信されます。

このためJSONは次のようになります。

{ 
    "recipient":{ 
    "id":"USER_ID" 
    }, 
    "sender_action":"typing_on" 
} 

コールがhere

関連する問題