在bothub.studio上构建无服务器聊天机器人

bothub的Python项目详细描述


这个包提供了与BotHub.Studio一起工作的组件,这是一个chatbot托管服务。

使用bothub-cli,只需四行命令就可以部署一个新的聊天机器人。

安装

要安装Bothub:

$ pip install bothub

Bothub包对python2和3都有效。

开始

您可以通过子类化BaseBot类并重写handle_message方法来构建echo聊天机器人。

# -*- coding: utf-8 -*-from__future__import(absolute_import,division,print_function,unicode_literals)frombothub_client.botimportBaseBotfrombothub_client.decoratorsimportchannelclassBot(BaseBot):"""Represent a Bot logic which interacts with a user.

    BaseBot superclass have methods belows:

    * Send message
      * self.send_message(message, chat_id=None, channel=None)
    * Data Storage
      * self.set_project_data(data)
      * self.get_project_data()
      * self.set_user_data(data, user_id=None, channel=None)
      * self.get_user_data(user_id=None, channel=None)
    * Channel Handler
      from bothub_client.decorators import channel
      @channel('<channel_name>')
      def channel_handler(self, event, context):
        # Handle a specific channel message
    * Command Handler
      from bothub_client.decorators import command
      @command('<command_name>')
      def command_handler(self, event, context, args):
          # Handle a command('/<command_name>')
    * Intent Handler
      from bothub_client.decorators import intent
      @intent('<intent_id>')
      def intent_result_handler(self, event, context, answers):
          # Handle a intent result
          # answers is a dict and contains intent's input data
            {
              "<intent slot id>" : <entered slot value>
              ...
            }
    """@channel()defdefault_handler(self,event,context):

当bot接收到来自用户的消息时,它用eventcontext对象触发handle_message方法。

event是包含以下项的dict:

  • content:收到消息文本。
  • channel:哪个频道(信使平台)发送了消息。
  • sender:发送消息的人。{"id": <user-id>, "name": "<username>}
  • chat_id:发送消息的聊天室ID。它可以是1:1聊天室或小组聊天室。
  • location:位置信息(如果可能的话){"longitude": <float>, "latitude": <float>}
  • postback:回发数据。
  • new_joined:一个布尔值,表示此机器人是否被邀请到某个聊天室。
  • raw_data:原始数据本身是Messenger平台发送的。

您可以使用我们提供的各种工具响应此消息。

信息

要发送消息,请对要发送的消息使用self.send_message方法。

self.send_message('hello')

在大多数情况下,可以省略user_idchannel参数。然后它会回复给你的机器人发信息的人。如果要指定接收器,请将值放入这些参数。

您可以使用Message对象发送带有丰富控件(如“快速答复”或“按钮”)的消息。

frombothub_client.messagesimportMessagemessage=Message(event).add_quick_reply('Go ahead')\
                        .add_quick_reply('Never mind')\
                        .set_text('May I reserve the seat?')self.send_message(message)

Message类提供以下方法:

  • set_text(text)
  • add_url_button(text, url)
  • add_postback_button(text, payload)
  • add_quick_reply(text, payload=None, image_url=None)
  • add_location_request(text)
  • add_keyboard_button(text)

储存

要存储/检索属性数据,我们提供以下方法:

  • 项目级别
    • self.set_project_data(data):将数据设置为项目
    • self.get_project_data(key=None):从项目获取数据
  • 用户级别
    • self.set_user_data(data, user_id=None, channel=None):设置用户数据
    • self.get_user_data(user_id=None, channel=None, key=None):获取用户数据

^ TT32 } $应该是一个DATA。不包含在^ {TT32 } $中的现有属性将被忽略,不被删除。

  • 如果user_idchannelNone,则将其视为消息发送者。
  • keyNone时,将返回get-whole dictionary。否则,将返回给定密钥的子树。

NLU积分

在bothub.studio上设置NLU集成后,可以使用nlu方法执行NLU。

有两种样式可请求NLU服务。(例如使用api.ai)

首先,使用事件对象构造消息和会话id。

defhandle_message(self,event,context):response=self.nlu('apiai').ask(event=event)self.send_message(response.next_message)

或者,自己放置明确的消息和会话id。

defhandle_message(self,event,context):response=self.nlu('apiai').ask(message='hello',session_id='customer1')self.send_message(response.next_message)

如果要使用英语以外的语言,请对ask()函数使用lang关键字参数。

ask方法返回一个NluResponse对象,该对象包含如下属性:

  • raw_response:NLU服务返回的原始响应。
  • action:用于标识意图和所需参数的NluAction类对象。
  • next_message:响应NLU服务建议的下一条消息文本。

NluAction对象包含如下属性:

  • intent:意向名称
  • parameters:参数dict
  • completed:布尔值指示操作是否已完成

对于未完成的操作,您需要使用nlureponse实例的next_message属性回复用户以完成操作。

许可证

此软件包根据AGPLv3授权用于非商业性个人用途。如果您想将此软件包用于商业用途,请联系bothub@bothub.studio

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何加载JNI。具有依赖项的动态库文件,但未获得未满足的链接错误?   java ResultSet元数据未返回第一行   无法从java xml解析器中的当前节点获取节点列表   java如何从for循环值创建单个数组   java如何在没有arrayList的情况下查找对象   java ItemizedOverlayWithFocus在聚焦osmdroid时显示另一个覆盖   java使用迭代器进行“向下”迭代的优雅方式   java如何使用OnListItemClick为listview和AlertDialog使用单独的arraylist?   arraylist读取txt文件Java中存储的数组   javascript IE 11与RicoLive Grid 2.2框架不兼容   java我能得到水豚的maven依赖性吗?   简单Escp Java:PrintPreviewPane在JDK7中不起作用   java取出给定字符串的一部分,并将所取部分作为变量返回?   java如何替换“instanceof”函数中的变量   来自url的Java utf8编码   java方法获取类Gregorianalendar?   安卓如何在java 7中使用AndroidStudio和DDMS监视器   java测试在JUnit4下运行,但不是在JUnit5下运行-编译干净,但执行0测试   java无法使用Azure服务总线发送消息