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

我们今天将使用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()方法回复它一样简单,如下所示:

@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类型的事件时,它会被调用。

@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中指定正则表达式。

@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属性匹配。

@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()方法有各种重载版本以满足您的需求。

最简单的例子就是,

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

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

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

// 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)

@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回复了两个标准按钮

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回复了三个项目列表

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

/**
 * 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文字设置为:

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

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

Gradle

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

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

在生产中部署

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

[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

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

原文链接:https://dzone.com/articles/7-easy-steps-to-make-facebook-messenger-bots

原文作者:Ram Patra

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java技术栈

推荐 | 6月份最值得看的 Java 技术干货

6月过完了,这一年都 TM 过了一半了,大家都回想下自己这大半年,你都收获了什么??技术有提升吗?对象搞定了吗?

16020
来自专栏developerHaoz 的安卓之旅

Android App 与 U 盘通信详解

在 U 盘插入或插出的时候,系统都会发出一条相关的广播,所以我们需要自定义广播接收器,接收这两条广播,然后进行相应的处理。

16720
来自专栏ShaoYL

iOS定位--CoreLocation框架

452100
来自专栏FreeBuf

适用于渗透测试不同阶段的工具收集整理

该资源清单列表涵盖了一系列,适用于渗透测试不同阶段的开源/商业工具。如果你想为此列表添加贡献,欢迎你向我发送pull request。

1.1K00
来自专栏FreeBuf

Cisco Linksys无线路由固件安全分析与后门研究

最近我对嵌入式设备安全方面比较感兴趣,所以我决定找点东西练练手,于是我在淘宝上搜了一下,发现Linksys WRT54Gv5无线路由比较流行,决定就拿这个下手了...

34650
来自专栏腾讯NEXT学位

那些让编码效率起飞(前端)的工具了解一下

? | 导语 想晚上吃鸡?前端编码效率提升工具了解一下? 一、Bash篇(Mac) iTerm2 iTerm 2 is a terminal emulato...

21530
来自专栏Golang语言社区

【Golang 语言社区】 剧透社区APP 问答功能模块设计思路及实现

社区APP问答模块,设计思想:主要为了满足用户在发表疑问及遇到的问题的时候可以发表。 1 发...

33670
来自专栏Wordpress专用主机|主题模板|必备插件

5款经典的WORDPRESS问答类主题模板推荐

近期,有不少WP爱好者问我:wordpress可以用来做问答类网站吗?类似于百度知道,知乎之类的。 答案是当然可以!其实wordpress也有不少优秀的问答类主...

2.6K80
来自专栏腾讯Bugly的专栏

全系统栈崩溃是什么鬼?手机管家高级工程师 jaylin,教你如何抓鬼!

Jaylin 腾讯手机管家团队,高级研发工程师,5年以上Android开发经验,擅长终端架构设计、性能和稳定性优化。 前言 Android的严重碎片化,通常会给...

37140
来自专栏安恒信息

一些APT攻击案例分享

2014年我们所知的所有网络攻击,实际上还只是冰山一角,未来的网络空间将出现更多错综复杂、有组织性甚至是由敌对国家发起的网络袭击。APT攻击事件目前趋于爆发式增...

48150

扫码关注云+社区

领取腾讯云代金券