今回の LINE API テストにつかった Perl ソース(PSGI 対応)の bot.psgi を載せておく。
API リファレンスに載っているソース例を元に作成した。
(前回のエントリーを書いてから、メッセージの出力を追加してるけど)
use strict;use warnings;use utf8;use LINE::Bot::API;use LINE::Bot::API::Builder::SendMessage;use Plack::Request;my $channel_secret = '84xxxxxxxxxxxxxxxxxxxxxxxxxxxxec';my $channel_access_token = '8sXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcDnyilFU=';my $bot = LINE::Bot::API->new(channel_secret => $channel_secret,channel_access_token => $channel_access_token,);sub {my $req = Plack::Request->new(shift);unless ($bot->validate_signature($req->content,$req->header('X-Line-Signature'))) {return [200, [], ['bad request']];}my $events = $bot->parse_events_from_json($req->content);foreach my $event (@{ $events }) {if ($event->is_user_event && $event->is_message_event&& $event->is_text_message) {my $messages = LINE::Bot::API::Builder::SendMessage->new;$messages->add_text( text => $event->text );$messages->add_text( text => 'って言ったのね?');my $res = $bot->reply_message($event->reply_token,$messages->build);}}return [200, [], ["OK"]];};
これで、
こんな感じに、ユーザが入力した文字を復唱したあとで、「って言ったのね?」と問いかけるウザい形に(笑)。
ポイントは、use utf8 と宣言して、プログラム内に記述される文字列リテラルがすべて「flagged utf8」(utf8 フラグ有効)になるようにすること。
LINE Messaging API に送る文字列は utf8 フラグ有効にしたものでないと駄目。use utf8 してないと、LINE 画面で文字化けする。
まあ、use Encode 宣言して、ひとつひとつ Encode::decode('utf8', 'って言ったのね?') という具合にしても(多分)一緒だけど。いちいちするのは面倒なので、use utf8 した方がいいだろう。
さて、LINE がらみの提案をしたいお客さんのサーバでは PSGI サーバが使えないので、CGI 版に直してみるかな。
<追記>
ちょっとソースを転記したとき、コピーミスがあったので修正した(2020/05/13 12:00)