JDBな人生  専門的なことから日常的なことまで~ まぁ自由きままに書いていきます。
2016年04月 / 03月<< 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 >>05月

アクセスランキング

[ジャンルランキング]
コンピュータ
364位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
46位
アクセスランキングを見る>>

LINE BOT API に Mojolicious::Lite & LWP::UserAgent で接続してみる

今朝Qiitaでみて知ったのですが、いまLINEがこんなサービスを試験しているようです。

BOT API Trial Accountのご紹介 | LINE BUSINESS CENTER
https://business.line.me/services/products/4/introduction

JSONベースのAPIを使ってBOTを実装することで、(いまのところ)50名までのユーザと、任意のタイミングでメッセージを送受信することができるというものです。 実装自体は非常に簡単で、実用化されればメールに代わる通知の手段としても使えそうです。

具体的には、
(1) ユーザからのコンタクト受諾時、ブロック時、およびメッセージ受信時のコールバックの実装
(2) ユーザへメッセージを返信するためのUserAgentの実装
という具合です。

ということで、Mojolicious::Liteで簡単に実装してみました。とは言ってみたものの、DB接続を頻繁に行うということなどがなければ、ただの一枚CGIでも十分に実装可能な内容です。
use strict;
use warnings;
use utf8;

use Mojolicious::Lite;
use JSON qw(decode_json encode_json);
use Digest::SHA qw(hmac_sha256_base64);

use LWP::UserAgent;

use Data::Dumper;

app->config(hypnotoad => {listen => ['http://*:8080']});

#アカウントの管理画面から取得
my $channel_id = 'CHANNEL ID';
my $channel_secret = 'CHANNEL SECRET';
my $bot_mid = 'BOT MID';

sub generate_msg_json_text {
    my ($mids_to_arrayref, $body) = @_;
    return {
        to => $mids_to_arrayref, 
        toChannel => 1383378250, #FIXED
        eventType => '138311608800106203', #FIXED
        content => {
            contentType => '1', #FIXED
            toType => '1', #FIXED
            text => $body
        }
    };
}

sub post_msg_json {
    my ($channel_id, $channel_secret, $bot_mid, $body) = @_;
    my $ua = LWP::UserAgent->new;
    my $res = $ua->post(
        'https://trialbot-api.line.me/v1/events', 
        'Content' => $body, 
        'Content-Type' => 'application/json', 
        'X-Line-ChannelID' => $channel_id, 
        'X-Line-ChannelSecret' => $channel_secret, 
        'X-Line-Trusted-User-With-ACL' => $bot_mid
    );
    #ToDo: think what to do
}

post '/line/callback' => sub{
    my $self = shift;

    my $key = $channel_secret;
    my $request_body = $self->req->body;
    my $signature_should_be = hmac_sha256_base64($request_body, $key);

    my $signature_got = $self->req->headers->header('x-line-channelsignature') || "";
    $signature_got =~ s/=//g;

    if ($signature_should_be ne $signature_got) {
        $self->render(json => {}, status => 470);
        return;
    }

    my $json = decode_json($request_body);
    my $results = $json->{'result'};
    foreach my $result (@$results) {
        my $content = $result->{'content'};  
        my $op_type = $content->{'opType'};
        my $new_msg_json = undef;

        #コンタクト受諾時・ブロック時
        if (defined $op_type) {
            my $msg_from = $content->{'params'}->[0];
            if ($op_type == 4) {
                $new_msg_json = generate_msg_json_text([$msg_from], 'The tutorial to enable LINE notifications is available at: http://--');
            } elsif ($op_type == 8) {
                #GOOD BYE
            }
        } else {
            my $msg_body = $content->{'text'};
            my $msg_from = $content->{'from'};
            #やまびこ
            $new_msg_json = generate_msg_json_text([$msg_from], 'hello. this is what you said: ' . $msg_body);
        }

        app->log->debug(Dumper($result));

        if (defined $new_msg_json) {
            post_msg_json($channel_id, $channel_secret, $bot_mid, encode_json($new_msg_json));
        }
    }

    $self->render(json => {});
};

app->start;


運用中のサービスへの実装はまだ検討中ですが、料金によっては(おそらくユーザ数ごとに課金される形になるかと思います)利用していきたいと考えています。
スポンサーサイト
   Perl    TB(0)    CM(0)    EDIT    ページ↑

プロフィール

JDB Luigi

Author:JDB Luigi
どこにでもいるようなありふれた人間・・・という訳でもなく、かと言って怪しい宗教を信仰する変人という訳でも無い。

基本的に掲載しているコード等は煮ていただいても焼いていただいても結構ですが、利用は自己責任にてお願いいします。
また、バグ・アドバイス等もしあればよろしくお願いします。

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。