RubyでLINEのbotを作るために必要だったことまとめ

Pocket

Rubyの書き方も知らない。botの作り方も知らない。HTTPサーバーの設定方法も知らない。アプリケーションサーバーが何かもわかっていない。

そんな状態だった僕が、「数字博士」という人気(?)のbotを作るために必要だった知識をまとめます。「数字博士」は送った数字の特性を返してくれるbotで、使い方はこの記事を読んでもらえればわかるかと思います。

スマホの方はこちらから友達登録できます。

友だち追加

パソコンの方はQRコードを読み取ってください。

 

背景

僕は一体誰で、どういう流れでbotを作ることになったのか。

 

自己紹介

まず僕のプログラミングスキル関してだが、以前にSwiftを使ってiOSアプリを開発・リリースした経験があった。
だからRubyのようなオブジェクト指向言語はある程度理解できていた。
しかし、サーバーサイドに関しては全く開発経験がなかった。
サーバーで触ったことがあるといえば、WordPressを使ってブログ運営をしていたぐらいであった。

 

bot開発までの流れ

LINE BOT CARAVANというイベントが京都で開催され、僕はそれに参加した。
そのイベントで用意されたチュートリアルに従ったところ、送った文字列をそのまま返してくれるbotが完成した。
このbotを元に改良して、以前から必要性を感じていた「数字博士」を作ろうと思い立ったのである。

 

準備

「あの人、LINEのbotを作ってるんだって!」

って、そんなにすごいことなのか?

実際、そんなことはない。

botを作るために何が必要だったのかをまとめてみよう。
僕には別に大変な下積み時代があったわけではない。

botを作るにあたって事前に必要なものは三つある。
サーバーとプログラミングスキルとアイディアである。

事前に必要といえど、これから始めたらいいだけではあるが、一つ一つ紹介しよう。

 

サーバー

サーバーは、自分が書いたプログラムを実際に置いておくコンピューターであり、botを作るためにはレンタルサーバーを借りたりAWSを使用したりということが必要になって来る。

以上のようなサーバーは毎月費用がかかるのだが、Herokuというサービスを使うと無料でデプロイ(サービスを開始)することができる。無料でどれくらい使用できるかであるが、Herokuの新料金体系が発表され、2017年2月現在はこのような形になっている。

一つのbotを作るぐらいならHerokuで十分で、これからも何かサービスを作ろうと考えているのであればAWSやVPSを借りたらいいのではないかと思う。

僕はさくらのVPSを使った。

 

プログラミングスキル

botを作ろうと思って、プログラミング全くできません状態だったら流石に何もできないだろう。

ただ、学習コストもそれほどかからないし、始めるための敷居はめちゃめちゃ低いのではないかと思う。
それに、それほど難易度が高いわけでもない。
そういう点で、誰でも始められる趣味なのでオススメだ。

 

アイディア

どれだけスペックがいいサーバーがあろうと、どれだけ実装力が高かろうと、アイディアがなければbotは誕生しない!

アイディアは開発の基盤となり、これがプログラミングをクリエイティブたらしめるものなのだろうと思う。

まあ個人の開発なら、「自分のためにいいbotを作るぞ」ぐらいの感覚でいいだろう。

 

bot開発に必要な知識まとめ

サーバーサイドを触ったことがなければ、どういう仕組みでbotが動いているのか全然イメージが湧かないと思う。

 

概観

イメージはこんな感じだ。
これは僕が「サーバーわからん!教えて!」と先輩に頼んだ時に描いてもらった図を自分で書き直した図だ。

  1. ユーザーがbotにメッセージを送ると、Apacheさんにその内容が送られてくる。
  2. ApacheさんはUnicornさんにその内容を転送する。
  3. Unicornさんはapp.rbに従って返信内容を生成した後、Apacheさんにその内容を送信する
  4. Apacheさんがユーザーに返信内容を送る。

botにメッセージを送ると1秒もかからないうちに、このようにbotが動いて自動で返信しているのだ。

すごい!

ここで注意が必要なことは、

  • ユーザーとアプリケーションサーバー(Unicorn)との間にリバースプロキシ(Apache)を挟むこと
  • ユーザーとApacheさんとの間の通信にLINEのAPIが入り込んでいること
  • 1と4ではHTTPS通信が使われており、2と3ではHTTP通信が使われていること

の3点だ。(写真の図ではアプリケーションサーバーのことをappサーバーと書いている。)

まず、リバースプロキシの必要性についてだが、

この記事この記事などの記事で説明されている。

正直初心者からするとそれほど必要性を感じないのだが、「まあなんかよくわからんけど、ワンクッション挟んどこか。」ぐらいのノリでリバースプロキシを挿入している。

少し真面目な感じで言うと、クライアントからのHTTPリクエストは一旦Apacheさんに渡すようにした方が統一感があっていいかなという感じだろうか。

そして、ApacheがHTTPSという保護された通信をしている理由は、セキュリティの関係でLINEがそのように指定しているからである。

よし、

ここまで読んで、

何言ってんの?意味わからんw ( ^∀^)ゲラゲラ

って状態の人が、「わかったー!」ってなるために必要な知識を一つ一つ掘り下げてみよう。

 

HTTPサーバー

「HTTP」というのは通信における決まりごと(プロトコル)のことで、このHTTPに従っている通信(HTTP通信)でブラウザや他のサーバーと通信をするサーバーのことをHTTPサーバーと呼ぶ。

