Загрузка...

[MongoDB / TypeScript / grammY / WebHook] Шаблон телеграм-бота

Тема в разделе Node.js создана пользователем TRUEC0DER 27 авг 2023. (поднята 14 окт 2023) 713 просмотров

  1. TRUEC0DER
    TRUEC0DER Автор темы 27 авг 2023 22 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:
     
    27 авг 2023 Изменено
  2. daz5554
    daz5554 29 сен 2023 i wanna be 169 4 июл 2017
    Либа Grammy тоже поддерживает состояния, чтобы создать последовательное меню из кнопок или не?
    Рассматриваю, какую лучше либку юзать для практики, Grammy или Telegraf

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

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

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

    Это что то по типу FSM как в аиограм?
     
    16 окт 2023 Изменено
    1. Посмотреть предыдущие комментарии (2)
    2. TRUEC0DER Автор темы
      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`)
      }
      17 окт 2023 Изменено
    3. TRUEC0DER Автор темы
Загрузка...
Top