В мессенджере Telegram появилась возможность создать бота — с его помощью вы можете отвечать на сообщения в телеграме, рассылать уведомления, добавлять к сообщениям картинки и так далее.

Пользователи node.js уже подготовили npm-пакет, с которым всё становится ещё проще.

Сначала создаём бота. Стучимся к @botfather, говорим ему /newbot, пишем имя бота и его юзернейм (он должен заканчиваться на _bot).

Теперь у вас есть бот, и @botfather сообщает ссылку для поиска бота и его http-токен. Токен понадобится нам дальше как ключ для API. В своём телеграм-аккаунте вы можете найти своего бота и добавиться к нему в друзья.

Теперь к программированию. Установите npm-пакет:

npm install node-telegram-bot-api

Создайте скрипт:

var TelegramBot = require('node-telegram-bot-api');
var token = 'токен_вашего_бота';
var bot = new TelegramBot(token, {polling: true});

bot.on('message', function (msg) {
    var chatId = msg.chat.id;
    console.log(msg);
    bot.sendMessage(chatId, "Hello!", {caption: "I'm a bot!"});
});

Сохраните его под именем app.js, и запустите его в node.js:

node app

Всё, бот работает. Напишите что-нибудь ему в телеграме, он ответит «Hello!».

Снимок экрана 2015-07-19 в 13.26.26

Пару слов об API. Во-первых, есть два варианта запуска бота: polling и WebHook. В режиме WebHook сервер телеграма будет дёргать вашего бота каждый раз при поступлении запроса. К сожалению, этот режим требует https-подключения и валидного (не self-signed) сертификата https. У меня такого нет.

В режиме polling бот будет сам раз в секунду ходить на сервер телеграма и забирать новые данные. Этот режим таких ограничений нет, поэтому он гораздо проще для начала экспериментов — единственное, реакция будет не мгновенной, а в среднем с пол-секундной задержкой. Надеюсь, это не будет проблемой.

Давайте попробуем сделать что-то более интересное: пускай бот после получения запроса «photo» снимает фотографию камерой макбука и отправляет её. Для съёмки нам потребуется модуль imagesnap.js.

var TelegramBot = require('node-telegram-bot-api');
var imagesnapjs = require('imagesnapjs'), fs = require('fs');

var token = 'токен_вашего_бота';
var filename = '/Users/catethysis/telegram/webcam.jpg';

var bot = new TelegramBot(token, {polling: true});

bot.on('message', function (msg) {
    var chatId = msg.chat.id;
    console.log(msg);
    if(msg.text == 'photo')
        fs.exists(filename, function (exists) {
            if(exists)
                fs.unlinkSync(filename);
            imagesnapjs.capture(filename, { cliflags: '-w 2'}, function(err) {
                console.log(err ? err : 'Success!');
                bot.sendPhoto(chatId, filename, {caption: "It's your photo!"});
            });
    });
});

Снимок экрана 2015-07-19 в 13.25.03