[![Build Status](https://travis-ci.org/yagop/node-telegram-bot-api.svg?branch=master)](https://travis-ci.org/yagop/node-telegram-bot-api) [![Build status](https://ci.appveyor.com/api/projects/status/ujko6bsum3g5msjh/branch/master?svg=true)](https://ci.appveyor.com/project/yagop/node-telegram-bot-api/branch/master) [![Coverage Status](https://coveralls.io/repos/yagop/node-telegram-bot-api/badge.svg?branch=master)](https://coveralls.io/r/yagop/node-telegram-bot-api?branch=master) [![bitHound Score](https://www.bithound.io/github/yagop/node-telegram-bot-api/badges/score.svg)](https://www.bithound.io/github/yagop/node-telegram-bot-api) [![https://telegram.me/node_telegram_bot_api](https://img.shields.io/badge/💬 Telegram-node__telegram__bot__api-blue.svg)](https://telegram.me/node_telegram_bot_api) [![https://telegram.me/Yago_Perez](https://img.shields.io/badge/💬 Telegram-Yago__Perez-blue.svg)](https://telegram.me/Yago_Perez) Node.js module to interact with official [Telegram Bot API](https://core.telegram.org/bots/api). A bot token is needed, to obtain one, talk to [@botfather](https://telegram.me/BotFather) and create a new bot. ```sh npm install node-telegram-bot-api ``` ```js var TelegramBot = require('node-telegram-bot-api'); var token = 'YOUR_TELEGRAM_BOT_TOKEN'; // Setup polling way var bot = new TelegramBot(token, {polling: true}); // Matches /echo [whatever] bot.onText(/\/echo (.+)/, function (msg, match) { var fromId = msg.from.id; var resp = match[1]; bot.sendMessage(fromId, resp); }); // Any kind of message bot.on('message', function (msg) { var chatId = msg.chat.id; // photo can be: a file path, a stream or a Telegram file_id var photo = 'cats.png'; bot.sendPhoto(chatId, photo, {caption: 'Lovely kittens'}); }); ``` There are some other examples on [examples](https://github.com/yagop/node-telegram-bot-api/tree/master/examples). ### Events Every time TelegramBot receives a message, it emits a `message`. Depending on which [message](https://core.telegram.org/bots/api#message) was received, emits an event from this ones: `text`, `audio`, `document`, `photo`, `sticker`, `video`, `voice`, `contact`, `location`, `new_chat_participant`, `left_chat_participant`, `new_chat_title`, `new_chat_photo`, `delete_chat_photo`, `group_chat_created`. Its much better to listen a specific event rather than a `message` in order to stay safe from the content. TelegramBot emits `inline_query` when receives an [Inline Query](https://core.telegram.org/bots/api#inlinequery) and `chosen_inline_result` when receives a [ChosenInlineResult](https://core.telegram.org/bots/api#choseninlineresult). Bot must be enabled on [inline mode](https://core.telegram.org/bots/api#inline-mode) * * * ### WebHooks Telegram only supports HTTPS connections to WebHooks, in order to set a WebHook a private key file and public certificate must be used. Since August 29, 2015 Telegram supports self signed ones, to generate them: ```bash # Our private cert will be key.pem, keep in private this file. openssl genrsa -out key.pem 2048 # Our public certificate will be crt.pem openssl req -new -sha256 -key key.pem -out crt.pem ``` Once they are generated, the `crt.pem` can be provided to `telegramBot.setWebHook(url, crt)` as `crt`. ## API Reference ## TelegramBot TelegramBot **Kind**: global class **See**: https://core.telegram.org/bots/api * [TelegramBot](#TelegramBot) * [new TelegramBot(token, [options])](#new_TelegramBot_new) * [.getMe()](#TelegramBot+getMe) ⇒ Promise * [.setWebHook(url, [cert])](#TelegramBot+setWebHook) * [.getUpdates([timeout], [limit], [offset])](#TelegramBot+getUpdates) ⇒ Promise * [.sendMessage(chatId, text, [options])](#TelegramBot+sendMessage) ⇒ Promise * [.answerInlineQuery(inlineQueryId, results, [options])](#TelegramBot+answerInlineQuery) ⇒ Promise * [.forwardMessage(chatId, fromChatId, messageId)](#TelegramBot+forwardMessage) ⇒ Promise * [.sendPhoto(chatId, photo, [options])](#TelegramBot+sendPhoto) ⇒ Promise * [.sendAudio(chatId, audio, [options])](#TelegramBot+sendAudio) ⇒ Promise * [.sendDocument(chatId, doc, [options])](#TelegramBot+sendDocument) ⇒ Promise * [.sendSticker(chatId, sticker, [options])](#TelegramBot+sendSticker) ⇒ Promise * [.sendVideo(chatId, video, [options])](#TelegramBot+sendVideo) ⇒ Promise * [.sendVoice(chatId, voice, [options])](#TelegramBot+sendVoice) ⇒ Promise * [.sendChatAction(chatId, action)](#TelegramBot+sendChatAction) ⇒ Promise * [.getUserProfilePhotos(userId, [offset], [limit])](#TelegramBot+getUserProfilePhotos) ⇒ Promise * [.sendLocation(chatId, latitude, longitude, [options])](#TelegramBot+sendLocation) ⇒ Promise * [.getFile(fileId)](#TelegramBot+getFile) ⇒ Promise * [.getFileLink(fileId)](#TelegramBot+getFileLink) ⇒ Promise * [.downloadFile(fileId, downloadDir)](#TelegramBot+downloadFile) ⇒ Promise * [.onText(regexp, callback)](#TelegramBot+onText) * [.onReplyToMessage(chatId, messageId, callback)](#TelegramBot+onReplyToMessage) ### new TelegramBot(token, [options]) Both request method to obtain messages are implemented. To use standard polling, set `polling: true` on `options`. Notice that [webHook](https://core.telegram.org/bots/api#setwebhook) will need a SSL certificate. Emits `message` when a message arrives. | Param | Type | Default | Description | | --- | --- | --- | --- | | token | String | | Bot Token | | [options] | Object | | | | [options.polling] | Boolean | Object | false | Set true to enable polling or set options | | [options.polling.timeout] | String | Number | 10 | Polling time in seconds | | [options.polling.interval] | String | Number | 2000 | Interval between requests in miliseconds | | [options.webHook] | Boolean | Object | false | Set true to enable WebHook or set options | | [options.webHook.key] | String | | PEM private key to webHook server. | | [options.webHook.cert] | String | | PEM certificate (public) to webHook server. | ### telegramBot.getMe() ⇒ Promise Returns basic information about the bot in form of a `User` object. **Kind**: instance method of [TelegramBot](#TelegramBot) **See**: https://core.telegram.org/bots/api#getme ### telegramBot.setWebHook(url, [cert]) Specify an url to receive incoming updates via an outgoing webHook. **Kind**: instance method of [TelegramBot](#TelegramBot) **See**: https://core.telegram.org/bots/api#setwebhook | Param | Type | Description | | --- | --- | --- | | url | String | URL where Telegram will make HTTP Post. Leave empty to delete webHook. | | [cert] | String | stream.Stream | PEM certificate key (public). | ### telegramBot.getUpdates([timeout], [limit], [offset]) ⇒ Promise Use this method to receive incoming updates using long polling **Kind**: instance method of [TelegramBot](#TelegramBot) **Returns**: Promise - Updates **See**: https://core.telegram.org/bots/api#getupdates | Param | Type | Description | | --- | --- | --- | | [timeout] | Number | String | Timeout in seconds for long polling. | | [limit] | Number | String | Limits the number of updates to be retrieved. | | [offset] | Number | String | Identifier of the first update to be returned. | ### telegramBot.sendMessage(chatId, text, [options]) ⇒ Promise Send text message. **Kind**: instance method of [TelegramBot](#TelegramBot) **See**: https://core.telegram.org/bots/api#sendmessage | Param | Type | Description | | --- | --- | --- | | chatId | Number | String | Unique identifier for the message recipient | | text | String | Text of the message to be sent | | [options] | Object | Additional Telegram query options | ### telegramBot.answerInlineQuery(inlineQueryId, results, [options]) ⇒ Promise Send answers to an inline query. **Kind**: instance method of [TelegramBot](#TelegramBot) **See**: https://core.telegram.org/bots/api#answerinlinequery | Param | Type | Description | | --- | --- | --- | | inlineQueryId | String | Unique identifier of the query | | results | Array.<InlineQueryResult> | An array of results for the inline query | | [options] | Object | Additional Telegram query options | ### telegramBot.forwardMessage(chatId, fromChatId, messageId) ⇒ Promise Forward messages of any kind. **Kind**: instance method of [TelegramBot](#TelegramBot) | Param | Type | Description | | --- | --- | --- | | chatId | Number | String | Unique identifier for the message recipient | | fromChatId | Number | String | Unique identifier for the chat where the original message was sent | | messageId | Number | String | Unique message identifier | ### telegramBot.sendPhoto(chatId, photo, [options]) ⇒ Promise Send photo **Kind**: instance method of [TelegramBot](#TelegramBot) **See**: https://core.telegram.org/bots/api#sendphoto | Param | Type | Description | | --- | --- | --- | | chatId | Number | String | Unique identifier for the message recipient | | photo | String | stream.Stream | Buffer | A file path or a Stream. Can also be a `file_id` previously uploaded | | [options] | Object | Additional Telegram query options | ### telegramBot.sendAudio(chatId, audio, [options]) ⇒ Promise Send audio **Kind**: instance method of [TelegramBot](#TelegramBot) **See**: https://core.telegram.org/bots/api#sendaudio | Param | Type | Description | | --- | --- | --- | | chatId | Number | String | Unique identifier for the message recipient | | audio | String | stream.Stream | Buffer | A file path, Stream or Buffer. Can also be a `file_id` previously uploaded. | | [options] | Object | Additional Telegram query options | ### telegramBot.sendDocument(chatId, doc, [options]) ⇒ Promise Send Document **Kind**: instance method of [TelegramBot](#TelegramBot) **See**: https://core.telegram.org/bots/api#sendDocument | Param | Type | Description | | --- | --- | --- | | chatId | Number | String | Unique identifier for the message recipient | | doc | String | stream.Stream | Buffer | A file path, Stream or Buffer. Can also be a `file_id` previously uploaded. | | [options] | Object | Additional Telegram query options | ### telegramBot.sendSticker(chatId, sticker, [options]) ⇒ Promise Send .webp stickers. **Kind**: instance method of [TelegramBot](#TelegramBot) **See**: https://core.telegram.org/bots/api#sendsticker | Param | Type | Description | | --- | --- | --- | | chatId | Number | String | Unique identifier for the message recipient | | sticker | String | stream.Stream | Buffer | A file path, Stream or Buffer. Can also be a `file_id` previously uploaded. Stickers are WebP format files. | | [options] | Object | Additional Telegram query options | ### telegramBot.sendVideo(chatId, video, [options]) ⇒ Promise Use this method to send video files, Telegram clients support mp4 videos (other formats may be sent as Document). **Kind**: instance method of [TelegramBot](#TelegramBot) **See**: https://core.telegram.org/bots/api#sendvideo | Param | Type | Description | | --- | --- | --- | | chatId | Number | String | Unique identifier for the message recipient | | video | String | stream.Stream | Buffer | A file path or Stream. Can also be a `file_id` previously uploaded. | | [options] | Object | Additional Telegram query options | ### telegramBot.sendVoice(chatId, voice, [options]) ⇒ Promise Send voice **Kind**: instance method of [TelegramBot](#TelegramBot) **See**: https://core.telegram.org/bots/api#sendvoice | Param | Type | Description | | --- | --- | --- | | chatId | Number | String | Unique identifier for the message recipient | | voice | String | stream.Stream | Buffer | A file path, Stream or Buffer. Can also be a `file_id` previously uploaded. | | [options] | Object | Additional Telegram query options | ### telegramBot.sendChatAction(chatId, action) ⇒ Promise Send chat action. `typing` for text messages, `upload_photo` for photos, `record_video` or `upload_video` for videos, `record_audio` or `upload_audio` for audio files, `upload_document` for general files, `find_location` for location data. **Kind**: instance method of [TelegramBot](#TelegramBot) **See**: https://core.telegram.org/bots/api#sendchataction | Param | Type | Description | | --- | --- | --- | | chatId | Number | String | Unique identifier for the message recipient | | action | String | Type of action to broadcast. | ### telegramBot.getUserProfilePhotos(userId, [offset], [limit]) ⇒ Promise Use this method to get a list of profile pictures for a user. Returns a [UserProfilePhotos](https://core.telegram.org/bots/api#userprofilephotos) object. **Kind**: instance method of [TelegramBot](#TelegramBot) **See**: https://core.telegram.org/bots/api#getuserprofilephotos | Param | Type | Description | | --- | --- | --- | | userId | Number | String | Unique identifier of the target user | | [offset] | Number | Sequential number of the first photo to be returned. By default, all photos are returned. | | [limit] | Number | Limits the number of photos to be retrieved. Values between 1—100 are accepted. Defaults to 100. | ### telegramBot.sendLocation(chatId, latitude, longitude, [options]) ⇒ Promise Send location. Use this method to send point on the map. **Kind**: instance method of [TelegramBot](#TelegramBot) **See**: https://core.telegram.org/bots/api#sendlocation | Param | Type | Description | | --- | --- | --- | | chatId | Number | String | Unique identifier for the message recipient | | latitude | Float | Latitude of location | | longitude | Float | Longitude of location | | [options] | Object | Additional Telegram query options | ### telegramBot.getFile(fileId) ⇒ Promise Get file. Use this method to get basic info about a file and prepare it for downloading. Attention: link will be valid for 1 hour. **Kind**: instance method of [TelegramBot](#TelegramBot) **See**: https://core.telegram.org/bots/api#getfile | Param | Type | Description | | --- | --- | --- | | fileId | String | File identifier to get info about | ### telegramBot.getFileLink(fileId) ⇒ Promise Get link for file. Use this method to get link for file for subsequent use. Attention: link will be valid for 1 hour. This method is a sugar extension of the (getFile)[#getfilefileid] method, which returns just path to file on remote server (you will have to manually build full uri after that). **Kind**: instance method of [TelegramBot](#TelegramBot) **Returns**: Promise - promise Promise which will have *fileURI* in resolve callback **See**: https://core.telegram.org/bots/api#getfile | Param | Type | Description | | --- | --- | --- | | fileId | String | File identifier to get info about | ### telegramBot.downloadFile(fileId, downloadDir) ⇒ Promise Downloads file in the specified folder. This is just a sugar for (getFile)[#getfilefiled] method **Kind**: instance method of [TelegramBot](#TelegramBot) **Returns**: Promise - promise Promise, which will have *filePath* of downloaded file in resolve callback | Param | Type | Description | | --- | --- | --- | | fileId | String | File identifier to get info about | | downloadDir | String | Absolute path to the folder in which file will be saved | ### telegramBot.onText(regexp, callback) Register a RegExp to test against an incomming text message. **Kind**: instance method of [TelegramBot](#TelegramBot) | Param | Type | Description | | --- | --- | --- | | regexp | RegExp | RegExp to be executed with `exec`. | | callback | function | Callback will be called with 2 parameters, the `msg` and the result of executing `regexp.exec` on message text. | ### telegramBot.onReplyToMessage(chatId, messageId, callback) Register a reply to wait for a message response. **Kind**: instance method of [TelegramBot](#TelegramBot) | Param | Type | Description | | --- | --- | --- | | chatId | Number | String | The chat id where the message cames from. | | messageId | Number | String | The message id to be replied. | | callback | function | Callback will be called with the reply message. | * * *