前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Java制作Facebook Messenger机器人的7个简单步骤

使用Java制作Facebook Messenger机器人的7个简单步骤

作者头像
February
发布2018-12-03 16:07:02
2.8K0
发布2018-12-03 16:07:02
举报
文章被收录于专栏:技术翻译技术翻译

我们今天将使用JBot制作Facebook Messenger Bot,因为我们之前使用JBot制作Slack Bot

与Slack类似,Facebook很简单,但几乎没有额外的步骤:

  1. 克隆$ git clone git@github.com:ramswaroop/jbot.git项目。
  2. 创建Facebook应用程序页面
  3. 为页面生成页面访问令牌(在应用程序的信使设置中)。
  1. 将上面创建的令牌粘贴到application.properties文件中。
  2. 通过在IDE中或通过命令行运行JBotApplication来运行示例应用程序: $ cd JBot $ mvn clean install $ cd jbot-example $ mvn spring-boot:run
  3. 设置webhook以接收消息和其他事件。您需要有一个安全的公共地址来设置webhook。如果您在计算机上本地运行,则可以使用localtunnel.me生成安全的公共地址。
  1. 在“Webooks”设置下的“Callback Url”字段中指定上面创建的地址,并将验证令牌作为fb_token_for_jbot并单击“Verify and Save”。

您现在可以通过转到Facebook页面并单击“发送消息”按钮来开始发送您的机器人消息。

如果你现在懒得开始并只是想玩,你可以尝试jbot-example访问JBot Facebook页面并点击“发送消息”按钮。

基本用法

Bot的主要功能是接收和回复消息。使用JBot,接收消息就像编写简单@Controller并通过调用reply()方法回复它一样简单,如下所示:

代码语言:javascript
复制
@Controller(events = EventType.MESSAGE)
public void onReceiveMessage(Event event) {
    if ("hi".equals(event.getMessage().getText())) {
        reply(event, "Hi, I am JBot.");
    }
}

你的机器人的所有代码都在FbBot类中,它从核心包中扩展了Bot。您可以拥有任意数量的机器人,只需让类扩展Bot类,它就可以获得Facebook Bot的所有功能。虽然建议为不同的机器人使用单独的JBot实例。

使用JBot构建Facebook Messenger机器人

在我们深入了解细节之前,请确保您拥有Facebook应用程序,fb页面并设置了webhooks。请参阅“ 入门”部分以了解更多信息。

设置你的机器人

在Facebook,我们可以为网页而不是用户制作信使机器人。要开始使用fb API,我们需要一个页面访问令牌,可以从您的任何fb应用程序设置生成。需要在jbot-example 中的application.properties文件中指定此页面访问令牌 。你也可以从spring.profiles.active中删除“slack” 。在此之后,您可以通过IDE或命令行运行JBotApplication来启动机器人。

机器人启动后,您可以转到应用程序的设置并设置webhook。将安全URL提供给您的机器人应用程序,如果您在计算机上运行而不是在任何服务器上运行,则可以使用localtunnel.me生成一个。您还需要提供“验证令牌”,可以在fbBotToken属性中的的application.properties文件中找到它。

接收消息

Facebook将Callback发送给/webhook,用于您的网页订阅的所有活动。它将POST请求发送到您的/webhook端点。

幸运的是,使用JBot,您不必担心定义自己的处理程序来处理这些POST调用,解析事件等。要从Fb接收事件,您只需要定义带@Controller注释的方法(从这里开始,我们将称之为@Controller)。

这是一个简单的示例,当您的机器人从Facebook 收到MESSAGEPOSTBACK类型的事件时,它会被调用。

代码语言:javascript
复制
@Controller(events = {EventType.MESSAGE, EventType.POSTBACK})
public void onReceiveMessage(Event event) {
    if ("hi".equals(event.getMessage().getText())) {
        reply(event, "Hi, I am JBot.");
    }
}

另一个示例是添加pattern@Controller。添加模式将限制仅在事件文本或事件有效内容(取决于事件类型)与定义的模式匹配时才调用方法。您可以在pattern中指定正则表达式。

代码语言:javascript
复制
@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));
}

如果要处理用户发送的匹配值,可以选择在方法中使用matcher作为正式参数(事件后)。您可以访问matcher.group(0)matcher.group(1)等等。

