COCOAデータを読む

接触チェックの記録

iPhoneにCOCOAをインストールしている。接触チェックの記録は,「設定」→「接触通知」→「接触のログ記録の状況」→「接触チェックの記録」→「接触チェックの記録を書き出す」でAirDropなどの手段で書き出すことができる。書き出されるのは ExposureChecks-YYYY-MM-DD.json のようなJSONファイルである。これを読んでみよう。

ExportVersion という項目があり,古いものは1,新しいものは2になっている。次のようにすれば接触情報(MatchCount が0以外)および毎日のキー数を表示できる:

#! /usr/bin/env python3

import sys
import json

def show(d):
    print()
    for k in ["Hash", "MatchCount", "Timestamp"]:
        print(k, d[k])

keycount = {}

for arg in sys.argv[1:]:
    with open(arg) as f:
        d = json.load(f)
    print(arg, "ExportVersion:", d["ExportVersion"])
    if d["ExportVersion"] == 1:
        for i in d["ExposureChecks"]:
            keycount[i["Timestamp"]] = keycount.get(i["Timestamp"], 0) + i["RandomIDCount"]
            if i["MatchCount"] != 0:
                show(i)
    elif d["ExportVersion"] == 2:
        for i in d["ExposureChecks"]:
            for j in i["Files"]:
                keycount[i["Timestamp"]] = keycount.get(i["Timestamp"], 0) + j["KeyCount"]
                if j["MatchCount"] != 0:
                    show(j)
    else:
        print(arg, "Unknown ExportVersion:", d["ExportVersion"])

print()
for k in sorted(keycount):
    print(k, keycount[k])

出力例:

ExposureChecks-2020-09-12.json ExportVersion: 2

Hash 6CBAA717FA2D584F2E8A77731C4B7D5294ED4B7E899EC3D4E54598BDCDE0400B
MatchCount 1
Timestamp 2020-09-12 01:15:24 +0900

2020-08-29 00:38:00 +0900 408
2020-08-30 00:41:07 +0900 178
2020-08-31 01:08:33 +0900 162
2020-09-01 00:48:51 +0900 422
2020-09-02 01:46:07 +0900 207
2020-09-03 03:01:08 +0900 328
2020-09-04 03:20:12 +0900 289
2020-09-05 03:50:32 +0900 315
2020-09-06 00:13:21 +0900 121
2020-09-07 00:22:34 +0900 58
2020-09-08 00:45:24 +0900 276
2020-09-09 00:54:57 +0900 209
2020-09-10 01:04:33 +0900 236
2020-09-11 03:08:06 +0900 481
2020-09-12 01:15:24 +0900 412

COCOAの動作ログ

COCOAの動作ログについては COCOA 突如として初期化される問題(UserDataが壊れている) #16 に詳しい。

COCOAアプリを立ち上げて,左上の三本線メニュー→「アプリに関するお問い合わせ」→「動作情報を送信」→「動作情報を確認する」→「保存完了OK」,いったんCOCOAを閉じて「ファイル」アプリを立ち上げ,「接触確認アプリ」フォルダを開き,cocoa_log_*.zip というファイルを長押しし,「共有」でAirDropなどでパソコンに送る(zipファイルを長押ししないでタップするとiPhoneの中で展開される)。

このzipファイルを展開すると2週間分のcsvファイルが出てくる。中はCOCOAの動作ログである。

次のようなスクリプトでエラー行だけ表示することができる:

#! /usr/bin/env python3

import re
import sys
from zipfile import ZipFile

for arg in sys.argv[1:]:
    with ZipFile(arg) as z:
        for x in z.namelist():
            with z.open(x) as f:
                for r in f:
                    line = r.decode('utf-8')
                    if re.search('^.*?,"Error",', line):
                        print(line)

出力例:

"2021/02/01 13:09:59","Error","Fail to download files, ...(後略)...
"2021/02/01 17:12:55","Error","Failed to get terms update info., ...(後略)...
"2021/01/31 21:14:08","Error","Failed to check version., ...(後略)...

Last modified: