Challenge Java EE !

Java EEを中心に趣味や仕事における開発メモを書いています。

LINE Messaging APIで「若様bot」を作ってみました

なんだか今日は乃木坂46関連で色々とニュースが流れていて(ひめたん17th活動停止、まなったん写真集、文春砲…)大変な日です。

そんなニュースを横目に、コツコツとbotを作ってました。まだ開発途中なのですが、紹介ページも作ってみたので公開してみます(^^;

wakasamabot.sakamichi46.com

上記ページにもLINEで友だち追加するQRコードなどありますが、ここにも


f:id:kikutaro777:20170128222526p:plain:w200

LINEの友だち追加

このbotは、私が大好きな乃木坂46の若月佑美さんのAIと会話できるbotです。主には

  • 「若様」と話しかけるとブログなどの情報リンクを返してくれる
  • 「こんばんは」と話しかけると「こんばんわかつき~」と若ちゃん挨拶を返してくれる
  • 「写真」「画像」など話かけると若ちゃんの写真をランダムに送ってくれる


f:id:kikutaro777:20170125001539p:plain:w350

と、非常に俺得なbotとなっております。とはいえ当初目的は、若ちゃんの素晴らしさをもっと広めたい!という所ですので、もう少し一般的に楽しめる機能も少ないですが入れています。

  • 普通にトークできる機能(現状、文脈は取れないです)
  • 若ちゃんがやってるラジオ「エバンジェリストスクール」の「略語コーナー」再演


f:id:kikutaro777:20170125001600p:plain:w350

このブログみてくれる方は情報系学生さんやエンジニアの方が多いと思いますが、例えば「IBM」って何の略語かわかりますか(^^)?私はわかりませんでしたw ラジオでそういうやりとりをするコーナーがあるんですが、普段IT業界にいてもハっとさせられることが多いです。エバンジェリストスクール、略してエバスクに興味もった方は以下読んでみてください~。

kikutaro777.hatenablog.com

技術スタック的には

Bot

  • Heroku
  • Spring Boot
  • Cognitive Services(現状はBing Image Search API,QnA Maker)
  • DoCoMo 雑談対話 API

Web Site

などを利用しています。今後まだ機能拡張する予定で、Cognitive ServicesはもういくつかAPIを利用するつもりです。


現状、アイコンに若月さんの写真を使ってしまっているので、この辺は肖像権の話などありますので、変更していく予定です。せっかくなので、もう少し拡張して「LINE BOT AWARDS」に登録したいなぁと思っており、規約にもちゃんと以下明記されていましたので。

f:id:kikutaro777:20170128223252p:plain

こういうBotってどうしてもアイドルとかアニメなど、身近なネタと絡めたくなるので、こういう所が難しいですね(^^;もし、若ちゃんの似顔絵画像とか描きますよ!という方などいらっしゃったら、お声かけいただけると嬉しいです(>_<)

Spring BootとLINE Messaging APIで作ったLINE BOTをHerokuで動かす

やっと触れましたLINE Messaging API。やばい、なにこれめっちゃ楽しい。

上のは完全に遊びですが、仕事でも真面目に検討してもいいのかもって今更ながら真面目に思い始めました。QRコードから簡単に友だち追加できるので、何かと初速が速いなぁと。とりあえずスマホだけあれば良いわけですし。と当たり前なことを今更言ってしまうぐらい楽しいです。

Javaな方々は公式からThe Messaging API SDK for Javaが出てるので、これで簡単に始められます。

github.com

ドキュメントは以下参照。

LINE API Reference

line-bot-spring-boot moduleもあるのでSpring Bootの勉強がてら始めるのもホントおすすめです(自分は完全にそんな感じ)

GitHubのページにサンプルコードありますが、単純に送ったメッセージをやまびこのようにブーメランするだけなら

package com.example.bot.spring.echo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.linecorp.bot.model.event.Event;
import com.linecorp.bot.model.event.MessageEvent;
import com.linecorp.bot.model.event.message.TextMessageContent;
import com.linecorp.bot.model.message.TextMessage;
import com.linecorp.bot.spring.boot.annotation.EventMapping;
import com.linecorp.bot.spring.boot.annotation.LineMessageHandler;

@SpringBootApplication
@LineMessageHandler
public class EchoApplication {
    public static void main(String[] args) {
        SpringApplication.run(EchoApplication.class, args);
    }

    @EventMapping
    public TextMessage handleTextMessageEvent(MessageEvent<TextMessageContent> event) {
        System.out.println("event: " + event);
        return new TextMessage(event.getMessage().getText());
    }

    @EventMapping
    public void handleDefaultMessageEvent(Event event) {
        System.out.println("event: " + event);
    }
}

で作れます。便利すぎる(^^;

誰でも簡単に、って感じなのだと思いますが、知ってると便利かなと思うことをまとめたいと思います。

クラウドとか使わずローカル環境で動作確認したいとき

当初、なんかサーバとかをクラウドに用意せんと動かせないよなーとか思ってたのですが、去年JJUG CCC 2016 FallでLINEの@tokuhiromさんがLINE BOT ライブコーディングをされていて、ngrokを使う方法を紹介されてました。

Java + spring-boot で書く! LINE BOT ライブコーディング。 · Issue #34 · jjug-ccc/call-for-paper-2016fall · GitHub

ngrokは知っていたので、これ聴いたとき、ぬおおー!その手があったのかって感じでした。(知ってたなら気づけっていう

ngrok.com

ngrok http 8080

と起動すればローカルPCの指定ポートを外部にトンネルしてくれます。

f:id:kikutaro777:20170116222625p:plain

Spring Bootでアプリを起動しておけば、上記ngrokでトンネルされたhttpとhttpsのURLをpublicに使うことできますので、httpsのアドレスをLINE Messaging APIに登録することができます。

f:id:kikutaro777:20170116222900p:plain

httpは以下のように登録できないので、ngrok使ったやり方は非常にお手軽だと思います。証明書もいらないし。

f:id:kikutaro777:20170116222942p:plain

設定まわり URLにcallback

Webhookを登録したとき、Verifyがうまくいかない、と最初ちょっとハマってました。Spring Boot利用したとき、デフォルトでは先ほどのキャプチャにあるように「https://hogehoge.ngrok.io/callback」のような形で「callback」と入れてあげる必要があります。GitHubのConfigurationに、デフォルトが「callback」になっていることが書いてあるのですが最初気づかなくて、ハマってました。

f:id:kikutaro777:20170116224349p:plain

あくまでデフォなので、変えてしまうのもありです。

設定まわり 自動応答メッセージ

ちゃんとドキュメント読めって感じなのですが、最初、WebhookのVerifyが成功してローカルPCにもデータ飛ぶのに、LINEから話かけると常に以下の「メッセージありがとうございます 申し訳ありませんが、このアカウントでは個別のご返信ができないのです 次回の配信をお楽しみに」と出てしまって、わからんーってなってました(^^;

f:id:kikutaro777:20170116223626j:plain

LINE@Managerで「アカウント設定」->「Bot設定」の「詳細設定」->「自動応答メッセージ」を「利用しない」にするだけです。

f:id:kikutaro777:20170116223907p:plain

herokuでhttps

ここまででローカル開発環境で色々遊べるのですが、最後はやっぱり公開してみたい、ということがあると思います。証明書は安いものを取るか、Let's Encryptなど使うか、など選択肢があるかと思いますが、それなりに手間だなぁと。で、探してたらHerokuのAdd-onでFixieを使うと簡単とのこと。

qiita.com

実際に試したらホント簡単でした(^^;

画像や動画、スタンプの認識

最後におまけですが、冒頭に出したサンプルコードはテキストメッセージをやまびこするものでしたが、画像とか動画、スタンプが送られてきた場合、どうフックするのかなーと思ったのですが、@EventMapping使って以下のように定義すれば、そのままフックされました。

@EventMapping
public Message handleStickerMessage(MessageEvent<StickerMessageContent> event) {
    return new TextMessage("スタンプ送信ありがとうございます!");
}
    
@EventMapping
public Message handleImageMessage(MessageEvent<ImageMessageContent> event) {
    return new TextMessage("画像送信ありがとうございます!");
}
    
@EventMapping
public Message handleVideoMessage(MessageEvent<VideoMessageContent> event) {
    return new TextMessage("動画送信ありがとうございます!");
}
    
@EventMapping
public Message handleAudioMessage(MessageEvent<AudioMessageContent> event) {
    return new TextMessage("音声送信ありがとうございます!");
}

@EventMapping
public Message handleFollowEvent(FollowEvent event) {
    return new TextMessage("友達追加ありがとうございます!");
}

Herokuの環境変数利用

LINEのChannelSecretやTokenはコードに埋め込んだり、設定ファイルでGitHubなどにアップするわけにはいかないので、Herokuなどでは環境変数を利用するのが良いかと思います。で、gradleを利用してる場合は

sample-spring-boot-echoのREADMEにあるように
github.com

../gradlew bootRun -Dline.bot.channelToken=YOUR_CHANNEL_TOKEN \
                   -Dline.bot.channelSecret=YOUR_CHANNEL_SECRET

みたいに指定するようです。自分はMaven使ってたのと、application.propertiesを上手く使えないかなぁと思って調べたら

line.bot.channelSecret = ${CHANNEL_SECRET}
line.bot.channelToken = ${CHANNEL_TOKEN}

というように定義することができました。ほえー便利。

ということで、Spring Bootの勉強を楽しみながらするのにもおススメなLINE Messaging APIでした!

すごい面白いのができたらAwardsに出して1000万狙うしかない!(無理

botawards.line.me

2016年に最も読まれた記事 TOP10 Java EE少ない…

2016年で分析してみました。ページビューの総数は317,337でした。

f:id:kikutaro777:20170114191333p:plain

ちなみにブログの総アクセス数は2016年で100万アクセスを超えました(^^)!(逆にこわい)

ということで2016年のTop10

1位 アクセス数 11,601

なぜこれが1位!?びっくりです。
kikutaro777.hatenablog.com

2位 アクセス数 11,174

はじめてAdvent Calendarに参加した記事で想い入れが強い記事です。ちょくちょく昔のPrimeFaces記事に質問もらったりするので、わりと使われてるのかなー。
kikutaro777.hatenablog.com

3位 アクセス数 10,217

この辺は懐かしくもあり、未だにちゃんとわかってない気がするところ(^^;
kikutaro777.hatenablog.com

4位 アクセス数 9,916

小ネタ系が多い(^^;
kikutaro777.hatenablog.com

5位 アクセス数 7,189

キター!Twitter4J!長期的にみるとこれが一番アクセス多いんですよね(^^;ホント便利。@yusukeさんありがとうございます!
kikutaro777.hatenablog.com

と、ここでちょっと番外編として、はてブが多くついた記事を振り返ってみます。が、2016年は2つしかないwww 悲しい(>_<;けど書いてる量も質問下がりまくりなので仕方がない。(常駐してて全然書けねー時期モゴモゴ

番外編

はてブ1位

間違いなく2016年で一番感動したプレゼン。噂では聴いていたけど生でみてびっくりしました。気が付けばエバンジェリストスクールを毎週欠かさず聴いて、日々刺激をもらってます。
kikutaro777.hatenablog.com

はてブ2位

2位にあげるのも…ってレベルですが(^^;そして、どちらもJava EEじゃないっていうwww
kikutaro777.hatenablog.com

番外編 その2

2016年は執筆に参加させていただいたパーフェクト Java EEが発売にもなった年でした。JavaOneでまたJava EE少し盛り上がらないかなぁと期待していましたが、うーん(^^;;本は売れているのだろうか(汗
でもホント素晴らしい方々と書かせていただいて、良い経験になりました。恐縮しまくり…。

kikutaro777.hatenablog.com

ではでは戻ります。

6位 アクセス数 6,874

やっとこガチな感じのJSFネタ!でももうJSFは時代じゃない気も。
kikutaro777.hatenablog.com

7位 アクセス数 6,466

Azureこれはもうダッシュボードとか含めて古い情報になってしまってますね(^^;今年はまたAzureも触っていきたいです。
kikutaro777.hatenablog.com

8位 アクセス数 5,136

6位に続いて、こちらもJSFネタ。現場からお届けしてた感じのやつです。
kikutaro777.hatenablog.com

9位 アクセス数 4,669

Active Directoryかー、わりと読まれるんだなぁ(^^;
kikutaro777.hatenablog.com

10位 アクセス数 4,183

最後もJSFですか。JPAは全然入ってないんだな…。
kikutaro777.hatenablog.com

ということでこんな感じで、Java EEネタは3,4割くらいですかね(^^;;最近はQiitaにも書いてるのでご興味あれば是非フォローお願いしますm(_ _)m

qiita.com

にほんブログ村 IT技術ブログへ
にほんブログ村 にほんブログ村 IT技術ブログ Javaへ
にほんブログ村