4

Chúng tôi sẽ sử dụng JBot để tạo Bot Facebook Messenger ngay hôm nay vì trước đó chúng tôi đã sử dụng JBot để tạo Bot Slack .

Tương tự như Slack , Facebook đơn giản nhưng có thêm vài bước:

  1. Nhân bản dự án này $ git clone git@github.com:ramswaroop/jbot.git.
  2. Tạo một ứng dụng Facebook và một trang .
  3. Tạo mã thông báo truy cập trang cho trang (bên trong cài đặt trình nhắn tin của ứng dụng).
  4. Dán mã thông báo được tạo ở trên trong tệp application.properIES .
  5. Chạy ứng dụng ví dụ bằng cách chạy JBotApplicationtrong IDE của bạn hoặc thông qua dòng lệnh:
    $ cd JBot
    $ mvn clean install
    $ cd jbot-example
    $ mvn spring-boot:run
  6. Thiết lập webhook để nhận tin nhắn và các sự kiện khác. Bạn cần có một địa chỉ công cộng an toàn để thiết lập webhook. Bạn có thể sử dụng localtunnel.me để tạo địa chỉ công cộng an toàn nếu bạn đang chạy cục bộ trên máy của mình.
  7. Chỉ định địa chỉ được tạo ở trên trong trường "Gọi lại Url" trong cài đặt "Webooks" và cung cấp mã xác minh dưới dạng fb_token_for_jbotvà nhấp vào "Xác minh và lưu".

Bây giờ bạn có thể bắt đầu nhắn tin cho bot của mình bằng cách truy cập trang Facebook và nhấp vào nút "Gửi tin nhắn".

Nếu bạn quá lười để bắt đầu ngay bây giờ và chỉ muốn chơi xung quanh, bạn có thể thử jbot-examplebằng cách truy cập trang Facebook JBot và nhấp vào nút "Gửi tin nhắn".

Cách sử dụng cơ bản

Chức năng chính của Bot là nhận và trả lời tin nhắn. Với JBot, việc nhận tin nhắn dễ dàng như chỉ cần viết một cách đơn giản @Controllervà trả lời nó bằng cách gọi reply()phương thức như dưới đây:

@Controller(events = EventType.MESSAGE)
public void onReceiveMessage(Event event) {
    if ("hi".equals(event.getMessage().getText())) {
        reply(event, "Hi, I am JBot.");
    }
}


Tất cả mã cho bot của bạn đi trong lớp FbBot mở rộng Bot từ gói cốt lõi. Bạn có thể có nhiều bot như bạn muốn, chỉ cần làm cho lớp mở rộng lớp Bot và nó có được tất cả sức mạnh của Bot Facebook. Mặc dù nên có các phiên bản JBot riêng cho các bot khác nhau.

Xây dựng Facebook Messenger Bot với JBot

Trước khi chúng tôi đi sâu vào chi tiết, hãy chắc chắn rằng bạn có ứng dụng Facebook, trang fb và đã thiết lập webhooks. Xem phần  Bắt đầu để tìm hiểu thêm.

Thiết lập Bot của bạn

Trong Facebook, chúng tôi có thể tạo bot messenger cho các trang chứ không phải cho người dùng. Để bắt đầu sử dụng API fb, chúng tôi cần mã thông báo truy cập trang có thể được tạo từ bất kỳ cài đặt ứng dụng fb nào của bạn. Mã thông báo truy cập trang này cần được chỉ định trong  tệp application.properations trong ví dụ jbot. Bạn cũng có thể loại bỏ "chùng" khỏi spring.profiles.active. Sau này, bạn có thể khởi động bot bằng cách chạy JBotApplicationtừ IDE của bạn hoặc thông qua dòng lệnh.

Khi bot được khởi động, bạn có thể truy cập cài đặt và cài đặt webhook của ứng dụng. Cung cấp url an toàn cho ứng dụng bot của bạn, bạn có thể sử dụng localtunnel.me để tạo một địa chỉ nếu bạn đang chạy trên máy của mình chứ không phải trên bất kỳ máy chủ nào. Bạn cũng cần cung cấp "Xác minh mã thông báo" có thể tìm thấy trong tệp application.properIES trong thuộc fbBotTokentính.

Nhận tin nhắn

Facebook sẽ gửi Callback để /webhookcho tất cả các sự kiện trang của bạn đã đăng ký. Nó gửi theo POSTyêu cầu đến /webhookđiểm cuối của bạn .