ちなみにHTTPS通信というのは、セキュリティの観点でより安全な、SSL通信によって暗号化された通信のことである。HTTPS通信もHTTPというプロトコルに準拠した通信である。

HTTPサーバーとしてはApacheやNginxが有名どころだ。どちらも無料でインストールできる。Nginxを使ったことがないので、それぞれの特性については割愛する。

botを作るなら、このHTTPサーバーの設定を理解しなければならない。全く何も知らない時は
この記事(Apache)に沿って設定を書いたらOKだと思う。
特に理解するべき知識はVirtualHostやProxyPassについてである。

  • VirtualHost

ドメイン名やIPアドレスやポート番号によって、DocumentRootを変更する設定。
この記事(Apache)に詳しく書いてある。
DocumentRootとは、サーバー内のどのディレクトリをRootにするかという設定のこと。

  • ProxyPass

ブラウザなどから送られてくるHTTPリクエストを内部で別のリクエストに変換する設定。
ApacheからUnicornにリクエストを転送するのに用いる。
クライアントとアプリケーションサーバーの間に入ってProxyPassを行なっているHTTPサーバーのことをリバースプロキシと言う。
この記事(Apache)にProxyPasssのことが詳しく書いてある。

 

アプリケーションサーバー

アプリケーションサーバーは、botのコードを保持して、リクエストに対するレスポンスを返すサーバーのこと。
UnicornやPumaが有名みたいだ。(ふざけて書いた。)

この記事を参照したらUnicornの雰囲気はわかるだろう。

UnicornやPumaはHTTPサーバーに含まれるのだが、Rackハンドラという位置付けみたいだ。
この記事にRackのことが詳しく書かれてある。
この記事によると、RackはRubyでWebサーバーを立ち上げるためのインターフェースらしい。

実際にUnicornを使用する際には、
この記事に書かれている通りの設定をすると動く。

 

Ruby

アプリケーションサーバーはapp.rb(.rbはRubyの拡張子)のようなファイルを保持して、リクエストに対するレスポンスを作成する。
ここで初めてRubyでのコーディングが必要となる。(今まで見てきたのは全て設定の方法などである。)

Rubyを扱うといっても、配列の処理と条件分岐とメソッドの使い方ぐらいを覚えたら、そんなに困ることはないのじゃないかと思う。

今回はSinatraという便利なFrameworkを使うことでHTTPリクエストに対する処理を実装することが出来たり、Rubyの標準ライブラリを使うことで文字列や数字の処理を簡単に実装できた。

特に、素数を扱うPrimeというライブラリは今回の開発において非常に便利だった。

 

LINE Messaging API

実はbotが開発できるのはLINE Messaging APIというもののおかげである。
実際、ブラウザからHTTPリクエストを送っているのでもなく、LINEからメッセージを送るだけで、botが返信をくれるというシステムは不思議なものである。
このような不思議を解決してくれる魔法の集まりがAPIなのだと、僕は勝手に理解している。
APIの中身がどうなっているのかはよくわからなくても、「エクスペクト・パトローナム!」みたいな風に魔法を唱えたら返信が送信されるようになっているのである。(魔法の中身は科学的なのだけれど。)

このGitHubに書かれているようなコードを書いたら、botを作ることが出来るのだ。

詳しい魔法の使い方はこのページに書かれている。

まあ、魔法といっても、この図のように

Apacheさんとユーザーとの間にLINEのAPIが実際は入って、いい感じにユーザーと開発者を繋げてくれていると思えばいいだろう。
実装した

「数字博士」の実装は先ほどのPrimeという便利な便利なライブラリを使用すると、驚くほど簡単に終わった。

  1. 送られてきたメッセージの中から数字を抜き取る。
  2. その数字をPrimeライブラリにあるPrimeクラスの、素因数分解をするメソッドを使って素因数分解の結果を配列に変換する。
  3. その配列を利用して素因数分解の結果を文字にする。

という風にすると、素因数分解の部分の機能は完成する。

他には平方数などの特別な数字を配列にしておき、配列の中の数字にマッチしているかを一つずつ判定するなどという風に実装している。

 

大変だったこと

何よりも大変だったのは、ProxyPassの設定やUnicornの設定を理解することだった。
Ruby自体が難しいというよりは、今まで扱ったことのないサーバーの設定に苦労したのだ。

また、SwiftとRubyはだいぶ似ているなと感じた。細かい記法が異なるだけで、やっていること自体に差はないのだと思う。
だから、Rubyを使ったプログラミングは全然大変ではなかった。むしろ楽しかった。

 

これからの展望

これからはRubyを学び始めたついでに、王道のFrameworkであるRuby on Railsをいじってみようかなと思っている。
それで何かWebアプリを作ったら、Pythonを使ってスクレイピングと機械学習に手を出そうかなと考えている。

そしてスクレイピングとか機械学習の知識も使ってもっとこのbotをいい感じに改良したいのだが、それはまだまだ長い道のりになりそうだ。

 

最後にもう一度

もう一度、全体像の図を掲載しておきます。

1回目に見た時よりもしっかりと理解ができているでしょうか?

それともう一つ。

今回は数字博士というbotを作りました。送った数字の特性を返してくれるbotです。

スマホの方はこちらから友達登録できます。

友だち追加

パソコンの方はQRコードを読み取ってください。

1回目に見た時よりも登録する気になったでしょうか?

Pocket