这里有一点要注意,pattern将针对匹配textpayload根据接收到的事件类型。对于下面的示例,接收的事件将是类型QUICK_REPLY,在这种情况下pattern将与QuickReply中的payload属性匹配,而不是与text属性匹配。

代码语言:javascript
复制
@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!");
    }
}

您可以查看信使平台当前支持的所有webhook事件。您可能会看到那里没有列出特定的QUICK_REPLY事件类型。这是JBot添加的额外活动,可让您轻松完成任务。

发送消息

就像接收一样,要从机器人向用户发送消息,您需要POST拨打Facebook的Send API。但是,再次使用JBot,您可以通过在@Controller方法中调用reply()方法来简单地进行回复。reply()方法有各种重载版本以满足您的需求。

最简单的例子就是,

代码语言:javascript
复制
reply(event, "Hi, I am Jbot.");

它需要一个事件对象和一个作为回复文本的字符串。

另一个例子,其中JBot回复了两个快速回复按钮

代码语言:javascript
复制
// 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));

如果你看到这里,我们已经在两个按钮设置了payload。因此,要知道用户点击了哪个按钮,您可以使用如下所示的事件EventType.QUICK_REPLY@Controller和模式(yes|no)

代码语言:javascript
复制
@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!");
    }
}

在这个例子中,JBot回复了两个标准按钮

代码语言:javascript
复制
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))));

最后一个示例显示JBot回复了三个项目列表

代码语言:javascript
复制
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))));

这是一个截屏视频,显示了我们讨论的所有示例:

您应该查看Facebook的Send API,了解机器人可以发送的各种回复。例如,您甚至可以向用户发送收据,航空公司登机牌等等。

对话

这是JBot的一个与众不同的功能,您可以直接与机器人交谈并进行对话。请参阅下面的示例,了解机器人如何通过一个接一个地提出一些简单的问题来为您的团队建立会议。

代码语言:javascript
复制
/**
 * 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
}

注意:

  • 只有对话中的第一种方法才能定义pattern。注释中的pattern属性对@Controller会话中的其余方法没有影响。
  • 会话中的第一种方法不需要调用nextConversation(event)但其他方法确实需要。
  • @Controllernext属性应该具有需要调用的对话中的下一个方法的名称。
  • 要结束对话,请在控制器方法中调用stopConversation(event)
入门按钮

您可以通过简单地调用setGetStartedButton("hi");“hi”是您的有效负载来设置“开始”按钮。您可以在FbBot.java中看到init()方法。在设置好webhook后取消@PostConstruct注释。

“开始使用”按钮仅向您的机器人新用户显示。了解更多

问候文本

greeting文本允许您指定人们将在机器人的欢迎屏幕上看到的消息。首次显示与您的机器人交互的人员的欢迎屏幕。您可以将greeting文字设置为:

代码语言:javascript
复制
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.")});

您可以为不同的区域设置定义不同的greeting文本。了解更多

用法

您可以直接克隆此项目并使用jbot-example,也可以将其作为项目中的maven / gradle依赖项包含在内。

Maven

代码语言:javascript
复制
<dependency>
    <groupId>me.ramswaroop.jbot</groupId>
    <artifactId>jbot</artifactId>
    <version>4.0.1</version>
</dependency>

Gradle

代码语言:javascript
复制
dependencies {
    compile("me.ramswaroop.jbot:jbot:4.0.1")
}

注意:当您将jbot作为依赖项包括在内时,请确保包含me.ramswaroop.jbot自动扫描包。例如,您可以在@SpringBootApplication@ComponentScan中指定scanBasePackages。有关详细信息,请参阅jbot-example

在生产中部署

您可以使用supervisord或类似工具在生产中部署此应用程序。以下是此应用程序的supervisord.conf示例:

代码语言:javascript
复制
[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

希望我的文档和框架可以帮助您制作机器人。赞助商和贡献者随时欢迎。所有详细信息都可以在项目的README.md文件中找到。

快乐编码:)

原文标题《7 Easy Steps to Make a Facebook Messenger Bot in Java》

作者:Ram Patra

译者:February

不代表云加社区观点,更多详情请查看原文链接

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基本用法
  • 使用JBot构建Facebook Messenger机器人
    • 设置你的机器人
      • 接收消息
        • 发送消息
          • 对话
            • 入门按钮
              • 问候文本
              • 用法
              • 在生产中部署
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档