NAME LINE::Bot::API - SDK of the LINE Messaging API for Perl SYNOPSIS # in the synopsis.psgi use strict; use warnings; use LINE::Bot::API; use LINE::Bot::API::Builder::SendMessage; use Plack::Request; my $bot = LINE::Bot::API->new( channel_secret => $channel_secret, channel_access_token => $channel_access_token, ); sub { my $req = Plack::Request->new(shift); unless ($req->method eq 'POST' && $req->path eq '/callback') { return [200, [], ['Not Found']]; } unless ($bot->validate_signature($req->content, $req->header('X-Line-Signature'))) { return [200, [], ['failed to validate signature']]; } my $events = $bot->parse_events_from_json($req->content); for my $event (@{ $events }) { next unless $event->is_message_event && $event->is_text_message; my $messages = LINE::Bot::API::Builder::SendMessage->new; $messages->add_text( text => $event->text ); $bot->reply_message($event->reply_token, $messages->build); } return [200, [], ["OK"]]; }; DESCRIPTION LINE::Bot::API is a client library which lets you easily start using the LINE Messaging API. You can create a bot which runs on the LINE app by registering for a LINE Messaging API account. You can create a Messaging API account from the LINE Business Center . You can find the Channel secret and Channel access token on the Basic information page on the Channel Console which you can access from the LINE Business Center . Use this documentation and the LINE Developers documentation to get you started developing your own bot! METHODS new(%args) Create a new LINE::Bot::API instance. my $bot = LINE::Bot::API->new( channel_secret => $channel_secret, channel_access_token => $channel_access_token, ); reply_message($reply_token, [ $message, ... ] ) Send reply messages to a user, room or group. my $messages = LINE::Bot::API::Builder::SendMessage->new; $messages->add_text( text => 'Example reply text' ); my $ret = $bot->reply_message($reply_token, $messages->build); unless ($ret->is_success) { # error warn $ret->message; for my $detail (@{ $ret->details // []}) { warn " detail: " . $detail->{message}; } } You can get a reply_token from a webhook event object . See the documentation for the parse_events_from_json($json) method. See also the API reference of this method: https://developers.line.biz/en/reference/messaging-api/#send-reply-message push_message($user_id|$room_id|$group_id, [ $message, ... ]) Send push messages to a user, room or group. my $messages = LINE::Bot::API::Builder::SendMessage->new; $messages->add_text( text => 'Example push text' ); $bot->push_message($user_id, $messages->build); You can get a user_id, room_id or group_id from a webhook event object See the documentation for the parse_events_from_json($json) method. See also the LINE Developers API reference of this method: https://developers.line.biz/en/reference/messaging-api/#send-push-message multicast([$user_id, ... ], [ $message, ... ]) Send push messages to multiple users. my $messages = LINE::Bot::API::Builder::SendMessage->new; $messages->add_text( text => 'Example push text' ); $bot->multicast([ $user_id ], $messages->build); You can get a user_id from a webhook event object . See the documentation for the parse_events_from_json($json) method. See also the LINE Developers API reference of this method: https://developers.line.biz/en/reference/messaging-api/#send-multicast-messages broadcast([ $message, ... ]) Sends push messages to multiple users at any time. my $messages = LINE::Bot::API::Builder::SendMessage->new; $messages->add_text( text => 'Example push text' ); $bot->broadcast($messages->build); See also the LINE Developers API reference of thi smethod: https://developers.line.biz/en/reference/messaging-api/#send-broadcast-message validate_signature($json, $signature) my $req = Plack::Request->new( ... ); unless ($bot->validate_signature($req->content, $req->header('X-Line-Signature'))) { die 'failed to signature validation'; } parse_events_from_json($json) Parse webhook event objects and build LINE::Bot::API::Event instances. my $req = Plack::Request->new( ... ); my $events = $bot->parse_events_from_json($req->content); for my $event (@{ $events }) { unless ($event->is_unfollow_event && $event->is_leave_event) { # Get a reply_token my $reply_token = $event->reply_token; } if ($event->is_user_event) { # Get a user_id my $user_id = $event->user_id; } if ($event->is_room_event) { # Get a room_id my $room_id = $event->room_id; } if ($event->is_group_event) { # Get a group_id my $group_id = $event->group_id; } if ($event->is_message_event) { # Get a message id my $message_id = $event->message_id; } } leave_room($room_id) Bot leaves a room. $bot->leave_room($room_id); You can get a room_id by a Webhook Event Object . And see also parse_events_from_json($json) method's document. leave_group($group_id) Bot leaves a group. $bot->leave_group($group_id); You can get a group_id from a webhook event object . See the documentation for the parse_events_from_json($json) method. get_message_content($message_id) Get the original file which was sent by user. my $ret = $bot->get_message_content($message_id); if ($ret->is_success) { my $filename = $ret->fh->filename; open my $fh, '<', $file or die "$!: $file"; ... } You can get a message_id from a webhook event object . See the documentation for the parse_events_from_json($json) method. You can also see the online API reference documentation. See also the LINE Developers API reference of this method: https://developers.line.biz/en/reference/messaging-api/#get-content get_target_limit_for_additional_messages Gets the target limit for additional messages in the current month. See also the LINE Developers API reference of this method: https://developers.line.biz/en/reference/messaging-api/#get-quota get_number_of_messages_sent_this_month Gets the number of messages sent in the current month. See also the LINE Developers API reference of this method: https://developers.line.biz/en/reference/messaging-api/#get-consumption get_number_of_message_deliveries({ date => ... }) Get the number of messages sent from LINE official account on a specified day. See also the LINE Developers API reference of this method: https://developers.line.biz/en/reference/messaging-api/#get-number-of-delivery-messages The argument is a HashRef with one pair of mandatary key-values; { date => "20191231" } The formate of date is "yyyyMMdd", that is, year in 4 digits, month in 2 digits, and date-of-month in 2 digits. The return value $res is a response object with the following read-only accessors (see the API documentation for the meaning of each.) $res->status(); #=> Str $res->broadcast(); #=> Num $res->targeting(); #=> Num Notice that the "status" does not mean HTTP status. To inspect actual HTTP status, invoke $res-http_status()>. get_profile($user_id) Get user profile information. my $ret = $bot->get_profile($user_id); if ($ret->is_success) { say $ret->display_name; say $ret->user_id; say $ret->picture_url; say $ret->status_message; } See also the LINE Developers API reference of this method: https://developers.line.biz/en/reference/messaging-api/#get-profile get_friend_demographics Retrieves the demographic attributes for a LINE Official Account's friends. See also the LINE Developers API reference of this method: https://developers.line.biz/en/reference/messaging-api/#get-demographic get_group_member_profile($group_id, $user_id) Get group user profile information. my $ret = $bot->get_group_member_profile($group_id, $user_id); if ($ret->is_success) { say $ret->display_name; say $ret->user_id; say $ret->picture_url; } See also the LINE Developers API reference of this method: https://developers.line.biz/en/reference/messaging-api/#get-group-member-profile get_room_member_profile($room_id, $user_id) Get room user profile information. A room is like a group without a group name. The response is similar to get_group_member_profile. See also the LINE Developers API reference of this method: https://developers.line.biz/en/reference/messaging-api/#get-room-member-profile get_number_of_sent_reply_messages($date) Gets the number of messages sent with the /bot/message/reply endpoint. The number of messages retrieved by this operation does not include the number of messages sent from LINE@ Manager. The $date parameter is "yyyyMMdd" format. get_number_of_sent_push_messages($date) Gets the number of messages sent with the /bot/message/push endpoint. The number of messages retrieved by this operation does not include the number of messages sent from LINE@ Manager. date Date the messages were sent Format: yyyyMMdd (Example: 20191231) Timezone: UTC+9 get_number_of_sent_multicast_messages($date) Gets the number of messages sent with the /bot/message/multicast endpoint. The number of messages retrieved by this operation does not include the number of messages sent from LINE@ Manager. date Date the messages were sent Format: yyyyMMdd (Example: 20191231) Timezone: UTC+9 get_number_of_send_broadcast_messages($date) Gets the number of messages sent with the /bot/message/broadcast endpoint. The number of messages retrieved by this operation does not include the number of messages sent from LINE Official Account Manager. date Date the messages were sent Format: yyyyMMdd (Example: 20191231) Timezone: UTC+9 create_rich_menu( $rich_menu_object ) This method corresponds to the API of Creating rich menu One argument is needed: $rich_menu_object, which is a plain HashRef representing rich menu object get_rich_menu( $rich_menu_id ) This method corresponds to the API of Get rich menu One argument is needed: $rich_menu_id -- which correspond to the richMenuId property of the object returned by create_rich_menu method. delete_rich_menu( $rich_menu_id ) This method corresponds to the API of Delete rich menu One argument is needed: $rich_menu_id -- which correspond to the richMenuId property of the object returned by create_rich_menu method. The return value is an empty RichMenu object -- only status code matters. Upon successful deletion, status code 200 is returned. get_rich_menu_list This method corresponds to the API of Get rich menu list No arguments are needed. set_default_rich_menu( $rich_menu_id ) This method corresponds to the API of Set default rich menu One argument is needed: $rich_menu_id -- which correspond to the richMenuId property of the object returned by create_rich_menu method. get_default_rich_menu_id This method corresponds to the API of Get default rich menu ID No arguments are needed. The return value is a RichMenu object with only one property: richMenuId. cancel_default_rich_menu This method corresponds to the API of Cancel default rich menu ID link_rich_menu_to_user( $user_id, $rich_menu_id ) This method corresponds to the API of Link rich menu to user Both of $user_id and $rich_menu_id are required. link_rich_menu_to_multiple_users( $user_ids, $rich_menu_id ) This method corresponds to the API of Link rich menu to multiple users Both of $user_ids and $rich_menu_id are required. $user_ids should be an ArrayRef of user ids, while $rich_menu_id should be a simple scalar. get_rich_menu_id_of_user( $user_id ) This method corresponds to the API of Get rich menu ID of user The argument $user_id is mandatory. The return value is a RichMenu object with only one property: richMenuId. unlink_rich_menu_from_user( $user_id ) This method corresponds to the API of Unlink rich menu from user The argument $user_id is mandatory. The return value is an empty object. unlink_rich_menu_from_multiple_users( $user_ids ) This method corresponds to the API of Unlink rich menu from multiple users The mandatory argument $user_ids is an ArrayRef of user ids. The return value is an empty object. issue_channel_access_token({ client_id => '...', client_secret => '...' }) This method corresponds to the API of: Issue Channel access token The argument is a HashRef with two pairs of mandatary key-values: { client_id => "...", client_secret => "...", } Both pieces of information can be accquired from the channel console. When a 200 OK HTTP response is returned, a new token is issued. In this case, you may want to store the values in "access_token", "expires_in", and "token_type" attributes of the response object for future use. Otherwise, you my examine the "error" attribute and "error_description" attribute for more information about the error. revoke_channel_access_token({ access_token => "..." }) This method corresponds to the API of: Revoke channel access token The argument is a HashRef with one pair of mandatary key-values; { access_token => "..." } Upon successful revocation, a 200 OK HTTP response is returned. Otherwise, you my examine the "error" attribute and "error_description" attribute for more information about the error. get_number_of_followers({ date => "..." }) This method corresponds to the API of: Get number of followers The argument is a HashRef with one pair of mandatary key-values; { date => "20191231" } The formate of date is "yyyyMMdd", that is, year in 4 digits, month in 2 digits, and date-of-month in 2 digits. Upon successful invocation, a 200 OK HTTP response is returned. Otherwise, you my examine the "error" attribute and "error_description" attribute for more information about the error. The return value $res is a response object with the following read-only accessors (see the API documentation for the meaning of each.) $res->status(); #=> Str, one of: "ready", "unready", "out_of_service" $res->followers(); #=> Num $res->targetedReaches(); #=> Num $res->blocks(); #=> Num Notice that the "status" does not mean HTTP status. To inspect actual HTTP status, invoke $res-http_status()>. How to build a send message object See the LINE Developers API reference about Message objects When the LINE::Bot::API::Builder::SendMessage class is used, it is possible easily to build a send message object. That class supports a fluent interface. my $messages = LINE::Bot::API::Builder::SendMessage->new( )->add_text( text => 'Closing the distance', )->add_image( image_url => 'http://example.com/image.jpg', preview_url => 'http://example.com/image_preview.jpg', ); $bot->reply_message($reply_token, $messages->build); Text type Build a text type object. my $messages = LINE::Bot::API::Builder::SendMessage->new( )->add_text( text => 'Closing the distance', ); $bot->reply_message($reply_token, $messages->build); Image type Build an image type object. my $messages = LINE::Bot::API::Builder::SendMessage->new( )->add_image( image_url => 'http://example.com/image.jpg', preview_url => 'http://example.com/image_preview.jpg', ); $bot->reply_message($reply_token, $messages->build); Video type Build a video type object. my $messages = LINE::Bot::API::Builder::SendMessage->new( )->add_video( video_url => 'http://example.com/video.mp4', preview_url => 'http://example.com/video_preview.jpg', ); $bot->reply_message($reply_token, $messages->build); Audio type Build an audio type object. my $messages = LINE::Bot::API::Builder::SendMessage->new( )->add_audio( audio_url => 'http://example.com/image.m4a', duration => 3601_000, # msec ); $bot->reply_message($reply_token, $messages->build); Location type Build a location type object. my $messages = LINE::Bot::API::Builder::SendMessage->new( )->add_location( title => 'LINE Corporation.', address => 'Hikarie Shibuya-ku Tokyo 151-0002', latitude => 35.6591, longitude => 139.7040, ); $bot->reply_message($reply_token, $messages->build); Sticker type Build a sticker type object. my $messages = LINE::Bot::API::Builder::SendMessage->new( )->add_sticker( package_id => '1', sticker_id => '2', ); $bot->reply_message($reply_token, $messages->build); Imagemap type To build a message of imagemap type, you may use a helper module. my $imagemap = LINE::Bot::API::Builder::ImagemapMessage->new( base_url => 'https://example.com/bot/images/rm001', alt_text => 'this is an imagemap', base_width => 1040, base_height => 1040, )->add_uri_action( uri => 'http://example.com/', area_x => 0, area_y => 0, area_width => 1040, area_height => 520, )->add_message_action( text => 'message', area_x => 0, area_y => 520, area_width => 1040, area_height => 520, ); my $messages = LINE::Bot::API::Builder::SendMessage->new( )->add_imagemap($imagemap->build); $bot->reply_message($reply_token, $messages->build); An Imagemap message can contain a video area inside. Here is an example of one withe upper half being a video overlay: my $imagemap_message = LINE::Bot::API::Builder::ImagemapMessage->new( base_url => 'https://example.com/bot/images/rm001', alt_text => 'this is an imagemap', base_width => 1040, base_height => 1040, video => { originalContentUrl => "https://example.com/video.mp4", previewImageUrl => "https://example.com/video_preview.jpg", area => { x => 0, y => 0, width => 1040, height => 585 } } )->build; For more detail about Imagemap message, see: https://developers.line.biz/en/reference/messaging-api/#imagemap-message Template type Build a template type object. You can use a helper module for the template type. Buttons type my $buttons = LINE::Bot::API::Builder::TemplateMessage->new_buttons( alt_text => 'this is a buttons template', image_url => 'https://example.com/bot/images/image.jpg', title => 'buttons', text => 'description', )->add_postback_action( label => 'postback', data => 'postback data', text => 'postback message', )->add_message_action( label => 'message', text => 'message', )->add_uri_action( label => 'uri', uri => 'http://example.com/', )->add_message_action( label => 'message2', text => 'message2', ); my $messages = LINE::Bot::API::Builder::SendMessage->new( )->add_template($buttons->build); $bot->reply_message($reply_token, $messages->build); Confirm type my $confirm = LINE::Bot::API::Builder::TemplateMessage->new_confirm( alt_text => 'this is a confirm template', text => 'confirm', )->add_postback_action( label => 'postback', data => 'postback data', text => 'postback message', )->add_message_action( label => 'message', text => 'message', )->add_uri_action( label => 'uri', uri => 'http://example.com/', ); my $messages = LINE::Bot::API::Builder::SendMessage->new( )->add_template($confirm->build); $bot->reply_message($reply_token, $messages->build); Carousel type my $carousel = LINE::Bot::API::Builder::TemplateMessage->new_carousel( alt_text => 'this is a carousel template', ); for my $i (1..5) { my $column = LINE::Bot::API::Builder::TemplateMessage::Column->new( image_url => 'https://example.com/bot/images/item.jpg', title => "carousel $i", text => "description $i", )->add_postback_action( label => 'postback', data => 'postback data', text => 'postback message', )->add_message_action( label => 'message', text => 'message', )->add_uri_action( label => 'uri', uri => 'http://example.com/', ); $carousel->add_column($column->build); } my $messages = LINE::Bot::API::Builder::SendMessage->new( )->add_template($carousel->build); $bot->reply_message($reply_token, $messages->build); Image Carousel type my $carousel = LINE::Bot::API::Builder::TemplateMessage->new_image_carousel( alt_text => 'this is a image carousel template', ); my $column1 = LINE::Bot::API::Builder::TemplateMessage::ImageColumn->new( image_url => 'https://example.com/bot/images/item1.jpg', )->add_postback_action( label => 'postback', data => 'postback data', text => 'postback message', ); $carousel->add_column($column1->build); my $column2 = LINE::Bot::API::Builder::TemplateMessage::ImageColumn->new( image_url => 'https://example.com/bot/images/item2.jpg', )->add_message_action( label => 'message', text => 'message', ); $carousel->add_column($column2->build); my $column3 = LINE::Bot::API::Builder::TemplateMessage::ImageColumn->new( image_url => 'https://example.com/bot/images/item3.jpg', )->add_uri_action( label => 'uri', uri => 'http://example.com/', ); $carousel->add_column($column3->build); my $messages = LINE::Bot::API::Builder::SendMessage->new( )->add_template($carousel->build); $bot->reply_message($reply_token, $messages->build); AUTHORS LINE Corporation. COPYRIGHT Copyright 2016-2020 LICENSE This Software Development Kit is licensed under The Artistic License 2.0. You may obtain a copy of the License at https://opensource.org/licenses/Artistic-2.0 SEE ALSO LINE::Bot::API::Event, https://developers.line.biz/, https://at.line.me/