Пишем «ТамТам»-бота на Node.js с использованием библиотеки node-tamtam-botapi

Недавно у мессенджера «ТамТам» появилось Bot API. Разработчики предоставили библиотеку для работы на Java. Позже появились сторонние библиотеки на Kotlin и Python, а для Node.js модулей для работы с Bot API не было. Так я решил написать свою библиотеку node-tamtam-botapi.

В закладки

В этой статье я опишу пример работы с библиотекой и создание простого бота, который будет отправлять приветственное сообщение в ответ на любой текст. Статья по самой библиотеке выйдет отдельно, сам проект еще находится на стадии beta-версии.

Исходные данные:

  • документация — TamTam Bot API;
  • сервер на Heroku — tutorial (простой в развертывании и бесплатный облачный сервис);
  • исходный код библиотеки — Node.js TamTam Bot API;
  • пакет npm — node-tamtam-botapi;
  • данные от Bot API будем получать по WebHook.

Установка модуля:

npm install --save node-tamtam-botapi

Подключение необходимых модулей:

const TamTamBot = require('node-tamtam-botapi'); const express = require('express'); const bodyParser = require('body-parser');

Создание бота и получение токена происходит через @PrimeBot в «ТамТам». Версия Bot API на момент написания статьи — 0.1.8.

Установка параметров бота:

const config = { token: process.env.TOKEN || 'YOUR_GENERATED_TOKEN', host: 'https://botapi.tamtam.chat', version: '0.1.8' };

Инициализация бота:

const bot = new TamTamBot(config);

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

const app = express(); const PORT = process.env.PORT || 3000; app.use(bodyParser.json());

Чтобы получать данные по WebHook, нам необходимо выполнить метод subscribe:

const appName = process.env.HEROKU_APP_NAME || 'HEROKU_APP_NAME'; const path = process.env.HEROKU_APP_PATH || 'HEROKU_APP_PATH'; //тело запроса метода subscribe const subscribeBody = { url: `https://${appName}.herokuapp.com/${path}` }; // выполняем метод для подписки бота на WebHook bot.subscribe(subscribeBody);

После выполнения метода subscribe будем обрабатывать получаемые данные следующим образом:

app.post(`/${path}`, (req, res) => { // Для обработки данных получаемых через WebHook // необходимо вызывать метод bot.webhookUpdateTypeHandler bot.webhookUpdateTypeHandler(req.body); // для корректной обработки запроса // в ответ отправляем success: true res.send({ success: true }); });

Важно. Если бот подписан на получение данных по WebHook, он не сможет получать данные по long polling.

Запуск сервера:

app.listen(PORT, () => { console.log(`Express server is listening on ${PORT}`); });

Подготовка закончена, теперь начнём заниматься обработкой запросов и отправкой сообщений. Для начала создадим тело запроса для отправки сообщения:

const message = { text: 'Hello! this is a test message' };

Для обработки сообщений от пользователей подпишемся на событие 'message_created'. Каждый раз, когда будет приходить сообщение от пользователя, будет вызываться следующий метод:

bot.on('message_created', update => { });

Далее в этом методе будем вызвать 'sendMessage' для отправки сообщений. В нем есть три параметра:

  • user_id {Number} - optional;
  • chat_id {Number} - optional;
  • body {Object}.

При вызове метода необходимо указать один из параметров user_id или chat_id. При получении update мы можем получить chat_id следующим образом:

update.message.recipient.chat_id

В итоге получается:

bot.on('message_created', update => { bot.sendMessage(undefined, update.message.recipient.chat_id, message); });

На данный момент это все. Исходный код бота можно посмотреть в Readme в Node.js TamTam Bot API.

Если возникнут вопросы, пишите мне в «ТамТам».

Материал опубликован пользователем. Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Иван Вершинин", "author_type": "self", "tags": [], "comments": 4, "likes": 0, "favorites": 7, "is_advertisement": false, "subsite_label": "dev", "id": 74598, "is_wide": false, "is_ugc": true, "date": "Tue, 23 Jul 2019 18:26:19 +0300" }
{"average":25955,"one":95,"ten":75}
Сколько денег вы откладываете в месяц?
Ответьте и узнаете, сколько копят другие.
0 ₽
70 000+ ₽
0 ₽
{ "id": 74598, "author_id": 212743, "diff_limit": 1000, "urls": {"diff":"\/comments\/74598\/get","add":"\/comments\/74598\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/74598"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 235819, "last_count_and_date": null }
4 комментария

Популярные

По порядку

13

Зачем писать бот для ботов?(пользователей ТамТам)

Ответить
5

Чтобы хоть кто-то там общался. Нужно же перед инвесторами оправдываться ростом аудитории, к-вом отправленных сообщений в день и тд.

Ответить
3

Дизлайк не глядя

Ответить
0

Комментарий удален по просьбе пользователя

Ответить
0
{ "page_type": "article" }

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } } ]
Голосовой помощник выкупил
компанию-создателя
Подписаться на push-уведомления
{ "page_type": "default" }