Share
Embed
Python×LINE
2023/10/9 10:00から行われたイベント「Python×LINE」のスライド資料です。
動画と併せてお使いください。
https://youtu.be/GfpQv1rXmSI?si=BdnM1yxLwyxjs57t
EngineerCafe
October 09, 2023
Transcript
62 slides
-
今回目指すのは、Pythonを使ったプログラミングで LINEのチャットBotを作成するというものです。 そのために、まずは準備を行います。 必要となるのは以下の通り。 ・LINE Developersの登録(公式アカウントの取得 ) ・ngrok(エングロック)アカウント ・ChatGPTアカウント ・Google
Coraboratory まずは、LINE Developersへ登録します。 -
Colaboratoryとは何か Google社が、機械学習の教育・研究を目的として開発した、 Pythonコードを記述するためのノートブック。 Jupyterをベースにしているため、 Jupyter愛用者にはありがたい存在。 Googleドライブの仮想環境内で動くので、ダウンロードやインストールの手間がだいぶ省けるものとなっています。 最大の特徴は無料で GPUが使えること。深層学習や機械学習などに非常に重宝します。 最大使用容量制限もありますが、自分のスキル学習に用いる程度であれば特にストレスなく使えます。 しかしながら、90分ルールと12時間ルールというものがあるため、学習用の域を出ない事に注意が必要です。
つまりは、本運用には向いていません。 ・90分ルールとは コードの実行が始まった時からカウントする。 90分の間PCに触らずにいる、あるいはタブを開いたまま何もしないと、自動的に停止します。 ・12時間ルールとは 同じくコードの実行が始まった時からカウントします。 折りに触れてPCに触る、あるいはシャットダウンしない仕組みを導入するなどしても、 12時間経つと強制的に初期化 されます。学習したデータもリセットされるので、その前に保存することをおすすめします。 保存すれば、そこから実行することができますので、また 12時間学習させることができます。 -
アカウント取得が必要なものはこれで終わりですが、まだまだ下準備が必要になります。 何のための準備なのかというと …LINEのチャットボットを作るためです。 どうして必要になるのか、まずはこれを作るための仕組みについて、順に説明していきます。 通常、ユーザー(LINEアプリ利用者)は公式LINEに友達登録(追加)したうえで、チャットボットとのやりとりを行いま すね。 ということは、まず友達登録が先になります。 開発者も一旦は自分のアカウントで友達登録し、チャットボットが正常に動いているかを確かめます。 ということでまずは第一段階。 ユーザー(利用者)がチャネル(公式LINE)に友達登録を申請します。
承認やIDの発行等は公式LINE側で行われます。 あいさつ返しなどの設定の他は特にすることはありません。 ユーザー QRコードから 友達登録の リクエスト 承認 公式LINE ここでの動きはユーザーから見た画面と同じですので、 分かりにくい部分がないかもチェックしてみましょう。 -
ユーザー 次に第二段階。 友達登録した人からメッセージが送られてきたら、送られた言葉をオウム返しする仕組みについて。 公式LINEには、予め設定したキーワードに応じて自動返信を設定できるなど、 公式LINEを運営するうえで必要な機能はほとんど揃っています。 【例】 「住所を知りたい」→(送信)→「住所」でワードを検知 →「〇〇市〇〇-〇〇」と返信 メッセージ (予め設定しておいたものを自動返信
) 公式LINE お店の住所は どこ? 住所 検知 〇〇市〇〇-〇〇です。 ご来店をお待ちしております! メッセージ (リクエスト) 予め登録したワード -
ユーザー メッセージ (受信したものと同一のもの ) 公式LINE 最終目標はChatGPTを利用したチャットボット作成ですが、まずは試しにオウム返しするプログラムを 組んでみます。 送信されたメッセージをそのままオウム返しする仕組みの場合、 公式LINE側で受け取る際にWebhookというトリガーを用意しておき、一度プログラムに渡します。 渡された内容をコピーし、なおかつそのまま返すというプログラムに従い、
Python側で生成、 そして公式LINEを介してユーザーに表示する仕組みとなっています。 このトリガーとなるWebhookを作成するために、ngrokを利用します。 リクエスト レスポンス -
今回フレームワークとして Flask(フラスク、フラスコ)を使用します。 Flaskではローカルホストを (0.0.0.0)として設定すれば外部ネットワークからのアクセスを許可しますが、 ネックになるのがエンドポイント (末端の端末機器などを示す )。 LINEアプリはネットワーク上にあるので、今回で言えばネットワーク上のアドレスが必要になります。 そのアドレスを一時的にネット上に公開してくれるのが ngrokです。
そのため、まず下準備として、 LINEMessagingAPIのチャネルシークレットキーとアクセストークン、 ngrokのAUTHトー クンが必要になります。 まずはこれを変数に代入し、格納しておきます。 Google Colaboratory(以下colab)を新しいタブで開いてください。 -
最初のコードボックスには以下の通りに記述してください。 # LINEのチャネルシークレット LINE_CHANNEL_SECRET = '#' # LINEのチャネルアクセストークン LINE_ACCESS_TOKEN =
'#' # ngrokのAuthtoken NGROK_AUTHTOKEN = '#' #の部分は後から差し替えます。 シングルクォーテーションはダブルクォーテーションでも OKです。 -
# LINEのチャネルアクセストークン LINE_ACCESS_TOKEN = '#' 取得した値を#と差し替えます。 アイコンと名前 次にngrokのAuthtokenについて。 ngrokのwebサイトを開き、ログインします。 左側にあるメニューから、
「Your Authtoken」を開き、 値をコピーしてください。 # ngrokのAuthtoken NGROK_AUTHTOKEN = '#' 同じように、こちらも#をコピーした値と差し替えます。 -
次に、チャットボットを作成するためのパッケージをインストールします。 しかし、このパッケージは、現在 (2023年9月時点)tensorflowとtyping-extensionsの最新バージョンでは 依存関係が競合するバージョンとなっています。 このままではエラーが発生し、正常に動きませんので、まず先にグレードダウンする必要があります。 新しいコードボックスを「+コード」から開き、 次のように記述してください。 !pip uninstall tensorflow
!pip install tensorflow==2.12.0 次に、もうひとつ新しいコードボックスを増やして次のように記述します。 !pip uninstall typing-extensions !pip install typing-extensions<4.6.0 記述したら、どちらも実行します。 途中、アンインストールしてもいいか?と尋ねられますので、文字列横をクリックして「 Y」を入力し、エンターキー で決定して実行結果を待ちます。 -
どちらも正常にグレードダウン出来たのを確認できたら、次にラインでのチャットボットを作るための ライブラリ、line-bot-sdkをインストールします。 また、今回はFlaskという、小規模のWebアプリ作成のフレームワークを使用しますので、 そちらも併せてインストールします。 次のように記述してください。 !pip install flask !pip install
line-bot-sdk 次に、ngrokの初期化を行います。これにより外部からのアクセスを可能にします。 新しいボックスではなく、そのままコードを記述してください。 !pip install pyngrok !ngrok authtoken $NGROK_AUTHTOKEN 記述できたら実行します。 -
次に、新しいコードボックスを追加して次のように記述してください。 import os from pyngrok import ngrok from pyngrok.conf import
PyngrokConfig os.system('kill -9 $(pgrep ngrok)') webhook_url = ngrok.connect(addr='127.0.0.1:5000', pyngrok_config=PyngrokConfig(start_new_session=True)) print (webhook_url) 解説は次のページで! -
これは、pythonでngrokを制御するためのコードです。 import os from pyngrok import ngrok from pyngrok.conf import
PyngrokConfig os.system('kill -9 $(pgrep ngrok)') webhook_url = ngrok.connect(addr='127.0.0.1:5000', pyngrok_config=PyngrokConfig(start_new_session=True)) print (webhook_url) 標準ライブラリのosモジュールをインポートし、 ngrokの設定を管理するクラスを呼び出しています。 そして、ここでngrokのプロセスを強制終了しています。 そうすることで、ログが残っていた場合に誤作動することを防ぎます。 それから新しくngrokでトンネリングを行い、外部からのアクセスを可能にします。 生成した公開URLをここで表示させます。これが Webhookとなります。 -
次はこちら。 これは、Flaskアプリケーション内で特定の URLパスに関連付けられたビュー関数を定義しています。 具体的には、”/test”パスに対するHTTP GETリクエストが送信された場合に test関数を呼び出し、 格納している文字列 ”TEST OK”を返します、というような動きをします。 例えばhttp://localhost:5000/test
にアクセスすると、ブラウザに "TEST OK" というテキストが表示されます。 ちなみに@から始まるのは「デコレータ」と呼び、 Pythonの特定の機能や振る舞いを、変更・拡張するために使用される概念です。 デコレータは、他の関数やクラスに装飾を追加するために、関数やクラスに適用される特別な関数です。デコレータ は、コードの再利用性、可読性、保守性を向上させるのに役立ちます。 -
handlerオブジェクトに対し、 MessageEvent と TextMessage タイプのメッセージを処理するハンドラー関数 を定義します。 上記のデコレータで定義された条件を満たすイベントが発生した場合、この関数が呼び出されます。 event パラメータは、受信した LINEメッセージイベントに関する情報を含むオブジェクトです。
受信したメッセージに対する応答を生成するコードです。 この場合、TextSendMessage を使用して、同じテキストメッセージを返信するように設定されていま す。 これにより、ユーザーが送信したテキストメッセージに対して、同じメッセージが返信されます。 -
それでは実行ボタンを押して、問題なく動くか確認してください。 友達登録したアカウントとのトーク画面で、ためしに言葉を入力して送信してください。 そのままオウム返しをしてきたら成功です! 何度か試してみてくださいね。 この時、colabのコンソール欄に送信された情報がありますので、それも同時に確認してください。 colabを閉じてしまうと当然ですがサーバーが停止してしまいます。 また、実行中であっても最大使用時間は 12時間です。 12時間経過すると初期化されますので永久的に使用はできない事に注意してください。 そのため、コード実行中の警告文には「本番導入へは別のサーバー利用を推奨します」というような旨の文章が
表示されています。 colabは無料版でも有料版でも、学習用として使用するのが正しい使い方です。 -
アカウント名 メールアドレス ここを選んで進んだ先のページで と書いてあるマークを押して発行しますが ここで注意する点があります! APIキーは有料です。 OpenAIのアカウントを登録した時、 お試し用として18クレジット分付与されますが、 有効期限は3ヶ月です。 もし、先に登録していた人は無効になっていないか確認
してください。 また、有効期間内であっても、クレジットカードの 支払い情報の紐づけがないと使用できないように 制限がかかっています。 -
いかがでしたか? コードを見返してみれば、意外と短くスリムであることが分かります。 また、JupyterやColaboratoryで記述した場合、特にランサーバーを立ち上げたままにしたい場合、 何度も読み込む手間もなく、 Webhookは一度の設定でできます。 Colaboratoryはgoogle社の提供するアプリケーションのため、 スプレッドシートをデータベースの代わりにして動かすことも可能です。 データベースの導入に関しては知識が必要だったり、追加するソフトも多いなど障害も多く立ちはだかりますが、学習 やテスト程度であれば googleの機能だけで完結します。
こういった導入の簡単なものから学習を始め、徐々にスキルアップしていくことで、 挫折することなく続けていけると思います。 勉強を続けるうえで大事なことは、「難しい問題に立ち当たった時、誰かに相談する環境があること」です。 エンジニアカフェでは、いつでもご相談に応じています!! 専門的な分野に関しても、現役エンジニアによる「 ハッカーサポータ―」への相談も可能です! まずは一度、エンジニアカフェにお越しください! また、Discordで「オンライン・エンジニアカフェ」 も運営中! 定休日(毎月最終月曜日と年末年始 )以外の10時から21時まで受付スタッフが常駐していますので、 ぜひご参加ください!