没有Azure的Bot框架可能吗?

时间:2016-11-30 12:33:06

标签: azure bots botframework

如果我使用Microsoft Bot Framework构建机器人,我是否需要将我的机器人部署到Azure才能注册机器人HERE以便为机器人配置通道? 或者我可以简单地将我的机器人部署到普通(例如)IIS服务器吗?

我无法找到关于此toppic的任何信息,我不想使用Azure。

5 个答案:

答案 0 :(得分:41)

是的,应该可以在IIS上或任何其他托管服务(包括Azure之外的云托管)上运行您的机器人,如here所述。您必须确保您的机器人具有可通过Internet访问的端点和有效的HTTPS证书。

关于HTTPS证书的要求,我正在复制此thread的信息供您参考:

  

Bot Framework要求公开x.509v3证书   您的端点是最新且有效的。大多数检查“当前   有效的“是服务器证书的标准检查:CN必须匹配   hostname,它一定不能过期,它一定不能列在CRL中   必须有正确的EKU等等。

     

最重要的是,您的证书必须链接到根证书颁发机构   受微软信赖。这些CA的最新列表可用here

此外,您可以注册机器人甚至启用频道,而无需部署到Azure或任何其他主机。您可以暂时使用ngrok to create a secure tunnel to your localhost environment并在电子邮件渠道中测试机器人,然后再将其暴露给其他用户。顺便说一句,您不需要在BotFramework门户中发布您的机器人,只需注册它。发布只适用于那些想要出现在Bot Directory中的机器人。

答案 1 :(得分:1)

是的,你的机器人就像一个由Facebook Messenger,Skype等聊天前端消费的API。查看这个媒体博客,解释如何在Heroku上托管https://medium.com/@chinnatiptaemkaeo/create-fb-bot-with-heroku-nodejs-microsoft-bot-framework-687bd2893238

答案 2 :(得分:1)

是的,在不使用Azure云门户的情况下完全开发机器人。

答案 3 :(得分:0)

您需要在Azure上拥有一个帐户,但是不需要直接在Azure上托管您的机器人。登录到Azure仪表板时有三个选项:Web App Bot,Functions Bot和Bot Channels Registration。选择Bot Channels Registration,然后在设置中输入您的机器人的https URL(部署它的位置)。

或者,如果您想直接从Messenger(而非仿真器)调试机器人,则可以下载ngrok,然后在命令行中输入

ngrok.exe http <your port> -host-header="localhost:<your port>

然后输入ngrok代理URL(无端口)到Bot Channels Registration设置。 在几个小时内,该临时地址将转发到您的本地主机。

答案 4 :(得分:0)

完全有可能。

我以两种方式运行它。 第一个-在Docker容器中重新验证服务-与Ngrok一起在AWS上本地运行

// Create HTTP server.
const server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, () => {
    console.log(`\n${server.name} listening to ${server.url}`);
});

async function main(req: WebRequest, context: TurnContext) {
    logger.json("Request ->", req.body);
    try {
        for (const bot of allBots) {
            await bot.run(context);
        }
    } catch (error) {
        logger.error("Error processing request[server.ts]");
        logger.error(error);
    }
}
// Listen for incoming requests.
server.post("/api/messages", (req: WebRequest, res: WebResponse) => {
    adapter.processActivity(req, res, async (context: TurnContext) => {
        await main(req, context);
    });
});

2nd-在具有无服务器框架的AWS Lambda上运行。这是适配器。

export function lambda(bots: ActivityHandler[]) {
    const handler: Handler = async (event: any, _: Context, callback: Callback) => {
        logger.json("Event to bot framework: ", event);
        const reqWrapper: WebRequest = {
            body: event.body,
            headers: event.headers,
            method: event.method,
            query: event.query,
            on: (_1: string, ..._2: any[]): any => {
                // it needs to be empty
            },
        };
        let statusCode: number;
        const resWrapper: WebResponse = {
            status: (code: number) => {
                statusCode = code;
            },
            send: (body) => {
                callback(null, {statusCode, body});
            },
            end: () => {
                callback(null, { statusCode });
            },
        };

        const adapter = await getAdapter();

        adapter.processActivity(reqWrapper, resWrapper, async (context: TurnContext) => {
            await main(context, bots);
        });
    };
    return handler;
}