来自 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.");
    }
};

目前,这在实践中运行良好,我对解决方案感到满意。如果您认为我可以添加更多详细信息以帮助其他人,请联系我。

谢谢, 克里斯