Help us understand the problem. What is going on with this article?

LINE Messaging APIを使ったオウム返しBot (Perl)

More than 3 years have passed since last update.

概要

LINE Messaging API を使って、Perlでオウム返しBotを作成してみます。
アカウントは、LINE Business Center から取得可能です。

動作イメージ

13E8592F-57FA-4C02-8FF1-2B514F8B38E5.jpg

動かし方

Replay message と呼ばれるAPIを使用します。
Botが反応するまでの大まかな流れは以下の通りです。(太字が今回作成する処理)

  1. BotのいるLINE部屋で喋る
  2. 事前設定したURLにLINEサーバからPOSTが届く
  3. POST内容からメッセージ本文と返信用トークンを取得する
  4. 返信用トークンを使用して、LINEサーバにメッセージを送信
  5. Botがメッセージを喋ってくれる

ソースコード

line_echo_bot.pl
#!/usr/bin/perl
use CGI;
use JSON;
use LWP::UserAgent;
my $cgi  = new CGI();
my $json = new JSON();
my $ua   = new LWP::UserAgent();

# API認証情報
my $API_URI               = "https://api.line.me/v2/bot/message/reply";
my $CHANNEL_ACCCESS_TOKEN = "xxxxx"; # LINE developersから取得したtokenを指定

# LINEからPOST受信
my $source = $cgi->param('POSTDATA');
my $items  = $json->decode($source);
my $event  = $items->{events}[0];

# replyToken、投稿内容取得
my $reply_token = $event->{replyToken};
my $reply_text  = $event->{message}->{text};

# LINEに200を返す
print "Status: 200 OK\n";
print "Content-Type: text/html\n\n";

# 返信メッセージ作成、JSONエンコード
my $data = {
    "replyToken" => $reply_token,
    "messages"   => [
        {"type"  => "text", "text" => "復唱するよ。"},
        {"type"  => "text", "text" => $reply_text}
    ]
};
my $content = $json->utf8(0)->encode($data);

# POSTリクエスト生成
my $req = HTTP::Request->new("POST", $API_URI);
$req->header("Content-Type"  => "application/json");
$req->header("Authorization" => "Bearer $CHANNEL_ACCCESS_TOKEN");
$req->content($content);

# POST送信
$ua->request($req);

以下の箇所を修正することで、一度につき5件までメッセージ送信が可能です。

    "messages"   => [
        {"type"  => "text", "text" => "復唱するよ。"},
        {"type"  => "text", "text" => $reply_text}
    ]

上記のサンプルコードは、GitHubより取得可能です。
https://github.com/yuu26jp/line-echo-bot

参考資料

API Reference - Messaging API
API Reference - Webhook Event Object
API Reference - Reply Message

活用例

グループ部屋にもBotを参加させることは可能なので、いろいろ遊んでみてください。
私はスプラトゥーンでよく遊ぶので、こんなBotを作ってみました。

1F950689-54BE-4A0F-B4F6-2AEA725482FB.jpg

yuu26
インフラ分野に興味のあるエンジニアです。 https://spla2.yuu26.com なども作っています。 最近、新しい記事はブログに書くことが多くなってきました。
http://blog.yuu26.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away