オウム返しbot作ってみた話

# LINEbotを作ってみた!!
`ubuntu` `Linux` `AWS` `MessageAPI`
最終更新日 2023年12月19日　投稿日2023年12月19日
### はじめに

今回私は、LINEbotを作成し、オウム返しをするプログラムと、天気予報を取得するプログラムを作成し、LINEbotでメールを送り返すことにチャレンジ
***
### 目次
1.APIとは
2.環境開発
3.公式LINE作成方法
4.aws無料アカウント作成
5.オウム返しチャットボット


### 1.APIとは
APIとは、Application Programming Interfaceの略で、別々のアプリケーションがお互いに情報をやりとりする際の接点となる窓口です。本来APIとは、広い意味を持つ言葉だが、今回のMessage APIとは、REST APIのことである。REST APIとはルールのようなものに従って出来ている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621704/df614052-833e-4d09-a674-d1319a7449c8.png)
普段我々は、webサーバーに「webページを表示して！」とリクエストを投げ、webサーバー側が処理をしてレスポンスを返してクライアント側にデータを表示させる。webサーバーがサーバー側で、自分やブラウザがクライアントである。しかし、Webhookにおいては、ユーザーがこんなメッセージを送ってきたよ、webhookを受けとってとリクエストが飛んでくるので、それをあなたが用意したポットサーバーでそれを受けとってwebhookを受けとったよ。ステータスコード200!とレスポンスを返さなければならない。Webhookを投げてくるものがクライアントで自身が用意するポットサーバーがサーバーにかわる。


