見出し画像

LINEのBOTをPythonで作ってみた

こんにちはRcatです。
さて、いきなりですが、やりたいことがあるのでLINEのbotを作ります。
今回はボットアカウントの作り方と動作確認までを行っていこうと思いますタイトル通り、プログラミング言語はPythonです。

次回はこちら


BOTアカウントを準備する

アカウントを作成する

まず、最初にBOTアカウントを用意しましょう。

公式の説明が非常に丁寧で、わざわざ書く必要がなかったので、リンクを貼っておきます。さすが日本の会社って感じ。株式は揉めてますが…。

デベロッパーコンソール

完成したらメッセージングAPIの設定のところから長期のアクセストークンを取得しましょう。

いくつかの設定を変更する

アカウントができたらいくつかの設定を変更しておきましょう。
真ん中らへんのオフィシャル設定をクリックします。

機能の利用の部分のトークへの参加で、グループ複数にトークへの参加を許可しましょう。今回やりたいことはグループに招待しないとできないので、この機能をオンにします。
認証というのがありますが、これは検索して出てくるようになるというもので、今回は個人的に使いたいのであえて認証はしません。

ボットと友達になる

メッセージングAPIの中にQRコードがあるので、LINEのアプリで読み込むことで友達追加することができます。お友達が一人増えました ウレシイナ~☆

BOTを作成する

さて、アカウントが準備できたところで処理側を作っていきます。

BOTサーバーを用意する

公式の説明にもある通り、LINEのbotはWebhookという仕組みを使用して動いています。私も詳しく知らなかったのでちょっと調べてみました。
これは、ボットに対してメッセージが送られたなどのイベントが発生した場合LINEのサーバーから各ボットが稼働しているサーバーへデータが送信されることによって、ボットにデータを伝える仕組みです。

そのため、LINEのサーバーからデータを受信して、そして動かすために送信するサーバーが必要になります。

図にしてみるとこんな感じでしょうか?

インターネットで調べるとgasを使っているものもありますが、私の場合は24時間用のLinuxサーバーがあるので、それを使ってPythonで動かします。
確かにこの仕組みならgasを使うのも賢いやり方なのかもしれません。
今回はそもそも私のやりたいことをやる時点で自分のサーバーでPythonでなければダメなのです。具体的には次の記事で説明しますね。

アクセス先のURLを設定する

さて、仕組みが分かりました。つまりは公式から家にアクセスしてもらわなければいけないということですね。
というわけでその設定がこちら、友達追加のQRコードの少し下にあるWebhookURLです。
ここに自分の家に接続できるURLを入力しましょう。今回はサーバーの中にWebhookcgiというのを作成したので、そこにアクセスさせます

この次の手順でホスト名が必要になるので、多分IPアドレスではダメです(試してませんが)。
もしホスト名が必須だった場合、私が利用しているサービスを紹介しますので、よろしければ使ってみてください。
このサイトを使っている理由としては、一番最初IPアドレスの更新をESP32からやってたからです。ESP32用のライブラリがあるんですよね。今はもちろん24時間サーバーでやっていますが。更新スクリプト配布しようかな…?

SSL証明書を入手する

さて、早速壁にぶち当たりました。とうとうSSLに手を出さなければならない時が来たようです。
ユーザーの情報が含まれているので当たり前ですが、暗号化できるhttps通信でなくてはならないようで、対応するサーバーはSSLにしなければなりません
今までは別に漏洩しても問題のない情報だったり、どうしてもの時はVPNを使うという方法でどうにかなっていたので手を出してきませんでしたが、必要になったので仕方ありませんやりましょう。
しかし、ありがたいことにLINEの公式から無料の証明書入手に関する情報があったので、そちらを使っていきます。やっぱりこの辺日本の会社って感じ。アプリを無限に改悪して通知来なくなっているのは残念だけど。まあ、それも今回のやりたいことで解決予定

ちなみに自己署名の証明書を適用して、先ほどのURLの下の検証ボタンを押すとこうなります。(後でよく見たら自己証明はダメってちゃんと書いてあった。)ちゃんと家に接続しに来てくれてるみたいですが、証明書がダメなので蹴られたみたいですね。

証明書の入手はそれだけで1本のネタになるので、以下の記事で行っています。参照してください。

というわけで証明書を作りました。適用すると…

うまくいきました。
これでボットアカウントの準備は完了です。

動作確認のテストコード

さて、次はテストコードの紹介です。
紹介は後になってしまいましたが、そもそもボットの接続検証の時点でサーバーが必要です。上の説明をしている頃はURLを作って単純に200返すだけにしてました。

というわけで具体的なコードを作っていきましょう。

使用するライブラリは?

今回はaiohttpライブラリーのサーバーを使います。
え、いつもはflask使ってる裏切り者だって?
Flaskには大変申し訳ございませんが、今回はBOTを作る目的があり、それに対応するにはasyncioを使った非同期ではなければならないので、このライブラリを使います。
さて、この辺でだんだん目的がわかってきちゃいましたか?具体的には次の記事で紹介しますね。

Line BOTのPythonコード

実際に書いているコードはテンプレートの使い回しなので、いろんなところで記述があるので抜粋します。抜粋しすぎて抜けてたらごめんなさい。

簡単に内容を説明します。
まず上の方で簡単な設定を行っています。具体的にはポート番号とSSLに必要なデータの読み込みですね。証明書を作る方の記事で作った証明書をディレクトリに持ってきて読み込むようにしています。

