プログラミング

プログラミング超初心者向け!LineBot作成に必要な3つの知識

こんにちは、最近「Yui」ではなく「行動力おばけ」と呼ばれるYuiです。

さて、前に繰り返しLineBotの作り方について書いたわけですが、実際に繰り返しBotを作ってみたらこんなこと思いませんでしたか?

アホYui
アホYui
繰り返しだけじゃなくてもっと発展させたい!でもコードを張り付けただけだからどこをいじれば良いのかわからない・・!

実は繰り返しBotだけだったら、ググれば数多くの記事が出てくるんですよね。けど、実際のところコードを張り付けて動かしてるだけだから、発展させようとしたときに実際にどこを動かせば良いかわからないという現象が起きてしまいました。(ほとんどのブログでも前回私が書いたみたいに「コピペして下さい」としか言われない)

そこで、今回は繰り返しLineBotのコードを見ながら、必要な3つの知識について解説したいと思います。(もし、コードを見ただけで分かったわ!という方はさら~と流してくださいね!)

※今回は前に書いた繰り返しBotの作り方のコードを見ながら解説を進めていきます。まだ読まれてない方は下のリンクから一読することをおすすめします!

APIを使いこなすべし

まず、前回紹介した繰り返しBotの実際のコードがこちらです。

まず、LineBotを作成するにあたって、専用のAPIを利用することが必要になります。

APIとは

「Application Programming Interface」の略語。端的にいうと「すでにこの世に存在するプログラムを共有する仕組み」のことです。つまり、先人たちがすでによく使う機能をAPIとして用意してくれているので、これを利用すれば、わざわざ一からプログラムを組まなくて良いんです!楽ちんですねえ。(Yuipediaより)

私の代表(?)作であるおしゃべりマンも人工知能APIとWikiAPIと星占いAPIを導入しています。なので、結構いろんな機能をつけている割にはほとんどコードを書いていないんですよね。

LineBotに関してはすでにBot作成のために必要なプログラムがAPIとして共有されているんですよ。

前の記事でGemfileにgem ‘line-bot-api’と追加したのを覚えているでしょうか。これでBotに必要な機能として、「投稿されたものを受け取る機能」「プログラム通りに投稿する機能」が追加されたわけです。これをここで適用させてあげるために必要なものがrequire ‘line/bot’というコードなわけです。

APIの導入のさせ方は言語によって異なりますが、Railsでは以下の流れになります。

①Gemfileに必要なAPIを追記

gem ‘sqlite3’をgroup :development doに移動&group :production doを追記して、中にgem ‘pg’を入れる(LineBotの場合。それ以外だったら、随時開発環境と本番環境で必要なパッケージを確認してそれに応じて編集)

bundle install without productionで追記したGemをインストール

④コントローラーにAPIを導入するためのコードを書く

これは今後どんなAPIを導入するとしても同じ手順なので、まずLineBotに導入したい機能があれば、例えばWikipedeiaAPIのように「○○API」という感じで調べたいAPIをググって、導入させてみてください。

Messaging APIが用意してくれてる型を使いこなすべし

Bot作成において大事になってくるのが、型を使いこなすことです。

LINEのMessaging APIは本当に優秀で、すでにテンプレートとして様々な型を用意してくれているんですね。

どういうことかというと、下のコードを見てください。ここの部分が実際に繰り返しBotの核となる部分です。

簡単に右側に解説をつけましたが、さらに詳しくみていきましょう。

まず、入力された値をevent.typeで受け取ってますね。

そのあとに、見慣れない、when Line::Bot::Event::MessageType::Textというコードが出てきて戸惑った方も多いのではないでしょうか。

これは何をしているのかというと、入力されたevent.typeの値がテキストタイプであるときに反応すると言ってあげているんですね。Lineってメッセージだけでなく写真、位置情報など、たくさんのものが送れますよね。人間だったらすぐに見たらわかりますが、相手はコンピュータ。まずどれがテキストかを認識させてあげないといけないんですよ。その認識させてあげるためのコードがMessaging APIの方で用意されているというわけです!いや~楽ちんですねぇ。

ちなみにですが、 最後のTextをLocationにしたら位置情報を認識します!(あくまでこれは認識だけなので、実際に位置情報を読み取るためには、位置情報認識APIを導入してあげることが必要です)

そしてさらにその下を見てください。

何やら”message”の中で”type”を指定してあげています。これも、すでにMessaging APIがテンプレートとして用意してくれている型です。メッセージタイプで送信したい場合、まず送信する型は”message”で指定してあげて具体的にどのようなタイプなのかを指定してあげます。今回はテキスト型なので、”text”です。

