#0021

【初心者向け】PythonによるHeroku環境で簡単LINEBot開発

2018-09-10 14:07 2018-09-11 15:58 "ゆざ"

LINE Botって誰でも案外簡単に作れちゃうことを知っていますか?

今回は、カンタンなLINEBotをPythonを使って作っていきます。途中まで全然Python出てこないので、他の言語でも割と参考になると思います。

LINE APIの登録から始まり、Heroku登録と設定を経て、設定ファイルの作成、デプロイを行なっていくのです。

それでは、まず実際にぼくが作ったLINE Botをみてください。

スポンサーリンク

今回作成する簡易なLINEBotはコレ!

今回、作成する簡単なLINEBotはこちら!

いわゆるオウム返しをするBotです。

〇〇とコメントを送信すると、「〇〇」って何?と返してくれます。

このBotは基本中の基本で、簡単なコードで書くことができますが、基本だからこそ大切なエッセンスが詰まっています。

これを完成させるには、大きく3つのステップがあります。

  1. LINE APIの登録&設定
  2. Heroku登録&設定
  3. Pythonでコーディング

LINE APIやHerokuに触れたことのない人も問題ありません。

1つずつ解説していきます。

それでは、LINEBot作成していきましょう!

スムーズにいけば、初めての人でも約1-2時間で完成することができるはずです!

LINE APIの登録&設定

まずは、LINE APIの登録と設定を行います。

LINE Botを作成する上では、LINE APIの使用は欠かせません。

かと言っても、普段使っているLINEアカウントから簡単に登録を進めていくことができますので、難しくはありませんよ。

LINE Developers 登録

LINE Developersとは、LINEを使って開発を行うためのものでこれを登録すると、APIで様々なことができるようになります。

LINEアカウントで簡単に登録できるので、LINE Developersページからログインしていきましょう。

Line developersページ

ログイン画面はこのようなページになっていますので、登録しているメールアドレスパスワードを入力してください。

LINEログイン画面

ログインした後にやることは以下のような流れです。

  1. 開発者名を登録
  2. 新規プロバイダーを作成
  3. チャネル作成
開発者名を登録

開発者名の登録は、単純に自分の実名または、ニックネームなどを登録してくれればOKです。

新規プロバイダーを作成

プロバイダーとは、サービス提供者(企業・個人)の名前のことですが、名称はなんでもいいので基本的に個人開発の場合は開発者名と同じで大丈夫です。

チャネル作成

チャネルとは、botに対応するもので、1つのチャネルが1つのBotを表しています。

任意のプロバイダーから新規チャネル作成を行いましょう。

チャンネル作成

LINE Messaging APIを選択して下さい。

LINE Messaging APIを選択する

LINE Messaging APIの登録&設定

LINE Messaging APIとは、開発するLINE BotとユーザーがLINEのアカウントを通じて相互コミュニケーションを実現するAPIです。

新規チャネル作成時にLINE Messaging APIで設定するのは、以下の5つです。

  • アプリ名
  • アプリ説明
  • プラン
  • 大業種/小業種
  • メールアドレス

プランは、Developer Trialフリーの2種類から選ぶことができます。

Developer Trialは、プッシュ通知をすることができるプランですが、無料の場合は追加可能友だち数は50人までです。

一方、フリーは、プッシュ通知をすることはできませんが、追加可能友だち数は無制限なので今回は、フリーを選択します。

これで、チャネルが作成できました。

ここで、いくつかチャネルの設定を変更しておきます。

まず、LINE@機能の利用にある自動応答メッセージと友達追加あいさつを利用しないと編集してください。

自動応答メッセージとは、こちらのコメントに対して自動的に返信を返してしまう機能なので今回は利用しないでください。

友達追加あいさつは、初回の友達追加時のコメントのことですが、これも自動的にくるのが嫌なので利用しません。

LINE@機能の利用

そして、メッセージ送受信設定も変更します。

アクセストークン(ロングターム)

