如何从自托管自定义 Microsoft Teams 机器人获取消息?
How to get a message from self hosted custom Microsoft Teams bot?
我在这个问题上苦思冥想了太久;
我想要一个
的设置
- 我在Node.js
中编码
- 我运行一个本地服务器
- 在我可以回复的频道中捕获对 自定义 机器人的回复
我已经做到了
- Node.js
中的代码
- 运行 本地服务器(使用 restify 或 https)
- 我已设法将请求发送到我的 Node.js 实施
我还没有做到
- 在提到机器人时捕获实际消息字符串或其他有用信息
我已经搜索了多种资源但运气不佳,这将以最简单的形式解释您的方式;启动一个 Node.js 应用程序侦听来自自定义机器人的传入请求,解析它以获取消息字符串,然后将其发送回频道。
这是一些转储我得到的响应的代码
const fs = require('fs');
var restify = require('restify');
var builder = require('botbuilder');
const https_options = {
key: fs.readFileSync('[redacted].key'),
cert: fs.readFileSync('[redacted].pem')
};
// Setup Restify Server
var server = restify.createServer(https_options);
server.listen(process.env.port || process.env.PORT || 8080, function () {
console.log('%s listening to %s', server.name, server.url);
});
// Create chat connector for communicating with the Bot Framework Service
var connector = new builder.ChatConnector({
appId: process.env.MICROSOFT_APP_ID,
appPassword: process.env.MICROSOFT_APP_PASSWORD
});
// Listen for messages from users
server.post('/api/messages', function (request, response, next) {
console.log(request);
});
// Receive messages from the user and respond by echoing each message back (prefixed with 'You said:')
var bot = new builder.UniversalBot(connector, function (session) {
session.send("You said: %s", session.message.text);
});
这给了我一个 1850 行的 JSON 格式的控制台输出,当端点被击中时(这也意味着机器人至少正在捕获请求。但是数据中没有任何内容与消息相对应,类似与此处提到的 "Example inbound message" 中的示例相同 https://msdn.microsoft.com/en-us/microsoft-teams/custombot
进行以下代码切换时
---- replacing this ----
// Listen for messages from users
server.post('/api/messages', function (request, response, next) {
logger.debug(request);
});
---- with this ----
// Listen for messages from users
server.post('/api/messages', connector.listen());
结果是
ERROR: ChatConnector: receive - no security token sent.
我怀疑这与我尝试使用为 Office 应用商店制作的连接器解析自定义机器人的请求有关。我对将此机器人发布到任何商店都不感兴趣。我只需要一个可以对消息做出反应和响应的自托管机器人。
我是不是看错地方了,还是没摸对?关于自定义机器人的讨论太少了,我保证我会编写示例代码来描述如何处理这种情况,如果最终有一些有用的东西的话。
最后我在 Whosebug 上找到了 ,这让我终于走上了正轨!
获取消息进行处理的最终结果
const fs = require('fs');
var restify = require('restify');
const https_options = {
key: fs.readFileSync('[redacted].key'),
cert: fs.readFileSync('[redacted].pem')
};
var handler = function (request, res) {
if (request.method === 'POST') {
var body = '';
request.on('data', function (data) {
body += data;
// 1e6 === 1 * Math.pow(10, 6) === 1 * 1000000 ~~~ 1MB
if (body.length > 1e6) {
// FLOOD ATTACK OR FAULTY CLIENT, NUKE REQUEST
request.connection.destroy();
}
});
request.on('end', function () {
console.log(body)
// use POST
});
}
res.writeHead(200, {'Content-Type': 'application/json'});
//res.end(parseCommands(req));
res.end(`{
"type": "message",
"text": "This is a reply!"
}`);
};
// Setup Restify Server
var server = restify.createServer(https_options);
server.listen(process.env.port || process.env.PORT || 8080, function () {
console.log('%s listening to %s', server.name, server.url);
});
// Listen for messages from users
server.post('/api/messages', handler);
这将为您提供一个 JSON 格式的字符串供您使用!呸!
我在这个问题上苦思冥想了太久;
我想要一个
的设置- 我在Node.js 中编码
- 我运行一个本地服务器
- 在我可以回复的频道中捕获对 自定义 机器人的回复
我已经做到了
- Node.js 中的代码
- 运行 本地服务器(使用 restify 或 https)
- 我已设法将请求发送到我的 Node.js 实施
我还没有做到
- 在提到机器人时捕获实际消息字符串或其他有用信息
我已经搜索了多种资源但运气不佳,这将以最简单的形式解释您的方式;启动一个 Node.js 应用程序侦听来自自定义机器人的传入请求,解析它以获取消息字符串,然后将其发送回频道。
这是一些转储我得到的响应的代码
const fs = require('fs');
var restify = require('restify');
var builder = require('botbuilder');
const https_options = {
key: fs.readFileSync('[redacted].key'),
cert: fs.readFileSync('[redacted].pem')
};
// Setup Restify Server
var server = restify.createServer(https_options);
server.listen(process.env.port || process.env.PORT || 8080, function () {
console.log('%s listening to %s', server.name, server.url);
});
// Create chat connector for communicating with the Bot Framework Service
var connector = new builder.ChatConnector({
appId: process.env.MICROSOFT_APP_ID,
appPassword: process.env.MICROSOFT_APP_PASSWORD
});
// Listen for messages from users
server.post('/api/messages', function (request, response, next) {
console.log(request);
});
// Receive messages from the user and respond by echoing each message back (prefixed with 'You said:')
var bot = new builder.UniversalBot(connector, function (session) {
session.send("You said: %s", session.message.text);
});
这给了我一个 1850 行的 JSON 格式的控制台输出,当端点被击中时(这也意味着机器人至少正在捕获请求。但是数据中没有任何内容与消息相对应,类似与此处提到的 "Example inbound message" 中的示例相同 https://msdn.microsoft.com/en-us/microsoft-teams/custombot
进行以下代码切换时
---- replacing this ----
// Listen for messages from users
server.post('/api/messages', function (request, response, next) {
logger.debug(request);
});
---- with this ----
// Listen for messages from users
server.post('/api/messages', connector.listen());
结果是
ERROR: ChatConnector: receive - no security token sent.
我怀疑这与我尝试使用为 Office 应用商店制作的连接器解析自定义机器人的请求有关。我对将此机器人发布到任何商店都不感兴趣。我只需要一个可以对消息做出反应和响应的自托管机器人。
我是不是看错地方了,还是没摸对?关于自定义机器人的讨论太少了,我保证我会编写示例代码来描述如何处理这种情况,如果最终有一些有用的东西的话。
最后我在 Whosebug 上找到了 ,这让我终于走上了正轨!
获取消息进行处理的最终结果
const fs = require('fs');
var restify = require('restify');
const https_options = {
key: fs.readFileSync('[redacted].key'),
cert: fs.readFileSync('[redacted].pem')
};
var handler = function (request, res) {
if (request.method === 'POST') {
var body = '';
request.on('data', function (data) {
body += data;
// 1e6 === 1 * Math.pow(10, 6) === 1 * 1000000 ~~~ 1MB
if (body.length > 1e6) {
// FLOOD ATTACK OR FAULTY CLIENT, NUKE REQUEST
request.connection.destroy();
}
});
request.on('end', function () {
console.log(body)
// use POST
});
}
res.writeHead(200, {'Content-Type': 'application/json'});
//res.end(parseCommands(req));
res.end(`{
"type": "message",
"text": "This is a reply!"
}`);
};
// Setup Restify Server
var server = restify.createServer(https_options);
server.listen(process.env.port || process.env.PORT || 8080, function () {
console.log('%s listening to %s', server.name, server.url);
});
// Listen for messages from users
server.post('/api/messages', handler);
这将为您提供一个 JSON 格式的字符串供您使用!呸!