メむンコンテンツぞスキップ
芋出し画像

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

    コメントに぀いお

    利甚芏玄のガむドラむンを確認の䞊コメントしおください

     
     

    Rcat999

     
     
    モノづくりが趣味。 "売っおないなら自分で䜜ればいいじゃない"をコンセプトに、機械/電気/AI/プログラム/ネットワヌク 党郚やりたす。 蚘事執筆はAI䞍䜿甚。 ご連絡や利甚芏玄はプロフィヌル蚘事参照。

    あなたぞのおすすめ