CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/pypi-line-bot-sdk

LINE Messaging API SDK for Python with comprehensive bot development capabilities including messaging, webhooks, and platform integrations.

Pending
Overview
Eval results
Files

rich-menus.mddocs/

Rich Menus

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.

Capabilities

Rich Menu Management

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
        """

Rich Menu Images

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
        """

User Rich Menu Assignment

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
        """

Bulk Rich Menu Operations

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
        """

Rich Menu Aliases

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
        """

Batch Rich Menu Operations

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
        """

Rich Menu Models

Core Rich Menu Configuration

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
        """

Rich Menu Alias Models

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]

Bulk Operation Models

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."""

Response Models

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"""
    pass

Usage Examples

Creating a Basic Rich Menu

from 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}")

Uploading Rich Menu Image

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")

Linking Rich Menu to Users

# 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)

Dynamic Rich Menu Switching with Aliases

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"
)

Advanced Rich Menu Management

# 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)

Rich Menu Templates

# 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

docs

authentication.md

index.md

messaging.md

rich-menus.md

rich-messages.md

user-management.md

webhooks.md

tile.json