LINE変態コンシェルジュのPerl実装を作った

今すぐ登録

f:id:anatofuz:20180312122318p:plain

元ネタ

review-of-my-life.blogspot.jp

構成

という訳で作ったコードはこちらとなっております。 当初Dockerで動かそうとしていたのでレポジトリ名に名残があります。

github.com

今回はPlack + LINE::Bot::API + Werbservice::YDMMの大まかに3つのモジュールを利用して書いています。まさか自分で作ったモジュールを使うことになるとは思ってなかった。

PerlからLINEBotを叩くにはyappoさんが書かれたPerl HackersHubの記事を読めば大体分かる世界観です。

第44回 LINE Messaging APIで作るchatbot―LINE::Bot::APIとngrokでお手軽に!

実際今回作ったwebアプリも、ほぼサンプルコードの助けを得ながらPlackアプリとして書いた感じです。

ちなみにデプロイしている先はHerokuとなっています。当初はDocker imageをpushして動かそうと考えていたのですが、どうにも動かずbuild packを利用しました。

build packは二ヶ月前までメンテが行われている形跡があるものを利用しています。 github.com

挙動

挙動としては「XX」というとXXを人気順で検索しデフォルトで10件返してきます。

「XXをあと10個」というと追加で10件サーチしてきます。

他には「XXを人気で」「XXを日付で」というとソート順が変更されます。

f:id:anatofuz:20180312144441p:plainf:id:anatofuz:20180312144450p:plainf:id:anatofuz:20180312144453j:plain

ちなみに検索でヒットしなかった場合「XXは見つかんなかった…」と返してきます。

HowTo

LINEとの連携は先程のyappoさんの記事を、DMMとの通信は自作モジュールWebService::YDMMのREADMEなどを読んでいただければおおよその雰囲気はわかるかと思います。

今回のBotでは、偉大なる元ネタが1つのみのレスポンスだったのに対しデフォルトで10個のAVリストを返す実装を行っています。 その為carouse方式でメッセージをbuildし、返却しています。

 my $carousel = LINE::Bot::API::Builder::TemplateMessage->new_carousel(
                alt_text => 'this is a dmm videos',
            );

carouse方式の場合 LINE::Bot::API::Builder::TemplateMessage::Column->new() で作成したオブジェクトに対してメソッド経由でプロパティを設定する事でメッセージを作ることが可能です。

今回は画像サムネイル,動画へのリンク,DMM.comへのリンクの合計3種類をプロパティとしてそれぞれ設定しています。 urlが絡んでくるものは add_uri_action() メソッドを利用して追加します。

                my $col = LINE::Bot::API::Builder::TemplateMessage::Column->new(
                    image_url => $image_url,
                    title     => $title,
                    text      => "Please Selecet",
                )->add_uri_action(
                    label   => '動画で致す',
                    uri     => $movie_uri,
                )->add_uri_action(
                    label   => 'DMMで見る',
                    uri     => $item_uri,
                );
                $carousel->add_column($col->build);
            }

あとは手順通り

            my $messages = LINE::Bot::API::Builder::SendMessage->new()->add_template($carousel->build);
            my $res = $bot->reply_message($event->reply_token,$messages->build);
            ... unless $res->is_success; # error handling

などとすれば簡単にsendできます

注意点

WerbService::YDMMは検索モジュールではありますが、対象の動画がサンプルを持っていない場合もあります。 LINE::Bot::API::Builder::TemplateMessage::Columnは何かしらのURLが必須となっているので、無かった場合は飛ばすという処理が必要となってきます。

またこのURLはhttpsじゃないとダメですが、DMMのレスポンスはhttpなので置換する必要となります。

さらにタイトルは40文字以上だとクエリエラーになるため $title = substr($title,0,39); などとしてあげる必要があります。

感想

たまにこういうの作るとやっぱ楽しいね…