May mắn thay, với JBot, bạn không phải lo lắng về việc xác định xử lý của riêng bạn để xử lý những POSTcuộc gọi, phân tích sự kiện vv Để nhận các sự kiện từ Fb, bạn chỉ cần phải xác định phương pháp với @Controllerchú thích (từ đây trở đi, chúng tôi sẽ gọi cho họ như @Controller).

tôi. Đây là một ví dụ đơn giản được gọi khi bot của bạn nhận được một sự kiện loại MESSAGEhoặc POSTBACKtừ Facebook.

@Controller(events = {EventType.MESSAGE, EventType.POSTBACK})
public void onReceiveMessage(Event event) {
    if ("hi".equals(event.getMessage().getText())) {
        reply(event, "Hi, I am JBot.");
    }
}

ii. Một ví dụ khác có thêm một patternđến @Controller. Việc thêm một mẫu sẽ hạn chế phương thức chỉ được gọi khi văn bản sự kiện hoặc tải trọng sự kiện (tùy thuộc vào loại sự kiện) khớp với mẫu được xác định. Bạn có thể chỉ định một biểu thức chính quy trong pattern.

@Controller(events = {EventType.MESSAGE, EventType.POSTBACK}, pattern = "^(?i)(hi|hello|hey)$")
public void onGetStarted(Event event) {
    // quick reply buttons
    Button[] quickReplies = new Button[]{
            new Button().setContentType("text").setTitle("Sure").setPayload("yes"),
            new Button().setContentType("text").setTitle("Nope").setPayload("no")
    };
    reply(event, new Message().setText("Hello, I am JBot. Would you like to see more?").setQuickReplies(quickReplies));
}

Bạn có thể tùy chọn có một matchertham số chính thức (sau sự kiện) trong phương thức nếu bạn muốn làm việc với các giá trị khớp được gửi bởi người dùng. Bạn có thể truy cập bằng matcher.group(0), matcher.group(1)v.v.

Một điều cần lưu ý ở đây, patternsẽ được khớp với texthoặc payloadtùy thuộc vào loại sự kiện nhận được. Đối với ví dụ dưới đây, sự kiện nhận được sẽ thuộc loại QUICK_REPLYpatterntrong trường hợp này sẽ được khớp với payloadthuộc tính trong QuickReplyvà không chống lại textthuộc tính.

@Controller(events = EventType.QUICK_REPLY, pattern = "(yes|no)")
public void onReceiveQuickReply(Event event) {
    if ("yes".equals(event.getMessage().getQuickReply().getPayload())) {
        reply(event, "Cool! You can type: \n 1) Show Buttons \n 2) Show List \n 3) Setup meeting");
    } else {
        reply(event, "See you soon!");
    }
}


Bạn có thể xem tất cả các sự kiện webhook mà nền tảng messenger hiện đang hỗ trợ. Bạn có thể thấy rằng không có QUICK_REPLYloại sự kiện cụ thể được liệt kê ở đó. Đây là một sự kiện bổ sung được thêm vào bởi JBot để làm cho nhiệm vụ của bạn dễ dàng hơn.

Gửi tin nhắn

Giống như nhận, để gửi tin nhắn cho người dùng từ bot của bạn, bạn cần thực hiện POSTcuộc gọi đến API Gửi của Facebook . Nhưng một lần nữa, với JBot, bạn có thể trả lời đơn giản bằng cách gọi reply()phương thức từ bên trong @Controllerphương thức của bạn . Có nhiều phiên bản quá tải khác nhau của reply()phương pháp để phù hợp với nhu cầu của bạn.

tôi. Các đơn giản nhất ví dụ là như thế nào,

reply(event, "Hi, I am Jbot.");


Nó nhận một đối tượng sự kiện và một chuỗi là văn bản trả lời.

ii. Một ví dụ khác trong đó JBot trả lời bằng hai nút trả lời nhanh :

// quick reply buttons
Button[] quickReplies = new Button[]{
        new Button().setContentType("text").setTitle("Sure").setPayload("yes"),
        new Button().setContentType("text").setTitle("Nope").setPayload("no")
};
reply(event, new Message().setText("Hello, I am JBot. Would you like to see more?").setQuickReplies(quickReplies));


Nếu bạn thấy ở đây, chúng tôi đã thiết lập payloadtrong cả hai nút. Vì vậy, để biết người dùng đã nhấp vào nút nào, bạn có thể có một @Controllersự kiện EventType.QUICK_REPLYvà mẫu (yes|no)như dưới đây:

