【AWS】知識ゼロから理解するRDS超入門
AWSのデータベースサービス「Amazon RDS」を初心者にもわかるように解説します。未経験には難しいMultiAZ構成やレプリケーションは、マスター/スレ...
2018-09-10 14:07 2018-09-11 15:58
LINE Botって誰でも案外簡単に作れちゃうことを知っていますか?
今回は、カンタンなLINEBotをPythonを使って作っていきます。途中まで全然Python出てこないので、他の言語でも割と参考になると思います。
LINE APIの登録から始まり、Heroku登録と設定を経て、設定ファイルの作成、デプロイを行なっていくのです。
それでは、まず実際にぼくが作ったLINE Botをみてください。
今回、作成する簡単なLINEBotはこちら!
いわゆるオウム返しをするBotです。
〇〇とコメントを送信すると、「〇〇」って何?と返してくれます。
このBotは基本中の基本で、簡単なコードで書くことができますが、基本だからこそ大切なエッセンスが詰まっています。
これを完成させるには、大きく3つのステップがあります。
LINE APIやHerokuに触れたことのない人も問題ありません。
1つずつ解説していきます。
それでは、LINEBot作成していきましょう!
スムーズにいけば、初めての人でも約1-2時間で完成することができるはずです!
まずは、LINE APIの登録と設定を行います。
LINE Botを作成する上では、LINE APIの使用は欠かせません。
かと言っても、普段使っているLINEアカウントから簡単に登録を進めていくことができますので、難しくはありませんよ。
LINE Developersとは、LINEを使って開発を行うためのものでこれを登録すると、APIで様々なことができるようになります。
LINEアカウントで簡単に登録できるので、LINE Developersページからログインしていきましょう。
ログイン画面はこのようなページになっていますので、登録しているメールアドレスとパスワードを入力してください。
ログインした後にやることは以下のような流れです。
開発者名の登録は、単純に自分の実名または、ニックネームなどを登録してくれればOKです。
プロバイダーとは、サービス提供者(企業・個人)の名前のことですが、名称はなんでもいいので基本的に個人開発の場合は開発者名と同じで大丈夫です。
チャネルとは、botに対応するもので、1つのチャネルが1つのBotを表しています。
任意のプロバイダーから新規チャネル作成を行いましょう。
LINE Messaging APIを選択して下さい。
LINE Messaging APIとは、開発するLINE BotとユーザーがLINEのアカウントを通じて相互コミュニケーションを実現するAPIです。
新規チャネル作成時にLINE Messaging APIで設定するのは、以下の5つです。
プランは、Developer Trialとフリーの2種類から選ぶことができます。
Developer Trialは、プッシュ通知をすることができるプランですが、無料の場合は追加可能友だち数は50人までです。
一方、フリーは、プッシュ通知をすることはできませんが、追加可能友だち数は無制限なので今回は、フリーを選択します。
これで、チャネルが作成できました。
ここで、いくつかチャネルの設定を変更しておきます。
まず、LINE@機能の利用にある自動応答メッセージと友達追加あいさつを利用しないと編集してください。
自動応答メッセージとは、こちらのコメントに対して自動的に返信を返してしまう機能なので今回は利用しないでください。
友達追加あいさつは、初回の友達追加時のコメントのことですが、これも自動的にくるのが嫌なので利用しません。
そして、メッセージ送受信設定も変更します。
アクセストークンとは、APIを使用する上で必要なトークンのことであとでHerokuに環境変数として設定します。
ここでは、まだ何も表示されていないと思うので、発行のボタンを押してアクセストークンを発行してください。
失効までの時間は0のままでOK です。
万が一、アクセストークンが流出した可能性がある場合はすぐに再発行を行いましょう。
Webhook送信では、友だち追加やユーザーからのメッセージ送信などのイベントが発生した際に、Webhook URLでリクエストを受信するか否かを設定するので、必ず「利用する」を選択してください。
これが利用しないとなっていると、リクエストを受信できずになんの反応もない既読スルーなBotになってしまうので気をつけてください。
Webhook URLには、LINE Platformからのリクエストを受信するURLを設定します。
つまり、あとで設定するHerokuのURLをここに入力します。そのため、ここはまだ空欄で構いません。
設定したWebhook URLがイベントを受け取ることができる状態なのかを確認するためには「接続確認」ボタンを押して確認してください。
ただし、接続失敗となっていても、LINE Botは正常に動いているというケースも僕の場合はありました。こちらは原因究明中です。
Heroku(ヘロク)とは、PaaS(パース)と呼ばれるサービスで、とにかく簡単にWebサービスを公開することができます。
PaaS(パース)とは、「Platform as a Service」の略で、Webサービスを公開するために必要なものをあらかじめ用意してくれるサービスを指します。
などが具体的には含まれています。
今回は、LINE BotをLINE Platformからのリクエストを受信するURL(Webhook URL)を作るためにHerokuを採用しています。
先にHerokuで使えそうなコマンドをあらかじめまとめておきます。
コマンド | 内容 |
---|---|
heroku login | ログイン |
heroku logout | ログアウト |
heroku list | アプリ一覧を表示 |
heroku open | アプリをブラウザで確認 |
heroku logs | ログを確認 |
heroku logs -t | リアルタイムでログを確認 |
heroku ps | ステータスを確認 |
heroku config | 環境変数を確認 |
heroku config:set PASSWORD=xxx | 環境変数を追加 |
heroku run "コマンド" | コマンドを実行 |
heroku pg:psql | Postgresにログイン |
ここには、コマンドを表にしましたが、実際はHerokuのWebページ(ブラウザ)からも基本的には操作できるので、ターミナルが苦手な人はそのほうが簡単かもしれません。
まずは、Herokuに登録してください。
作成したアカウントでログインした後、「create new app」で新規アプリを作成しましょう。
App name(アプリ名)は世界中で被ってはいけないので、自分のなりの名前をつけてください。
SettingのDomainに書かれているURLに/callbackをつけたURLをLINE Messaging APIのWebhook URLに入力しておいてください。
Herokuとgitをローカルのターミナルから操作したいので、あらかじめherokuコマンドとgitコマンドをインストールしておきましょう。
brew install heroku
brew install git
ここまで準備ができたら、まずは作業を行なっていくディレクトリをローカルに作成しましょう。(コマンドからじゃなくてもOKです。)
mkdir line-bot-test
そして、このディレクトリの中に入った後、
cd line-bot-test
Herokuにgit pushするため、ログインを行なっていきます。
ここでは、Herokuに登録した際のメールアドレスとパスワードを入力してください。
heroku login
heroku: Enter your login credentials
Email [********@gmail.com]:
Password: *****************
以下のように出たらログイン成功です。
Logged in as ********@gmail.com
エラーが出た場合は、パスワードなどが間違えていないか確認し直しましょう。
次にgitの初期ファイルを作成する(git init)ところから、git pushするまでを行います。
gitについては別の記事で詳細を執筆するので、今回は説明を省かせてもらいます。
// gitの初期ファイルを作成
git init
// ローカルリポジトリに結びつくリモートリポジトリを設定
heroku git:remote -a (アプリ名)
// 変更したファイルをインデックスに登録
git add .
// 変更したファイルをリポジトリに書き込む("inital commit"はコメントなのでなんでも良い)
git commit -m "inital commit"
// herokuにローカルで作成したファイルをpush
git push heroku master
git pushが正常に行われているかの確認はHerokuで行うことができます。
このようにBuild succeededとなっていれば成功です。
Herokuにあげているファイルを編集または新規作成を行いたいときは、git initが初回のみですが、それ以外のコマンドをもう一度打ち直してください。
環境変数には、LINE_CHANNEL_ACCESS_TOKEN、LINE_CHANNEL_SECRETの2つを設定します。
LINE_CHANNEL_ACCESS_TOKENには、LINE Developersにあるアクセストークンを、LINE_CHANNEL_SECRETには、Channel Secretを設定します。
以下のようなコマンドを使用します。
heroku config:set LINE_CHANNEL_ACCESS_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXX
heroku config:set LINE_CHANNEL_SECRET=XXXXXXXXXXXXXXXXXXXXX
Herokuのブラウザからでも設定は可能です。
これでHerokuとLINE APIの設定は終わりです。
ここまでくれば、後は必要なファイルを作成してgit push(デプロイ)を行えば完成です。
あと少しです。集中力を切らさずに頑張りましょう。
言語によって多少の差異はありますが、今回PythonでLINE Botを開発する時は作成すべき設定ファイルは3つあります。
それぞれについて説明していきます。
runtime.txtは、Pythonのバージョンを記載するテキストファイルです。
そのため、runtime.txtの中に記載されているのは以下の1行だけです。
python-3.6.6
ここで、注意してほしいのは、HerokuがサポートしているバージョンのPythonを使用するという点です。
ぼくはここでかなり詰みました。はじめはpython-3.6.3と記載していたのですが、そうするとデプロイをした際に
The latest version of Python 3.6 is python-3.6.6 (you are using python-3.6.3, which is unsupported).
このようなエラーが生じてしまい正常に動かなくなってしまうのです。
そのため、必ずHerokuがサポートしているバージョンのPythonを使用しましょう。
requirements.txtは、インストールするライブラリを記載するテキストファイルです。
importするライブラリはバージョンとともにここに記載しておきましょう。
そうすると、デプロイした際に自動的にHerokuへインストールを行なってくれます。
今回は以下の2行を記載します。
Flask==0.12.2
line-bot-sdk==1.8.0
Procfileには、プログラムの実行方法を記載します。
今回は、main.pyというpythonファイルを動かしたいので以下のように記載します。
web: python main.py
main.pyには、以下のようなコードを記載しました。
# インポートするライブラリ
from flask import Flask, request, abort
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
FollowEvent, MessageEvent, TextMessage, TextSendMessage, ImageMessage, ImageSendMessage, TemplateSendMessage, ButtonsTemplate, PostbackTemplateAction, MessageTemplateAction, URITemplateAction
)
import os
# 軽量なウェブアプリケーションフレームワーク:Flask
app = Flask(__name__)
#環境変数からLINE Access Tokenを設定
LINE_CHANNEL_ACCESS_TOKEN = os.environ["LINE_CHANNEL_ACCESS_TOKEN"]
#環境変数からLINE Channel Secretを設定
LINE_CHANNEL_SECRET = os.environ["LINE_CHANNEL_SECRET"]
line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(LINE_CHANNEL_SECRET)
@app.route("/callback", methods=['POST'])
def callback():
# get X-Line-Signature header value
signature = request.headers['X-Line-Signature']
# get request body as text
body = request.get_data(as_text=True)
app.logger.info("Request body: " + body)
# handle webhook body
try:
handler.handle(body, signature)
except InvalidSignatureError:
abort(400)
return 'OK'
# MessageEvent
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text='「' + event.message.text + '」って何?')
)
if __name__ == "__main__":
port = int(os.getenv("PORT"))
app.run(host="0.0.0.0", port=port)
ライブラリのインポートや環境変数からのトークンの設定、リクエストメッセージの作成を行なっています。
最もメインとなってくるのは、MessageEventの部分なので今回はここを中心に説明していきます。
# MessageEvent
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text='「' + event.message.text + '」って何?')
)
ユーザーがメッセージを送信した時に、Botに起こしてほしいアクションを記述する場合は、
@handler.add(MessageEvent, message=TextMessage)
このように@handler.addの引数として、MessageEventを代入します。
そして、TextMessageは、ユーザー送信したデータが画像や音声ではなく、テキストであることを示しています。
あとは、メッセージを返信するためのメソッドreply_messageを利用してメッセージを返します。
TextSendMessageの引数としてtext=以下の値を入力します。
ここにあるevent.message.textがユーザー送信したメッセージを表しているため、おうむ返しを実現しています。
つまり、ここを"Hello World"のような固定値にするとどんなメッセージを送った際にもHello Worldと返すBotができるのです。
ユーザー送信したメッセージの情報(event)は以下のようにJSON形式で含まれているのです。
(LINE Messaging API公式リファレンス参照。)
{
"events": [
{
"replyToken": "0f3779fba3b349968c5d07db31eab56f",
"type": "message",
"timestamp": 1462629479859,
"source": {
"type": "user",
"userId": "U4af4980629..."
},
"message": {
"id": "325708",
"type": "text",
"text": "Hello, world"
}
},
{
"replyToken": "8cf9239d56244f4197887e939187e19e",
"type": "follow",
"timestamp": 1462629479859,
"source": {
"type": "user",
"userId": "U4af4980629..."
}
}
]
}
今回は、Pythonを使って簡単なLINE Bot開発を行いました。
流れは以下のようです。
おうむ返しでは、LINE Botとしてあまり面白くないかもしれませんが、LINE Botにはまだまだたくさんの面白い機能(リッチメニュー、クイックリプライなど)があります。
今回のコードをベースに実行してみるとさらなるLINE Botの面白さに気づくことができると思います。
また、LINE BotはWebサービスを作るよりもデザイン(UI)をそれほど考える必要がないので、面白そうなアイディアをお持ちの方はぜひLINE Bot開発をして、公開までしてみてくださいね!
学生Webエンジニア PLANインターン生 PHP Laravel Python HTML CSS JS
【名前】 "ゆざ"
【関連】 株式会社PLAN / MIYABI Lab / Tmeet(twitterユーザーマッチングサービス) /
【MIYABI Lab運営】23歳/同期がト◯タやMicr◯softに就職する中、ベンチャーに未経験でWebエンジニアになるのを選んだ脳科学専攻の理系院生◆人見知り日本縦断◆機械学習/Web歴5ヶ月
【AWS】知識ゼロから理解するRDS超入門
AWSのデータベースサービス「Amazon RDS」を初心者にもわかるように解説します。未経験には難しいMultiAZ構成やレプリケーションは、マスター/スレ...
【AWS】Auto Scalingする前に知っておくべき7つのこと
Amazon EC2 Auto Scaling(オートスケール)を使用すると、CPU使用率等に応じてEC2の台数を自動的に増減できます。ここでは、初心者の持つ疑問を通し...
WordPressの基本構造を理解してオリジナルテーマを作ろう(後半)
WordPressのテーマを自作するために必要なテンプレートファイル(functions.phpやstyle.css)の役割やファイル構造を理解して、どのようにオリジナ...
WordPressの基本構造を理解してオリジナルテーマを作ろう(前半)
WordPressのテーマを自作するために必要なテンプレートファイル(functions.phpやfront-page.php)の役割やファイル構造を理解して、どのようにオ...
【Heroku入門】無料枠サーバーを24時間スリープさせない方法
フリープランのHerokuサーバーでは、30分以上アクセスがないと自動的にスリープしてしまいます。ここでは、Herokuサーバーを寝かせない方法につい...
【入門編】Laravelのディレクトリ構造とMVCの処理の流れを理解する
Laravel初心者が学習する際にわかりにくいLaravelのディレクトリ構造を具体的な例を交えて解説します。MVCの基本であるビュー、モデル、コントロー...
【初心者向け】PythonによるHeroku環境で簡単LINEBot開発
誰でも簡単にLINEBotをpythonを使ってHeroku環境で開発できる方法を解説します。ここでは、LINE Messaging APIを用いることでおうむ返しをするBot...
AWSでWebサーバー構築!踏み台サーバーでセキュアなネットワークを構築する(第5回)
連載の第5回です。メインEC2に対して直接SSH接続できる状態というのは、セキュリティの観点からあまり望ましくありません。MySQLやEBSが紐づいたメ...
AnacondaでのTensorFlow環境構築と基礎的な使い方
Anaconda(アナコンダ)のインストールからJupyter notebook(ジュピターノートブック)とTensorFlow(テンサーフロー)の基本的な使い方を初心者...
脱初心者!MNIST beginnerに隠れ層を加えたニューラルネット解説
TensorFlowのチュートリアルであるMNIST beginnerの応用して、隠れ層と活性化関数を加えたニューラルネットワークで手書き文字識別を解説します。...
AWSでWebサーバー構築!Apache2.4, PHP7, MySQLの導入と初期設定(第4回)
連載の第4回です。今回は作成したEC2インスタンスにWebサーバーとしての機能を持たせるため、Apache2.4のインストールおよびhttpd.conf等の各種設...
AWSでWebサーバー構築!EC2を作成してSSH接続する(第3回)
連載の第3回です。前回作成したVPC・サブネットにおいて、セキュリティーグループに保護されたEC2インスタンスの作成・設定およびSSH接続の確立ま...
初心者必読!MNIST実行環境の準備から手書き文字識別までを徹底解説!
Pythonによる機械学習をプログラミング初心者にもわかりやすいように、TensorFlowチュートリアルのMNIST beginnerを使って、手書き文字(MNIST)識別...
AWSでWebサーバー構築!専門用語の解説とVPC環境を構築する手順(第2回)
連載の第2回です。AWSにてVPCネットワークを構築してWebサーバーを設置・運用するためには、AWS内で利用される重要単語について正しく理解しておく...
知識ゼロで機械学習・AIを理解するために必要なニューラルネットワークの基礎知識
機械学習・AIを理解するために必要なニューラルネットワークの基礎について、これから機械学習を勉強したい人、プログラミング未経験の人にもわか...
Canvaで簡単におしゃれなアイキャッチ画像を作ろう!使い方を徹底解説!
PhotoshopやIllustratorを使えなくてもCanvaなら誰でも簡単におしゃれなアイキャッチ画像が作れます。豊富なデザインテンプレートを組み合わせるだ...
プレビュー機能付きの記事編集画面の作り方(Laravel5)
記事編集フォームにはプレビュー機能の実装が必須です。記事を保存する処理とプレビューを表示する処理を共存させるにあたり、ボタンをクリックし...
AWSでWebサーバー構築!VPC設計に必要なIPアドレスとサブネットの基礎知識(第1回)
連載の第1回です。AWSのVPCネットワークを設計して実際に構築するためには、IPアドレスの基礎を理解することが非常に大切です。EC2 Webサーバーを...
MIYABI Labホームページを製作しました
様々な理由でプログラミングの勉強を困難だと感じてしまっている方のお役に立てれば嬉しいです。これからも小さなWebサービスを作り続けていき、技...
ゆざ、株式会社PLANを卒業します。
2年間インターンとしてお世話になった株式会社PLANを卒業します。AWS,Laravel,Pythonなどの技術的なことだけではなく、エンジニアとして、社会人と...