読者です 読者をやめる 読者になる 読者になる

ちぎっては投げるブログ

Programming, Android, RaspberryPi, Digital Devices, Kinkuma Hamster...

翔泳社とは別に、プログラミング・IT技術書フェアで50%OFFセール中(2/23まで)

Book Programming 特価

amzn.to

先日のセール、

denpa-shinbun.com

に引き続き、技術書が半額セール中。

今回はなんだかマイナー本や、個人出版に近そうなタイトルが多い印象。

機械学習のDeepLearning周りの本がいくつかある、TensorFlowの本もあるが、内容は薄そうに見えなくもない。

気になる本

翔泳社の技術書半額セール中、おすすめを何冊か

Programming Linux 特価 Book

翔泳社の技術書が電子書籍で半額セールをしている。ITエンジニア向け。

電子書籍が世に出てきてから、なかなか値下げされず中古市場にも出回らなかった技術書が安く手に入るので嬉しい。

ただ、個人的には、積んである本がたくさんあるので、今回はよほど良さげな本がない限り見逃そうかと思う。

でも、AWS関連の本が一冊ぐらい欲しい。

だと簡単すぎるだろうか?

amzn.to

おすすめタイトル

有名どころで世間的にも名著とされているのを何冊かあげておく。

LINE非公式APIで通知を取得するまで

Linux Programming shell Python TIL GitHub

前回の続き。

denpa-shinbun.com

今回はLINE非公式APIをPythonから使って通知の取得を試みた。

f:id:mczh:20170124215447p:plain

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はやめて違う方法を検討することにする。