@Controller(events = EventType.QUICK_REPLY, pattern = "(yes|no)")
public void onReceiveQuickReply(Event event) {
    if ("yes".equals(event.getMessage().getQuickReply().getPayload())) {
        reply(event, "Cool! You can type: \n 1) Show Buttons \n 2) Show List \n 3) Setup meeting");
    } else {
        reply(event, "See you soon!");
    }
}


iii. Trong ví dụ này, JBot trả lời bằng hai nút tiêu chuẩn :

Button[] buttons = new Button[]{
        new Button().setType("web_url").setUrl("http://blog.ramswaroop.me").setTitle("JBot Docs"),
        new Button().setType("web_url").setUrl("https://goo.gl/uKrJWX").setTitle("Buttom Template")
};
reply(event, new Message().setAttachment(new Attachment().setType("template").setPayload(new Payload()
        .setTemplateType("button").setText("These are 2 link buttons.").setButtons(buttons))));


iv. Ví dụ cuối cùng cho thấy JBot trả lời với danh sách ba mục :

Element[] elements = new Element[]{
        new Element().setTitle("AnimateScroll").setSubtitle("A jQuery Plugin for Animating Scroll.")
                .setImageUrl("https://plugins.compzets.com/images/as-logo.png")
                .setDefaultAction(new Button().setType("web_url").setMessengerExtensions(true)
                .setUrl("https://plugins.compzets.com/animatescroll/")),
        new Element().setTitle("Windows on Top").setSubtitle("Keeps a specific Window on Top of all others.")
                .setImageUrl("https://plugins.compzets.com/images/compzets-logo.png")
                .setDefaultAction(new Button().setType("web_url").setMessengerExtensions(true)
                .setUrl("https://www.compzets.com/view-upload.php?id=702&action=view")),
        new Element().setTitle("SimpleFill").setSubtitle("Simplest form filler ever.")
                .setImageUrl("https://plugins.compzets.com/simplefill/chrome-extension/icon-64.png")
                .setDefaultAction(new Button().setType("web_url").setMessengerExtensions(true)
                .setUrl("https://plugins.compzets.com/simplefill/"))
};
reply(event, new Message().setAttachment(new Attachment().setType("template").setPayload(new Payload()
        .setTemplateType("list").setElements(elements))));


Đây là một screencast cho thấy tất cả các ví dụ chúng ta đã thảo luận:

Bạn nên xem API Gửi của Facebook để biết tất cả các loại trả lời mà bot có thể gửi. Ví dụ: bạn thậm chí có thể gửi biên nhận cho người dùng của mình, thẻ lên máy bay của hãng hàng không và nhiều hơn nữa.

Cuộc trò chuyện

Đây là một tính năng khác biệt của JBot, với điều này bạn có thể nói chuyện với bot của mình theo nghĩa đen và có một cuộc trò chuyện. Xem bên dưới để biết ví dụ về cách bot của bạn thiết lập một cuộc họp cho nhóm của bạn bằng cách hỏi từng câu hỏi đơn giản.


/**
 * Type "setup meeting" to start a conversation with the bot. Provide the name of the next method to be
 * invoked in {@code next}. This method is the starting point of the conversation (as it
 * calls {@link Bot#startConversation(Event, String)} within it. You can chain methods which will be invoked
 * one after the other leading to a conversation.
 *
 * @param event
 */
@Controller(pattern = "(?i)(setup meeting)", next = "confirmTiming")
public void setupMeeting(Event event) {
    startConversation(event, "confirmTiming");   // start conversation
    reply(event, "Cool! At what time (ex. 15:30) do you want me to set up the meeting?");
}

/**
 * This method will be invoked after {@link FbBot#setupMeeting(Event)}. You need to
 * call {@link Bot#nextConversation(Event)} to jump to the next question in the conversation.
 *
 * @param event
 */
@Controller(next = "askTimeForMeeting")
public void confirmTiming(Event event) {
    reply(event, "Your meeting is set at " + event.getMessage().getText() +
            ". Would you like to repeat it tomorrow?");
    nextConversation(event);    // jump to next question in conversation
}

/**
 * This method will be invoked after {@link FbBot#confirmTiming(Event)}. You can
 * call {@link Bot#stopConversation(Event)} to end the conversation.
 *
 * @param event
 */
@Controller(next = "askWhetherToRepeat")
public void askTimeForMeeting(Event event) {
    if (event.getMessage().getText().contains("yes")) {
        reply(event, "Okay. Would you like me to set a reminder for you?");
        nextConversation(event);    // jump to next question in conversation  
    } else {
        reply(event, "No problem. You can always schedule one with 'setup meeting' command.");
        stopConversation(event);    // stop conversation only if user says no
    }
}

