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-mess
age
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-messa
ge
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-d
elivery-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;
say $ret->language;
}
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-membe
r-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()>.
get_user_interaction_statistics({ requestId => "..." })
Returns statistics about how users interact with narrowcast messages or
broadcast messages sent from your LINE Official Account.
See also the LINE Developers API reference of this method:
https://developers.line.biz/en/reference/messaging-api/#get-message-eve
nt
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);
Build a text message with emojis inside:
my $message = LINE::Bot::API::Builder::SendMessage->new();
$message->add_text(
text => '$ LINE Emoji $',
emojis => [
+{
"index" => 0,
"productId" => "5ac1bfd5040ab15980c9b435",
"emojiId" => "001"
},
+{
"index" => 13,
"productId" => "5ac1bfd5040ab15980c9b435",
"emojiId" => "002"
}
]
);
Since 2020/04/16, text messages may contain LINE emojis. They are
identified by (productId, emojiId). For more details about possible
values as well as how to use these emojis, please read:
https://developers.line.biz/en/reference/messaging-api/#text-message
first.
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-messag
e
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/