来自 slack bot 的 Lambda 函数中的 HTTPS GET 请求?
HTTPS GET Request from within a Lambda function for slack bot?
我是 Node、AWS Lambdas 和 Slackbots 的新手,那么有什么比尝试同时弄清楚它们更好的学习方法呢?开个玩笑。
我已经创建了一个 slackbot slash 命令应用程序。也就是说,当 Slack 上的用户键入 '/anondm @username msg' 时,Slack 会将此命令发送到我的 Lambda 函数,然后 returns 直接向发件人回复。
目标是让 Lambda 获取消息,删除用户名,然后将消息匿名转发给收件人。
现在,首先,这是存在的。或者至少,我可以在 GitHub 上找到代码库。但我想要一个品牌版本,我想添加一些小技巧。
什么有效:
— 创建 bot 和 slash 命令不是问题。
— 让 Lambda 接收消息并回复发件人也不是问题。
如果您有兴趣,只需一个 API 网关和一个 Lambda 函数,本教程就足够了:https://api.slack.com/tutorials/aws-lambda
什么不起作用:
— 我需要向 Slack API 发出 HTTPS GET 请求,以便它执行向用户发送消息的命令。
我花了大约一天的时间来解决这个问题,并在许多解决方案之间来回徘徊,但今天早上喝了杯咖啡后,我发现了我真正喜欢的东西。
我看到有人建议使用 SNS 主题。因此,一个 Lambda 接收 Web 请求,然后发布到触发另一个 Lambda 发送的 SNS 主题。好吧,这对于我会使用作业队列的大容量的东西来说听起来不错,但是......我的意思是它是一个网络处理程序和一个 GET 请求......这应该是几行代码。
所以问题是:在接收到 Web 请求的 Lambda 期间执行 GET 请求的最简单方法是什么?
以下是行不通的方法(最简单的形式),但有望成为解决方案:
'use strict';
var qs = require('querystring');
var https = require('https');
var target = "_snip_";
exports.handler = function(event, context) {
console.log("This will for sure execute.");
https.get(target, function(res) {
console.log("Got response: " + res.statusCode);
}).on('error', function(e) {
console.log("Got error: " + e.message);
});
console.log("This will for sure NOT execute.");
return "Your quest is complete.";
};
下面是可行的方法:
'use strict';
var qs = require('querystring');
var https = require('https');
var target = "_snip_";
exports.handler = function(event, context) {
console.log("This will for sure execute.");
https.get(target, function(res) {
console.log("Got response: " + res.statusCode);
context.succeed("Your quest is complete");
}).on('error', function(e) {
console.log("Got error: " + e.message);
});
};
我失败的原因最初是:当我试图执行另一个异步或同步函数时,我的 lambda 是异步的并且 returning。 Lambda 只是 return 运行得太快,或者卡在另一个等待 return.
的函数中
这绝对是知识匮乏的问题,但我注意到 sooooooooooooooooooooooooooooooo 网上很多人都在为同样的问题而苦苦挣扎。
诀窍是使用:
context.succeed("Your message: '"+msg+"' to: '<"+channel+">' has been sent.");
在 https.get 函数中。这有效地告诉 Lambda return。我早该知道这一点,但我一直希望代码能够到达我 returned.
的底部和最后一个语句
因此不需要 axios 或 requests 或任何包含的包。只是一个 API 网关和一个 Lambda。
'use strict';
var qs = require('querystring');
var https = require('https');
var target = "_snip_";
exports.handler = function(event, context) {
if( event && event.body && event.body.length > 0 ) {
var body = event.body.toString();
var buf = Buffer.from(body, 'base64').toString('ascii');
var params = qs.parse(buf);
var text = "";
var channel = "";
var username = "";
var msg = "";
if( params && params.text && params.text.length > 0 ) {
text = params.text;
username = text.split(" ").shift().trim();
username = username.slice(1,-1).split("|");
channel = username[0];
username = username[1];
msg = text.split(" ").splice(1).join(" ").trim();
console.log( "channel id: __"+channel+"__" );
console.log( "username: __"+username+"__" );
console.log( "msg: __"+msg+"__" );
var msg_slash_resp = "You've received an anonymous message: " + msg;
target = target + "&channel=" + channel;
target = target + "&text=" + msg_slash_resp;
https.get(target, function(res) {
console.log("Got response: " + res.statusCode);
// return from lambda function
context.succeed("Your message: '"+msg+"' to: '<"+channel+">' has been sent.");
}).on('error', function(e) {
console.log("Got error: " + e.message);
//context.done(null, 'FAILURE');
});
} else {
context.succeed("Format: /anondm @username your message goes here.");
}
} else {
context.succeed("Format: /anondm @username your message goes here.");
}
};
目前,这在实践中运行良好,我对解决方案感到满意。如果您认为我可以添加更多详细信息以帮助其他人,请联系我。
谢谢,
克里斯
我是 Node、AWS Lambdas 和 Slackbots 的新手,那么有什么比尝试同时弄清楚它们更好的学习方法呢?开个玩笑。
我已经创建了一个 slackbot slash 命令应用程序。也就是说,当 Slack 上的用户键入 '/anondm @username msg' 时,Slack 会将此命令发送到我的 Lambda 函数,然后 returns 直接向发件人回复。
目标是让 Lambda 获取消息,删除用户名,然后将消息匿名转发给收件人。
现在,首先,这是存在的。或者至少,我可以在 GitHub 上找到代码库。但我想要一个品牌版本,我想添加一些小技巧。
什么有效: — 创建 bot 和 slash 命令不是问题。 — 让 Lambda 接收消息并回复发件人也不是问题。
如果您有兴趣,只需一个 API 网关和一个 Lambda 函数,本教程就足够了:https://api.slack.com/tutorials/aws-lambda
什么不起作用: — 我需要向 Slack API 发出 HTTPS GET 请求,以便它执行向用户发送消息的命令。
我花了大约一天的时间来解决这个问题,并在许多解决方案之间来回徘徊,但今天早上喝了杯咖啡后,我发现了我真正喜欢的东西。
我看到有人建议使用 SNS 主题。因此,一个 Lambda 接收 Web 请求,然后发布到触发另一个 Lambda 发送的 SNS 主题。好吧,这对于我会使用作业队列的大容量的东西来说听起来不错,但是......我的意思是它是一个网络处理程序和一个 GET 请求......这应该是几行代码。
所以问题是:在接收到 Web 请求的 Lambda 期间执行 GET 请求的最简单方法是什么?
以下是行不通的方法(最简单的形式),但有望成为解决方案:
'use strict';
var qs = require('querystring');
var https = require('https');
var target = "_snip_";
exports.handler = function(event, context) {
console.log("This will for sure execute.");
https.get(target, function(res) {
console.log("Got response: " + res.statusCode);
}).on('error', function(e) {
console.log("Got error: " + e.message);
});
console.log("This will for sure NOT execute.");
return "Your quest is complete.";
};
下面是可行的方法:
'use strict';
var qs = require('querystring');
var https = require('https');
var target = "_snip_";
exports.handler = function(event, context) {
console.log("This will for sure execute.");
https.get(target, function(res) {
console.log("Got response: " + res.statusCode);
context.succeed("Your quest is complete");
}).on('error', function(e) {
console.log("Got error: " + e.message);
});
};
我失败的原因最初是:当我试图执行另一个异步或同步函数时,我的 lambda 是异步的并且 returning。 Lambda 只是 return 运行得太快,或者卡在另一个等待 return.
的函数中这绝对是知识匮乏的问题,但我注意到 sooooooooooooooooooooooooooooooo 网上很多人都在为同样的问题而苦苦挣扎。
诀窍是使用:
context.succeed("Your message: '"+msg+"' to: '<"+channel+">' has been sent.");
在 https.get 函数中。这有效地告诉 Lambda return。我早该知道这一点,但我一直希望代码能够到达我 returned.
的底部和最后一个语句因此不需要 axios 或 requests 或任何包含的包。只是一个 API 网关和一个 Lambda。
'use strict';
var qs = require('querystring');
var https = require('https');
var target = "_snip_";
exports.handler = function(event, context) {
if( event && event.body && event.body.length > 0 ) {
var body = event.body.toString();
var buf = Buffer.from(body, 'base64').toString('ascii');
var params = qs.parse(buf);
var text = "";
var channel = "";
var username = "";
var msg = "";
if( params && params.text && params.text.length > 0 ) {
text = params.text;
username = text.split(" ").shift().trim();
username = username.slice(1,-1).split("|");
channel = username[0];
username = username[1];
msg = text.split(" ").splice(1).join(" ").trim();
console.log( "channel id: __"+channel+"__" );
console.log( "username: __"+username+"__" );
console.log( "msg: __"+msg+"__" );
var msg_slash_resp = "You've received an anonymous message: " + msg;
target = target + "&channel=" + channel;
target = target + "&text=" + msg_slash_resp;
https.get(target, function(res) {
console.log("Got response: " + res.statusCode);
// return from lambda function
context.succeed("Your message: '"+msg+"' to: '<"+channel+">' has been sent.");
}).on('error', function(e) {
console.log("Got error: " + e.message);
//context.done(null, 'FAILURE');
});
} else {
context.succeed("Format: /anondm @username your message goes here.");
}
} else {
context.succeed("Format: /anondm @username your message goes here.");
}
};
目前,这在实践中运行良好,我对解决方案感到满意。如果您认为我可以添加更多详细信息以帮助其他人,请联系我。
谢谢, 克里斯