/**
 * This method will be invoked after {@link FbBot#askTimeForMeeting(Event)}. You can
 * call {@link Bot#stopConversation(Event)} to end the conversation.
 *
 * @param event
 */
@Controller
public void askWhetherToRepeat(Event event) {
    if (event.getMessage().getText().contains("yes")) {
        reply(event, "Great! I will remind you tomorrow before the meeting.");
    } else {
        reply(event, "Okay, don't forget to attend the meeting tomorrow :)");
    }
    stopConversation(event);    // stop conversation
}

CHÚ THÍCH:

  • Chỉ có phương pháp đầu tiên trong một cuộc trò chuyện có thể định nghĩa a pattern. patternthuộc tính trong @Controllerchú thích không có tác dụng đối với các phương thức còn lại trong một cuộc hội thoại.
  • Phương thức đầu tiên trong cuộc hội thoại không cần gọi nextConversation(event)nhưng phần còn lại của các phương thức cần phải làm.
  • nextthuộc tính trong @Controllernên có tên của phương thức tiếp theo trong cuộc hội thoại cần được gọi.
  • Để kết thúc cuộc trò chuyện, hãy gọi stopConversation(event)bên trong phương thức điều khiển của bạn.

Nút bắt đầu

Bạn có thể đặt nút "Bắt đầu" bằng cách gọi setGetStartedButton("hi");"hi" là trọng tải của bạn. Bạn có thể thấy init()phương thức trong FbBot.java . Chỉ cần bỏ qua @PostConstructsau khi bạn thiết lập webhook của bạn.

Nút "Bắt đầu" chỉ được hiển thị cho người dùng mới sử dụng bot của bạn. Tìm hiểu thêm .

Văn bản chào

Văn greetingbản cho phép bạn chỉ định một thông báo mà mọi người sẽ thấy trên màn hình chào mừng của bot của bạn. Màn hình chào mừng được hiển thị cho những người tương tác với bot của bạn lần đầu tiên. Bạn có thể đặt greetingvăn bản như:

setGreetingText(new Payload[]{new Payload().setLocale("default").setText("JBot is a Java Framework to help" +
                " developers make Facebook, Slack and Twitter bots easily. You can see a quick demo by clicking " +
                "the \"Get Started\" button.")});


Bạn có thể xác định greetingvăn bản khác nhau cho các địa phương khác nhau. Tìm hiểu thêm .

Sử dụng

Bạn có thể trực tiếp sao chép dự án này và sử dụng ví dụ jbot hoặc bạn có thể đưa nó vào như một phụ thuộc maven / gradle trong dự án của bạn.

Maven

<dependency>
    <groupId>me.ramswaroop.jbot</groupId>
    <artifactId>jbot</artifactId>
    <version>4.0.1</version>
</dependency>


Học sinh lớp

dependencies {
    compile("me.ramswaroop.jbot:jbot:4.0.1")
}

LƯU Ý: Khi bạn bao gồm jbot làm phụ thuộc, vui lòng đảm bảo bao gồm me.ramswaroop.jbotgói để tự động quét. Ví dụ: bạn có thể chỉ định scanBasePackagestrong @SpringBootApplicationhoặc @ComponentScan. Xem ví dụ jbot để tìm hiểu thêm.

Triển khai trong sản xuất

Bạn có thể sử dụng supervisordhoặc các công cụ tương tự để triển khai ứng dụng này trong sản xuất. Đây là một mẫu supervisord.confcho ứng dụng này:

[inet_http_server]
port=127.0.0.1:9001

[supervisord]
logfile=/tmp/supervisord.log 
logfile_maxbytes=50MB        
logfile_backups=10           
loglevel=info                
pidfile=/tmp/supervisord.pid 
nodaemon=false               
minfds=1024                  
minprocs=200

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=http://127.0.0.1:9001

[program:jbot]
command=mvn spring-boot:run    
;directory=/var/www/jbot.ramswaroop.me/jbot/jbot-example/       ; change this
autostart=true                 
autorestart=true               
;user=jbot                                                      ; change this
redirect_stderr=true           
stdout_logfile=/tmp/jbot.log


Hy vọng tài liệu của tôi và khuôn khổ sẽ giúp bạn trong việc tạo bot của bạn. Nhà tài trợ và người đóng góp luôn được chào đón. Tất cả các chi tiết có thể được tìm thấy trong tệp README.md trong dự án.

Chúc mừng mã hóa :)

|