Загрузка...

[MongoDB / TypeScript / grammY / WebHook] Telegram bot template

Thread in Node.js created by TRUEC0DER Aug 27, 2023. (bumped Oct 14, 2023) 711 views

  1. TRUEC0DER
    TRUEC0DER Topic starter Aug 27, 2023 22 Apr 8, 2019
    Шаблон телеграм-бота на вебхуках

    grammY как-то слишком мало распространён, а он очень даже неплох, потому я решил написать небольшой шаблон для разработки на TypeScript, MongoDB и вебхуках

    Скачать (v1.0.1)
    Настройка бота

    Все параметры хранятся в .env.example. Необходимо переименовать его в .env

    BOT_TOKEN - токен бота, получить можно в @BotFather
    WEBHOOK_DOMAIN - адрес, на который сервер телеграма будет стучаться
    WEBHOOK_PORT - порт, на который телеграм будет стучаться
    MONGO_URL - адрес базы данных


    Запуск


    Для установки всех модулей - npm install
    Для запуска бота - npm run dev
    Для того, чтобы сбилдить бота - npm run build
    Для запуска сбилженной версии - npm run start


    Дополнительно

    Базу данных можно бесплатно получить на официальном сайте MongoDB (512 мб памяти), сайт блокирует российские айпи, потому нужно ***
    Прокинуть локального бота в интернет можно через
    ngrok


    :pepepizza:
     
  2. daz5554
    daz5554 Sep 29, 2023 i wanna be 169 Jul 4, 2017
    Либа Grammy тоже поддерживает состояния, чтобы создать последовательное меню из кнопок или не?
    Рассматриваю, какую лучше либку юзать для практики, Grammy или Telegraf

    К вопросу о БД, можно юзать MongoDB Atlas с россии есть доступ
     
    1. TRUEC0DER Topic starter
      daz5554,
      Официальной поддержки состояний нет, но есть плагин от стороннего чела - https://github.com/IlyaSemenov/grammy-scenes
      Я с ним не работал, потому не могу ничего сказать по работоспособности, но по документации функционал очень похож на подобные фишки из других либ

      Сам сайт MongoDB блокирует роуты личного кабинета с российского айпишника, но сам доступ к базе работает без ***, достаточно только создать базу и получить URL
  3. Crimson
    Crimson Oct 8, 2023 1170 Aug 13, 2019
    Было бы не плохо если б использовал роутеры
     
    1. TRUEC0DER Topic starter
      Crimson, У меня в планах обновить, но пока нет времени на это
  4. TRUEC0DER
    TRUEC0DER Topic starter Oct 16, 2023 22 Apr 8, 2019
    Обновление (1.0.1)
    - Добавлен пример работы плагина @grammyjs/conversations (Последовательное получение информации от юзера)
    - Добавлена работа с inline-клавиатурой и callback
    - Изменён способ указания путей к компонентам проекта с помощью фишки TypeScript (paths)
    - Немного изменена структура проекта

    В дополнение от себя:
    - Изначально планировалось использование @grammyjs/router, но @grammyjs/conversations более подходящий и удобный вариант
     
  5. Crimson
    Crimson Oct 16, 2023 1170 Aug 13, 2019

    Это что то по типу FSM как в аиограм?
     
    1. View previous comments (2)
    2. TRUEC0DER Topic starter
      Crimson, Да, ты можешь ожидать необходимый тип апдейтов от телеграма. Вот пример кода с получением коллбэка от инлайн кнопки и получением обычного текста после :pepedj:

      JS
      const inlineButtonAndText = async (conversation: CustomConversation, ctx: CustomContext) => {
      await ctx.reply(`Click on the button`, { reply_markup: {
      inline_keyboard: [
      [
      {text: "foo", callback_data: "foo"}, {text: "bar", callback_data: "bar"}
      ]
      ],
      resize_keyboard: true
      }
      })
      const callback = await conversation.waitFor('callback_query') // Ожидание коллбэка
      const callback_data = callback.update.callback_query.data // Получение текста коллбэка
      switch (callback_data) { // Обработка текста коллбэка
      case 'foo': {
      await callback.answerCallbackQuery() // Отправка ответа телеграму, чтобы он понял, что коллбэк нормально обработан
      await ctx.reply(`You clicked the foo button`)
      break
      }
      case 'bar': {
      await callback.answerCallbackQuery() // Отправка ответа телеграму, чтобы он понял, что коллбэк нормально обработан
      await ctx.reply(`You clicked the bar button`)
      break
      }
      }
      await ctx.reply(`Enter the text`)
      const text = await conversation.form.text() // Ожидание текста
      return await ctx.reply(`You entered the ${text} text`)
      }
Loading...
Top