ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

WhatsApp demo Ρ‡Π°Ρ‚-Π±ΠΎΡ‚ с GPT Π½Π° JS#

WhatsApp demo Ρ‡Π°Ρ‚-Π±ΠΎΡ‚ с GPT Π½Π° JS ΠšΠΎΠΌΠΏΠ»Π΅ΠΊΡΠ½Ρ‹ΠΉ дСмонстрационный Ρ‡Π°Ρ‚-Π±ΠΎΡ‚, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ возмоТности ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ @green-api/whatsapp-chatgpt, которая Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π° ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для написания Ρ‡Π°Ρ‚-Π±ΠΎΡ‚ΠΎΠ² с использованиСм сСрвиса GREEN-API.

ΠžΡ‚ΡΠΊΠ°Π½ΠΈΡ€ΡƒΠΉΡ‚Π΅ QR-ΠΊΠΎΠ΄ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ ссылкС для Π½Π°Ρ‡Π°Π»Π° общСния с Ρ‡Π°Ρ‚Π±ΠΎΡ‚ΠΎΠΌ

chatbot-QR

Бсылка Π½Π° Π±ΠΎΡ‚Π°

Для запуска Ρ‡Π°Ρ‚Π±ΠΎΡ‚Π° Π½Π° собствСнном Whatsapp Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π΅ слСдуйтС инструкциям:

ΠžΠ±Π·ΠΎΡ€#

Π­Ρ‚ΠΎΡ‚ Π΄Π΅ΠΌΠΎ-Π±ΠΎΡ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΡ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ WhatsApp-Ρ‡Π°Ρ‚-Π±ΠΎΡ‚ Π½Π° основС ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ OpenAI GPT. Он Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ПО (middleware), ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² сообщСний, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ#

  • Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с OpenAI GPT с настраиваСмыми модСлями
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… языков (автоматичСски ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π½Π° языкС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ)
  • ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠ°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ
  • НСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ПО (Middleware)
  • БистСма ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄
  • ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сообщСний ΠΏΠΎ Ρ‚ΠΈΠΏΠ°ΠΌ
  • ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠΎΠ΄Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°
  • ДСмонстрационныС ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ (имитация API ΠΏΠΎΠ³ΠΎΠ΄Ρ‹)
  • НСсколько Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² личности

Настройка#

ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ трСбования#

Установка#

  1. Π‘ΠΊΠ»ΠΎΠ½ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ:

    git clone https://github.com/green-api/whatsapp-demo-chatgpt-js.git
    cd whatsapp-demo-chatgpt-js
    

  2. УстановитС зависимости:

    npm install
    

  3. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ» .env Π² ΠΊΠΎΡ€Π½Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ содСрТимым:

    INSTANCE_ID=ваш_ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€_инстанса_green_api
    INSTANCE_TOKEN=ваш_Ρ‚ΠΎΠΊΠ΅Π½_инстанса_green_api
    OPENAI_API_KEY=ваш_ΠΊΠ»ΡŽΡ‡_api_openai
    

  4. ЗапуститС Π±ΠΎΡ‚Π°:

    npm start
    

  5. Для Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ:

    npm run start:debug
    

АрхитСктура Π±ΠΎΡ‚Π°#

ΠŸΡ€ΠΎΡ†Π΅ΡΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний#

Π”Π΅ΠΌΠΎ-Π±ΠΎΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ настройку handlersFirst: true, которая устанавливаСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ процСсс ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСний:

  1. Π‘ΠΎΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ сообщСниС
  2. Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ (onText, onRegex, onType) сначала ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ сообщСниС:
    • Если ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ совпадаСт ΠΈ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° останавливаСтся Π½Π° этом этапС (GPT Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ сообщСниС)
    • Если ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ совпадаСт ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° продолТаСтся Π΄ΠΎ GPT
    • Если Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π½Π΅ совпадаСт с сообщСниСм, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° автоматичСски продолТаСтся Π΄ΠΎ GPT
  3. Если ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° продолТаСтся Π΄ΠΎ GPT (Π»ΠΈΠ±ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π½Π΅ совпал, Π»ΠΈΠ±ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ явно Π²Π΅Ρ€Π½ΡƒΠ» true), сообщСниС обрабатываСтся модСлью GPT

ПониманиС этого процСсса критичСски Π²Π°ΠΆΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ:

  • ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ /help ΠΈ /weather, ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ сообщСниС ΠΈ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ Π΅Π³ΠΎ Π² GPT
  • ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²) ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ сообщСниС, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² GPT, Π²Π΅Ρ€Π½ΡƒΠ² true
  • Π›ΡŽΠ±ΠΎΠ΅ сообщСниС, Π½Π΅ совпавшСС с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ, автоматичСски отправляСтся Π² GPT

Π‘Π΅Π· установки handlersFirst: true всС сообщСния сначала Π±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π»ΠΈΡΡŒ Π² GPT, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ…Π΅Π½Π΄Π»Π΅Ρ€ΠΎΠ².

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ#

