Как использовать Telegraf (Telegram) в Firebase?

Я пытаюсь использовать библиотеку Telegraf с функциями Firebase, но она работает не так, как я ожидал.

Я следую этой статье и инструкциям, приведенным в веб-перехватчики (как показано для экспресс-примера) и webhookcallback, как указано в документации Telegraf.

const Telegraf = require('telegraf')

// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions')

// The Firebase Admin SDK to access the Firebase Realtime or Firestore Database.
const admin = require('firebase-admin')

// set telegraf and responses.
const BOT_TOKEN = 'my-telegram-bot-token'
const bot = new Telegraf(BOT_TOKEN)
bot.start((ctx) => ctx.reply("Start instructions"))
bot.help((ctx) => ctx.reply("This is help"))
bot.hears('hi', (ctx) => ctx.reply('Hola'))
bot.on('text', (ctx) => ctx.reply('Response to any text'))
bot.catch((err, ctx) => {
  console.log(`Ooops, ecountered an error for ${ctx.updateType}`, err)
})

// initialize bot

bot.launch() // <-- (2)

//appends middleware 
exports.ideas2coolBot = functions.https.onRequest(bot.webhookCallback(`/my-path`));

На сервере firebase мне нужно добавить bot.launch () (2) для работы, но он работает только для максимального тайм-аута, установленного в функции Firebase. Мне нужно вспомнить API Telegram "setWebhook", чтобы снова заработать, и он работает для в то же время. Это похоже на создание одного экземпляра функции и завершение работы по истечении времени.

Я заметил, что у telegraf.launch () есть параметры для запуска в режиме опроса или веб-перехватчика, но мне не совсем понятно, как использовать эти параметры.

Как мне использовать telegram.launch () для работы в режиме веб-перехватчика в Firebase?

Изменить: когда я использовал getWebhookInfo, я получил следующий результат:

{
    "ok": true,
    "result": {
        "url": "https://0dbee201.ngrok.io/test-app-project/us-central1/testAppFunction/bot",
        "has_custom_certificate": false,
        "pending_update_count": 7,
        "last_error_date": 1573053003,
        "last_error_message": "Read timeout expired",
        "max_connections": 40
    }
}

и консоль показывает входящее соединение, но ничего не делает ...

i  functions: Beginning execution of "ideas2coolBot"
i  functions: Finished "ideas2coolBot" in ~1s

Edit2:

Я тоже пробовал добавить Экспресс ...

app.use(bot.webhookCallback('/bot'))

app.get('/', (req, res) => {
  res.send('Hello World from Firebase!')
})

exports.ideas2coolBot = functions.https.onRequest(app);

он работает по пути '/', но ничего не имеет с '/ bot'. POST на '/ bot' не отвечает.

Кстати, я попробовал экспресс-автономную версию и отлично работает, но использование ее с firebase не отвечает («Истекло время ожидания чтения»).


person molavec    schedule 06.11.2019    source источник
comment
При чем здесь Microsoft Bot Framework?   -  person Kyle Delaney    schedule 06.11.2019
comment
Ничего, спасибо за исправление!   -  person molavec    schedule 06.11.2019
comment
Это похоже на то, что функция ctx.reply не отвечает на throw express или просто firebase отбрасывает содержимое app.use.   -  person molavec    schedule 06.11.2019


Ответы (1)


удалять

bot.launch()

попробуйте добавить это

exports.YOURFUNCTIONNAME = functions.https.onRequest(
  (req, res) => bot.handleUpdate(req.body, res)
)

затем установите ur webhook вручную

https://api.telegram.org/bot{BOTTOKEN}/setWebhook?url={FIREBASE FUNCTION URL}'

person Zizheng    schedule 08.11.2019
comment
Я добавил ссылку на этот вопрос в разделе «Проблемы Telegraf»: github.com/telegraf/telegraf/issues/555 - person molavec; 11.11.2019