Перейти к содержанию

Получение и обработка сообщений на Golang#

Установка#

Перед началом необходимо установить библиотеку и инициировать бота, подробно этот процесс описан здесь: Как импортировать библиотеку и инициировать своего бота.

Как начать получать сообщения и отвечать на них#

Чтобы начать получать уведомления, необходимо вызвать у бота метод bot.StartReceivingNotifications(). Но перед этим необходимо добавить обработчик, это можно сделать двумя способами. Вы можете сделать это сразу в функции main как в примере base.

Ссылка на пример: base.go .

package base

import (
    "github.com/green-api/whatsapp_chatbot_golang"
)

func main() {
    bot := whatsapp_chatbot_golang.NewBot("INSTANCE_ID", "TOKEN")

    bot.IncomingMessageHandler(func(message *whatsapp_chatbot_golang.Notification) {
        if message.Filter(map[string][]string{"text": {"test"}}) {
            message.AnswerWithText("Well done! You have write \"test\".")
        } else {
            message.AnswerWithText("Write \"test\"!")
        }
    })

    bot.StartReceivingNotifications()
}

Если у вас сложные вложенные сценарии, лучше использовать сцены как в примере baseScene. Пользоваться сценами просто - достаточно вынести логику бота в отдельную структуру, которая реализовывает интерфейс Scene, и добавить ее в бот методом bot.SetStartScene(StartScene{}). Стартовая сцена может вызвать следующую с помощью метода message.ActivateNextScene(NextScene{}), тогда следующий вебхук попадет уже в новую сцену, это позволит разделить бота на отдельные части и сделает код более читаемым и редактируемым:

Ссылка на пример: baseScene.go .

package base

import (
    "github.com/green-api/whatsapp_chatbot_golang"
)

func main() {
    bot := whatsapp_chatbot_golang.NewBot("INSTANCE_ID", "TOKEN")

    bot.SetStartScene(StartScene{})

    bot.StartReceivingNotifications()
}

type StartScene struct {
}
func (s StartScene) Start(bot *whatsapp_chatbot_golang.Bot) {
    bot.IncomingMessageHandler(func(message *whatsapp_chatbot_golang.Notification) {
        if message.Filter(map[string][]string{"text": {"test"}}) {
            message.AnswerWithText("Well done! You have write \"test\".")
            message.AnswerWithText("Now write \"second scene\"")
            message.ActivateNextScene(SecondScene{})
        } else {
            message.AnswerWithText("Write \"test\"!")
        }
    })
}

type SecondScene struct {
}
func (s SecondScene) Start(bot *whatsapp_chatbot_golang.Bot) {
    bot.IncomingMessageHandler(func(message *whatsapp_chatbot_golang.Notification) {
        if message.Filter(map[string][]string{"text": {"second scene"}}) {
            message.AnswerWithText("Well done! You have write \"second scene\".")
            message.ActivateNextScene(StartScene{})
        } else {
            message.AnswerWithText("This is second scene write \"second scene\"!")
        }
    })
}

Если вам нужно чтобы при создании нового состояния, оно уже имело некоторые дефолтные значения, необходимо изменить поле InitData у структуры StateManager. В стандартной имплементации MapStateManager это делается так:

package main

import (
    "github.com/green-api/whatsapp_chatbot_golang"
    "github.com/green-api/whatsapp_chatbot_golang/examples/full"
)

func main() {
    bot := whatsapp_chatbot_golang.NewBot("INSTANCE_ID", "TOKEN")

    bot.StateManager = whatsapp_chatbot_golang.NewMapStateManager(
        map[string]interface{}{
            "defaultField1": "defaultValue1",
            "defaultField2": "defaultValue2",
            "defaultField3": "defaultValue3",
        })

    bot.SetStartScene(full.StartScene{})

    bot.StartReceivingNotifications()
}

Обратите внимание, что во время выполнения запросов могут возникать ошибки, чтобы ваша программа не прерывалась из-за них, вам необходимо обрабатывать ошибки. Все ошибки библиотеки отправляются в канал ErrorChannel, вы можете обработать их например таким способом:

package main

import (
    "fmt"
    "github.com/green-api/whatsapp_chatbot_golang"
    "github.com/green-api/whatsapp_chatbot_golang/examples/full"
)

func main() {
    bot := whatsapp_chatbot_golang.NewBot("INSTANCE_ID", "TOKEN")

    bot.SetStartScene(full.StartScene{})

    //Все ошибки будут просто выводиться в консоль
    go func() {
        select {
        case err := <-bot.ErrorChannel:
            if err != nil {
                fmt.Println(err)
            }
        }
    }()

    bot.StartReceivingNotifications()
}

Список примеров#

Описание Ссылка на пример
Как инициализировать обработчик base.go
Как инициализировать сцену baseScene.go
Сцена "Эхо" echo.go
Как получать другие типы уведомлений event.go
Как фильтровать входящие сообщения filter.go
Как работать с состоянием бота state.go
Пример готового чат бота full.go