Π‘ΠΎΡ‚ настраиваСтся с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ:

const bot = new WhatsappGptBot({
    idInstance: process.env.INSTANCE_ID || "",
    apiTokenInstance: process.env.INSTANCE_TOKEN || "",
    openaiApiKey: process.env.OPENAI_API_KEY || "",
    model: "gpt-4o",
    systemMessage: "ВсСгда ΠΎΡ‚Π²Π΅Ρ‡Π°ΠΉ Π½Π° языкС, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΈΡˆΠ΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ...",
    maxHistoryLength: 15,
    temperature: 0.5,
    handlersFirst: true,
    clearWebhookQueueOnStart: true,
});

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ сообщСний#

ДСмонстрация Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ стандартноС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅:

class EnhancedImageHandler extends ImageMessageHandler {
    async processMessage(message: Message, openai: OpenAI, model: OpenAIModel): Promise<any> {
        const result = await super.processMessage(message, openai, model);

        if (typeof result === "string") {
            return result.replace(
                "[The user sent an image",
                "[ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Π‘ΠΊΠ°ΠΆΠΈΡ‚Π΅ Π΅ΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ Ρ‚Π° модСль..."
            );
        }

        return result;
    }
}

// РСгистрация ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°
bot.replaceHandler(ImageMessageHandler, new EnhancedImageHandler());

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ПО (Middleware)#

ДСмонстрация Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ПО, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ возмоТности:

ΠŸΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ ПО для логирования#

const loggingMessageMiddleware: ProcessMessageMiddleware = async (
    message, messageContent, messages, _
) => {
    console.log(`[${new Date().toISOString()}] ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ (${message.chatId}): `,
        typeof messageContent === "string"
            ? messageContent
            : JSON.stringify(messageContent));

    return {messageContent, messages};
};

bot.addMessageMiddleware(loggingMessageMiddleware);

ΠŸΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ ПО для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ контСкста#

const timeContextMiddleware: ProcessMessageMiddleware = async (
    _, messageContent, messages, __
) => {
    const systemIndex = messages.findIndex(m => m.role === "system");
    if (systemIndex >= 0 && typeof messages[systemIndex].content === "string") {
        const now = new Date();
        const timeContext = `Π’Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя: ${now.toLocaleString()}`;

        // Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ контСкста Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² систСмном сообщСнии
        // ...
    }

    return {messageContent, messages};
};

bot.addMessageMiddleware(timeContextMiddleware);

ΠŸΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ ПО для ΠΌΠΎΠ΄Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°#

const moderationMiddleware: ProcessMessageMiddleware = async (
    _, messageContent, messages, __
) => {
    const sensitiveKeywords = [
        "stupid", "bad", "awful",
    ];

    if (typeof messageContent === "string") {
        // ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов ΠΈ ΠΈΡ… ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠ° ΠΏΡ€ΠΈ нСобходимости
        // ...
    }

    return {messageContent, messages};
};

bot.addMessageMiddleware(moderationMiddleware);

ΠŸΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ ПО для подписи ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²#

const signatureMiddleware: ProcessResponseMiddleware = async (
    response, messages, _
) => {
    const signature = "β€” GREEN-API WhatsApp GPT Π±ΠΎΡ‚";

    // Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ подписи ΠΊ ΠΎΡ‚Π²Π΅Ρ‚Π°ΠΌ
    // ...

    return {
        response: enhancedResponse,
        messages
    };
};

bot.addResponseMiddleware(signatureMiddleware);

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄#

ДСмонстрация Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ нСсколько ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄ для дСмонстрации систСмы ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄:

Команда ΠΏΠΎΠΌΠΎΡ‰ΠΈ#

bot.onText("/help", async (message, _) => {
    const helpText = `*Π”Π΅ΠΌΠΎ-Π±ΠΎΡ‚ WhatsAppGPT*

ДоступныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:
- /help - ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ это сообщСниС ΠΏΠΎΠΌΠΎΡ‰ΠΈ
- /clear - ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π°
- /mode [professional|casual|creative] - Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡΡ‚ΠΈΠ»ΡŒ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²
- /weather [мСстополоТСниС] - ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΠΎΠ³ΠΎΠ΄Π΅ (Π΄Π΅ΠΌΠΎ)
...`;

    await bot.sendText(message.chatId, helpText);
});

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ историСй#

bot.onText("/clear", async (message, session) => {
    // Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ систСмноС сообщСниС
    if (session.stateData && session.stateData.messages) {
        const systemMessage = session.stateData.messages.find(m => m.role === "system");
        session.stateData.messages = systemMessage ? [systemMessage] : [];
        await bot.sendText(message.chatId, "βœ“ Π˜ΡΡ‚ΠΎΡ€ΠΈΡ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π° ΠΎΡ‡ΠΈΡ‰Π΅Π½Π°!");
    } else {
        await bot.sendText(message.chatId, "НСт истории Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π° для очистки.");
    }
});

ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π΅ΠΆΠΈΠΌΠ° личности#

