Perl: 2020年5月アーカイブ

今回の 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"]];
};

これで、

20200512_line1.jpg

こんな感じに、ユーザが入力した文字を復唱したあとで、「って言ったのね?」と問いかけるウザい形に(笑)。

ポイントは、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)
いやあ、やっと LINE Messaging API を使った「オウム返し bot」がちゃんと動いた。

試しに Perl でテストプログラムを作ってみようと昨夜手をつけたんだけど、これがなかなかうまく行かなくて(^^;

公式 API リファレンスに載ってるスクリプト例が PSGI(Perl Web Server Gateway Interface)前提になってるんで、CGI 形式になおしてもよかったんだけど、まあ、せっかくなんで PSGI 使ってみようかなっと。その分よけいに時間がかかってしまった(^^;

やることは、

    1. CPAN から Perl モジュールを簡単にインストールするための cpanm のインストール
    2. Plack インストールの前準備(openssl-devel、expat-devel などを yum で入れておく)
    3. Plack(PSGI サーバソフトウェア)のインストール(cpanm で、Task::Plack、XMLRPC::Transport::HTTP::Plack をインストール)
    4. LINE API 関係のモジュールをインストール(cpanm で、LINE::Bot::API をインストール)
    5. Apache に PSGI サーバへのリバースプロキシ設定を追加(https://www.hoge.jp/line_api/ にアクセスがあったら、http://localhost:5000/ に転送・・・みたいな)
    6. API を使うチャンネルを LINE Developersコンソールで作成
    7. チャンネルの設定(基本設定、Webhook やチャネルアクセストークンなど Messaging API の設定)
    8. プログラム作成(GitHub 上の「LINE::Bot::API - SDK of the LINE Messaging API for Perl」にサンプルプログラムあり)
    9. Apache Web サーバ起動
    10. PSGI サーバ起動(例:plackup --max-workers 30 --port 5000 -a bot.psgi&)
    11. LINE でこのチャンネルと友達になる
    12. トーク画面で話しかけて、同じ言葉をチャンネル側が返してくるか確認

って感じ。けっこう色々あるっしょ?

20200511_line1.jpg
これがなかなか大変。Task::Plack のインストールはかなりの数のモジュールがインストールされるので時間がかかるし、「チャンネルの設定」って一行でさらっと書いているけど、アイコンとかチャンネル名とかの基本情報は LINE Official Account Manager で設定するし、Webhook やチャネルアクセストークンの発行などは LINE Developers で行う。どっちで何を設定できるのかよくわからんし、飛んだ先のページからの戻りリンクが無かったり、なんか手間取った。

結局、うまく行かなかったのも、チャネルアクセストークンの発行が正しく行われてなかったからのようだ。ずっとうまく行かなくて悩んでいたのだが、トークンを再発行してプログラムに設定したら、あっけなく上手く行った。

PSGI も初めてだったので、その仕組から調べたので時間がかかった。素直に PSGI のソースを CGI に書き直した方が早かっただろう(笑)
ググっても、ngrok を利用する記事が多くて、最初は PSGI のこともよくわからなかったので、何が何やら(^^;・・・

まあ、そのうち、ルータの内側の PSGI サーバへ外部から直接アクセスするために ngrok というトンネリングサービスを使っていることや、つまりは PSGI サーバは Java の Tomacat みたいなアプリケーションサーバ(のようなもの)なのか・・・とかそういうことがわかってきたので、「うちのテストサーバはグローバルIPアドレス空間にいるので ngrok なんか使わずに、Apache で Reverse Proxy 設定してやればいいだけじゃん」と。そこまで考えが至るにもけっこう時間がかかった(^^;

疲れた(^^;

具体的な設定やプログラムについては追々書いていこう(笑)

このアーカイブについて

このページには、2020年5月以降に書かれたブログ記事のうちPerlカテゴリに属しているものが含まれています。

前のアーカイブはPerl: 2020年2月です。

次のアーカイブはPerl: 2020年11月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら