LINE Messaging API SDK for Python with comprehensive bot development capabilities including messaging, webhooks, and platform integrations.
—
Interactive menu system for LINE bot interfaces. Rich menus provide persistent navigation and quick access to bot features through customizable button layouts displayed at the bottom of the chat interface.
Core rich menu operations including creation, retrieval, updates, and deletion.
class MessagingApi:
def create_rich_menu(self, rich_menu_request: RichMenuRequest) -> RichMenuIdResponse:
"""
Create a new rich menu with custom layout and areas.
Args:
rich_menu_request: Rich menu configuration including size, areas, and settings
Returns:
RichMenuIdResponse: Created rich menu ID
"""
def get_rich_menu(self, rich_menu_id: str) -> RichMenuResponse:
"""
Get rich menu configuration by ID.
Args:
rich_menu_id: Rich menu identifier
Returns:
RichMenuResponse: Rich menu configuration details
"""
def delete_rich_menu(self, rich_menu_id: str) -> dict:
"""
Delete an existing rich menu.
Args:
rich_menu_id: Rich menu identifier to delete
Returns:
dict: Empty response on success
"""
def get_rich_menu_list(self) -> RichMenuListResponse:
"""
Get list of all rich menus for the bot.
Returns:
RichMenuListResponse: List of rich menu configurations
"""Upload and manage rich menu background images.
class MessagingApiBlob:
def set_rich_menu_image(self, rich_menu_id: str, body: bytes, content_type: str = "image/jpeg") -> dict:
"""
Upload background image for a rich menu.
Args:
rich_menu_id: Rich menu identifier
body: Image binary data
content_type: Image content type (image/jpeg or image/png)
Returns:
dict: Empty response on success
"""
def get_rich_menu_image(self, rich_menu_id: str) -> bytes:
"""
Download rich menu background image.
Args:
rich_menu_id: Rich menu identifier
Returns:
bytes: Image binary data
"""Link and unlink rich menus to/from specific users.
class MessagingApi:
def link_rich_menu_id_to_user(self, user_id: str, rich_menu_id: str) -> dict:
"""
Link a rich menu to a specific user.
Args:
user_id: LINE user ID
rich_menu_id: Rich menu identifier to link
Returns:
dict: Empty response on success
"""
def unlink_rich_menu_id_from_user(self, user_id: str) -> dict:
"""
Remove rich menu from a specific user.
Args:
user_id: LINE user ID
Returns:
dict: Empty response on success
"""
def get_rich_menu_id_of_user(self, user_id: str) -> RichMenuIdResponse:
"""
Get the rich menu ID currently assigned to a user.
Args:
user_id: LINE user ID
Returns:
RichMenuIdResponse: Currently assigned rich menu ID
"""Perform rich menu operations on multiple users simultaneously.
class MessagingApi:
def rich_menu_bulk_link(self, rich_menu_bulk_link_request: RichMenuBulkLinkRequest) -> dict:
"""
Link a rich menu to multiple users at once.
Args:
rich_menu_bulk_link_request: Bulk link configuration with user IDs and rich menu ID
Returns:
dict: Empty response on success
"""
def rich_menu_bulk_unlink(self, rich_menu_bulk_unlink_request: RichMenuBulkUnlinkRequest) -> dict:
"""
Unlink rich menus from multiple users at once.
Args:
rich_menu_bulk_unlink_request: Bulk unlink configuration with user IDs
Returns:
dict: Empty response on success
"""Create and manage rich menu aliases for dynamic menu switching.
class MessagingApi:
def create_rich_menu_alias(self, create_rich_menu_alias_request: CreateRichMenuAliasRequest) -> dict:
"""
Create an alias for a rich menu to enable programmatic switching.
Args:
create_rich_menu_alias_request: Alias configuration with rich menu ID and alias ID
Returns:
dict: Empty response on success
"""
def delete_rich_menu_alias(self, rich_menu_alias_id: str) -> dict:
"""
Delete a rich menu alias.
Args:
rich_menu_alias_id: Alias identifier to delete
Returns:
dict: Empty response on success
"""
def update_rich_menu_alias(self, rich_menu_alias_id: str, update_rich_menu_alias_request: UpdateRichMenuAliasRequest) -> dict:
"""
Update rich menu alias configuration.
Args:
rich_menu_alias_id: Alias identifier to update
update_rich_menu_alias_request: New alias configuration
Returns:
dict: Empty response on success
"""
def get_rich_menu_alias(self, rich_menu_alias_id: str) -> RichMenuAliasResponse:
"""
Get rich menu alias configuration.
Args:
rich_menu_alias_id: Alias identifier
Returns:
RichMenuAliasResponse: Alias configuration details
"""
def get_rich_menu_alias_list(self) -> RichMenuAliasListResponse:
"""
Get list of all rich menu aliases.
Returns:
RichMenuAliasListResponse: List of rich menu aliases
"""Execute complex rich menu operations as batch jobs.
class MessagingApi:
def rich_menu_batch(self, rich_menu_batch_request: RichMenuBatchRequest) -> dict:
"""
Execute batch rich menu operations (link, unlink, unlink all).
Args:
rich_menu_batch_request: Batch operation configuration
Returns:
dict: Empty response on success
"""
def get_rich_menu_batch_progress(self, request_id: str) -> RichMenuBatchProgressResponse:
"""
Get progress status of a batch rich menu operation.
Args:
request_id: Batch operation request identifier
Returns:
RichMenuBatchProgressResponse: Operation progress and status
"""class RichMenuRequest:
def __init__(
self,
size: RichMenuSize,
selected: bool,
name: str,
chat_bar_text: str,
areas: List[RichMenuArea]
):
"""
Rich menu configuration for creation.
Args:
size: Menu dimensions and layout
selected: Whether menu is initially displayed
name: Internal name for the rich menu
chat_bar_text: Text displayed on chat bar tab
areas: List of clickable areas with actions
"""
class RichMenuResponse:
rich_menu_id: str
size: RichMenuSize
selected: bool
name: str
chat_bar_text: str
areas: List[RichMenuArea]
class RichMenuSize:
def __init__(self, width: int, height: int):
"""
Rich menu dimensions.
Args:
width: Menu width (must be 2500px)
height: Menu height (1686px for full, 843px for half)
"""
class RichMenuArea:
def __init__(self, bounds: RichMenuBounds, action: Action):
"""
Clickable area within rich menu.
Args:
bounds: Rectangular area coordinates
action: Action to perform when area is tapped
"""
class RichMenuBounds:
def __init__(self, x: int, y: int, width: int, height: int):
"""
Rectangular area coordinates within rich menu.
Args:
x: Left edge X coordinate
y: Top edge Y coordinate
width: Area width
height: Area height
"""class CreateRichMenuAliasRequest:
def __init__(self, rich_menu_alias_id: str, rich_menu_id: str):
"""
Request to create rich menu alias.
Args:
rich_menu_alias_id: Unique alias identifier
rich_menu_id: Target rich menu ID
"""
class UpdateRichMenuAliasRequest:
def __init__(self, rich_menu_id: str):
"""
Request to update rich menu alias target.
Args:
rich_menu_id: New target rich menu ID
"""
class RichMenuAliasResponse:
rich_menu_alias_id: str
rich_menu_id: str
class RichMenuAliasListResponse:
aliases: List[RichMenuAliasResponse]class RichMenuBulkLinkRequest:
def __init__(self, rich_menu_id: str, user_ids: List[str]):
"""
Request to link rich menu to multiple users.
Args:
rich_menu_id: Rich menu identifier to link
user_ids: List of user IDs (max 500)
"""
class RichMenuBulkUnlinkRequest:
def __init__(self, user_ids: List[str]):
"""
Request to unlink rich menus from multiple users.
Args:
user_ids: List of user IDs (max 500)
"""
class RichMenuBatchRequest:
def __init__(self, operations: List[RichMenuBatchOperation]):
"""
Request for batch rich menu operations.
Args:
operations: List of batch operations to execute
"""
class RichMenuBatchOperation:
"""Base class for batch operations"""
type: str
class RichMenuBatchLinkOperation(RichMenuBatchOperation):
def __init__(self, rich_menu_id: str, user_ids: List[str]):
"""Batch operation to link rich menu to users."""
class RichMenuBatchUnlinkOperation(RichMenuBatchOperation):
def __init__(self, user_ids: List[str]):
"""Batch operation to unlink rich menus from users."""
class RichMenuBatchUnlinkAllOperation(RichMenuBatchOperation):
def __init__(self):
"""Batch operation to unlink all rich menus from all users."""class RichMenuIdResponse:
rich_menu_id: str
class RichMenuListResponse:
rich_menus: List[RichMenuResponse]
class RichMenuBatchProgressResponse:
phase: RichMenuBatchProgressPhase
accepted_time: str
completed_time: Optional[str] = None
class RichMenuBatchProgressPhase:
"""Enum: succeeded, failed, in_progress"""
passfrom linebot.v3.messaging import MessagingApi, Configuration
from linebot.v3.messaging.models import (
RichMenuRequest, RichMenuSize, RichMenuArea, RichMenuBounds,
PostbackAction, URIAction, MessageAction
)
# Initialize API client
config = Configuration(access_token='YOUR_ACCESS_TOKEN')
messaging_api = MessagingApi(config)
# Create rich menu configuration
rich_menu_request = RichMenuRequest(
size=RichMenuSize(width=2500, height=1686),
selected=True,
name="Main Menu",
chat_bar_text="Menu",
areas=[
RichMenuArea(
bounds=RichMenuBounds(x=0, y=0, width=833, height=843),
action=PostbackAction(data="menu=home", label="Home")
),
RichMenuArea(
bounds=RichMenuBounds(x=833, y=0, width=834, height=843),
action=PostbackAction(data="menu=products", label="Products")
),
RichMenuArea(
bounds=RichMenuBounds(x=1667, y=0, width=833, height=843),
action=URIAction(uri="https://example.com/contact", label="Contact")
),
RichMenuArea(
bounds=RichMenuBounds(x=0, y=843, width=1250, height=843),
action=MessageAction(text="Show my orders", label="My Orders")
),
RichMenuArea(
bounds=RichMenuBounds(x=1250, y=843, width=1250, height=843),
action=PostbackAction(data="menu=help", label="Help")
)
]
)
# Create the rich menu
response = messaging_api.create_rich_menu(rich_menu_request)
rich_menu_id = response.rich_menu_id
print(f"Created rich menu: {rich_menu_id}")from linebot.v3.messaging import MessagingApiBlob
blob_api = MessagingApiBlob(config)
# Upload background image
with open('rich_menu_image.jpg', 'rb') as image_file:
image_data = image_file.read()
blob_api.set_rich_menu_image(
rich_menu_id=rich_menu_id,
body=image_data,
content_type='image/jpeg'
)
print("Rich menu image uploaded successfully")# Link to specific user
messaging_api.link_rich_menu_id_to_user(
user_id="USER_ID_HERE",
rich_menu_id=rich_menu_id
)
# Bulk link to multiple users
from linebot.v3.messaging.models import RichMenuBulkLinkRequest
bulk_link_request = RichMenuBulkLinkRequest(
rich_menu_id=rich_menu_id,
user_ids=["user1", "user2", "user3"]
)
messaging_api.rich_menu_bulk_link(bulk_link_request)from linebot.v3.messaging.models import (
CreateRichMenuAliasRequest, RichMenuSwitchAction
)
# Create aliases for different menu states
messaging_api.create_rich_menu_alias(
CreateRichMenuAliasRequest(
rich_menu_alias_id="main_menu",
rich_menu_id=main_menu_id
)
)
messaging_api.create_rich_menu_alias(
CreateRichMenuAliasRequest(
rich_menu_alias_id="settings_menu",
rich_menu_id=settings_menu_id
)
)
# Use RichMenuSwitchAction in buttons or areas
switch_action = RichMenuSwitchAction(
rich_menu_alias_id="settings_menu",
data="switched_to_settings"
)# Get all rich menus
menu_list = messaging_api.get_rich_menu_list()
for menu in menu_list.rich_menus:
print(f"Menu: {menu.name} (ID: {menu.rich_menu_id})")
# Check user's current rich menu
try:
user_menu = messaging_api.get_rich_menu_id_of_user("USER_ID")
print(f"User's current menu: {user_menu.rich_menu_id}")
except Exception as e:
print("User has no rich menu assigned")
# Batch operations for complex scenarios
from linebot.v3.messaging.models import (
RichMenuBatchRequest, RichMenuBatchLinkOperation,
RichMenuBatchUnlinkOperation
)
batch_request = RichMenuBatchRequest(
operations=[
RichMenuBatchUnlinkOperation(user_ids=["user1", "user2"]),
RichMenuBatchLinkOperation(
rich_menu_id=new_menu_id,
user_ids=["user1", "user2", "user3"]
)
]
)
messaging_api.rich_menu_batch(batch_request)# Template for e-commerce bot
def create_ecommerce_menu():
return RichMenuRequest(
size=RichMenuSize(width=2500, height=843), # Half height
selected=True,
name="E-commerce Menu",
chat_bar_text="Shop",
areas=[
RichMenuArea( # Categories
bounds=RichMenuBounds(x=0, y=0, width=625, height=843),
action=PostbackAction(data="action=categories", label="Categories")
),
RichMenuArea( # Search
bounds=RichMenuBounds(x=625, y=0, width=625, height=843),
action=PostbackAction(data="action=search", label="Search")
),
RichMenuArea( # Cart
bounds=RichMenuBounds(x=1250, y=0, width=625, height=843),
action=PostbackAction(data="action=cart", label="Cart")
),
RichMenuArea( # Account
bounds=RichMenuBounds(x=1875, y=0, width=625, height=843),
action=PostbackAction(data="action=account", label="Account")
)
]
)
# Template for customer service bot
def create_support_menu():
return RichMenuRequest(
size=RichMenuSize(width=2500, height=1686), # Full height
selected=True,
name="Support Menu",
chat_bar_text="Help",
areas=[
RichMenuArea( # FAQ
bounds=RichMenuBounds(x=0, y=0, width=1250, height=843),
action=PostbackAction(data="support=faq", label="FAQ")
),
RichMenuArea( # Contact Agent
bounds=RichMenuBounds(x=1250, y=0, width=1250, height=843),
action=PostbackAction(data="support=agent", label="Talk to Agent")
),
RichMenuArea( # Track Issue
bounds=RichMenuBounds(x=0, y=843, width=833, height=843),
action=PostbackAction(data="support=track", label="Track Issue")
),
RichMenuArea( # Submit Feedback
bounds=RichMenuBounds(x=833, y=843, width=834, height=843),
action=PostbackAction(data="support=feedback", label="Feedback")
),
RichMenuArea( # Return to Main
bounds=RichMenuBounds(x=1667, y=843, width=833, height=843),
action=RichMenuSwitchAction(
rich_menu_alias_id="main_menu",
data="menu=main"
)
)
]
)Install with Tessl CLI
npx tessl i tessl/pypi-line-bot-sdk