Skip to main content

LINE Messaging API SDK for Python

Project description

Build Status PyPI version Documentation Status

SDK of the LINE Messaging API for Python.

Introduction

The LINE Messaging API SDK for Python makes it easy to develop bots using LINE Messaging API, and you can create a sample bot within minutes.

Documentation

See the official API documentation for more information

English: https://developers.line.biz/en/docs/messaging-api/overview/

Japanese: https://developers.line.biz/ja/docs/messaging-api/overview/

Requirements

  • Python >= 2.7 or >= 3.4

Installation

$ pip install line-bot-sdk

Synopsis

Usage:

from flask import Flask, request, abort

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)

app = Flask(__name__)

line_bot_api = LineBotApi('YOUR_CHANNEL_ACCESS_TOKEN')
handler = WebhookHandler('YOUR_CHANNEL_SECRET')


@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        print("Invalid signature. Please check your channel access token/channel secret.")
        abort(400)

    return 'OK'


@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text))


if __name__ == "__main__":
    app.run()

API

LineBotApi

__init__(self, channel_access_token, endpoint=’https://api.line.me’, timeout=5, http_client=RequestsHttpClient)

Create a new LineBotApi instance.

line_bot_api = linebot.LineBotApi('YOUR_CHANNEL_ACCESS_TOKEN')

You can override the timeout value for each method.

reply_message(self, reply_token, messages, timeout=None)

Respond to events from users, groups, and rooms. You can get a reply_token from a webhook event object.

https://developers.line.me/en/docs/messaging-api/reference/#send-reply-message

line_bot_api.reply_message(reply_token, TextSendMessage(text='Hello World!'))

push_message(self, to, messages, timeout=None)

Send messages to users, groups, and rooms at any time.

https://developers.line.me/en/docs/messaging-api/reference/#send-push-message

line_bot_api.push_message(to, TextSendMessage(text='Hello World!'))

multicast(self, to, messages, timeout=None)

Send messages to multiple users at any time.

https://developers.line.me/en/docs/messaging-api/reference/#send-multicast-messages

line_bot_api.multicast(['to1', 'to2'], TextSendMessage(text='Hello World!'))

get_profile(self, user_id, timeout=None)

Get user profile information.

https://developers.line.me/en/docs/messaging-api/reference/#get-profile

profile = line_bot_api.get_profile(user_id)

print(profile.display_name)
print(profile.user_id)
print(profile.picture_url)
print(profile.status_message)

get_group_member_profile(self, group_id, user_id, timeout=None)

Gets the user profile of a member of a group that the bot is in. This can be the user ID of a user who has not added the bot as a friend or has blocked the bot.

https://developers.line.me/en/docs/messaging-api/reference/#get-group-member-profile

profile = line_bot_api.get_group_member_profile(group_id, user_id)

print(profile.display_name)
print(profile.user_id)
print(profile.picture_url)

get_room_member_profile(self, room_id, user_id, timeout=None)

Gets the user profile of a member of a room that the bot is in. This can be the user ID of a user who has not added the bot as a friend or has blocked the bot.

https://developers.line.me/en/docs/messaging-api/reference/#get-room-member-profile

profile = line_bot_api.get_room_member_profile(room_id, user_id)

print(profile.display_name)
print(profile.user_id)
print(profile.picture_url)

get_group_member_ids(self, group_id, start=None, timeout=None)

Gets the user IDs of the members of a group that the bot is in. This includes the user IDs of users who have not added the bot as a friend or has blocked the bot.

https://developers.line.me/en/docs/messaging-api/reference/#get-group-member-user-ids

member_ids_res = line_bot_api.get_group_member_ids(group_id)

print(member_ids_res.member_ids)
print(member_ids_res.next)

get_room_member_ids(self, room_id, start=None, timeout=None)

Gets the user IDs of the members of a room that the bot is in. This includes the user IDs of users who have not added the bot as a friend or has blocked the bot.

https://developers.line.me/en/docs/messaging-api/reference/#get-room-member-user-ids

member_ids_res = line_bot_api.get_room_member_ids(room_id)

print(member_ids_res.member_ids)
print(member_ids_res.next)

get_message_content(self, message_id, timeout=None)

Retrieve image, video, and audio data sent by users.

https://developers.line.me/en/docs/messaging-api/reference/#get-content

message_content = line_bot_api.get_message_content(message_id)

with open(file_path, 'wb') as fd:
    for chunk in message_content.iter_content():
        fd.write(chunk)

leave_group(self, group_id, timeout=None)

Leave a group.

https://developers.line.me/en/docs/messaging-api/reference/#leave-group

line_bot_api.leave_group(group_id)

leave_room(self, room_id, timeout=None)

Leave a room.

https://developers.line.me/en/docs/messaging-api/reference/#leave-room

line_bot_api.leave_room(room_id)

get_rich_menu(self, rich_menu_id, timeout=None)

Gets a rich menu via a rich menu ID.

https://developers.line.me/en/docs/messaging-api/reference/#get-rich-menu

rich_menu = line_bot_api.get_rich_menu(rich_menu_id)
print(rich_menu.rich_menu_id)

create_rich_menu(self, rich_menu, timeout=None)

Creates a rich menu. You must upload a rich menu image and link the rich menu to a user for the rich menu to be displayed. You can create up to 10 rich menus for one bot.

https://developers.line.me/en/docs/messaging-api/reference/#create-rich-menu

rich_menu_to_create = RichMenu(
    size=RichMenuSize(width=2500, height=843),
    selected=False,
    name="Nice richmenu",
    chat_bar_text="Tap here",
    areas=[RichMenuArea(
        bounds=RichMenuBounds(x=0, y=0, width=2500, height=843),
        action=URIAction(label='Go to line.me', uri='https://line.me'))]
)
rich_menu_id = line_bot_api.create_rich_menu(rich_menu=rich_menu_to_create)
print(rich_menu_id)

delete_rich_menu(self, rich_menu_id, timeout=None)

Deletes a rich menu.

https://developers.line.me/en/docs/messaging-api/reference/#delete-rich-menu

line_bot_api.delete_rich_menu(rich_menu_id)

get_rich_menu_id_of_user(self, user_id, timeout=None)

Gets the ID of the rich menu linked to a user.

https://developers.line.me/en/docs/messaging-api/reference/#get-rich-menu-id-of-user

rich_menu_id = ine_bot_api.get_rich_menu_id_of_user(user_id)
print(rich_menu_id)

get_rich_menu_image(self, rich_menu_id, timeout=None)

Downloads an image associated with a rich menu.

https://developers.line.me/en/docs/messaging-api/reference/#download-rich-menu-image

content = line_bot_api.get_rich_menu_image(rich_menu_id)
with open(file_path, 'wb') as fd:
    for chunk in content.iter_content():
        fd.write(chunk)

set_rich_menu_image(self, rich_menu_id, content_type, content, timeout=None)

Uploads and attaches an image to a rich menu.

https://developers.line.me/en/docs/messaging-api/reference/#upload-rich-menu-image

with open(file_path, 'rb') as f:
    line_bot_api.set_rich_menu_image(rich_menu_id, content_type, f)

get_rich_menu_list(self, timeout=None)

Gets a list of all uploaded rich menus.

https://developers.line.me/en/docs/messaging-api/reference/#get-rich-menu-list

rich_menu_list = line_bot_api.get_rich_menu_list()
for rich_menu in rich_menu_list:
    print(rich_menu.rich_menu_id)

set_default_rich_menu(self, rich_menu_id, timeout=None)

Sets the default rich menu.

https://developers.line.biz/en/reference/messaging-api/#set-default-rich-menu

line_bot_api.set_default_rich_menu(<rich_menu_id>)

get_default_rich_menu(self, timeout=None)

Gets the ID of the default rich menu set with the Messaging API.

https://developers.line.biz/en/reference/messaging-api/#get-default-rich-menu-id

line_bot_api.get_default_rich_menu()

cancel_default_rich_menu(self, timeout=None)

Cancels the default rich menu set with the Messaging API.

https://developers.line.biz/en/reference/messaging-api/#cancel-default-rich-menu

line_bot_api.cancel_default_rich_menu()

issue_channel_token(self, client_id, client_secret, grant_type=’client_credentials’, timeout=None)

Issues a short-lived channel access token.

https://developers.line.biz/en/reference/messaging-api/#issue-channel-access-token

channel_token_response = line_bot_api.issue_channel_token(<client_id>, <client_secret>)
print(access_token_response)

revoke_channel_token(self, access_token, timeout=None)

Revokes a channel access token.

https://developers.line.biz/en/reference/messaging-api/#revoke-channel-access-token

line_bot_api.revoke_channel_token(<access_token>)

※ Error handling

If the LINE API server returns an error, LineBotApi raises LineBotApiError.

https://developers.line.me/en/docs/messaging-api/reference/#error-responses

try:
    line_bot_api.push_message('to', TextSendMessage(text='Hello World!'))
except linebot.exceptions.LineBotApiError as e:
    print(e.status_code)
    print(e.error.message)
    print(e.error.details)

Message objects

https://developers.line.me/en/docs/messaging-api/reference/#message-objects

The following classes are found in the linebot.models package.

TextSendMessage

text_message = TextSendMessage(text='Hello, world')

ImageSendMessage

image_message = ImageSendMessage(
    original_content_url='https://example.com/original.jpg',
    preview_image_url='https://example.com/preview.jpg'
)

VideoSendMessage

video_message = VideoSendMessage(
    original_content_url='https://example.com/original.mp4',
    preview_image_url='https://example.com/preview.jpg'
)

AudioSendMessage

audio_message = AudioSendMessage(
    original_content_url='https://example.com/original.m4a',
    duration=240000
)

LocationSendMessage

location_message = LocationSendMessage(
    title='my location',
    address='Tokyo',
    latitude=35.65910807942215,
    longitude=139.70372892916203
)

StickerSendMessage

sticker_message = StickerSendMessage(
    package_id='1',
    sticker_id='1'
)

ImagemapSendMessage

imagemap_message = ImagemapSendMessage(
    base_url='https://example.com/base',
    alt_text='this is an imagemap',
    base_size=BaseSize(height=1040, width=1040),
    video=Video(
        original_content_url='https://example.com/video.mp4',
        preview_image_url='https://example.com/video_preview.jpg',
        area=ImagemapArea(
            x=0, y=0, width=1040, height=585
        ),
        external_link=ExternalLink(
            link_uri='https://example.com/see_more.html',
            label='See More',
        ),
    ),
    actions=[
        URIImagemapAction(
            link_uri='https://example.com/',
            area=ImagemapArea(
                x=0, y=0, width=520, height=1040
            )
        ),
        MessageImagemapAction(
            text='hello',
            area=ImagemapArea(
                x=520, y=0, width=520, height=1040
            )
        )
    ]
)

TemplateSendMessage - ButtonsTemplate

buttons_template_message = TemplateSendMessage(
    alt_text='Buttons template',
    template=ButtonsTemplate(
        thumbnail_image_url='https://example.com/image.jpg',
        title='Menu',
        text='Please select',
        actions=[
            PostbackAction(
                label='postback',
                display_text='postback text',
                data='action=buy&itemid=1'
            ),
            MessageAction(
                label='message',
                text='message text'
            ),
            URIAction(
                label='uri',
                uri='http://example.com/'
            )
        ]
    )
)

TemplateSendMessage - ConfirmTemplate

confirm_template_message = TemplateSendMessage(
    alt_text='Confirm template',
    template=ConfirmTemplate(
        text='Are you sure?',
        actions=[
            PostbackAction(
                label='postback',
                display_text='postback text',
                data='action=buy&itemid=1'
            ),
            MessageAction(
                label='message',
                text='message text'
            )
        ]
    )
)

TemplateSendMessage - CarouselTemplate

carousel_template_message = TemplateSendMessage(
    alt_text='Carousel template',
    template=CarouselTemplate(
        columns=[
            CarouselColumn(
                thumbnail_image_url='https://example.com/item1.jpg',
                title='this is menu1',
                text='description1',
                actions=[
                    PostbackAction(
                        label='postback1',
                        display_text='postback text1',
                        data='action=buy&itemid=1'
                    ),
                    MessageAction(
                        label='message1',
                        text='message text1'
                    ),
                    URIAction(
                        label='uri1',
                        uri='http://example.com/1'
                    )
                ]
            ),
            CarouselColumn(
                thumbnail_image_url='https://example.com/item2.jpg',
                title='this is menu2',
                text='description2',
                actions=[
                    PostbackAction(
                        label='postback2',
                        display_text='postback text2',
                        data='action=buy&itemid=2'
                    ),
                    MessageAction(
                        label='message2',
                        text='message text2'
                    ),
                    URIAction(
                        label='uri2',
                        uri='http://example.com/2'
                    )
                ]
            )
        ]
    )
)

TemplateSendMessage - ImageCarouselTemplate

image_carousel_template_message = TemplateSendMessage(
    alt_text='ImageCarousel template',
    template=ImageCarouselTemplate(
        columns=[
            ImageCarouselColumn(
                image_url='https://example.com/item1.jpg',
                action=PostbackAction(
                    label='postback1',
                    display_text='postback text1',
                    data='action=buy&itemid=1'
                )
            ),
            ImageCarouselColumn(
                image_url='https://example.com/item2.jpg',
                action=PostbackAction(
                    label='postback2',
                    display_text='postback text2',
                    data='action=buy&itemid=2'
                )
            )
        ]
    )
)

With QuickReply

text_message = TextSendMessage(text='Hello, world',
                               quick_reply=QuickReply(items=[
                                   QuickReplyButton(action=MessageAction(label="label", text="text"))
                               ]))

Webhook

WebhookParser

※ You can use WebhookParser or WebhookHandler

__init__(self, channel_secret)

parser = linebot.WebhookParser('YOUR_CHANNEL_SECRET')

parse(self, body, signature)

Parses the webhook body and builds an event object list. If the signature does NOT match, InvalidSignatureError is raised.

events = parser.parse(body, signature)

for event in events:
    # Do something

WebhookHandler

※ You can use WebhookParser or WebhookHandler

__init__(self, channel_secret)

handler = linebot.WebhookHandler('YOUR_CHANNEL_SECRET')

handle(self, body, signature)

Handles webhooks. If the signature does NOT match, InvalidSignatureError is raised.

handler.handle(body, signature)

Add handler method

You can add a handler method by using the add decorator.

add(self, event, message=None)

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text))

