TS ΡΠ°Ρ-Π±ΠΎΡ Π΄Π»Ρ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ API MAX#
maxbot-chatbot-ts β ΡΡΠΎ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌΡΡ Π±ΠΎΡΠΎΠ² Π΄Π»Ρ MAX BOT API Π½Π° ΡΠ·ΡΠΊΠ΅ TypeScript (Node.js). ΠΠΎΡΡΡΠΎΠ΅Π½Π½Π°Ρ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ green-api/maxbot-api-client-ts, ΡΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡ, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ ΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΡΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ (FSM) Π΄Π»Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ ΠΌΠ½ΠΎΠ³ΠΎΡΠ°Π³ΠΎΠ²ΡΡ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΡΡ ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π².
API#
ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΊ REST API MAX Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅. ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΡΡΠΊΠΎΠΉ ΠΊ REST API, ΠΏΠΎΡΡΠΎΠΌΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅ Π²ΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠ° ΠΈ ΠΊ ΡΠ°ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅.
ΠΠ²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ#
ΠΠ»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΎΠΊΠ΅Π½ Π±ΠΎΡΠ° Π² ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° MAX API.
Π‘ΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅#
ΠΠ°ΠΊ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ ΠΈ ΠΈΠ½ΠΈΡΠΈΠΈΡΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠ΅Π³ΠΎ Π±ΠΎΡΠ°#
ΠΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ#
Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡΠΌΠΈ ΠΈ ΡΡΠ΅Π½Ρ#
ΠΡΠ²Π΅Ρ Ρ ΠΌΠ΅Π΄ΠΈΠ°ΡΠ°ΠΉΠ»Π°ΠΌΠΈ#
ΠΡΠΈΠΌΠ΅Ρ ΡΡ ΠΎ-Π±ΠΎΡΠ°#
ΠΠΈΡΠ΅Π½Π·ΠΈΡ#
ΠΠ°ΠΊ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ ΠΈ ΠΈΠ½ΠΈΡΠΈΠΈΡΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠ΅Π³ΠΎ Π±ΠΎΡΠ°#
Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Ρ Π²Π°Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π° Π²Π΅ΡΡΠΈΡ Node.js Π½Π΅ Π½ΠΈΠΆΠ΅ 22.18:
node -v
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ:
npm install @green-api/maxbot-chatbot-ts
ΠΠ°ΠΊ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ#
ΠΠ»Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π±ΠΎΡΠ° Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π² ΡΡΠ½ΠΊΡΠΈΡ main Π°Π΄ΡΠ΅Ρ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ MaxBot, MAX token, Π° ΡΠ°ΠΊ ΠΆΠ΅ Π·Π°Π΄Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ RateLimiter ΠΈ Timeout.
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ:
BaseURL- ΠΠ°Π·ΠΎΠ²ΡΠΉ URL-Π°Π΄ΡΠ΅Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ MaxBot. ΠΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ API Π±ΡΠ΄ΡΡ ΠΌΠ°ΡΡΡΡΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΏΠΎ ΡΡΠΎΠΌΡ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΌΡ Π°Π΄ΡΠ΅ΡΡ. ΠΠΊΡΡΠ°Π»ΡΠ½ΡΠΉ Π°Π΄ΡΠ΅Ρ ΡΠΊΠ°Π·Π°Π½ Π² ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ.Token- Π£Π½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΊΠ»ΡΡ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ (API-ΠΊΠ»ΡΡ) Π²Π°ΡΠ΅Π³ΠΎ Π±ΠΎΡΠ°. ΠΠΎΠ»ΡΡΠΈΡΡ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π² Π»ΠΈΡΠ½ΠΎΠΌ ΠΊΠ°Π±ΠΈΠ½Π΅ΡΠ΅ ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ Π±ΠΎΡΠ° Π½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅ business.max.ru. Π§ΠΈΡΠ°ΠΉΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄ Π½Π°ΡΠ°Π»ΠΎΠΌ ΡΠ°Π±ΠΎΡΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΎΠΊΠ΅Π½.ratelimiter- ΠΡΡΡΠΎΠ΅Π½Π½ΡΠΉ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΠ΅Π»Ρ ΡΠ°ΡΡΠΎΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ². ΠΠ½ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΈΡΡ ΠΎΠ΄ΡΡΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ (RPS), Π·Π°ΡΠΈΡΠ°Ρ Π±ΠΎΡΠ° ΠΎΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠΎ ΡΡΠΎΡΠΎΠ½Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° Π·Π° ΠΏΡΠ΅Π²ΡΡΠ΅Π½ΠΈΠ΅ Π»ΠΈΠΌΠΈΡΠΎΠ². Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ β Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ 25, Π½ΠΎ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 30.timeout- ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΠΎΡΠ²Π΅ΡΠ° ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ° (Π² ΡΠ΅ΠΊΡΠ½Π΄Π°Ρ ). ΠΡΠ»ΠΈ ΡΠ΅ΡΠ²Π΅Ρ Π½Π΅ ΠΎΡΠ²Π΅ΡΠΈΡ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, Π·Π°ΠΏΡΠΎΡ Π±ΡΠ΄Π΅Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ. ΠΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ β 30 ΡΠ΅ΠΊΡΠ½Π΄.
async function bootstrap() {
const api = new MaxBotAPI({
base_url: "https://platform-api.max.ru", /* Base url for MAX API requests */
token: "YOUR_BOT_TOKEN", /* Max bot token */
ratelimiter: 25,
timeout: 30000
});
ΠΡΠΈΠΌΠ΅Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π±ΠΎΡΠ°#
import { MaxBotAPI } from '@green-api/maxbot-api-client-ts';
import { Bot } from '@green-api/maxbot-chatbot-ts';
async function bootstrap() {
const api = new MaxBotAPI({
base_url: "https://platform-api.max.ru", /* Base url for MAX API requests */
token: "YOUR_BOT_TOKEN", /* Max bot token */
ratelimiter: 25,
timeout: 30000
});
const myBot = new Bot(api);
try {
await myBot.start();
} catch (error) {
console.error("Error starting bot:", error);
}
}
bootstrap();
ΠΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ#
ΠΡΡΡΠΎΠ΅Π½Π½ΡΠΉ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡ ΡΠΏΡΠΎΡΠ°Π΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΊΠΎΠΌΠ°Π½Π΄, ΠΎΠ±ΡΠ°ΡΠ½ΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² (ΠΊΠΎΠ»Π±Π΅ΠΊΠΎΠ²) ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ.
import { UpdateType, Format } from '@green-api/maxbot-api-client-ts';
myBot.router.command("/start", async (n) => {
await n.reply("Hello! Welcome to the MAX Bot.");
});
myBot.router.register(UpdateType.MessageCreated, async (n) => {
const text = n.text();
if (text === "ping") {
await n.reply("pong", Format.Markdown);
}
});
myBot.router.callback("accept_rules_payload", async (n) => {
await n.reply("*Thank you for accepting the rules!*", Format.Markdown);
await n.answerCallback("Rules accepted");
});
Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡΠΌΠΈ ΠΈ ΡΡΠ΅Π½Ρ#
ΠΠ»Ρ ΡΠ»ΠΎΠΆΠ½ΡΡ Π±ΠΎΡΠΎΠ² (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ, Π²ΠΈΠΊΡΠΎΡΠΈΠ½ ΠΈΠ»ΠΈ ΠΏΠΎΡΠ°Π³ΠΎΠ²ΡΡ ΡΠΎΡΠΌ) ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ (StateManager) ΠΈ ΡΡΠ΅Π½Ρ (Scene). Π‘ΡΠ΅Π½Π° ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΡΠ΅Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ Π² Π΄ΠΈΠ°Π»ΠΎΠ³Π΅ ΠΈ ΠΈΠ·ΠΎΠ»ΠΈΡΡΠ΅Ρ Π΅Ρ Π»ΠΎΠ³ΠΈΠΊΡ.
class RegistrationScene implements Scene {
async start(n: Notification): Promise<void> {
const text = n.text();
if (text === "/start") {
await n.reply("Let's register! What is your *login*?");
return;
}
if (text.length >= 4) {
n.setData({ login: text });
await n.reply(`**Login** \`${text}\` accepted. Now enter your **password**:`);
n.activateNextScene(new PasswordScene());
} else {
await n.reply("Login must be **at least 4 characters long**.");
}
}
}
class PasswordScene implements Scene {
async start(n: Notification): Promise<void> {
const password = n.text();
const data = n.getData<{ login: string }>();
await n.reply(`Success! Profile created.\nLogin: \`${data?.login}\`\nPass: \`${password}\``);
n.activateNextScene(new RegistrationScene());
}
}
const stateManager = new MapStateManager({ step: "start" });
stateManager.setStartScene(new RegistrationScene());
myBot.withStateManager(stateManager);
ΠΡΠ²Π΅Ρ Ρ ΠΌΠ΅Π΄ΠΈΠ°ΡΠ°ΠΉΠ»Π°ΠΌΠΈ#
ΠΠ±Π΅ΡΡΠΊΠ° Notification ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π³ΠΎΡΠΎΠ²ΡΠ΅ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ², Π³Π΅ΠΎΠ»ΠΎΠΊΠ°ΡΠΈΠΉ, ΡΡΠΈΠΊΠ΅ΡΠΎΠ² ΠΈ ΡΡΠ°ΡΡΡΠΎΠ² Π½Π°Π±ΠΎΡΠ° ΡΠ΅ΠΊΡΡΠ°.
myBot.router.command("/photo", async (n) => {
await n.replyWithMedia(
"Check out this image!",
"https://example.com/image.png",
Format.Markdown
);
});
ΠΡΠΈΠΌΠ΅Ρ ΡΡ ΠΎ-Π±ΠΎΡΠ°#
ΠΠ»Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ MAX BOT API, ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΠΌ Π²Π°ΠΌ ΠΊΠΎΠ΄ ΡΡ ΠΎ ΡΠ°Ρ-Π±ΠΎΡΠ°:
import { MaxBotAPI, UpdateType } from '@green-api/maxbot-api-client-ts';
import { Bot, MapStateManager } from '@green-api/maxbot-chatbot-ts';
async function main() {
const api = new MaxBotAPI({
base_url: "https://platform-api.max.ru", /* Base url for MAX API requests */
token: "YOUR_BOT_TOKEN", /* Max bot token */
});
const bot = new Bot(api);
bot.withStateManager(new MapStateManager({}));
bot.router.register(UpdateType.MessageCreated, async (n) => {
const text = n.text();
if (text && !text.startsWith('/')) {
await n.reply(`**Echo:** ${text}`);
}
});
process.on('SIGINT', () => {
console.log("Shutting down...");
bot.stop();
process.exit(0);
});
try {
await bot.start();
} catch (error) {
console.error("Bot initialization error:", error);
}
}
main();
ΠΠΈΡΠ΅Π½Π·ΠΈΡ#
ΠΠΈΡΠ΅Π½Π·ΠΈΡΠΎΠ²Π°Π½ΠΎ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ MIT.