Node.js 将消息从Facebook webview发送回bot

Node.js 将消息从Facebook webview发送回bot,node.js,webview,botframework,webhooks,facebook-messenger,Node.js,Webview,Botframework,Webhooks,Facebook Messenger,已在Facebook Messenger的ms bot框架上编写了bot,该框架使用启用Messenger扩展的web\u url创建:“Messenger\u扩展”:true。我们在webview页面上有一个链接,但不清楚如何将带有附件的消息从此webview页面发送回messenger,从而发送回bot framework <!DOCTYPE html> <html> <body> <style type="text/css">

已在Facebook Messenger的ms bot框架上编写了bot,该框架使用启用Messenger扩展的
web\u url
创建:
“Messenger\u扩展”:true
。我们在webview页面上有一个链接,但不清楚如何将带有附件的消息从此webview页面发送回messenger,从而发送回bot framework

<!DOCTYPE html>
<html>

<body>
    <style type="text/css">
        .button {
            background-color: #4CAF50;
            /* Green */
            border: none;
            color: white;
            padding: 15px 32px;
            text-align: center;
            text-decoration: none;
            display: inline-block;
            font-size: 16px;
            width: 50%;
            margin: 25%;
        }
    </style>

    <button type="button" class="button" onclick="sendMessage();">Complete Booking</button>

    <script type="text/javascript">
        function sendMessage() {
            alert('Booking completed. What to do now? How to send the message back to bot?')
            /// how to return? the facebook docs don't say anything
            /// you HAVE to make a server round trip.. https://stackoverflow.com/questions/43956045/messengerextensions-how-to-send-a-message-by-messenger-to-users
            return {
                text: "HOTEL_SERVICE_PAYLOAD",
                attachments: [
                    {
                        email: "some@email.com",
                        hotelName: "Hotel marriott",
                        confirmNumber: "1234567"
                    }
                ]
            }
            MessengerExtensions.requestCloseBrowser(function success() {

            }, function error(err) {

            });
        }

        (function (d, s, id) {
            var js, fjs = d.getElementsByTagName(s)[0];
            if (d.getElementById(id)) { return; }
            js = d.createElement(s); js.id = id;
            js.src = "//connect.facebook.com/en_US/messenger.Extensions.js";
            fjs.parentNode.insertBefore(js, fjs);
        }(document, "script", "Messenger"));

        window.extAsyncInit = function () {
            // the Messenger Extensions JS SDK is done loading
            MessengerExtensions.getUserID(function success(uids) {
                var psid = uids.psid;//This is your page scoped sender_id
                alert("Getting PSID")
                alert("This is the user's psid " + psid);
            }, function error(err) {
                alert("Messenger Extension Error: " + err);
            });
        };
    </script>
</body>
</html>

.按钮{
背景色:#4CAF50;
/*绿色的*/
边界:无;
颜色:白色;
填充:15px 32px;
文本对齐:居中;
文字装饰:无;
显示:内联块;
字体大小:16px;
宽度:50%;
利润率:25%;
}
完整预订
函数sendMessage(){
警报('预订已完成。现在要做什么?如何将消息发送回bot?')
///如何返回?facebook文档什么都没说
///您必须进行服务器往返。。https://stackoverflow.com/questions/43956045/messengerextensions-how-to-send-a-message-by-messenger-to-users
返回{
文字:“酒店服务有效载荷”,
附件:[
{
电子邮件:“some@email.com",
酒店名称:“万豪酒店”,
确认号码:“1234567”
}
]
}
Messenger Extensions.requestCloseBrowser(函数成功(){
},函数错误(err){
});
}
(功能(d、s、id){
var js,fjs=d.getElementsByTagName[0];
if(d.getElementById(id)){return;}
js=d.createElement;js.id=id;
js.src=“//connect.facebook.com/en_US/messenger.Extensions.js”;
fjs.parentNode.insertBefore(js,fjs);
}(文件,“脚本”、“信使”);
window.extasyninit=函数(){
//Messenger Extensions JS SDK已完成加载
getUserID(函数成功(uids){
var psid=uids.psid;//这是您的页面范围的发送者\u id
警报(“获取PSID”)
警报(“这是用户的psid”+psid);
},函数错误(err){
警报(“通讯器扩展错误:+err”);
});
};
已读取数吨,包括stackoverflow:


页面上是否有嵌入JavaScript脚本的简单示例?谢谢

如果我没弄错问题,您可以设置一个触发消息发送的API端点,并在“Messenger Extensions.requestCloseBrowser()的成功回调中点击该端点

使用jQuery和节点的express模块的示例:

网络视图:

window.extAsyncInit = function () {
    // the Messenger Extensions JS SDK is done loading
    MessengerExtensions.getUserID(function success(uids) {
        var psid = uids.psid;//This is your page scoped sender_id
        $.post('https://myapi.com/sendOnWebviewClose', {"psid": psid})
    }, function error(err) {
        alert("Messenger Extension Error: " + err);
    });
};
服务器:

app.post('/sendOnWebviewClose', (req, res) => {
  let psid = req.body.psid;
  sendMessage(psid);
})

可以通过get请求()发送参数,然后在js代码中使用它们,从服务器触发消息(我们使用directline)

可能是可能的,但问题是如何将此
psid
转换为bot builder
消息。address
对象(
IAddress
):
{address:{id:
{address>:“mi888mlbigbg4d469”,“channelId:”emulator“,”user“:{“id:”default user“,”name:”user“},“conversation:”{“id:”dehg2kfnh9703g94c“},“bot:”{“id:”default bot“,”name:“bot”},“serviceUrl:”http://127.0.0.1:46839"   } }
将消息发送回用户???总结一下:问题在于您的
发送消息(psid);
-如何实现此功能?发送消息的Ms Bot框架代码是:var
reply=new builder.message().address(address).text(“Hi!”;Bot.send(reply)在这种情况下,如何从
PSID
创建
iadAddress
对象?好的,我明白了。在这种情况下,您不会将PSID传递回后端。一个选项是在打开webview时将会话数据中的id作为查询参数传递。例如,如果您使用url按钮打开webview:“按钮”:[{“type”:“web_url”,“url”:“,{“id”:idFromURLQuery})我对bot builder不太熟悉,但这似乎是将会话id从webview保留到服务器的一种可能的方法。安全问题:如果用户在web Messenger上聊天,代码可以通过开发人员工具轻松查看。您的
/sendOnWebviewClose
端点将被公开,任何人都可能是一个用户无法代表bot发送消息。