### 2.環境開発
今回はSDKをpythonで行う
・pythonのインストール
[ここからインストール](https://www.python.org/)

pythonをインストールする理由としてオウム返しのチャットボットを作成する際にmessageAPIのSDKを用意する必要がある。

その他のSDK
・Java
・php
・node.js
・go
・Ruby


### WSL（仮想マシン）
****
[スタート] > [cmdと入力] > [右クリック] > [管理者として実行]
下記を実行
```cmd
PS C:\Users\ユーザー名>dim.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
```
実行後再起動
```cmd
PS C:\Users\ユーザー名> wsl --install ubunts
```
実行後、ユーザー名とパスワードを要求される。これでLinuxのubuntuの環境構築が完了し、wslが使用出来る。

### 3.公式LINE作成方法

<table>
<tr>
<td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621704/834bf6c8-f652-00e3-06b8-86964ed1ea9b.png"></td>
<td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621704/69605ad5-8dfc-86f4-7c7b-be10ef5fa8a4.png"></td>
</tr>
</table>
[LINE VOOM]>[作成]をクリック
アカウント名を入力しカテゴリーは各使用用途に応じて変更して下さい。今回は特に指定はないので個人で個人（学生）を指定した。地域は日本に設定し、アカウント作成をクリック。

MessageAPIを作成するためにLINE Official Account Managerを開く
[ここから作成](https://www.linebiz.com/jp/login/)

<table>
<tr>
<td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621704/73534147-43be-5164-11ba-2705ffd7a88e.png">
</td>
<td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621704/d93c9233-f458-363b-75f9-1f042b5ba850.png">
</td>
</tr>
</table>
LINEアカウントでログインをクリックし、[メールアドレス],[パスワード]を入力。
二要素認証のため、4 桁の認証番号が表示されるので、スマートフォンの LINE を開くと、認証番号入力の画面が表示されますので、この 4 桁の認証番号を入力して［本人確認］をタップするとログインできる。

#### ログイン完了後
[設定]>[Messaging API]>[Messaging APIを利用する]
LINE Developers コンソールにログインしたことがない場合、[名前]と[メールアドレス]を入力して[同意]をクリックし[OK]をクリック。
その後、プライバシーポリシーと利用規約が表示される。サービス提供者としてすでに持っている場合は登録し無ければ入力せずに[OK]をクリック

####LINE Developersコンソールにアクセスしてアクセストークンを発行
[ここから](https://developers.line.biz/console/)
先程作成したブロバイダーを選択する
[Messaging API設定]>[チャンネルアクセストークン(長期)]>[発行]
[チャンネル基本設定]>[チャンネルシークレット]
※チャンネルアクセストークンとチャンネルシークレットは今後使用するのでコピーなどして覚えておくこと

管理アプリをインストールして公式アカウントからメッセージを確認しよう
インストールは下記から↓
[Andoroidの場合](https://play.google.com/store/apps/detaols?id=com.linecorp.lineoa)
[iosの場合](https://play.google.com/store/apps/detaols?id=com.linecorp.lineoa)

### 4.AWSアカウント作成
AWS無料利用枠を使用した。無料利用枠は、12ヶ月のAWS無料利用枠の期間が終了しても自動的に期限切れにならない。しかし、無料の使用量は毎月合計量が計算され、自動的に請求額に適用されるため注意が必要！！

[ここからアカウント作成](https://console.aws.amazon.com/)

### 5.オウム返しチャットボットを作成

###### 手順１.環境開発で使用出来るようにしたWSLを開く。
[スタート]>[WSLと入力]>[開く]
そこでホーム画面からpythonの作業ディレクトリを作成する
```
$ cd
$ mkdir python
$ ls
```
※作業ディレクトリは必ずpythonにして下さい。でないとこの後の作業で上手くいかないため

```
$ cd python
```
作業ディレクトリに移動
```
$ sudo apt update
$ sudo apt install python3-pip
```
実行すると[Y/n]と表示するのでYを入力し[Enter]を押す。
```
$ cd ..
$ sudo apt install zip
```
zipコマンドでpythonディレクトリをzipファイルに圧縮するために作業ディレクトリの前に戻り上記を実行する。
```
$ zip -r python.zip python
```
上記を実行するとpythonディレクトリをzipファイルに圧縮出来る。

###### 手順2. AWS(Amazon Web Servis)を開く
[コンソールホーム画面]>[Lambda]を開く>[レイヤー]>[レイヤー作成]をクリック
| 名前 | Messaging-API-SDK-for-python| 
|:-----------:|:------------:|
| 説明       | Messaging API SDK for python       |
| アップロード方法     | zip ファイルをアップロード|
| アップロードするファイル      |　「2.6.1 Messaging API の SDK を準備する」で用意した python.zip       |
| 互換性のあるアーキテクチャ         | x86_64 にチェックを入れる          |
| 互換性のあるランタイム       | Python 3.10 を選択       | 
| ライセンス   | https://github.com/line/line-bot-sdk-python/blob/master/LICENSE| 

これでLambda関数の作成が完了した。次にMessage API SDKのレイヤーを追加したいので、[Layers]>[レイヤーの追加]をクリック。レイヤーの選択を下記に設定。

| レイヤーソース | カスタレイヤー| 
|:-----------:|:------------:|
| カスタムレイヤー      | Messaging API SDK for python       |
| バージョン     | 1 |

Layersが追加出来たら、次に[トリガーを追加]をする。APIGatewayを作成する。[トリガーの設定]>[API Gateway]を選択。トリガー値は下記に設定し[追加]をクリック。トリガーの作成後、[API エンドポイント]のURLをLINE Developersを開き、[Messaging API設定]>[Webhook URL]>[編集]をクリックして貼り付ける。[検証]をクリックして

![LINE4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621704/1faeb93c-6599-2a2a-0979-2a131b2168a0.png)

![LINE3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621704/76d45c2e-52b3-793e-a408-6aa0a091c2d7.png)
が表示されたら成功。


| インテント | 新規APIを作成| 
|:-----------:|:------------:|
| APIタイプ       | HTTP API       |
| セキュリティ     | 開く|
| その他の設定     |　すべてデフォルトのまま|


```
import json
import logging
import os
import sys

from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError, LineBotApiError
from linebot.models import MessageEvent, TextMessage, TextSendMessage

# INFOレベル以上のログメッセージを拾うように設定する
logger = logging.getLogger()
logger.setLevel(logging.INFO)

# 環境変数からMessaging APIのチャネルアクセストークンとチャネルシークレットを取得する
CHANNEL_ACCESS_TOKEN = os.getenv('CHANNEL_ACCESS_TOKEN')
CHANNEL_SECRET = os.getenv('CHANNEL_SECRET')

# それぞれ環境変数に登録されていないとエラー
if CHANNEL_ACCESS_TOKEN is None:
    logger.error(
        'LINE_CHANNEL_ACCESS_TOKEN is not defined as environmental variables.')
    sys.exit(1)
if CHANNEL_SECRET is None:
    logger.error(
        'LINE_CHANNEL_SECRET is not defined as environmental variables.')
    sys.exit(1)

line_bot_api = LineBotApi(CHANNEL_ACCESS_TOKEN)
webhook_handler = WebhookHandler(CHANNEL_SECRET)


@webhook_handler.add(MessageEvent, message=TextMessage)
def handle_message(event):

    # 応答トークンを使って回答を応答メッセージで送る
    line_bot_api.reply_message(
        event.reply_token, TextSendMessage(text=event.message.text))


def lambda_handler(event, context):

    # リクエストヘッダーにx-line-signatureがあることを確認
    if 'x-line-signature' in event['headers']:
        signature = event['headers']['x-line-signature']

    body = event['body']
    # 受け取ったWebhookのJSONを目視確認できるようにINFOでログに吐く
    logger.info(body)

    try:
        webhook_handler.handle(body, signature)
    except InvalidSignatureError:
        # 署名を検証した結果、飛んできたのがLINEプラットフォームからのWebhookでなければ400を返す
        return {
            'statusCode': 400,
            'body': json.dumps('Only webhooks from the LINE Platform will be accepted.')
        }
    except LineBotApiError as e:
        # 応答メッセージを送ろうとしたがLINEプラットフォームからエラーが返ってきたらエラーを吐く
        logger.error('Got exception from LINE Messaging API: %s\n' % e.message)
        for m in e.error.details:
            logger.error('  %s: %s' % (m.property, m.message))

    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
```
#CHANNEL_ACCESS_TOKEN = os.getenv('CHANNEL_ACCESS_TOKEN')
#CHANNEL_SECRET = os.getenv('CHANNEL_SECRET')
上記の2行には公式LINEで作成しチャンネルアクセストークンとチャンネルシークレットキーを入れる。書き換えれば[Deploy]をクリックする。

[Deploy]をクリック後、[設定]>[環境変数]>[編集]をクリックし下記を入力し[保存]をクリック。

| キー| 値| 
|:-----------:|:------------:|
| CHANNEL_ACCESS_TOKEN  | チャネルアクセストークン      |
| CHANNEL_SECRET      | チャネルシークレット|

下記のように[正常に更新されました。]と表示されれば成功！！
![LINE5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621704/d123f4b2-e0d0-cd0e-df4f-56d4aa8adf6e.png)


### 感想
今回初めてLinebotを動かしてみてAPIやawsといった触れたことのないもの触れていい経験になったと感じる。linebotは今回オウム返しをするといったものを作ったが、今度は天気予報を取得するものを作ってみたい。


### 参考文献
https://qiita.com/Qiita/items/c686397e4a0f4f11683d
https://learn.microsoft.com/ja-jp/windows/wsl/install-manual#step-1---enable-the-windows-subsystem-for-linux
https://qiita.com/MinadukiSekina/items/25f3440565ca7b6a359e