# Python×LINEで実践！自動返信アプリを作ってみよう！

> 当サイト【スタビジ】の本記事では、Pythonを使って、LINEにメッセージを送ったら返信してくれるアプリを作っていきます！この機能を応用することでいろんなサービスの開発が可能になるのでぜひマスターしましょう！

- URL: https://toukei-lab.com/python_line
- 公開: 2022.11.29 / 更新: 2024.02.02
- サイト: スタビジ（https://toukei-lab.com）

:::talk{who="umatan"}
当サイト【スタビジ】の本記事では、Pythonを使って、LINEにメッセージを送ったら自動で返信してくれるアプリを作っていきます！この機能を応用することでいろんなサービスの開発が可能になるのでぜひマスターしましょう！
:::

こんにちは！スタビジ編集部です！

この記事ではPythonの演習として[LINE](https://line.me/ja/)を利用していろんな実装していきます！

:::talk{who="robotan"}
LINEは毎日使うコミュニケーションツールの一つだね！

知り合いとチャットする以外にも何か良い使い方ないかな～？
:::

:::talk{who="umatan"}
そうだね！今回はPythonを使ってLINEで出来ることを試してみよう！
:::

実際に手を動かしつつPythonでLINEを動かしてみましょう！

## PythonでLINEアプリを作るための事前準備

さて早速実装をやっていきたいところですが、その前に今回使うツールを準備をしていきます

今回使っていくツールは主に3つです！

- Messaging API
- Flask
- Heroku

「**Messaging API**」とはLINEのアカウントを通じて、自分のサービスとLINEユーザーの双方向コミュニケーションを可能にしてくれるAPIです！

:::talk{who="umatan"}
Messaging APIを使うことで自分が作ったアプリとLINEを繋げてくれるから、ユーザーとのやり取りを自分のアプリでコントロールできるんだね！
:::

### LINE Developersにログイン

「**Messaging API**」を利用するための準備をしていきましょう！

今回のサービス作成に当たり、「[LINE Developers](https://developers.line.biz/ja/)」へサインインが必要です。

「**LINE Developers**」とは、LINEサービスとの連携を可能にするAPIの仕様や使い方をまとめているポータルサイトです！

ブラウザで「LINE デベロッパー」と検索し「[LINE Developers](https://developers.line.biz/ja/)」のページにアクセスします

![LINE](/wp-content/uploads/2022/04/linepage1-min.jpg) ![LINE](/wp-content/uploads/2022/04/linepage2-min-253x300.jpg)

画面に従ってログインをします、自身の「**LINEアカウント**」でログインできます。

ログイン後は「新規プロバイダーを作成」で自分のプロバイダーを作成しましょう。

プロバイダーとはアプリを提供するチームや組織のことを指します

![line](/wp-content/uploads/2022/04/linepage3-min.jpg)

これで、プロバイダーを通して<mark>LINE Developersの各種機能を利用できます</mark>

:::talk{who="umatan"}
基本的にLINEが提供しているサービスは無料で使えるから、ちょっとしたお試しに便利だね！
:::

### チャネルの作成

続いて、Messaging APIを利用するチャネルを作成します。

プロバイダー画面から「新規チャネル作成」をクリックし、出てきた画面の「Messaging API」をクリックします

![line](/wp-content/uploads/2022/04/linepage4-min.jpg)

チャネル名や業種などの必須項目を入力し、規約の同意チェックを入れて「作成」ボタンを押します

![line](/wp-content/uploads/2022/04/linepage5-min.jpg)

プロバイダー画面にチャネルが表示されたら準備完了です！

### FlaskとHerokuの準備

LINE Messaging APIを実行するアプリを準備していきます。

今回はFlaskとHerokuで実装していきます。

```python
pip install flask
pip install line-bot-sdk
```

「**Flask**」は2010年にリリースされたPythonのWebアプリケーションフレームワークです。

なぜFlaskを使うというと、<mark>LINEアプリはメッセージ(リクエスト)がサーバーに送られて、それに返信(レスポンス)する仕組みがWebアプリとほぼ同じだからです。</mark>

Flaskについては詳しくは下記の記事に書いてありますので、チェックしてみてください！

<https://toukei-lab.com/python-flask>

インストールが終わったら作業フォルダに必要なファイルを準備していきます！

- app.py
- conf.json
- Procfile
- requirments.txt
- runtime.txt

「app.py」に今回のアプリの中身を書いていきます、詳しくは実践編で解説します。

「conf.json」にはLINEチャネルへのアクセス情報を記載します

```python
{
    "CHANNEL_SECRET": "シークレット情報",
    "CHANNEL_ACCESS_TOKEN": "アクセストークン"
}
```

「シークレット情報」は作成したチャネルの「**チャネル基本設定**」で、「アクセストークン」は「**Messeaging API設定**」で取得できます

![line](/wp-content/uploads/2022/04/linepage7-min.jpg) ![line](/wp-content/uploads/2022/04/linepage8-min.jpg)

この情報があると<mark>誰でもチャネルにアクセス出来てしますので取り扱いには注意が必要です</mark>

「Procfile」「requirments.txt」「runtime.txt」にはherokuのデプロイに必要な情報を記載します

各ファイルの中身については下記の記事で詳しく書いてありますので、参考にしてみてください！

<https://toukei-lab.com/heroku-python>

Herokuへアプリの登録も行います

```python
heroku create アプリ名
```

アプリ名はheroku内で<mark>ユニークである必要あるので注意してください！</mark>

```python
Creating ⬢ lineapp... !
▸ Name lineapp is already taken
```

下のような出力がされたらエラーなのでアプリ名を変えて、試してみましょう

Herokuでアプリを登録したら、チャネルへのアクセス情報をHerokuにも入力します

```python
heroku config:set YOUR_CHANNEL_SECRET="シークレット情報" --app アプリ名
heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="アクセストークン" --app アプリ名
```

これでHerokuの準備は完了です！

:::talk{who="umatan"}
Herokuを使うのが初めての場合だと、このHerokuの登録までが難しいから慎重に！
:::

## 実践① LINEで自動返信アプリを作る

実際にPythonを使ってLINEで自動返信する機能を作っていきましょう！

まずは[LINEの公式](https://github.com/line/line-bot-sdk-python)のテンプレートをもとにユーザーが送った言葉をそのまま返す<mark>「オウム返し」機能を実装します</mark>

### 自動返信アプリの実装コード

app.pyに下記のコードを書いていきます

```python
import os
import json
from flask import Flask, request, abort

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage, TemplateSendMessage, CarouselTemplate, CarouselColumn)

app = Flask(__name__)

ABS_PATH = os.path.dirname(os.path.abspath(__file__))
with open(ABS_PATH+'/conf.json', 'r') as f:
    CONF_DATA = json.load(f)

#LINEへのアクセス情報を入力
LINE_CHANNEL_ACCESS_TOKEN = CONF_DATA["CHANNEL_ACCESS_TOKEN"]
LINE_CHANNEL_SECRET = CONF_DATA["CHANNEL_SECRET"]

line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(LINE_CHANNEL_SECRET)

#ルーティングの設定、POSTリクエストが来たらcallback関数を返す
@app.route("/callback", methods=['POST'])
def callback():
    # リクエストヘッダーからアクセス情報の検証のための値を取得
    signature = request.headers['X-Line-Signature']

    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)
    # アクセス情報を検証し、成功であればhandleの関数を呼び出す
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)

    return 'OK'

#メッセージを受け取った後にどんな処理を行うかを記述
@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", 5000))
    app.run(host="0.0.0.0", port=port)
```

実装の中身を見ていきましょう

```python
@app.route("/callback", methods=['POST'])
```

ここでは、LINE プラットフォームから送信されたWebhookイベントのルーティングを設定し、<mark>LINE APIがアプリに接続できるかを確認します</mark>

Webhookの設定はチャネルの「**Messeaging API設定**」で設定します

herokuの場合は「**http\://作成したアプリ名.herokuapp.com/**」になります

![line](/wp-content/uploads/2022/04/linepage9-min.jpg)

```python
@handler.add(MessageEvent, message=TextMessage)
```

ここではLINEがユーザーからメッセージを受け取った時の処理を記載します

今回は、LineBotApiのメソッドを用いて、リプライ処理を行っています

```python
def handle_message(event):
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text))
```

リプライの内容は送られたメッセージをそのまま返信用のメッセージとして送っています

:::talk{who="umatan"}
リプライの内容を変更することで、受け取ったメッセージにあわせて応答を変えたり出来そうだね！ぜひ試してみよう！
:::

### 自動返信アプリのデプロイ

では実際にアプリを動かしてみましょう！

```python
git init
git add .
git commit -m "バージョン名"
git push heroku master
```

GitコマンドでHerokuにデプロイします

作成したチャネルと友達になってメッセージを送ってみます

![line](/wp-content/uploads/2022/04/linepage10-min.jpg)

「テスト」と送ったらちゃんと「テスト」と返ってきましたね！

返信の最初の「メッセージありがとう～」はユーザーからメッセージを受信したときアプリとは別にLINE側で自動で返信されるものです

この返信メッセージはチャネルの「Messeaging API設定」にある「**応答メッセージ**」で編集できます

![line](/wp-content/uploads/2022/04/linepage11-min.jpg)

オフに設定してすると、<mark>チャットした内容を返してくれる「**オウム返しBot**」が完成です！</mark>

![line](/wp-content/uploads/2022/04/linepage12-min.jpg)

:::talk{who="umatan"}
簡単なものだけど、実際に返答が返ってくると嬉しい！（笑）
:::

チャットボットの作り方を以下の記事で解説しているので、参考にしてみて下さい。

<https://toukei-lab.com/chatbot_python>

## 実践② LINEで自動通知アプリを作る

実践①では自分がLINEでアクションをしてそれに対する返答するアプリを実装しました。

続いてはアプリの方が<mark>ある条件をトリガーにユーザーへ通知するアプリ</mark>を実装していきたいと思います。

### Heroku Schedulerの設定

今回は「**10分毎にユーザーにメッセージを送る**」機能を実装していこうと思います。

まず実装のポイントとして「～分ごとにメッセージを送る」⇒「～分ごとにPythonを実行する」と考えてみます。

定期的にPythonを実行する方法はいくつかありますが、今回Herokuを利用しているので、「**Heroku Scheduler**」で実行していきます。

「Heroku Scheduler」の設定は以下の手順で行います。

:::box
**①Herokuのポータルで実行するアプリを選択する**\
**②**__Heroku Schedulerをインストール__\
**③定期実行のジョブを設定する**
:::

#### ①Herokuのポータルで実行するアプリを選択する

まずは、Herokuのポータルにログインします。

そこで、定期実行したいアプリを選択します。

![line_app](/wp-content/uploads/2022/04/linepage13-min.jpg)

#### ②Heroku Schedulerをインストール

続いてHeroku Schedulerをインストールします。

選択したアプリから「Resources」タブに移動し、「Find more add-ones」ボタンをクリックします。

![line_app](/wp-content/uploads/2022/04/linepage14-min.jpg)

検索窓から「Heroku Scheduler」を検索し、検索結果の中から選択します。

Heroku Schedulerの画面から「Install Heroku Scheduler」をクリックします。 ![](/wp-content/uploads/2022/04/linepage15-min.jpg)

「Standard – Free」プラン、実行するアプリを選択した上で、「Submit Order Form」をクリックします。

![](/wp-content/uploads/2022/04/linepage18-min.jpg)

#### ③定期実行のジョブを設定する

①と同じようにHerokuのポータル画面から今回実行するアプリに移動します。

②でインストールした後だと、「Adds-on」に「Heroku Scheduler」が表示されているので、クリックします。

![line_app](/wp-content/uploads/2022/04/linepage19-min.jpg)

「Create job」をクリックします。

実行する期間と実行するコマンドを設定できます。ここでは「10分毎」と「python app.py」を設定します。

![line_app](/wp-content/uploads/2022/04/linepage20-min.jpg)

これで「Heroku Scheduler」の設定は完了です。

今回は10分に1回「app.py」が実行されます。

### 通知するアプリを実装する

「Heroku Scheduler」を設定することで定期的にPythonを実行することができるようになりました。

ただ、今の状況ではリプライ処理しか記述していないので、<mark>app.pyを実行してもアプリからLINEにメッセージを送られません。</mark>

そこで先ほどのapp.pyを修正していきます。

```python
#LINEへのアクセス情報を入力
LINE_CHANNEL_ACCESS_TOKEN = CONF_DATA["CHANNEL_ACCESS_TOKEN"]
LINE_CHANNEL_SECRET = CONF_DATA["CHANNEL_SECRET"]
LINE_USER_ID = CONF_DATA["USER_ID"]

line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(LINE_CHANNEL_SECRET)
#プッシュメッセージを送る
line_bot_api.push_message(LINE_USER_ID, TextSendMessage(text='Hello World!'))
```

「**line_bot_api.push_message**」メソッドでアプリからLINEへメッセージをプッシュできます。

メソッドの中身は「line_bot_api.push_message(to, messages)」となっており、messagesのところで送るメッセージを指定できます。

今回はシンプルに”Hello World!”という文字を送ってみます。

実装①と同じようにGitコマンドでHerokuにデプロイします。

![line_app](/wp-content/uploads/2022/04/linepage21-min.jpg)

10分に1度「app.py」が実行され、”Hell World!”が通知されていました！

「**line_bot_api.push_message**」メソッドのメッセージの内容を変更することでいろんな通知を実装できます。

:::talk{who="umatan"}
自動でメッセージを送れるだけでいろんなアイデアが実現できそう！

天気予報APIと組みあわせて天気を通知してくれるアプリにしたり、ぜひ試してみてね！
:::

## Python×LINE まとめ

Pythonでコードを書きながら、LINEで自動返信するアプリを学んでいきました

今回は送られたメッセージをそのまま返信する簡単な仕組みでしたが、「**LINEの設定**」\~「**アプリのデプロイ**」まで一通り理解を掴めたらうれしいです

今回学んだことを応用することで企業のQ\&Aボットのような<mark>実用性の高いものを作ることが出来るので是非試してみてください！</mark>

今回使ったFlaskに関して勉強したい方は以下の講座をぜひチェックしてみてください！

[**【実践】ビジネスケースとつなげてPythonで出来ること5つを学べる3日間集中コース**](https://www.udemy.com/course/python-can/?referralCode=2CBAD21040FF57199084)

[![Udemy python](/wp-content/uploads/2020/04/Udemy-me2-min-1024x554.jpg)](https://www.udemy.com/course/python-can/?referralCode=2CBAD21040FF57199084)

<table class="table">
<tbody>
<tr>
<th>【オススメ度】</th>
<td><span class="stars" role="img" aria-label="5点中5点" data-value="5"></span></td>
</tr>
<tr>
<th>【講師】</th>
<td>ウマタン</td>
</tr>
<tr>
<th>【時間】</th>
<td><span>3.5時間</span></td>
</tr>
<tr>
<th>【レベル】</th>
<td><span>初級～中級</span></td>
</tr>
</tbody>
</table>

Pythonで出来ることのうち以下の5つを網羅して学んでいきます。

:::box
**・データ集計・加工・描画**\
**・機械学習を使ったモデル構築**\
**・Webスクレイピング**\
**・APIの利用**\
**・Webアプリケーション開発**
:::

::button[このコースを見てみる]{href="https://www.udemy.com/course/python-can/?referralCode=2CBAD21040FF57199084" note="＼30日以内なら返金無料／"}

他にPythonでのWebアプリケーション開発について知りたい方は下記の記事がオススメです！

<https://toukei-lab.com/python-webapp>

また最近ではPythonのWebアプリのフレームワークで「[Streamlit](/streamlit)」がデータサイエンスの分野でよく利用されているので参考にしてみて下さい。

<https://toukei-lab.com/streamlit>