iPhone の SMS メッセージをテキストで残しておきたい

2011/8/30追記:

iBackupBot - iTunes Backup Manager for iPhone, iPod Touch, iPadで、iOS5のbeta版(beta4あたりで確認)のバックアップファイルからsms.dbを取り出せました。使い方は簡単だと思われますが、追ってアップしたいと思います。



[追記]*1


SMSメッセージはたくさん溜まると、起動にえらく時間がかかるようになり、急いでいるときにはイライラします。どんどん消してしまえばよいのですが、相手によっては SMSメッセージをメールのようにずっと取っておきたい、と思うのです。彼女とのやり取りとか…。

ところがバックアップはできても、テキストデータとして取り出す方法はかなり面倒なようです。大きく分けて2つ分かりましたので、まずは、バックアップデータから取り出す方法をメモしておきます。


必要なもの

    • iPhone Backup Extractor.app*2
    • sqlite3(もともと入っているらしい、私は手動で MacPorts*3 で導入した)
    • SQLite Database Browser.app または Base.app など Sqlite のDBファイルを覗けるソフト
    • 方法1の場合は nkf (これも MacPorts で導入)


SMS.db を取り出す

まず iTunesiPhone の最新のバックアップを取ります。

次に

iTunesにバックアップしたiPhoneのデータを漁る方法 - iPhone.goodegg.jp  *4

こちらの記事を参考に

iPhone OS Files/Library/SMS/sms.db

を取り出します。

添付画像などは

iOS Files/Library/SMS/Parts/

以下に入っていました。


テキストデータの取り出し

本文を取り出す方法は何通りかあります。目的によって選んでください。SQL文に詳しい方は、SQLite Database Browser.app または Base.app などのツールで「message」というテーブルのカラム名を調べることで、自由に加工ができます。また、ツールから直接csvファイルなどに出力もできます。

拙記事SQLiteのDBファイルを編集できるGUIツール for OSX で、GUIで扱えるSQLツールをいくつかご紹介しています。今のところ、気に入っているのはFireFoxThunderbirdのアドオンで提供されている「SQLite Manager」です。CSVで取り出せてしまえば、Excelで加工など簡単にできますのでお手軽かと思います。(2012/1/22追記)

以下は、sqlite3をコマンドラインでたたく場合の方法です。取り出したいSMSの電話番号を"08099999999"とします。

・sms.db を適当なフォルダに置きます。

・ターミナル.appを起動し、そのフォルダに移動します。

方法1:SMS.txt というテキストファイルに書き出したいとき
sqlite3 sms.db
sqlite> .mode column
sqlite> .width 3 3 19 70
sqlite> .output SMS.txt
sqlite> select replace(rtrim(flags,'3'),'2','=> '), replace(rtrim(flags,'2'),'3','<= '),datetime(date, 'unixepoch'),text from message  where address='08099999999'  order by date;
sqlite> .q
nkf -Ww --in-place SMS.txt
方法2:1の変形
sqlite3 sms.db
sqlite> .explain
sqlite> .header off
sqlite> .width 3 3 19 90 0 0 0 
sqlite> .output SMS.txt
sqlite> select replace(rtrim(flags,'3'),'2','=> '), replace(rtrim(flags,'2'),'3','<= '),datetime(date, 'unixepoch'),text from message  where address='08099999999'  order by date;
sqlite> .q
方法4:SMS.csv に出力してExcelなどで見る
sqlite3 sms.db
sqlite> .mode csv
sqlite> .output SMS.csv
sqlite> select datetime(date, 'unixepoch'),text from message  where address='08099999999'  order by date;
sqlite> .q
方法3:HTMLで見やすくする(SMS08099999999.htmlというHTMLファイルができる)

以下をシェルスクリプトとして実行

#!/bin/sh
db=sms.db
addr="08099999999"
f1=/tmp/f1
f2=SMS${addr}.html
echo "
.mode html
.output $f1
select replace(rtrim(flags,'3'),'2','=> '), replace(rtrim(flags,'2'),'3','<= '),datetime(date, 'unixepoch'),text from message  where address='$addr'  order by date;
.q
"  | sqlite3 $db

echo '<html><head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> ' > $f2
echo "<title>SMSバックアップ</title></head><body><h1>${addr}のバックアップ</h1> " >> $f2
echo '<table style="width: 90%; background-color: rgb(143, 181, 194);" border="2"> ' >> $f2
cat $f1 >> $f2
echo '</table>	</body></html>' >> $f2
echo "HTML file $f2 was created ..."

実は、もっとお馬鹿な方法もあります。

それは次の記事で。

*1iPhone Backup Extractor.appは、iOS5スキーマには対応していないようです。アップデートを待ちたいと思います。

*2iPhone / iPod Touch Backup Extractor

*3MacPorts の使い方 - maruko2 Note.参考

*4:>>筆者の方、非常に参考になりました。ありがとうございました。