post-image

Chatbot Messenger đơn giản trong Spring Boot

Social

Chatbot Messenger là phần mềm được kết nối với Facebook Messenger, giúp hoạt động bán hàng và chăm sóc khách hàng có thể thực hiện tự động. Ở bài viết này, mình sẽ hướng dẫn mọi người cách tạo ra một ChatBot cho page của mình trên Facebook để tự động reply những tin nhắn đơn giản. Bài viết này mình sẽ sử dụng mình số kiến thức cũ liên quan như:

Chuẩn bị

Tạo một ứng dụng trên Facebook developer

Chatbot
  • Sau khi click chọn tạo mới chúng ta tích chọn Quản lý tiện ích tích hợp cho doanh nghiệp và chọn như sau:
Chatbot
Chatbot
  • Sau khi tạo xong ứng dụng chúng ta vào cài đặt -> thông tin cơ bản
  • Và tại giao diện này chúng ta sẽ click vào ô hiển thị của khóa bí mật để lấy SecretKey của ứng dụng.
  • Chúng ta quay trở lại giao diện trang chủ và chọn thiết lập Messenger Webhook. 
    • Nhưng trước hết chúng ta phải tạo mới một trang Page Facebook để quản lý như sau:
    • Tại giao diện thiết lập Messenger chúng ta thêm trang vừa tạo vào đây và sẽ nhận được 1 đoạn Page Access Token để truy cập vào page.

Vậy là bước chuẩn bị trên Facebook developer đã xong giờ chúng ta tiến hành cài đặt các thư viện.

Cài đặt thư viện

Chúng ta tạo một ứng dụng Spring Boot với những thư viện như sau:

    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }Code language: JavaScript (javascript)

Vầ để tạo được ChatBot Messenger cho Facebook mình sử dụng thư viện của messenger4j. Chúng ta thêm thư viện của messenger4j vào trong dự án như sau:

compile group: 'com.github.messenger4j', name: 'messenger4j', version: '1.0.0'Code language: JavaScript (javascript)

Cấu hình file application.properties

Chúng ta truy cập vào file application.properties được để ở trong resource và chỉnh sửa như sau:

server.port=${port:8080}
#Profile
spring.profiles.active=${ENV:}
messenger4j.appSecret=${YOUR_APP_SECRET:}
messenger4j.verifyToken=${YOUR_VERIFY_TOKEN:}
messenger4j.pageAccessToken=${YOUR_PAGE_ACCESS_TOKEN:}Code language: PHP (php)
  • YOUR_APP_SECRET : các bạn sẽ điền mã bí mật của ứng dụng vào đây (mình đã hướng dẫn cách lấy ở trên).
  • YOUR_VERIFY_TOKEN: các bạn sẽ điền đoạn token bất kỳ vào đây có thể là 123456789 hoặc 123abcd,…
  • YOUR_PAGE_ACCESS_TOKEN: chỗ này chúng ta sẽ điền đoạn access token vừa lấy được để ứng dụng có truy cập vào trong Page Facebook của chúng ta ( mình cũng đã hướng dẫn cách lấy ở bước chuẩn bị).

Cấu hình các thư viện

Các bạn thêm đoạn khai báo Bean Messenger ở trong class được đánh dấu là @Configuration ở đây mình khai báo ở trong class DemoApplication

DemoApplication.java

package com.example.demo;

