LINE-Bot-API
view release on metacpan or search on metacpan
eg/echo.psgi view on Meta::CPAN
use strict;
use warnings;
use lib 'lib';
use Plack::Request;
use LINE::Bot::API;
use LINE::Bot::API::Builder::SendMessage;
my $channel_secret = $ENV{CHANNEL_SECRET};
my $channel_access_token = $ENV{CHANNEL_ACCESS_TOKEN};
my $messaging_api_endpoint = $ENV{MESSAGING_API_ENDPOINT};
my $callback_url = $ENV{CALLBACK_URL} // '/perl/callback';
my $bot = LINE::Bot::API->new(
channel_secret => $channel_secret,
channel_access_token => $channel_access_token,
messaging_api_endpoint => $messaging_api_endpoint,
);
sub {
my $env = shift;
my $req = Plack::Request->new($env);
unless ($req->method eq 'POST' && $req->path eq $callback_url) {
warn "Unknown endpoint: $callback_url != @{[ $req->path ]}\n";
return [404, [], ['Not Found']];
}
unless ($bot->validate_signature($req->content, $req->header('X-Line-Signature'))) {
warn "Bad LINE Signature\n";
return [400, [], ['bad request']];
}
my $events = $bot->parse_events_from_json($req->content);
for my $event (@{ $events }) {
my $messages = LINE::Bot::API::Builder::SendMessage->new;
if ($event->is_message_event) {
my $from_id;
if ($event->is_user_event) {
$from_id = $event->user_id;
} elsif ($event->is_group_event) {
$from_id = $event->group_id;
} elsif ($event->is_room_event) {
$from_id = $event->room_id;
}
warn sprintf 'message_id=%s, type=%s(%s), reply_token=%s, timestamp=%s', $event->message_id, $event->type, $from_id, $event->reply_token, $event->timestamp;
if ($event->is_text_message) {
if ($event->text eq 'me' && $event->is_user_event) {
my $profile = $bot->get_profile($event->user_id);
$messages->add_text(
text => sprintf('Hello! %s san! Your status message is %s', $profile->display_name, ($profile->status_message // 'null')),
)->add_sticker(
package_id => '1',
sticker_id => int(rand(10))+1 + '',
);
} else {
$messages->add_text( text => $event->text );
}
} elsif ($event->is_image_message || $event->is_video_message) {
my $size = do {
my $res = $bot->get_message_content($event->message_id);
$res->is_success ? (-s $res->fh) : '-';
};
my $type = $event->is_image_message ? 'image' : 'video';
$messages->add_text( text => sprintf("Thank you for sending a %s.\nOriginal file size: %s", $type, $size) );
} elsif ($event->is_audio_message) {
$messages->add_text( text => 'Thank you for sending a audio.' );
} elsif ($event->is_location_message) {
$messages->add_location(
title => $event->title,
address => $event->address,
latitude => $event->latitude,
longitude => $event->longitude,
);
} elsif ($event->is_sticker_message) {
$messages->add_sticker(
sticker_id => $event->sticker_id,
package_id => $event->package_id,
);
}
( run in 1.121 second using v1.01-cache-2.11-cpan-524268b4103 )