When the event is an instance of MessageEvent and event.message is an instance of TextMessage, this handler method is called.

Set default handler method

You can set the default handler method by using the default decorator.

default(self)

@handler.default()
def default(event):
    print(event)

If there is no handler for an event, this default handler method is called.

Webhook event object

https://developers.line.me/en/docs/messaging-api/reference/#webhook-event-objects

The following classes are found in the linebot.models package.

Event

  • MessageEvent
  • FollowEvent
    • type

    • timestamp

    • source: Source

    • reply_token

  • UnfollowEvent
    • type

    • timestamp

    • source: Source

  • JoinEvent
    • type

    • timestamp

    • source: Source

    • reply_token

  • LeaveEvent
    • type

    • timestamp

    • source: Source

  • PostbackEvent
    • type

    • timestamp

    • source: Source

    • reply_token

    • postback: Postback
      • data

      • params: dict

  • BeaconEvent
    • type

    • timestamp

    • source: Source

    • reply_token

    • beacon: Beacon
      • type

      • hwid

      • device_message

Source

  • SourceUser
    • type

    • user_id

  • SourceGroup
    • type

    • group_id

    • user_id

  • SourceRoom
    • type

    • room_id

    • user_id

Message

  • TextMessage
    • type

    • id

    • text

  • ImageMessage
    • type

    • id

  • VideoMessage
    • type

    • id

  • AudioMessage
    • type

    • id

  • LocationMessage
    • type

    • id

    • title

    • address

    • latitude

    • longitude

  • StickerMessage
    • type

    • id

    • package_id

    • sticker_id

  • FileMessage
    • type

    • id

    • file_size

    • file_name

