ちぎっては投げるブログ

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

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

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

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

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

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

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

amzn.to

おすすめタイトル

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

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

前回の続き。

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

LINE Payの出金を自動で家計簿アプリZaimに登録させる計画だったもの

最近、還元率2+1%(たまに4+1%)のLINE Payカードを買い物利用のメインに切り替えた。

還元率はいいのだが、家計簿アプリのZaimへの自動登録機能がないため、毎回自分で登録することになり、家計簿をつけるのがかなり面倒になってしまった。

Zaim側が対応してくれればよいが、まだ対応予定にすら載っていないので、とうぶんは期待できない。

これをなんとか解決したいと考えて、以下ならできそうじゃない?と考えた計画をメモしておく。

f:id:mczh:20170117211843p:plain

なお今のところうまくいっていない。

計画

LINE Payは、使用するとLINEに金額の通知が来る。

この通知から日時と金額の情報をとって、Zaimに投げれば自動化できるのではないか。

LINEメッセージをどうやって読むか?

LINE Messagging APIという、Botを作るときに用いるAPIがLINEにあるので、これを使ってBotを作る。

Botを作って、そのBotをLINE Payの通知会話に登録させれば情報が拾えるのでは!?

ZaimもAPIを公開しているので、そちらは心配ない。

Botを作ってみる

herokuで動かすのが楽そうだったので、herokuのアカウントを作ってとりあえず固定文字列を返すbotを作成した。

特に大きくつまずく点もなく、資料もそろっていた。

落とし穴

さて、いざ出来たBotをLINE Payの会話に招待してみたところ、今まであった会話に加わるのではなく、新たなグループ会話が出来上がってしまった…。

f:id:mczh:20170117231916j:plain

これではLINE Payからの通知は取得できない。

さっそく暗礁に乗り上げてしまい、やる気を失いつつある。

もうひとつのアイデア

Androidだと通知領域のテキストを拾う的なことができた気がする。とすれば、LINE Payの通知から金額を拾えないだろうか? まだ調べていないが、通知されるテキストの長さによるだろうか。

ただ、これだとAndroidアプリとして作らないといけないので、ちょっと面倒だなという気持ちがある…

なにか良い方法はないだろうか。

denpa-shinbun.com