アクセストークンとは、APIを使用する上で必要なトークンのことであとでHerokuに環境変数として設定します。

ここでは、まだ何も表示されていないと思うので、発行のボタンを押してアクセストークンを発行してください。

失効までの時間は0のままでOK です。

万が一、アクセストークンが流出した可能性がある場合はすぐに再発行を行いましょう。

Webhook送信

Webhook送信では、友だち追加やユーザーからのメッセージ送信などのイベントが発生した際に、Webhook URLでリクエストを受信するか否かを設定するので、必ず「利用する」を選択してください。

これが利用しないとなっていると、リクエストを受信できずになんの反応もない既読スルーなBotになってしまうので気をつけてください。

Webhook URL

Webhook URLには、LINE Platformからのリクエストを受信するURLを設定します。

つまり、あとで設定するHerokuのURLをここに入力します。そのため、ここはまだ空欄で構いません。

設定したWebhook URLがイベントを受け取ることができる状態なのかを確認するためには「接続確認」ボタンを押して確認してください。

ただし、接続失敗となっていても、LINE Botは正常に動いているというケースも僕の場合はありました。こちらは原因究明中です。

Herokuの登録&設定

Heroku(ヘロク)とは、PaaS(パース)と呼ばれるサービスで、とにかく簡単にWebサービスを公開することができます。

PaaS(パース)とは、「Platform as a Service」の略で、Webサービスを公開するために必要なものをあらかじめ用意してくれるサービスを指します。

  • Webサーバー
  • OS
  • データベース
  • プログラミング言語の実行環境

などが具体的には含まれています。

今回は、LINE BotをLINE Platformからのリクエストを受信するURL(Webhook URL)を作るためにHerokuを採用しています。

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にログイン

まずは、Herokuに登録してください。

HEROKUログイン

作成したアカウントでログインした後、「create new app」で新規アプリを作成しましょう。

HEROKU新規アプリ作成

App name(アプリ名)は世界中で被ってはいけないので、自分のなりの名前をつけてください。

app nameをつける

SettingのDomainに書かれているURLに/callbackをつけたURLをLINE Messaging APIのWebhook URLに入力しておいてください。

domainの確認

ローカルでgit pushする

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となっていれば成功です。

git pushの確認

Herokuにあげているファイルを編集または新規作成を行いたいときは、git initが初回のみですが、それ以外のコマンドをもう一度打ち直してください

環境変数を登録する

環境変数には、LINE_CHANNEL_ACCESS_TOKENLINE_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のブラウザからでも設定は可能です。

configの設定

これでHerokuとLINE APIの設定は終わりです。

設定ファイル&Pythonファイルの作成

ここまでくれば、後は必要なファイルを作成してgit push(デプロイ)を行えば完成です。

あと少しです。集中力を切らさずに頑張りましょう。

設定ファイルの作成

言語によって多少の差異はありますが、今回PythonでLINE Botを開発する時は作成すべき設定ファイルは3つあります。

  • runtime.txt:Pythonのバージョンを記載
  • requirements.txt:インストールするライブラリを記載
  • Procfile:プログラムの実行方法を記載

それぞれについて説明していきます。

runtime.txt

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

requirements.txtは、インストールするライブラリを記載するテキストファイルです。

importするライブラリはバージョンとともにここに記載しておきましょう。

そうすると、デプロイした際に自動的にHerokuへインストールを行なってくれます。

今回は以下の2行を記載します。

Flask==0.12.2
line-bot-sdk==1.8.0
Procfile

Procfileには、プログラムの実行方法を記載します。

今回は、main.pyというpythonファイルを動かしたいので以下のように記載します。

web: python main.py

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開発を行いました。

流れは以下のようです。

  1. LINE APIの登録&設定
  2. Herokuの登録&設定
  3. 設定ファイル&Pythonファイルの作成

おうむ返しでは、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ヶ月

Twitterやってます

最新の技術ブログはこちら