Skip to content

mgilangjanuar/line-chatbot-boilerplate

Repository files navigation

LINE Chatbot Boilerplate

Requirements

  • Python 3.5
  • Redis 4.0.8
  • MongoDB 2.6.10
  • LINE@ Messaging API
  • Wit.ai (optional)

How to Install (with Yeoman)

  • Install Yeoman
npm install -g yo
  • Install generator-line-chatbot-boilerplate
npm install -g generator-line-chatbot-boilerplate
  • Run line-chatbot-boilerplate generator with Yeoman
yo line-chatbot-boilerplate

Architecture Flow

Guide and Example

Configuration in index.py

from mongoengine import connect
from lib import ChatbotHandler
import redis

...

# create connection to MongoDB
connect('poc_chatbot_boilerplate', host='localhost', port=27017, username=None, password=None)

# connect to Redis server
my_redis = redis.StrictRedis(host='localhost', port=6379, db=0)

# define bot handler
bot_handler = ChatbotHandler(load_clients, redis=my_redis)

...

Create Module

Create a client in ./modules and create client object with methods in it.

Client Types:

  • StandardClient
from linebot.models import TextSendMessage
from lib import StandardClient


client = StandardClient(__name__)

@client.on_command(sources=['user'])    # only trigger from user, default: all
def action_ping():                      # name of the method must have "action_" as prefix
    """
    Always reply /pong whatever user type, StandardClient only
    have one on_command decorator method
    """
    client.bot.reply_message(
        client.event.reply_token,
        TextSendMessage(text='/pong')
    )
  • TextClient
from linebot.models import TextSendMessage
from lib import TextClient


client = TextClient(__name__)

@client.on_command('ping', sources=['user'])
def action_ping():
    """
    Always reply "/pong" when user type "/ping", TextClient
    only can be registered for TextMessage in register.py
    """
    client.bot.reply_message(
        client.event.reply_token,
        TextSendMessage(text='/pong')
    )
  • SimpleWitClient
from linebot.models import TextSendMessage
from lib import SimpleWitClient


client = SimpleWitClient(__name__)

@client.on_command('greeting')
def action_greeting(value):
    """Reply a string when entity greeting is True
    """
    if (value == 'True'):
        client.bot.reply_message(
            client.event.reply_token,
            TextSendMessage(text='Nice to meet you!')
        )
  • AdvancedWitClient
from linebot.models import TextSendMessage
from lib import AdvancedWitClient


client = AdvancedWitClient(__name__)

@client.on_command('greeting', 'True')
def action_greeting():
    """Reply a string when entity greeting is True
    """
    client.bot.reply_message(
        client.event.reply_token,
        TextSendMessage(text='Nice to meet you!')
    )

Notes:

If you doesn't like the prefix '/' for command in TextClient or the prefix "action_" in methods, you can change that in ./lib/client.py

Routing Client Methods:

  • On Command

Run method on command triggered

from linebot.models import TextSendMessage
from lib import TextClient


client = TextClient(__name__)

@client.on_command('echo')
def action_echo(args):
    """
    Echoing an argument when command /echo triggered, for 
    example when user type "/echo some shitty string here"
    will be replied with "some shitty string here"
    """
    client.bot.reply_message(
        client.event.reply_token,
        TextSendMessage(text=args)
    )
  • On State

Run method when user/room/group has a state which corresponds to the client's state

from linebot.models import TextSendMessage
from lib import TextClient


client = TextClient(__name__)

@client.on_command('echo')
def action_echo():      # we don't need any arguments
    """Set the state to "echo/input"
    """
    client.state.set_state('echo/input')
    client.state.set_data('go to the action_echo_input() method')
    client.bot.reply_message(
        client.event.reply_token,
        TextSendMessage(text='Please input your string')
    )

@client.on_state('echo/input')
def action_echo_input():
    """
    Always echoing the user's message when his state is "echo/input"
    and delete the state when user type "/end"
    """
    print(client.state.get_data())
    message = client.event.message.text
    if (message == '/end'):
        client.state.delete_state()
        client.state.delete_data()
    else:
        client.bot.reply_message(
            client.event.reply_token,
            TextSendMessage(text=message)
        )

Registering a Client

Update method load_clients in register.py and define which events (and message types, if any) that will handling your client

Example:

def load_clients(client_handler):
    ...
    # registering ping.client to TextMessage and StickerMessage handler
    client_handler.add(ping.client, [
        EventEntity(MessageEvent, message=TextMessage),
        EventEntity(MessageEvent, message=StickerMessage)
    ])
    ...
    return client_handler

References

About

Template for LINE chatbot project with Python

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages