$ git clone [email protected]:ramswaroop/jbot.git
项目。JBotApplication
来运行示例应用程序: $ cd JBot $ mvn clean install $ cd jbot-example $ mvn spring-boot:runfb_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实例。
在我们深入了解细节之前,请确保您拥有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 收到MESSAGE
或POSTBACK
类型的事件时,它会被调用。
@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
将针对匹配text
或payload
根据接收到的事件类型。对于下面的示例,接收的事件将是类型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)
但其他方法确实需要。@Controller
的next
属性应该具有需要调用的对话中的下一个方法的名称。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
me.ramswaroop.jbot
jbot
4.0.1
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文件中找到。