Шаблон телеграм-бота на вебхуках 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
Либа Grammy тоже поддерживает состояния, чтобы создать последовательное меню из кнопок или не? Рассматриваю, какую лучше либку юзать для практики, Grammy или Telegraf К вопросу о БД, можно юзать MongoDB Atlas с россии есть доступ
daz5554, Официальной поддержки состояний нет, но есть плагин от стороннего чела - https://github.com/IlyaSemenov/grammy-scenes Я с ним не работал, потому не могу ничего сказать по работоспособности, но по документации функционал очень похож на подобные фишки из других либ Сам сайт MongoDB блокирует роуты личного кабинета с российского айпишника, но сам доступ к базе работает без ***, достаточно только создать базу и получить URL
Обновление (1.0.1) - Добавлен пример работы плагина @grammyjs/conversations (Последовательное получение информации от юзера) - Добавлена работа с inline-клавиатурой и callback - Изменён способ указания путей к компонентам проекта с помощью фишки TypeScript (paths) - Немного изменена структура проекта В дополнение от себя: - Изначально планировалось использование @grammyjs/router, но @grammyjs/conversations более подходящий и удобный вариант
Crimson, Да, ты можешь ожидать необходимый тип апдейтов от телеграма. Вот пример кода с получением коллбэка от инлайн кнопки и получением обычного текста после 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`) } 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`) }