bot.onRegex(/^\/mode\s+(professional|casual)$/i, async (message, session) => {
    // Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
    // ...

    // ОбновлСниС систСмной подсказки Π² зависимости ΠΎΡ‚ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ°
    // ...

    await bot.sendText(message.chatId, `Π Π΅ΠΆΠΈΠΌ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ Π½Π° ΡΡ‚ΠΈΠ»ΡŒ *${mode}*! 🎭`);
});

Π”Π΅ΠΌΠΎ-ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΠΎΠ³ΠΎΠ΄Ρ‹#

bot.onRegex(/^\/weather\s+(.+)$/i, async (message, _) => {
    // Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ мСстополоТСния ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
    // ...

    // Π˜ΠΌΠΈΡ‚Π°Ρ†ΠΈΡ Π²Ρ‹Π·ΠΎΠ²Π° API ΠΏΠΎΠ³ΠΎΠ΄Ρ‹
    // ...

    await bot.sendText(
        message.chatId,
        `*Погода для ${weather.location}*\n` +
        // Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎ ΠΏΠΎΠ³ΠΎΠ΄Π΅
        // ...
    );
});

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ²#

ДСмонстрация Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ для Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² сообщСний:

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ мСстополоТСния#

bot.onType("location", async (message, _) => {
    if (!message.location) return;

    // Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎ мСстополоТСнии
    // ...

    // Π˜ΠΌΠΈΡ‚Π°Ρ†ΠΈΡ Π±Π»ΠΈΠΆΠ°ΠΉΡˆΠΈΡ… мСст
    // ...

    await bot.sendText(message.chatId, response);
});

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²#

bot.onType("document", async (message, _) => {
    if (!message.media) return;

    const fileName = message.media.fileName || "нСизвСстный Ρ„Π°ΠΉΠ»";

    await bot.sendText(
        message.chatId,
        `Π― ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» ваш Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚: "${fileName}"\n\n_ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π­Ρ‚ΠΎ дСмонстрация..._`
    );
    return true;
});

Запуск Π±ΠΎΡ‚Π°#

Запуск Π±ΠΎΡ‚Π° обрабатываСтся с ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ ошибок ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ΠΌ:

console.log("Запуск Π΄Π΅ΠΌΠΎ-Π±ΠΎΡ‚Π° WhatsApp GPT...");
bot.start().then(() => {
    console.log("Π‘ΠΎΡ‚ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π·Π°ΠΏΡƒΡ‰Π΅Π½!");
}).catch(error => {
    console.error("НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π±ΠΎΡ‚Π°:", error);
});

process.on("SIGINT", () => {
    console.log("ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π±ΠΎΡ‚Π°...");
    bot.stop();
    process.exit(0);
});

Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ дСмонстрации#

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ ΠΊΠ°ΠΊ ΠΎΡ‚ΠΏΡ€Π°Π²Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ для вашСго собствСнного WhatsApp GPT Π±ΠΎΡ‚Π°. Π’ΠΎΡ‚ нСсколько ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΏΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡŽ:

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄#

Π§Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ onText ΠΈΠ»ΠΈ onRegex:

bot.onText("/mycommand", async (message, session) => {
    // Π’Π°ΡˆΠ° Π»ΠΎΠ³ΠΈΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ здСсь
    await bot.sendText(message.chatId, "ΠžΡ‚Π²Π΅Ρ‚ Π½Π° мою ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ");
});

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ПО#

Π§Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ ПО, создайтС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΡƒΡŽ интСрфСйс ProcessMessageMiddleware ΠΈΠ»ΠΈ ProcessResponseMiddleware:

const myMiddleware: ProcessMessageMiddleware = async (
    message, messageContent, messages, sessionData
) => {
    // Π’Π°ΡˆΠ° Π»ΠΎΠ³ΠΈΠΊΠ° ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ПО здСсь
    return {messageContent, messages};
};

bot.addMessageMiddleware(myMiddleware);

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² сообщСний#

Для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½ΠΎΠ²Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² сообщСний ΠΈΠ»ΠΈ измСнСния ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²:

class MyCustomHandler implements MessageHandler {
    canHandle(message: Message): boolean {
        // ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅, ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ этот ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ сообщСниС
        return message.type === "my-custom-type";
    }

    async processMessage(message: Message): Promise<any> {
        // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сообщСния
        return "ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚";
    }
}

bot.registerMessageHandler(new MyCustomHandler());

ЛицСнзия#

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π»ΠΈΡ†Π΅Π½Π·ΠΈΡ€ΠΎΠ²Π°Π½ ΠΏΠΎ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ CC-BY-ND-4.0.