【问题标题】:HTTPS GET Request from within a Lambda function for slack bot?来自 Lambda 函数内的 HTTPS GET 请求用于 Slack 机器人?
【发布时间】:2020-04-02 21:12:39
【问题描述】:

我是 Node、AWS Lambdas 和 Slackbots 的新手,那么有什么比同时弄清楚它们更好的方法来学习它们呢?开个玩笑。

我创建了一个 slackbot 斜线命令应用程序。也就是说,当 Slack 上的用户键入“/anndm @username msg”时,Slack 会将此命令发送到我的 Lambda 函数,然后它会直接将答案返回给发送者。

目标是让 Lambda 接收消息,删除用户名,然后将消息匿名转发给收件人。

现在,首先,这是存在的。或者至少,我可以在 GitHub 上找到代码库。但我想要一个品牌版本,我想添加一些小技巧。

什么有效: — 创建 bot 和 slash 命令不成问题。 — 让 Lambda 接收消息并响应发送者也不是问题。

如果您有兴趣,只需要一个 API 网关和一个 Lambda 函数,本教程就足够了:https://api.slack.com/tutorials/aws-lambda

什么不工作: — 我需要向 Slack API 发出 HTTPS GET 请求,以便它执行向用户发送消息的命令。

我花了大约一天的时间试图弄清楚这一点,并在许多解决方案之间来回走动,但今天早上,在喝了杯咖啡后,我真的很喜欢。

我看到有人建议使用 SNS 主题。因此,一个 Lambda 接收 Web 请求,然后发布到触发另一个 Lambda 发送的 SNS 主题。好吧,这对于我会使用作业队列的大容量的东西来说听起来不错,但是......我的意思是它是一个 Web 处理程序和一个 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);
    });
};

【问题讨论】:

    标签: node.js https aws-lambda slack slack-api


    【解决方案1】:

    我失败的原因最初是:当我尝试执行另一个异步或同步函数时,我的 lambda 是异步的并返回。 Lambda 只是返回太快,或者卡在另一个等待返回的函数中。

    这绝对是知识匮乏的问题,但我注意到网上很多人都在为同样的问题苦苦挣扎。

    诀窍是使用:

    context.succeed("Your message: '"+msg+"' to: '<"+channel+">' has been sent.");
    

    在 https.get 函数中。这有效地告诉 Lambda 返回。我应该知道这一点,但我一直期待代码能够到达我返回的底部和最后一条语句。

    所以不需要 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.");
        }
    };
    

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

    谢谢, 克里斯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 2019-04-16
      • 2019-10-01
      • 2021-10-01
      • 1970-01-01
      • 2017-09-15
      • 2018-10-18
      相关资源
      最近更新 更多