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とはルールのようなものに従って出来ている。
普段我々は、webサーバーに「webページを表示して!」とリクエストを投げ、webサーバー側が処理をしてレスポンスを返してクライアント側にデータを表示させる。webサーバーがサーバー側で、自分やブラウザがクライアントである。しかし、Webhookにおいては、ユーザーがこんなメッセージを送ってきたよ、webhookを受けとってとリクエストが飛んでくるので、それをあなたが用意したポットサーバーでそれを受けとってwebhookを受けとったよ。ステータスコード200!とレスポンスを返さなければならない。Webhookを投げてくるものがクライアントで自身が用意するポットサーバーがサーバーにかわる。
2.環境開発
今回はSDKをpythonで行う
・pythonのインストール
ここからインストール
pythonをインストールする理由としてオウム返しのチャットボットを作成する際にmessageAPIのSDKを用意する必要がある。
その他のSDK
・Java
・php
・node.js
・go
・Ruby
WSL(仮想マシン)
[スタート] > [cmdと入力] > [右クリック] > [管理者として実行]
下記を実行
PS C:\Users\ユーザー名>dim.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
実行後再起動
PS C:\Users\ユーザー名> wsl --install ubunts
実行後、ユーザー名とパスワードを要求される。これでLinuxのubuntuの環境構築が完了し、wslが使用出来る。
3.公式LINE作成方法
MessageAPIを作成するためにLINE Official Account Managerを開く
ここから作成
ログイン完了後
[設定]>[Messaging API]>[Messaging APIを利用する]
LINE Developers コンソールにログインしたことがない場合、[名前]と[メールアドレス]を入力して[同意]をクリックし[OK]をクリック。
その後、プライバシーポリシーと利用規約が表示される。サービス提供者としてすでに持っている場合は登録し無ければ入力せずに[OK]をクリック
####LINE Developersコンソールにアクセスしてアクセストークンを発行
ここから
先程作成したブロバイダーを選択する
[Messaging API設定]>[チャンネルアクセストークン(長期)]>[発行]
[チャンネル基本設定]>[チャンネルシークレット]
※チャンネルアクセストークンとチャンネルシークレットは今後使用するのでコピーなどして覚えておくこと
管理アプリをインストールして公式アカウントからメッセージを確認しよう
インストールは下記から↓
Andoroidの場合
iosの場合
4.AWSアカウント作成
AWS無料利用枠を使用した。無料利用枠は、12ヶ月のAWS無料利用枠の期間が終了しても自動的に期限切れにならない。しかし、無料の使用量は毎月合計量が計算され、自動的に請求額に適用されるため注意が必要!!
5.オウム返しチャットボットを作成
手順1.環境開発で使用出来るようにした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]>[編集]をクリックして貼り付ける。[検証]をクリックして
インテント | 新規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 | チャネルシークレット |
下記のように[正常に更新されました。]と表示されれば成功!!
感想
今回初めて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