前回の続き。
今回はLINE非公式APIをPythonから使って通知の取得を試みた。
LINE非公式APIのマニュアル
LINE manual — LINE api doc 0.6.9 documentation
上記サイト参照。
Pythonで書かれていて、
pip install line
でインストールし、サンプルコード(Echo bot example)
from line import LineClient, LineGroup, LineContact try: client = LineClient("ID", "PASSWORD") #client = LineClient(authToken="AUTHTOKEN") except: print "Login Failed" while True: op_list = [] for op in client.longPoll(): op_list.append(op) for op in op_list: sender = op[0] receiver = op[1] message = op[2] msg = message.text receiver.sendMessage("[%s] %s" % (sender.name, msg))
のような形で使う。 ただし、これだけだとアクセストークンが取得できない。
アクセストークンの取得方法
GitHub - iwdmb/GetLineApiAuthToken: This will help you get LINE API authentication token(authToken).
上記のリポジトリをクローンしてきて、
python GetLineApiAuthToken
を実行すると、ユーザ名パスワードを聞いてくるので、LINEのメールアドレスとパスワードを入力する。 すると4桁の数字が表示されるので、これをスマホのLINEに入力する。 すると、AuthTokenが取得できる。
実は最初に挙げたpip install lineでインストールされるものでもトークン取得できそうなことが書いてあるのだが、実際にやってみると取得できない。
取得したAuthTokenを使って通知を取得する。
from line import LineClient, LineGroup, LineContact try: client = LineClient(authToken="AUTHTOKEN") #ここに取得したトークンをコピペ except: print "Login Failed" while True: op_list = [] for op in client.longPoll(): op_list.append(op) for op in op_list: sender = op[0] receiver = op[1] message = op[2] msg = message.text print "%s" % msg
問題点
LINEから、クライアント古いからアップデートしろよ、という通知が大量に飛んでくる。issueになっているのは見つけたが、解決法は書かれていない。
Receive message of update LINE app after login · Issue #71 · carpedm20/LINE · GitHub
また、トークンも怪しいとすぐに破棄されるように見える(非公式なのでしかたがないが)。たとえば、上のサンプルコードは、実際にはスリープを数秒間挟まないとすぐダメになった。
TypeError: 'unicode' does not have the buffer interfaceの対策
ググると、werkzeugのバグだ、古いから更新しろ、という書き込みばかり見つかるが、今回はそれではない。
こちらのissueに書いてある、thriftのバージョンの問題だった。
curve is not compatible with thrift 0.10.0 · Issue #88 · carpedm20/LINE · GitHub
一時的な対処としては、
pip install thrift==0.9.3
で直る。
結局諦めた
非公式なのでしかたがないが、安定した動作はしなかった。あるいは、GetLineApiAuthTokenのリポジトリ内にあるLINEディレクトリのメソッドを使えばあるいは…?と思い実験してみたのだが、他の端末が使用していると認識されてしまい、スマホのLINEアカウントが強制ログアウトされてしまい、会話ログも消えてしまった。
これに懲りて、やはり非公式APIはやめて違う方法を検討することにする。