Использование Slack API dialog_open из Firebase Cloud Functions

Цель

Событие Slack Event-Subscription достигает моей конечной точки Firebase, а затем облачная функция Firebase использует конечную точку dialog_open, чтобы открыть диалоговое окно в Slack с некоторыми значениями из Firebase.

Проблема

Когда функция Firebase Cloud достигает конечной точки Slack dialog_open, я получаю ошибки в журнале консоли.

Я получаю body: { ok: false, error: 'trigger_expired' }

Однако журналы в Firebase показывают, что время возврата составляет менее 500 миллисекунд. Но я не вижу идентификатора триггера, который будет регистрироваться в trigger_id из первого запроса (см. Код ниже).

4:57:12.443 PM | info | helloWorld | body: { ok: false, error: 'trigger_expired' } 
4:57:04.163 PM | outlined_flag | helloWorld | Function execution took 254 ms, finished with status code: 200
4:57:03.910 PM | outlined_flag | helloWorld | Function execution started

Когда я запускаю событие Slack во второй, третий или четвертый раз после нового развертывания, я получаю body: { ok: false, error: 'invalid_trigger' }

5:31:29.757 PM helloWorld body: { ok: false, error: 'invalid_trigger' }
5:31:28.744 PM helloWorld Function execution took 9 ms, finished with status code: 200
5:31:28.740 PM helloWorld json.trigger_id: "405615464868.7467239747.e706f2732257c541c445ad3938a29fd3"
5:31:28.735 PM helloWorld Function execution started

Это также происходит достаточно быстро (9 мс), но с другой ошибкой триггера, И на этот раз я действительно вижу json.trigger_id из события Slack Event-Subscription.

Напоследок я попробовал JSON.stringify:

trigger_id: JSON.stringify(json.trigger_id),

Теперь логи и ошибка разные:

5:33:24.512 PM | info | helloWorld | body: { ok: false, error: 'internal_error' }
5:33:23.565 PM | outlined_flag | helloWorld | Function execution took 13 ms, finished with status code: 200
5:33:23.559 PM | info | helloWorld | json.trigger_id: "406895248231.7467239747.7490e460213b3d65a44eef9f2e30c168"
5:33:23.553 PM | outlined_flag | helloWorld | Function execution started

Вопрос

Я, должно быть, делаю что-то глупое. Есть догадки, что не так с моим trigger_id?

Код

Вот функция Firebase Cloud:

import * as rp from "request-promise";
import * as functions from "firebase-functions";

export const helloWorld = functions.https.onRequest((request, response) => {
  return new Promise((_resolve, _reject) => {
    let json = JSON.parse(request.body.payload);
    console.log("json.trigger_id:", json.trigger_id);

    const options = {
      method: "POST",
      uri: "https://slack.com/api/dialog.open",
      body: {
        trigger_id: json.trigger_id,
        dialog: {
          callback_id: json.callback_id,
          title: "Request a Ride",
          submit_label: "Request",
          elements: [
            { type: "text", label: "Pickup Location", name: "loc_origin" },
            { type: "text", label: "Dropoff Location", name: "loc_destination" }
          ]
        }
      },
      json: true,
      headers: {
        "Content-type": "application/json; charset=utf-8",
        Authorization:
          "Bearer xoxp-secret"
      }
    };

    rp(options)
      .then(function(body) {
        console.log("body:", body);
      })
      .catch(function(err) {
        console.log("err:", err);
      });
    return response.status(200).json({ message: "Hello from Firebase" });
  }).catch(err => response.status(500).send(err));
});

comment
Для всех, кто сталкивался с этим, вот ссылка на соответствующие документы Slack. Я не могу заметить, что вы делаете неправильно ... но я упомяну, что если вы просматриваете журналы функций через консоль Firebase, иногда не все сообщения журнала отображаются на дисплее журнала родительского уровня. Более надежное место для поиска сообщений журнала - это непосредственно журналы GCP: посетите console.cloud.google.com и выберите «Облачные функции» в меню левой боковой панели, затем нажмите на 3 точки и выберите «Просмотр журналов». Может помочь вам отладить.   -  person JeremyW    schedule 27.07.2018
comment
Я думаю, что совершил несколько глупых ошибок. Посмотрите отличный ответ на этот вопрос на странице Slackapi GitHub. github.com/slackapi/node-slack-sdk/issues/ После исправления я опубликую решение здесь.   -  person Chadd    schedule 08.08.2018


Ответы (1)


Отвечать

Нарушенные обещания: в моем примере обещания просто неверны.

Сообщение против диалога: диалоги не нужны и не подходят для этой цели.

Запах кода: web.chat.postMessage не необходим для отправки сообщения. Сообщение можно отправить обратно в Slack с помощью облачной функции Firebase res.

Вот улучшенный пример.

...
exports.eventsSlackBot = functions.https.onRequest((req, res) => {
  return new Promise((resolve, reject) => {
      // asyc things happening
    })
    .then(() => {
      resolve.status(200).send({
        "text": "I am a test message http://slack.com",
        "attachments": [{
          "text": "And here’s an attachment!"
        }]
      });
    })
    .catch(console.error);
});
...
person Chadd    schedule 07.09.2018