これ、本当に様々な型があって、例えばグラフ形式で送ったりとかボタン形式で送ったりとかもできます。それらに関しては私も今クイズBotなどを作っていきながら勉強している最中なので、また実例をあげて紹介していきたいと思っています。気になる方は調べてみてくださいね!

そのあとに、具体的にどのようなtextにするかを書くわけです。今回は受け取ったままを書きたいので、受け取った文字をそのまま変数にいれてあげて、そのまま返してあげていますが、例えばこのように書くことも可能です。

私はこれで語尾に「にゃん」をつけてくれるBotとかも作成して遊んでました笑

最後は上記に書いてあるままですが、今回は文字を受け取った場合に返信としてこの動作をしてあげたいのでclient.reply_messageとしてあげています。もしBotからメッセージを送ってあげたい場合はreplyをpushにしてください。(フリータイプの場合はBotからのPushメッセージは送れません。)

いかがでしょうか。もともとMessaging APIが用意してくれている型を利用すれば素早く開発ができそうですね!

環境変数を(軽くでも良いので)理解しておくべし

環境変数に関してはそもそもプログラミングに関する基礎知識なので、この知識が直接LineBotを発展するときに役に立つというわけではないのですが、ここを理解すると、今後ググって色んなLineBotのコードを見た場合に理解しやすくなるので、長い目で見たら必須知識だと思うので書きますね。(実際私は最初環境変数が理解できずにコードを見て戸惑いました。笑)

さて、下のようなコードがありましたね。

ここで、あれ、なんで自分のChannel SecretとTokenを入れなくて良いの!?と思いませんでしたか?

これは、実を言うと自身のChannel SecretとTokenを直接ベタ打ちしても動くんですが、セキュリティ上あまりよろしくない&今後Botアカウントを変えたときに応用が利かないので、環境変数というものを利用してあげているんですね。

環境変数とは

ある特定の値を保存する入れ物のようなものです。これだけ見るとただの変数と同じですが、同一コンピュータ内(または同一ユーザー内)で有効な変数です。環境変数を使うことで、何度も同じことを書かなくてもよくなると同時に普遍的に皆が共通して同じコードを使えるというメリットがあります。(Yuipediaより)

つまり、環境変数は同一のコンピュータ/ユーザー内で動くことができます。要はただの変数よりも動く範囲が広いんですね。例えば、自分のChannel SecretとTokenはLineDevelopersの中で設定されています。それを違う場所(開発環境)で定義しても使えるのは、同じコンピュータ/ユーザー間で環境変数が動くからなんです。また、他のコンピュータやユーザーで動作させることが出来ないので、万が一コードが流出しても大事な情報は洩れないというわけですね!

ではどこでそもそも環境変数を定義したのかというところですが、前のBot作成の記事のときに下記のように書いたのを覚えているでしょうか。

これで、環境変数【LINE_CHANNEL_SECRET】と【LINE_CHANNEL_TOKEN】にそれぞれ自分のChannel SecretとTokenを入れてあげることで、自分のパソコン内で環境変数を定義してあげているわけです。

これで例えば今後内容そのままで新しいBotアカウントに変えたいなと思ったときは上記と同じ流れで新しいChannel SecretとTokenを上書きしてあげれば良いだけなのでコードは一切触る必要がありません。

実はもう一つ、LineBotを作る上で必ず必要な環境変数が定義されているんですね。

この部分です。

これは何をしているのかというと、下記のように公式サイトに解説があります。

X-Line-Signatureリクエストヘッダーに含まれる署名を検証して、リクエストがLINEプラットフォームから送信されたことを確認する必要があります

LineDevelopers公式サイトより)

実はお使いのLineBotアカウントの種類によって、LineBotAPIを使ってメッセージを送信出来るかというのは決まってるんですね。また、Line社としてもリクエストがきちんと正常に実行されたかどうかを把握する必要があります。その処理をこの数行で行っているというわけです!

まあ、こちらに関しては正直、LineBot作りには必ず入れないといけない処理なんだな~程度に思ってもらえれば大丈夫です!

環境変数に関しては理解しないままベタ打ちしても編集は可能ですが、今後様々な環境変数が出てきたときになんとなく混乱するかと思ったので書いてみました!

 

いかがでしたでしょうか。意外とLineBot作り簡単だなと思ったのではないかなと思います。

私も今後もっと作って立派なBot職人になれるように精進します!

最後までお付き合いいただきありがとうございました!