Шлюз для мессенджера MAX. Отправляйте и получайте текстовые сообщения. Стоимость.
Первое подключение это всегда бесплатный тариф. Для разработки и тестирования.
Вариант 1. Самый простой способ. Создайте два файла в одной папке: b-sdk.js (скопируйте из вкл. 3) и bot.js (скопируйте код ниже).
Шаг 1: Получение ключей.Зарегистрируйтесь в панели управления.
Создайте новое подключение кнопкой "+ Создать новое подключение".
Скопируйте Instance ID (ваш уникальный номер подключения) и Token (ваш секретный ключ).
Важно: Никогда не передавайте Token третьим лицам!
Шаг 2: Инициализация и установка зависимостейnpm init -y
npm install express axios dotenv
Шаг 3: Настройте .env
BOT_TOKEN=tk_ваш_токен
INSTANCE_ID=b_ваш_id
GATEWAY_URL=https://b-api.ru
# --- WEBHOOK_URL ---
# --- ВАРИАНТ 1: Домен с SSL (Продакшн) ---
WEBHOOK_URL=https://ваш-сайт.ru
# --- ВАРИАНТ 2: Для тестирования ботов на локальном компьютере используйте утилиты проброса портов (например, ngrok или localtunnel) ---
# Пример запуска: npx ngrok http 5000
# WEBHOOK_URL=https://ngrok-free.app
# --- ВАРИАНТ 3: Нестандартный порт (Для профи) ---
# ВАЖНО: Порт в адресе и переменная PORT должны СОВПАДАТЬ
#WEBHOOK_URL=http://95.2.3.4:7777
#PORT=7777
Шаг 4: Создайте файл bot.js
require("dotenv").config();
const Bot = require("./b-sdk");
const bot = new Bot({
token: process.env.BOT_TOKEN,
instanceId: process.env.INSTANCE_ID,
gatewayUrl: process.env.GATEWAY_URL,
});
bot.onMessage(async (msg) => {
if (msg.isCommand && msg.command === "start") {
msg.clear();
await msg.ack();
await msg.reply("Привет! Начнем анкету. 1. Как тебя зовут?");
msg.setStep("AWAIT_NAME");
return;
}
const step = msg.getStep();
if (!step) {
await msg.ack();
await msg.reply("Напиши /start для начала.");
} else if (step === "AWAIT_NAME") {
msg.saveData({ name: msg.text });
await msg.ack();
await msg.reply(`Ок, ${msg.text}. 2. Сколько тебе лет?`);
msg.setStep("AWAIT_AGE");
} else if (step === "AWAIT_AGE") {
msg.saveData({ age: msg.text });
await msg.ack();
await msg.reply("И последнее. 3. Какое у тебя хобби?");
msg.setStep("AWAIT_HOBBY");
} else if (step === "AWAIT_HOBBY") {
msg.saveData({ hobby: msg.text });
const data = msg.getData();
const userId = msg.chatId;
console.log(`💾 Сохраняю в БД для пользователя ${userId}:`, data);
/*
Пример
db.query("INSERT INTO results (chat_id, name, age, hobby) VALUES (?, ?, ?, ?)",
[userId, data.name, data.age, data.hobby]);
*/
await msg.ack();
await msg.reply(
`Готово! Имя: ${data.name}, Возраст: ${data.age}, Хобби: ${data.hobby}`,
);
msg.clear();
}
});
bot.start(process.env.PORT, process.env.WEBHOOK_URL);
Шаг 5: Тестирование
node bot.js //ВАЖНО. Проверьте .env. Запустите вашего чат-бота.
✅ Webhook успешно зарегистрирован //В консоли вы увидите. Это значит, шлюз узнал ваш адрес.
Откройте MAX и напишите своему чат-боту /start
Вариант 2. Пример создания чат-бота без использования библиотеки (чистый Node.js). Можно на любом языке программирования.
Шаг 1: Получение ключей.Зарегистрируйтесь в панели управления.
Создайте новое подключение кнопкой "+ Создать новое подключение".
Скопируйте Instance ID (ваш уникальный номер подключения) и Token (ваш секретный ключ).
Важно: Никогда не передавайте Token третьим лицам!
Шаг 2: Инициализация и установка зависимостейnpm init -y
npm install express axios dotenv
Шаг 3: Настройте .env
BOT_TOKEN=tk_ваш_токен
INSTANCE_ID=b_ваш_id
GATEWAY_URL=https://b-api.ru
# --- WEBHOOK_URL ---
# --- ВАРИАНТ 1: Домен с SSL (Продакшн) ---
WEBHOOK_URL=https://ваш-сайт.ru
# --- ВАРИАНТ 2: Для тестирования ботов на локальном компьютере используйте утилиты проброса портов (например, ngrok или localtunnel) ---
# Пример запуска: npx ngrok http 5000
# WEBHOOK_URL=https://ngrok-free.app
# --- ВАРИАНТ 3: Нестандартный порт (Для профи) ---
# ВАЖНО: Порт в адресе и переменная PORT должны СОВПАДАТЬ
#WEBHOOK_URL=http://95.2.3.4:7777
#PORT=7777
Шаг 4: создайте файл direct-bot.js
require("dotenv").config();
const express = require("express");
const axios = require("axios");
const app = express();
app.use(express.json());
const PORT = process.env.PORT || 5000;
const GATEWAY_URL = process.env.GATEWAY_URL;
const BOT_TOKEN = process.env.BOT_TOKEN;
const INSTANCE_ID = process.env.INSTANCE_ID;
const WEBHOOK_URL = process.env.WEBHOOK_URL;
const sessions = {};
async function sendMessage(chatId, text) {
try {
await axios.post(`${GATEWAY_URL}/send?instanceId=${INSTANCE_ID}`, {
token: BOT_TOKEN,
instanceId: INSTANCE_ID,
chatId: String(chatId),
text: text,
});
} catch (err) {
// console.error(
// "❌ Ошибка отправки:",
// err.response ? err.response.data : err.message,
// );
}
}
async function sendRead(chatId) {
try {
await axios.post(`${GATEWAY_URL}/read?instanceId=${INSTANCE_ID}`, {
token: BOT_TOKEN,
instanceId: INSTANCE_ID,
chatId: String(chatId),
});
} catch (err) {
// console.error(`❌ Ошибка отметки: ${err.message}`);
}
}
app.post("/webhook", async (req, res) => {
const { chatId, text } = req.body;
const incomingToken = req.headers["x-bot-token"];
if (incomingToken !== BOT_TOKEN) {
return res.status(401).send("Unauthorized");
}
if (!text || !chatId) return res.sendStatus(200);
if (!sessions[chatId]) {
sessions[chatId] = { step: null, data: {} };
}
const session = sessions[chatId];
if (text.toLowerCase() === "/start") {
session.step = "NAME";
await sendRead(chatId)
await sendMessage(chatId, "Привет! Это Direct API чат-бот. Как тебя зовут?");
} else if (session.step === "NAME") {
session.data.name = text;
session.step = "AGE";
await sendRead(chatId)
await sendMessage(chatId, `Принято. ${text}, сколько тебе лет?`);
} else if (session.step === "AGE") {
session.data.age = text;
const final = session.data;
console.log(`🏁 Результат Direct API для ${chatId}:`, final);
await sendRead(chatId)
await sendMessage(
chatId,
`Готово!\nИмя: ${final.name}\nВозраст: ${final.age}`,
);
delete sessions[chatId];
} else {
await sendRead(chatId)
await sendMessage(chatId, "Напиши /start для анкеты.");
}
res.sendStatus(200);
});
// ФУНКЦИЯ АВТО-РЕГИСТРАЦИИ
async function registerMe() {
try {
let publicUrl = WEBHOOK_URL;
if (!publicUrl) return;
let cleanUrl = publicUrl.replace(/\/+$/, "");
const parts = cleanUrl.split(":");
const hasPort = parts.length > 2;
if (cleanUrl.startsWith("http://") && !hasPort) {
cleanUrl = `${cleanUrl}:${PORT}`;
}
const finalWebhookUrl = `${cleanUrl}/webhook`;
await axios.post(`${GATEWAY_URL}/api/register-webhook`, {
token: BOT_TOKEN,
instanceId: INSTANCE_ID,
webhook_url: finalWebhookUrl,
});
console.log(`✅ Direct Bot: Webhook зарегистрирован -> ${finalWebhookUrl}`);
} catch (err) {
// console.error("❌ Не удалось зарегистрироваться:", err.message);
}
}
app.listen(PORT, () => {
console.log(`🚀 Direct API Бот запущен на порту ${PORT}`);
registerMe();
});
Шаг 5: Тестирование
node direct-bot.js //ВАЖНО. Проверьте .env. Запустите вашего чат-бота
✅ Webhook успешно зарегистрирован //В консоли вы увидите. Это значит, шлюз узнал ваш адрес.
Откройте MAX и напишите своему чат-боту /start
Скопируйте этот код и сохраните в файл b-sdk.js в папку с вашим чат-ботом. Это для первого варианта запуска чат-бота (SDK).
const express = require("express");
const axios = require("axios");
class Bot {
constructor(config) {
this.gatewayUrl = config.gatewayUrl || "http://localhost:8080";
this.token = config.token;
this.instanceId = config.instanceId;
this.onMessageHandler = null;
this.sessions = {};
this.app = express();
this.app.use(express.json());
}
// Метод автоматической регистрации
async registerWebhook(webhookUrl) {
try {
await axios.post(`${this.gatewayUrl}/api/register-webhook`, {
token: this.token,
instanceId: this.instanceId,
webhook_url: webhookUrl,
});
console.log(`✅ Webhook успешно зарегистрирован: ${webhookUrl}`);
} catch (error) {
console.error(`❌ Ошибка авто-регистрации Webhook: ${error.message}`);
}
}
async sendText(chatId, text) {
try {
await axios.post(
`${this.gatewayUrl}/send?instanceId=${this.instanceId}`,
{
token: this.token,
instanceId: this.instanceId,
chatId: String(chatId),
text: text,
},
);
} catch (error) {
console.error(`❌ SDK Send Error: ${error.message}`);
}
}
async sendRead(chatId) {
try {
await axios.post(
`${this.gatewayUrl}/read?instanceId=${this.instanceId}`,
{
token: this.token,
instanceId: this.instanceId,
chatId: String(chatId),
},
);
} catch (error) {
console.error(`❌ SDK Read Error: ${error.message}`);
}
}
onMessage(handler) {
this.onMessageHandler = handler;
}
start(port = 5000, publicUrl = null) {
// Авто-регистрация
if (publicUrl && publicUrl.trim() !== "") {
let cleanUrl = publicUrl.replace(/\/+$/, "");
const parts = cleanUrl.split(":");
const hasPort = parts.length > 2;
if (cleanUrl.startsWith("http://") && !hasPort) {
cleanUrl = `${cleanUrl}:${port}`;
}
this.registerWebhook(`${cleanUrl}/webhook`);
}
this.app.post("/webhook", (req, res) => {
const { chatId, text } = req.body;
const incomingToken = req.headers["x-bot-token"];
if (incomingToken !== this.token) {
return res.status(401).send("Unauthorized");
}
if (!text || !chatId) return res.sendStatus(200);
if (!this.sessions[chatId]) {
this.sessions[chatId] = { step: null, data: {} };
}
const isCommand = text.startsWith("/");
const command = isCommand
? text.toLowerCase().slice(1).split(" ")[0]
: null;
if (this.onMessageHandler) {
this.onMessageHandler({
chatId,
text,
isCommand,
command,
reply: (txt) => this.sendText(chatId, txt),
ack: () => this.sendRead(chatId),
setStep: (name) => {
this.sessions[chatId].step = name;
},
getStep: () => this.sessions[chatId].step,
saveData: (obj) => {
Object.assign(this.sessions[chatId].data, obj);
},
getData: () => this.sessions[chatId].data,
clear: () => {
this.sessions[chatId] = { step: null, data: {} };
},
});
}
res.sendStatus(200);
});
this.app.listen(port, () => {
console.log(`🚀 Bot SDK OK | Port: ${port}`);
});
}
}
module.exports = Bot;
Отсканируйте код через MAX
Настройки/Устройства/Войти по QR-коду
Текущий баланс: 0.00 руб.
⚠️ Пополнение баланса станет доступно, когда до конца подписки останется менее 3 месяцев (90 дней).
| Дата | Сумма | Описание операции |
|---|