メモ帳DPA

ぐぐってあまり引っかからないような何かがあったら書いたりする

PASELIの履歴/統計情報閲覧ツール作った(PASELIst)

※4/11追記
PlayStoreに置いてましたが公開取り下げました。理由は察して下さい。
アプリ自体はサーバ側の仕様が変わるまでは問題なく使えるかとは思います。

とりあえずapkとソースはここに置いておくのであとは好きに使って下さい。
※2014/12/07更新:myKONAMIの仕様変更のためログインを手動処理にして対応

ソース
https://github.com/de0/PASELIst
アプリ本体(apk)
https://github.com/de0/PASELIst/blob/master/PASELIst/PASELIst.apk

ダウンロード

ここからどうぞ

https://play.google.com/store/apps/details?id=com.de0.paselist

できること

https://my.konami.net/login.do → PASELI → 購入履歴
の内容を片っ端から取り込み、以下の形式で表示します。

表示されたリストの項目を選択するともう一段階詳細表示できます。

・利用履歴 → 選択項目のみの表示
・月別集計 → 選択月の機種別合計
・年別集計 → 選択年の機種別合計
・統計情報 → 選択機種の統計


統計情報の内容と補足

アプリ上ではスペースの都合上あんまり細かいこと書けなかったので補足。

項目 概要 共有ボタン対応
利用総額 なんと1Pは日本円にして1円なのです
平均利用額 プレイしない日はカウント外。ゲーセン行った日は一日で大体いくら使うか
最高利用額 そのまま。
プレイ日数 1回以上PASELI消費した日の数。
プレイ頻度 多分総額の大小よりもこの値のほうがゲーセン依存っぷりが出る
総チャージ額 そのまま。
平均チャージ額 チャージしなかった日はカウント外
最高チャージ額 一日でチャージした合計額の最高
チャージ日数 1回以上PASELIチャージした日の数
チャージ頻度 そのまま。
概算プレイ時間 100P10分換算。カード引きまくったりPFreeばっかやってたりする人は実時間とズレます。
最頻プレイ曜日 そのまま。
最長連続プレイ 1回でもプレイした日が何日続いたか。pop'nでいうところのX日連続プレー
最長未プレイ間隔 プレイしてから次にプレイした日までの最大日数。(現在進行形でずっとプレイしてないのは対象外。それもカウントすると過去機種のデータが使いものにならないので)
初回プレイ日 Paseli対応のロケテ時の記録なども含む
最多プレイ機種 使用ポイント基準(回数ではなく)
利用予想額−今月 「今月の総額 / 今月の経過日数 * 30」プレイが偏ると結構変動するので参考程度に。
利用予想額−今年 「今年の総額 / 今年の経過日数 * 365」

既知の問題や仕様

低スペック端末だと落ちる

現状の処理方式だと多分どうしようもないです。(落ちる理由は後述)
諦めてExcel版使って下さい

複数アカウント非対応

使えるのは1アカウントだけです。
最初に登録したアカウントと別のアカウントで取得しようとすると正しく収集できません。

同じ日付の中の履歴が使用順にならない

同じ日に使った同機種は全て同じ項目にまとめられた上で、使用順とは関係ないと思われる謎の順序で表示されるっぽい(サーバ側がそうなってる)

保存したパスワードの文字数が変わってる(ように見える)

設定の前後で暗号化/復号化を行なっているので、入力した文字数とダイアログ上で表示される文字数は異なって見えます。
実際にはちゃんと入れたとおりの内容になってるので別に気にする必要はありません。
空欄にした場合でもダイアログ上では「●●●●…」となるのは「空欄」を暗号化したものが設定されているためです。

「あそこにベンツが停まってますね」

134万円を記録されたこちらの方が現時点での優勝です。おめでとうございます?(2013/3/27時点)

さらなる記録をお持ちの方の挑戦をお待ちしております。



パスワード保存の話

パスワードは暗号化して保存していますが、仕組み上セキュリティが大して強くありません。
(本アプリに限らずほとんどのAndroidアプリに言えることです)
パスを保存する場合は主に以下のようなリスクが有ることを認識しておいて下さい。

