HTTPS GET Запрос из лямбда-функции для слабого бота? - PullRequest
0 голосов
/ 03 апреля 2020

Я новичок в Node, AWS Lambdas и Slackbots, так что может быть лучший способ выучить их всех, чем пытаться понять их одновременно? Шучу.

Я создал командное приложение slackbot sla sh. То есть, когда пользователь в Slack набирает '/ anondm @username msg ' Slack отправит эту команду моей функции Lambda, которая затем вернет ответ непосредственно отправителю.

Эта цель есть, чтобы лямбда-сообщение приняло сообщение, удалило имя пользователя и перенаправило сообщение анонимно получателю.

Теперь, во-первых, это существует. Или, по крайней мере, я могу найти репозитории на GitHub. Но я хотел фирменную версию и хотел добавить пару маленьких хитростей.

Что работает: - Создание команды bot и sla sh не было проблемой. - Получение лямбды для получения сообщения и ответа отправителю также не было проблемой.

Если вам интересно, вам просто нужен API-шлюз и лямбда-функция, и этого руководства будет достаточно: https://api.slack.com/tutorials/aws-lambda

Что не работает: - Мне нужно сделать HTTPS GET-запрос к Slack API, чтобы он выполнил команду отправки сообщения пользователю.

Я потратил около суток, пытаясь понять это, и переходил от одного решения к другому, но сегодня утром после того, как кофе попал на что-то, что мне ДЕЙСТВИТЕЛЬНО нравится.

Я видел людей, предлагающих использовать SNS Topi c. Таким образом, одна лямбда получает веб-запрос, а затем публикует в SNS Topi c, который инициирует отправку другой лямбды. Ну, это звучит хорошо для чего-то большого объема, где я бы использовал очередь заданий, но ... я имею в виду, что это веб-обработчик и запрос GET ... это должно быть пара строк кода.

Итак, вопрос: как проще всего выполнить запрос 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);
    });
};

1 Ответ

0 голосов
/ 03 апреля 2020

Причина, по которой я потерпел неудачу, была изначально: моя лямбда была asyn c и возвращалась, когда я пытался выполнить другую asyn c или syn c функцию. Лямбда просто возвращалась слишком быстро или застревала внутри другой функции, ожидающей возврата.

Это определенно проблема недостатка знаний, но я заметил, что многие пользователи онлайн борются с той же проблемой.

Хитрость заключалась в том, чтобы использовать:

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

внутри функции https.get. Это эффективно говорит Лямбда, чтобы вернуться. Я должен был знать это, но я продолжал ожидать, что код дойдет до последнего и последнего оператора, куда я вернулся.

Так что нет необходимости в ax ios или запросах или каких-либо пакетах. Просто шлюз API и лямбда.

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

В настоящее время это хорошо работает на практике, и я доволен решением. Пожалуйста, ударите меня, если вы думаете, что я мог бы добавить больше деталей, чтобы помочь другим.

Спасибо, Крис

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...