2 min read

LINE BOT written by Kotlin works on AWS Lambda + API Gateway + DynamoDB, builded by Serverless Framework

Table of Contents

この記事はボット (Bot) Advent Calendar 2017 - Qiitaの20日目の記事です。

最近はスマートスピーカーの機運が高まってきていますが、BOT勢もまだまだ勢いは衰えていませんよ!!!1

家にいない時に電気消したい?家にいない時にエアコンつけたい?これをやるにはBOTが必要ですよね!ということでそんなBOT開発者の為にLINE BOTをKotlinで実装する為の雛形を作りました。

使用する技術スタックは表題にもありますが、以下の通りです。

  • LINE BOT SDK
  • Kotlin
  • AWS Lambda
  • API Gateway
  • DynamoDB
  • Serverless Framework

成果物

Githubで公開していますので、よろしければForkするなりIssues登録するなり好きにしてください:D

なお、本実装にはmoritalous/linebot-serverless-blueprint-javaを大いにパクっ参考にさせていただきました。この場を借りて御礼申し上げます:D

出来ること

これからBOT開発をしていく上で最低限必要な以下の機能を実装しています。

  • 入力された文字列をオウム返しする
  • 定期的にPushメッセージを送信する

入力された文字列によって処理を分岐したければそういうロジックを入れればよし、

定期的に何か別のAPIを叩きたければそういうロジックを書けばよし。

BOTにやらせたい処理って基本的にはどちらかに収束すると思うので、それをサクッと書き始められるような雛形、という位置づけです。

作成した経緯

以下の理由から、KotlinでLINE BOT書くしかねぇとなりまして。

  • Kotlin使ってなんか書きたいけどGUI考えるのめんどくさ(ry => BOT書くしかねぇ
  • スマートホーム化=外部ネットワークからリクエストを送りたい => BOT書くしかねぇ
  • Amazon Echo全然買えない => BOT書くしかねぇ

ところが、LINE BOTのKotlin実装って非常に人気がないんですね。ググってもなかなか情報が出てきませんでした。

ないなら作ればいいじゃないということで、作りました。

ハマったところ

ハマったところというか、まだわかってないんですが()

Gradleの最新verは執筆時点で4.4なんですが、これでビルドすると設定してるHandlerが見つからずにClassNotFoundException吐いちゃうんですよね。

Class not found: com.serverless.Handler: java.lang.ClassNotFoundException
java.lang.ClassNotFoundException: com.serverless.Handler

とりあえずバージョン落としてビルドすればなぜか通るので、2.13まで落としています。原因わかる方いたら助けてプリーズ。

build.gradle

task wrapper(type: Wrapper) {
    gradleVersion = '2.13'
}

gradle/wrapper/gradle-wrapper.properties

#Fri Feb 24 00:05:35 JST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.13-all.zip

その他に関しては、優秀なIDE(IntelliJ IDEA CE)に助けられながら、多少はKotlinぽい?コードになったのかなぁ…とか思ってます。Kotlinほぼ初見で書いているので、変な部分あれば容赦なく突っ込んでください:D

参考サイト