保存先へのアクセスについて
  1. root権限がないとデータの保存先のファイルは読めない
  2. しかしAndroid端末は簡単にroot化可能
  3. 保存されたデータは実質的に全て取得可能
暗号化について
  1. サービスにログインするためパスワードは復号化できる形式で保存する必要がある
  2. 暗号化/復号化する処理はアプリ内に格納されてる
  3. Androidアプリはapkファイルから簡単に逆コンパイル出来る
  4. どういう方法で暗号化処理してるか内容が分かる
  5. 保存されたパスワードが取得できてしまう
使おうワンタイムパスワード

とりあえずOTP使っとけば間違いないです。
たとえパスワードを抜かれてもトークンも一緒に持っていないとログインできません。

コナミスタイル : KONAMI OTP TOKEN (キーチェーン) | KONAMI STYLE
コナミOTPサービス ソフトウェアトークン - Google Play の Android アプリ

ただ、キーチェーン型が利用期間無制限で\1050なのに、ソフトウェア型が1年制限で\1000なの全く解せないんで何とかして下さい…

パスワードの扱いについて

どんな処理してるかは確認できるよという話

これ作っておいてどの口で言うかという感じですが、そもそも得体の知れない外部アプリにサービスのパスワードをホイホイ入れるべきではありません。

パスワードはログイン処理以外には全く使っていませんが、信用ならないという方は逆コンパイルすることで実際にソースを見れるので確認してみて下さい。
(上記の暗号化の話だと逆コンパイルしやすいのは完全にデメリットですが、実際の処理が追えるって点ではメリットだと思います)

非公式ツールを使うリスクの話

このツールに限らず、ログインを要するタイプのほぼ全ての非公式ツールは、もし悪意を持った作者が作ったら簡単にパスワードを取得出来ます。
わざわざツール自作するくらいのコアなユーザがそんな悪さをするかよって考え方もあるようですが、「やろうと思えば出来る」状態であるのが紛れも無い事実なのでその危険性は十分認識が必要です。

一番安全なのは使わないことですが、次に出来る対策として、ツール使用の前後でパスワードを一時的に変えるなどの対策も効果的です。(一番素晴らしいのは公式が提供することです…)


こういった不正取得への対策としてOTPは非常に有効です。
仮にパスワードが不正に取得されてしまった場合でも、トークンも同時に物理的に盗まれない限りはログインされるのを防ぐことができます。

各種非公式ツールを使うときにこそOTPを使うべきです。おすすめ。
ツールも徐々にOTPに対応していくとお互いのためにも良いんじゃないかと思います。

処理の話

通信内容

ネットワーク通信は以下の処理だけで使ってます。

  1. https://my.konami.net/login.do にアクセス
  2. 上記ページからIDとパス入れてログイン
  3. https://my.konami.net/paseli/login.kc に移動
  4. https://my.konami.net/paseli/payinfo.kc に移動
  5. 各履歴ページにアクセス
認証について

PASELIチャージサイトですが、ログインしてCookieを使いまわしたりだけでは認証が通りません。
強引な対策として、見えないWebviewが画面の中に仕込んでありそれをバックグラウンドから直接操作しながらJsinterface経由でソースを取得する、という力技を使っています。
そのため、取得中はずっとこのWebViewが保持されている必要があります。また、負荷も大幅にかかっています。

落ちる原因はほとんどこの処理方式によるものです。
低スペック端末だと、WebViewを動かすためのリソースの不足からエラーになります。
こればっかりはこの処理で取得してる限り(多分)どうしようもないので諦めて下さい。

また、UIスレッド外からのView操作はAndroidのプログラミング作法を破っています。
今のところはこの処理は動作しているものの、今後のOSアップデートで使えなくなる可能性もあります。
エミュレータでの動作もこの処理で引っかかって動作しない可能性がおそらく高いです。(未確認)

参考(この方法ほとんど情報が見つからないのでちょっと苦労した)

北から南や西を見て思うこと: WebViewを使ったスクレイピングの使い道