Hints

Examples

simple-server-echo

Sample echo-bot using wsgiref.simple_server

flask-echo

Sample echo-bot using Flask

flask-kitchensink

Sample bot using Flask

API documentation

$ cd docs
$ make html
$ open build/html/index.html

OR Documentation Status

Help and media

FAQ: https://developers.line.biz/en/faq/

Community Q&A: https://www.line-community.me/questions

News: https://developers.line.biz/en/news/

Twitter: @LINE_DEV

Versioning

This project respects semantic versioning

See http://semver.org/

Contributing

Please check CONTRIBUTING before making a contribution.

For SDK developers

First install for development.

$ pip install -r requirements-dev.txt

Run tests

Test by using tox. We test against the following versions.

  • 2.7

  • 3.4

  • 3.5

  • 3.6

To run all tests and to run flake8 against all versions, use:

tox

To run all tests against version 2.7, use:

$ tox -e py27

To run a test against version 2.7 and against a specific file, use:

$ tox -e py27 -- tests/test_webhook.py

And more… TBD

License

Copyright (C) 2016 LINE Corp.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

line-bot-sdk-1.11.0.tar.gz (59.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

line_bot_sdk-1.11.0-py2.py3-none-any.whl (46.6 kB view details)

Uploaded Python 2Python 3

File details

Details for the file line-bot-sdk-1.11.0.tar.gz.

File metadata

  • Download URL: line-bot-sdk-1.11.0.tar.gz
  • Upload date:
  • Size: 59.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.3

File hashes

Hashes for line-bot-sdk-1.11.0.tar.gz
Algorithm Hash digest
SHA256 50cd63ef384fee1936abda439973af906b3d18a7908b77157479290267645d2b
MD5 f7373f095e3cb0d5ea27bc367c72ce41
BLAKE2b-256 606ee224073886856a9fd73762cc98a226c5cbf468e13836c52bbc8969880fae

See more details on using hashes here.

File details

Details for the file line_bot_sdk-1.11.0-py2.py3-none-any.whl.

File metadata

  • Download URL: line_bot_sdk-1.11.0-py2.py3-none-any.whl
  • Upload date:
  • Size: 46.6 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.3

File hashes

Hashes for line_bot_sdk-1.11.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 a668f4b3a9ce24b0e26e7c5451e36bfd9dc90eb19e699faf16d6032a743b83e7
MD5 83d5896f125fee8480cb20da985fd4af
BLAKE2b-256 2f9c72ff2b1a74db9bdfd4eb00628cbc36b821ea8def6885329ee61421aa3abd

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page