次にcgiの定義です。これはURLにアクセスしたら何をするという定義です。
リファレンスによると向こうはポストでJSONデータを投げてくるらしいです。そのため、受け取ったデータはJSONとして処理し、Pythonで辞書型に変換します。
今回はテストなので、受け取ったデータはpprintライブラリを使って分かりやすく画面に表示するようにしています。
処理が終わったらクライアントに応答を投げます。リファレンスによるとステータスコード200なら何でもいいみたいです。なのでOKと返します。

次にサーバーの定義です。
ここではアプリケーションをインスタンスし、URLとcgiの紐付けをしています。特に難しいことはありませんね。

最後にWebサーバーをスタートする関数です。
とりあえず基本通り書いてあるだけです。サイトの最後のところにSSLの証明書の設定があるのが特徴です。こうするだけでSSLにできるんですね。便利です。

そして一番下でプログラム自体を起動しています。
多分この書き方で合ってると思いますが、実働は別の書き方でやってるので動かないかもしれません。

ディレクトリ構成はこちら
なんかいっぱいキーがあるんですが、読み込んでるのは2つだけなんですよね。突っ込んだら終わらなくなりそうなので、とりあえずここはスルーしましょう。

接続を検証する

さて、サーバーができたらLINEの方で検証のボタンを押してみましょう。
サーバー側には以下のような表示が出てきて、LINEの方では成功しましたという表示になっているはずです。

メッセージを送ってみる

では、次にLINEアプリからメッセージを送ってみます。
とりあえず適当に雑なメッセージを送ります。

特に何もしていないとこういう自動返信があるんですね。
さて、大事なのはサーバー側にどんなのが来たかです。
ふむふむ。なるほど、分かりません。とりあえず色々隠した方が良さそうなのが多いので、とりあえず隠します。

ただ、これを見る限りテキストという部分から何を送られてきたかを取得することはできるみたいなので、活用はできそうです。

スタンプを送ってみる

では、LINEの特徴の一つであるスタンプを送ってみましょう。

rcatの使用率ナンバーワンのスタンプ 言ってて悲しくなってきた

ふむふむ。なるほど。
タイプのところがテキストからステッカーに変わっていますね。
プログラムではこのタイプの部分をきちんと読み取りしておかないと次の処理でエラーになりそうです。
画像は来ないみたいなので、あらかじめスタンプのIDと内容を表にして作っておく必要がありそうですね。このスタンプの場合は"(ST)残業です"みたいな感じでしょうかね。

グループに招待して、メッセージを送ってみる

さて、今回の目的はグループに招待しなければ達成できないので、ちゃんと動作するのか確認します。

というわけでBOTを招待してグループを作り、そこでメッセージを送信してみます。
ちなみにうるさいので応答メッセージはオフにしました。無視されてるわけじゃないです。

ボットの方の応答がこちら
ふむふむ。なるほど。ソースの部分のタイプが変わってますね。
グループなどがIDになっているので、事前にどのグループ名なのかは対応表を作っておかないと判別するのは難しそうですね。

プログラムからメッセージを送信する

さて、メッセージを受信できることがわかったところで、次は送信のテストをしましょう。
MessagingAPIを使用することになりますので以下のページを見ます。

APIを確認するとメッセージの送信はプッシュメッセージAPIを使うみたいですね。

というわけで、メッセージを送信する関数を作りました。
この関数に対して送りたいメッセージと、送る相手またはグループIDを渡すことでメッセージを送ることができます。

まず、POSTのリクエストヘッダーにコンテンツタイプと認証キーを入れます。認証キー一番最初にボットを作った時に取得した長期アクセストークンのことです。
次にリクエストボディですが、必須が2つあります。
1つ目は送信先toで表されていますね。ここにユーザーIDまたはグループIDを入れます。今回は新しいお友達とのグループを入れます。
次はメッセージです。最大5個まで指定できるみたいで、リストの中に各メッセージの内容になっています。テキストのところに送りたいメッセージを入れます。
今回はオプションで通知をいかせるかどうかのフラグにTRUEを入れてます。公式アカウントから通知が来ると嫌ですが、これは自分のbotなのでちゃんと通知が来てもらわないと困ります。まぁそもそも不具合で来ないんですが。

この関数を呼び出すための実験関数がこちら。はい、httpです。
メッセージを送るためのURLを作ったので、そこにGETでメッセージとIDを入れて実験してみることにしました。

アクセス方法はこんな感じ。
SSLを有効にするとローカルからの接続で逆に警告されるんですね。確かにホスト名使ってないからされるのか。

というわけで、実行結果はこちら。
はい、正常にメッセージが投稿されました。癖で""で囲ってしまいましたが、GETなのでいらなかったですね。

まとめ

今回はLINEのボットを作ってメッセージの送受信確認をしました。
SSLやWebフックの実装など初めてやることが多かったので、実際に3日くらいかかりました(主にSSL証明書のところ)。
さて、基盤は整ったので、次回から本当にやりたかったことを勧めていこうと思います。それではまたお会いしましょう。

リンク集

API

MessagingAPI


最後に

利用規約

情報や作品の活用時は事前に利用規約をご確認ください。

https://note.com/rcat999/n/nb6a601a36ef5

コメントについて

利用規約のガイドラインを確認の上コメントしてください

情報が役に立ったと思えば、僅かでも投げ銭していただけるとありがたいです。