import com.github.messenger4j.Messenger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class DemoApplication {
    @Bean
    public Messenger messenger(@Value("${messenger4j.pageAccessToken}") String pageAccessToken,
 @Value("${messenger4j.appSecret}") final String appSecret,
 @Value("${messenger4j.verifyToken}") final String verifyToken) {
        return Messenger.create(pageAccessToken, appSecret, verifyToken);
    }
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
Code language: JavaScript (javascript)

Tạo webhook

Như mình đã nói ở phần chuẩn bị chúng ta sẽ cần phải cài đặt cả webhook của ứng dụng trên trang developer của facebook để có thể sử dụng được chatbot.

Đầu tiên chúng ta sẽ tạo một Controller có tên là WebhookController mình sẽ để mapping của controller này là “/webhook”.

WebhookController.java

package com.example.demo.controller;

import com.github.messenger4j.Messenger;
import com.github.messenger4j.exception.MessengerApiException;
import com.github.messenger4j.exception.MessengerIOException;
import com.github.messenger4j.exception.MessengerVerificationException;
import com.github.messenger4j.send.MessagePayload;
import com.github.messenger4j.send.MessagingType;
import com.github.messenger4j.send.NotificationType;
import com.github.messenger4j.send.message.TextMessage;
import com.github.messenger4j.send.recipient.IdRecipient;
import com.github.messenger4j.webhook.event.TextMessageEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import static com.github.messenger4j.Messenger.*;
import static java.util.Optional.empty;
import static java.util.Optional.of;

@RestController
@CrossOrigin("*")
@RequestMapping("/webhook")
public class WebhookController {
    private static final Logger logger = LoggerFactory.getLogger(WebhookController.class);

    private final Messenger messenger;

    @Autowired
    public WebhookController(final Messenger messenger) {
        this.messenger = messenger;
    }

    @GetMapping
    public ResponseEntity<String> verifyWebhook(@RequestParam(MODE_REQUEST_PARAM_NAME) final String mode,
                                                @RequestParam(VERIFY_TOKEN_REQUEST_PARAM_NAME) final String verifyToken, @RequestParam(CHALLENGE_REQUEST_PARAM_NAME) final String challenge) {
        logger.debug("Received Webhook verification request - mode: {} | verifyToken: {} | challenge: {}", mode, verifyToken, challenge);
        try {
            this.messenger.verifyWebhook(mode, verifyToken);
            return ResponseEntity.ok(challenge);
        } catch (MessengerVerificationException e) {
            logger.warn("Webhook verification failed: {}", e.getMessage());
            return ResponseEntity.status(HttpStatus.FORBIDDEN).body(e.getMessage());
        }
    }

    @PostMapping
    public ResponseEntity<Void> handleCallback(@RequestBody final String payload, @RequestHeader(SIGNATURE_HEADER_NAME) final String signature) throws MessengerVerificationException {
        this.messenger.onReceiveEvents(payload, of(signature), event -> {
            if (event.isTextMessageEvent()) {
                try {
                    logger.info("0");
                    handleTextMessageEvent(event.asTextMessageEvent());
                    logger.info("1");
                } catch (MessengerApiException e) {
                    logger.info("2");
                    e.printStackTrace();
                } catch (MessengerIOException e) {
                    logger.info("3");
                    e.printStackTrace();
                }
            } else {
                String senderId = event.senderId();
                sendTextMessageUser(senderId, "Tôi là bot chỉ có thể xử lý tin nhắn văn bản.");
            }
        });
        return ResponseEntity.status(HttpStatus.OK).build();
    }

    private void handleTextMessageEvent(TextMessageEvent event) throws MessengerApiException, MessengerIOException {
        final String senderId = event.senderId();
        sendTextMessageUser(senderId, "Xin chào! Đây là chatbot được tạo từ ứng dụng Spring Boot");

    }

    private void sendTextMessageUser(String idSender, String text) {
        try {
            final IdRecipient recipient = IdRecipient.create(idSender);
            final NotificationType notificationType = NotificationType.REGULAR;
            final String metadata = "DEVELOPER_DEFINED_METADATA";

            final TextMessage textMessage = TextMessage.create(text, empty(), of(metadata));
            final MessagePayload messagePayload = MessagePayload.create(recipient, MessagingType.RESPONSE, textMessage,
                    of(notificationType), empty());
            this.messenger.send(messagePayload);
        } catch (MessengerApiException | MessengerIOException e) {
            handleSendException(e);
        }
    }

    private void handleSendException(Exception e) {
        logger.error("Message could not be sent. An unexpected error occurred.", e);
    }
}
Code language: JavaScript (javascript)

Ở đoạn code trên như các bạn thấy thì mình có sử dụng 2 phương thức GET và POST. Phương thức GET được sử dụng để xác thực xem webhook của chúng ta có được xác thực hay không. Còn phương thức POST được sử dụng để tự động gửi tin nhắn cho người dùng Facebook và chatbot này của mình demo chỉ gửi những tin nhắn văn bản.

Đưa ứng dụng lên trên Heroku

Vì hiện tại trang developer của Facebook không còn chấp nhận việc sử dụng localhost để sử dụng các API của Facebook nên mình sẽ đưa ứng dụng lên trên Heroku. 

Mọi người có thể xem lại bài hướng dẫn tại đây.

Hoàn thiện cấu hình trên trang developer

  • Mọi người truy cập lại ứng dụng của mình trên trang developer và hoàn thiện phần cài đặt như sau:
  • Ở phần webhook trong cài đặt của Messenger chúng ta thêm url gọi lại như sau:
  • Sau đó điền đường dẫn đến phương thức GET của Webhook controller vào phần url gọi lại và điền mã bí mật của bạn chính là YOUR_VERIFY_TOKEN đã được khai báo trong application.properties ở trên.
  • Sau đó các bạn chọn 2 trường cho messenger như sau:
  • Chú ý ở bước này các bạn chỉ chọn những trường cần thiết nếu chọn quá nhiều trường chatbot của bạn sẽ trở thành “spam” nhắn rất nhiều tin nhắn một lúc tới bạn.

Sau khi hoàn thành xong bước trên thì chúng ta đã hoàn thành việc xây dựng 1 ChatBot. Các bạn hãy thử tự nhắn tin vào trang Page Facebook vừa tạo của mình và ChatBot sẽ tự động gửi lại tin nhắn trả lời và dưới đây là thành quả của mình ^^

Kết luận

Vậy là mình đã hướng dẫn tạo ra một ChatBot Messenger đơn giản cho các bạn. Mọi người có thể tự tạo ra những con bot thú vị hơn cho mình sau khi đọc xong bài viết này nhé ^^

Leave a Reply

Your email address will not be published. Required fields are marked *