Hubot adapter for interfacting with the Telegram Bot API
First of read the docs on how to create a new Telegram Bot. Once you have a bot created, follow these steps:
npm install --save hubot-telegram- Set the environment variables specified in Configuration
- Run hubot
bin/hubot -a telegram
This adapter uses the following environment variables:
TELEGRAM_TOKEN (required)
The token that the BotFather gives you
TELEGRAM_INTERVAL (optional)
You can specify the interval (in milliseconds) in which the adapter will poll Telegram for updates. This option only applies if you are not using a webhook.
TELEGRAM_WEBHOOK (optional)
You can specify a webhook URL. The adapter will register TELEGRAM_WEBHOOK/TELEGRAM_TOKEN with Telegram and listen there.
The adapter will enhance the Response object with some custom methods with the same signature of the APIs. For example, sending an image:
module.exports = function (robot) { robot.hear(/send totoro/i, res => { const image = fs.createReadStream(__dirname + '/image.png') // https://core.telegram.org/bots/api#sendphoto res.sendPhoto(res.envelope.room, image, { caption: 'Totoro!' }) }) }Note: An example script of how to use this is located in the example/ folder
The list of methods exposed through a middleware to the response object is:
- sendMessage
- sendMessage
- sendPhoto
- sendAudio
- sendDocument
- sendMediaGroup
- sendSticker
- sendVideo
- sendVideoNote
- sendVoice
- sendChatAction
If you want to supplement your message delivery with extra features such as markdown syntax or keyboard replies, you can specify these parameters on the options of sendMessage:
robot.respond(/(.*)/i, res => { res.sendMessage( res.envelope.room, 'Select the option from the keyboard specified.', { reply_markup: { keyboard: [['Start', 'Stop']] } } ) })inlineQuery are a way to reply without a conversation to the bot. That's why they don't really fit into the normal hear/respond flow of Hubot. To support inlineQuery you can listen to event on the telegram object exposed by the robot object.
module.exports = function (robot) { robot.telegram.on('inline_query', async inlineQuery => { // Initially there is always a query with empty string // Usually is to provide suggestions if (inlineQuery.query) { const searches = await google.search(inlineQuery.query, 50) // Max 50 results for inlineQuery const results = searches.map(result => ({ type: 'photo', id: result.id, thumb_url: result['thumbnail'], photo_url: result['url'] })) robot.telegram.answerInlineQuery(inlineQuery.id, results) } }) }- Luca Simone - https://github.com/lukefx
- Chris Brand - https://github.com/arcturial