Как написать бота для Telegram — Создаем бота для телеграм на nodejs

Вы пишите или собираетесь писать игру на JavaScript, и вас мучают вопросы как быть с сервером игры, или как написать бота чтобы опубликовать свою игру в Telegram или другом мессенджере? Спешу обрадовать, на JavaScript вы можете писать серверные приложения, в том числе полноценные сервер с http/сокет соединением и ботов для любых мессенджеров. Может быть в будущем я как нибудь расскажу как написать сокет сервер, в этой же я покажу вам пошагово как создать бота в Telegram, а в следующей как создать свою первую игру и опубликовать в мессенджере Telegram. Статья разделена на несколько частей:

  1. Регистрируем бота в Telegram
  2. Установка NodeJS
  3. Пишем бота
  4. Дополнения
  5. Полный код приложения
  6. Что дальше

Если вы знакомы с каким либо пунктом, можете сразу приступить к следующему. Погнали…

<="" a="">

Далее BotFather попросит отправить ему логин вашего бота, логин должен быть уникальным:

Логин должен заканчиваться на Bot или _bot. После успешного содания бота, BotFather отправим вам token, который необходимо сохранить где нибудь, он нам понадобится для авторизации нашего бота.

<="" a="">

  1. для windows: нажимаем комбинацию win+R, в появившемся окне вводим cmd и нажимаем Enter,
  2. в OSX: приложение Терминал находится по адресу /Applications/Utilities/Terminal.app, запускаем его.

В командной строке наберите команду node --version, а затем npm --version, если вы установили NodeJS правильно, вы должны увидеть что то вроде:

Далее зайдите в терминале в каталог, где будет расположен ваш проект. Напомню что для того чтобы пройти в каталог в терминале необходимо набрать команду cd CatalogName, чтобы выйти в директорию выше: cd ../ . Для создания нашего приложения нам понадобятся дополнительные пакеты из npm-репозитория:

  1. http://npmjs.com/package/node-telegram-bot-api — собственно авторизация и работа с телеграм
  2. http://npmjs.com/package/mysql — работа с БД mysql

Для установки пакета необходимо набрать в командной строке npm install <package name>. В этом случае пакет будет установлен в каталоге, из которого была вызвана команда install, в этом каталоге будет создан каталог с именем node_modules/, можно туда не лесть, нам это не понадобится. Вы можете использовать ключ -g чтобы модуль установился глобально в систему и был доступен из любого места, но для этого на винде придется еще добавить путь к репозиторию в переменную PATH, вы можете сделать это если вам так удобнее. Установим пакеты в текущей рабочей директории:

На этом подготовительные процессы завершены, приступаем к написаню приложения.

<="" a=«">

Чтобы запустить приложение , наберите в командной строке node src/app.js и вы увидет в консоле строку new bot app. Ура, вы уже умеете запускать приложение и выводить инфу на экран, можно попрактиковатся и написать свою версию «HelloWorld!»… Идем дальше:

Не забудьте заполнить переменную var token = "ВАШ TOKEN" вашим токеном, полученным от бота BotFather в первом пункте статьи. Если запустить приложение в командной строке, ваш бот уже сможет получать сообщения, например если в телеграме отправить боту сообщение «ping», вы увидите в консоле запись вида:

Каке видите мы получили текст сообщения(text), информация о пользователе(from) и чате(chat). В данном случае инфа о пользователе и чате похожа, это потому что сообщение было отправлено в приватной беседе. Если же боту отправить сообщение из группы, тогда в переменной chat будет информация об этой группе. Давайте напишем ответ на сообщение ping:

Чтобы изменения вступили в силу, вам необходимо перезапустить приложение, для этого необходимо в консоле завершить текущее приложение сочетанием клавиш Ctrl+C (на винде и на маке), и запустить приложение заново. Не расстраивайтесь, в разделе Дополнения я покажу как это упростить. После перезапуска приложения, на команду ping в любой регистре, бот отправит в ответ pong. В методе tg.sendMessage третьим параметром вы можете отправить Object с параметрами, которые описаны в Telegram API. Например чтобы отправить текст с html-разметкой:

Давайте попробуем отправить inline-кнопку:

Здесь для создания кнопок используются параметры text-отображемый текст и callback_data: эта та информация, которую вы получите когда пользователь нажмет на кнопку, имейте ввиду что этот параметр должен быть строкой, максимальный размер которой не должна превышать 64 байта. Поэтому использовать слова helpCmd и gameCmd немного не удачное решение, лучше задать какие нибудь константы и отправлять циферки, которые потом можно пропарсить, можно использовать JSON строку, или же просто отправить список параметров разделенных каким нибудь символом, главное уложиться в 64 байта. В этом примере не будем усложнять и сделаем как проще. Еще обратите внимание что options.reply_markup.inline_keyboard — это массив массивов, это нужно для того чтобы вы могли размещать кнопки в одной строке или в разных:Например вот так будут выглядить кнопки если отправить их как в примере выше:

buttons1.png

А если отправить кнопки вот так:

Вы получите вот такую картину:

buttons2.png

При клике на кнопку вы увидите в консоле:

Напишем обработчик этой команды ( допишите метод onCallbackQuery созданный ранее):

Теперь при клике на кнопку Об игре мы получим в ответ какой то текст. Но, обратите внимание что на кнопке по прежнему висит индикатор процесса:

callback_indicator.png

Чтобы его скрыть, необходимо корректно ответить на callback-сообщение:

В метод answerCallbackQuery можно передать текст который увидит пользователь во всплывающем окне, подробности в документации Telegram API.

<="" a="">

Установите модуль nodemon из репозитория npm, который будет перезапускать ваше приложение каждый раз когда вы пересохраняете любой файл используемый в приложении. Устанавливать модуль nodemon необходимо глобально, используя ключ -g:

После установки, чтобы запустить приложение используйте команду:

Теперь каждый раз после изменения файла, ваше приложение будет запускаться с самого начала, удобно на этапе разработки.

process

Свойство process.title вы можете использовать для поиска процесса в системе, например на маке или линуксе можно в консоле написать так ps -A | grep "MyTestBot", и вы увидите: 4584 ttys002 0:00.47 MyTestBot, где 4584 это номер процесса, убить который можно командой kill 4584. Как сделать что то подобное на винде, к сожалению не знаю.

forever

Для детального ознакомления читайте документацию forever.

Что еще?

<="" a="">

<="" a="">

Поделиться:
Нет комментариев

Добавить комментарий

Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.