最近はLINEやFacebookなどのコミュニケーションツールが普及したことで、
メールや電話番号などを知らない人とやりとりしている、
ということは多いのではないでしょうか。
一方で、
特定の人とのやりとりのみ、キャリアメールやSMSを使用せざるを得ない、
ということもありえます。
たとえば私の場合、
家族との連絡はキャリアメール、
大学の友人との連絡はSMS、
となります。
これは単純に古くからの知人とのやりとりが
当初キャリアメールやSMSであったこと
そして今も、家族(親)はガラケーユーザであること、
大学の友人は信条的にSNSをやっていない、
という理由からやりとりの手段が更新されていないためとなります。
しかし、こうは言えないでしょうか。
彼らとのやりとりがプリミティブなインタフェースであるがゆえに、
現代では当たり前のソーシャル機能に疑問を投げかけてくれていると。
そしてそこで記録されるログは機能にかざられない本来の自分であると。
というわけでして、今回はSMSの履歴を取得する方法について書いていきます。
SMSのメール履歴データですが、
iphoneを利用しておりMacの場合、下記のフォルダにバックアップされております。
ライブラリ > Application Support > Mobile Sync > Backup
上記のフォルダの中に下記の名前のファイルがSMSの履歴に該当するデータとなりますので
任意の場所にコピーしておきます。
上記データはSQliteで操作することができます。
わかりやすいように「message_db」とリネームしておくことにします。
Macの場合はデフォルトでインストールされております。
ターミナルでmessage_dbファイルをおいた場所に移動し、
下記のコマンドでsqliteでの操作を開始します。
1 |
sqlite3 message_db |
まずは、テーブルを確認しておきましょう。
1 |
.tables |
すると下記のようなテーブル一覧があるかと思います。
_SqliteDatabaseProperties |
attachment |
chat |
chat_handle_join |
chat_message_join |
handle |
message |
message_attachment_join |
上記テーブルのなかで、
messageがSMSなどのやりとりの履歴一覧となります。
テーブルの項目は下記で確認できます。
1 |
pragma table_info(message); |
この中で必要なデータは下記かと思います。
text | sms、imessageの本文 |
handle_id | やりとりしている相手のid |
1 2 |
select handle_id,text from message; |

各handle_idがどの相手かはhandleテーブルに格納されております。
1 |
select * from handle; |

上記から抽出したい相手のhandle_idを確認します。
例えば、「09012345678」という電話番号の方(handle_idが45とする)とのやりとりを抽出したいときは、
下記のようなsqlで取得できます。
1 |
select text from message where handle_id = 45; |
あるいは、もはやhandle_idを介さずテーブルをjoinして、
下記のようにしても良いかと思います。
※データが国際電話番号表記(+81)のため、
念のためlikeでhandleの中のid(電話番号)を指定。
1 2 3 4 |
select text from message inner join handle on message.handle_id = handle.rowid where handle.id like '%8012345667%'; |
このファイルをcsvで書き出す場合は下記のコマンド後に
任意のsqlを記述することで可能です。
1 |
.output sms.csv |
得られたcsvファイルはpythonやexcelなどで編集できます。
※文字化けする場合は適宜ファイルのエンコードを指定してください。

以上、今回はsmsの履歴を取得する手順について見ていきました。