山手線トレインネットから得られる情報と、東京メトロオープンデータとの比較

**※2015/9/3更新**
友人からの指摘を受け、仕様変更があったことを確認しました。
現在はここで述べたような形式では情報が得られません。電車の位置はJSON Stringで簡単に読めないようになっており、電車ごとの温度情報はHTML形式になっています。
後日さらに判明したことがあれば更新します。


# 目的
JR東日本アプリから、現在走行中の電車の位置や車内温度・外気温度、混雑度を取得でき、乗車中はNTTドコモのAir Stamp技術によって乗っている電車に合わせた情報が受信できます。しかし、「通常の方法では」iOS, Android端末を使用してアプリを開かなければ情報は得られません。
今回は、山手線トレインネットの生データを保存することを考えます。データ取得元のURLを直接ここに書いてしまうと、中の人に塞がれてしまいそうな気がするので、以下の手順で試していただきたいです。

# 用意するもの
- PC (Windows, Mac, Linux)
- プロキシアプリケーション（一例）
    - [Charles](http://www.charlesproxy.com/)
        - 無料トライアルでは30分しか起動できませんが、ちょっと通信を読むのに使うくらいなら十分です
        - 僕はこれを使いました
    - [Paros](http://sourceforge.net/projects/paros/)
        - 山手線トレインネット解析記事を最初に掲載したと思われる河本氏が使っていたようです
    - [Burp Suite](https://portswigger.net/burp/)
- スマートフォン・タブレット(iOS, Android)
- JR東日本アプリ

# 手順
Charlesを使った場合の手順を示します。
1. ip（もしくはifconfig, ipconfig）コマンドなどでPCのIPアドレスを調べます。
2. Charlesを起動し、「Proxy」→「Proxy Settings...」の設定が以下のようになっていることを確認します。ポート番号は適当に。PCがプロキシサーバとして働いて通信を読んでくれます。
![スクリーンショット 2015-07-20 14.29.49.png](https://qiita-image-store.s3.amazonaws.com/0/86866/18eec177-5849-ae0c-7fad-4f44fbd1addb.png)

![スクリーンショット 2015-07-20 14.30.02.png](https://qiita-image-store.s3.amazonaws.com/0/86866/84c66ff6-3597-5f9b-f597-c7354c90199d.png)
3. スマートフォン側のプロキシ接続設定をします。
 - iOS: 「設定」→「Wi-Fi」→SSID右側の「i」ボタン→最下部までスクロールして「HTTPプロキシ」を「手動」に切り替え、PCのIPアドレスとポート番号を入力
 - Android: 「設定」→「Wi-Fi」→SSIDを長押し→「ネットワークを変更」→「詳細オプションを表示」→プロキシを「手動」に切り替え、PCのIPアドレスとポート番号を入力
4. HTTPS通信を読むので、CharlesのSSL証明書が必要になります。他のプロキシアプリでも同様かと思います。プロキシ接続設定をした状態で、スマートフォンのブラウザで[SSL証明書](http://www.charlesproxy.com/getssl)をインストールします。
5. JR東日本アプリを操作しながら、どのようなリクエストが送受信されているのか見てみましょう。電車の一覧を表示してみたり、どれか1つ特定の電車を押してみたりしてください。「cloudrail」でフィルタを掛けると、こんな感じでよく見えます。
![スクリーンショット 2015-07-20 14.47.14.png](https://qiita-image-store.s3.amazonaws.com/0/86866/c0d42e3f-e83c-13c6-47bc-a97f08a92c56.png)
6. 今回保存したい生データはJSON形式で得られます。あるリクエストにフォーカスして、Responseタブを見てみると、このようにいかにもなファイルを見ることができます。これは現在走行中の全ての電車の一覧です。他のリクエストを見れば、室内温度や日本語での行先表示なども得られます。
![スクリーンショット 2015-07-20 14.48.44.png](https://qiita-image-store.s3.amazonaws.com/0/86866/f56b6703-8d78-492e-959c-005c10770286.png)
7. ここまでくればどのようなリクエストを投げればよいか分かると思います。簡単にコードを書いてJSONファイルを取得してみましょう。

# 得られるデータ
- 全電車の一覧
    - 運転方向(direction): 外回り(0)・内回り(1)を示します。
    - 次駅(nextStationId): 大崎駅(1)を起点に、外回りにナンバリングされています。後述のstationIdも同様。
    - 編成番号(selfId): 「トウ5XX編成」の「XX
」の部分です。東京駅100周年記念ラッピング編成（トウ514編成）の運行情報が表示されていたことがありましたが、この情報を利用していたと思われます。
    - 最近停車した駅(stationId)
    - 現在位置(trainLoc): 千の位はdirectionと同様に運転方向を示します。有楽町駅（東京駅？）(0000, 1000)を起点に、5刻みで駅間（一の位が5）と駅構内（一の位が0）を示します。stationIdの対応が1つずれているデータが時々得られるので、起点はどちらか分かりません。
    - 電車の状態(trainStatus): 停車中(1)、発車直後(2)、中間程度(4)、到着直前(8)かと思われます。
- 特定の編成の情報
    - 号車番号(carNo)
    - 車内温度(indoorTemp): セルシウス温度です。
    - 混雑度(rateId): 数字がアプリ上での人のアイコンの数に対応します。
    - 外気温度(outdoorTemp)

# 東京メトロオープンデータと比較
- 山手線トレインネットでしか得られないデータ
    - 編成番号（特定編成の現在位置を即座に確認できるので、広告車やラッピング車を狙う撮り鉄にはかなり有用です）
    - 混雑度（河本氏の記事にもありますが、時間帯・号車による混雑度変化が得られます）
    - 温度（線路上を動き回る温度センサーとして使えそう？）
- 東京メトロオープンデータでしか得られないデータ
    - 運用番号（山手線で言えば前面の行先表示器の横に「****G」などと表示されているもの。その運用に充当されている電車の1日の動きが分かるので、「ラッシュ時に動いていたあの電車は日中も動いているか」などといったことが分かります）
    - 5分以上の遅延（そもそもATOSで情報を持っているはずで、他路線では表示しているのに、なぜデータがないのか謎ですが…。山手線でこれを検出するには時刻表データとの突き合わせが必要になりそうです。ただ、秒単位の時刻表は一般には公開されていないので、正確な遅延時分の検知には限界がありそう。また、時刻表データを見れば運用番号も取得できそうですね）

# 参考サイト
- [河本の実験室: 山手線リアルタイム混雑情報で遊んでみよう](http://kawalabo.blogspot.jp/2015/04/blog-post.html)
- [MacOSX - 通信系のデバッグには Charles が便利 - Qiita](http://qiita.com/usagimaru/items/d340e87da98e62f99b60)
- [TokyoMetroOpendataAPI · Apiary](http://docs.tokyometroopendataapi.apiary.io/)