Google の連絡先を DoCoMo NM706i (Nokia) にインポートしてみた

諸事情により今更ながらノキア社製の端末 DoCoMo NM706i を使い始めました。端末としてはええ感じなのですが、問題は電話帳の管理です。

Google の連絡先をサクッとインポートできればギリギリ我慢して使えます。あれこれ試行錯誤してようやく運用可能レベルになりましたので方法をまとめてみました。

運用の目標

目標としては、

  1. なるべく手間なく Google の連絡先を NM706i の電話帳にインポートできる
  2. 再インポートする場合は NM706i の電話帳を全件削除 → Google の連絡先から全件インポート する(差分とか考えない)
  3. インポートする項目は個人的最低限の「氏名」「電話番号」「メールアドレス」「所属」「メモ」とする

という感じです。

必要なもの

  1. Windows PC(Bluetooth 内蔵のノート PC であれば楽チン)
  2. Nokia PC Suite (vCard のインポートに必要)
  3. PHP の実行環境(僕の場合は Cygwin の PHP を使用)

Google の連絡先を vCard 形式でエクスポート

まずは Google の連絡先を vCard 形式でエクスポートします。

【その他】 → 【エクスポート】 で 【vCard 形式】 を選択してエクスポートします。指定した全連絡先が contacts.vcf という単一ファイルでエクスポートされますので、適当に保存します。

PHP スクリプトで vCard を変換

エクスポートされた contacts.vcf を適当に変換して「1連絡先で1ファイル」に分割します。

以下のスクリプトを ~/bin/nm706i_vcf_conv.php とか適当な名前で保存して、contacts.vcf を引数にして実行すると、「1連絡先で1ファイル」で vCard ファイルがどばーっと生成されます。

#!/usr/bin/php -q
<?php
/**
 * Google の連絡先 vCard から NM706i 用 vCard に変換
 * 注意:出力時の改行は \r\n にすること。
 * 注意:「;」を適切に付与すること。
 */

// 引数なしならヘルプを表示して終了
if ($argc < 2) {
    echo "usage: ".$argv[0]." <target vcf filename>\n";
    exit();
}

// UTF-8 にロケールを設定
setlocale(LC_ALL, "ja_JP.UTF-8");

// Google の連絡帳からエクスポートした vCard ファイルを読み込んで配列に格納
$data = file($argv[1]);

// 出力ファイル名プレフィックス
$out_filename = pathinfo($argv[1], PATHINFO_FILENAME);

// 元データの行数
$line_num = count($data);
// 人数(出力ファイル名に使用)
$member_num = 1;
// 入力の全行処理
for ($i = 0; $i < $line_num; $i++) {
    // 行 BEGIN:VCARD で出力ファイルオープン
    if (preg_match('/^BEGIN:VCARD$/u', $data[$i], $matches)) {
        // 出力用ファイルを開く
        $fp = fopen($out_filename."_".sprintf("%04d", $member_num).".vcf", "w");
    }

    // 1行出力用変数
    $out_data = "";
    // 複数行処理の際にカウンタを進めるための変数
    $count_add = 0;

    // 行頭が FN: なら捨てる
    if (preg_match('/^FN:(.+)/u', $data[$i], $matches)) {
        continue;
    }
    // 行頭 ADR なら捨てる
    if (preg_match('/^ADR/u', $data[$i], $matches)) {
        continue;
    }
    // 行頭 item なら捨てる
    if (preg_match('/^item/u', $data[$i], $matches)) {
        continue;
    }
    // 行頭 N: で ; 区切りあり
    // 氏名(行頭 N:)の処理
    // デリミタ「;」で分割してから処理
    if (preg_match('/^N:(.+)/u', $data[$i], $matches)) {
        $tmp = array();
        // ; 区切りを配列に分解
        $tmp = explode(';', $matches[1]);
        // 配列要素数は 5 固定
        // 0=姓, 1=名, 2=ミドルネーム, 3=前敬称, 4=後敬称
        // 姓名揃っていれば「姓 名」にする
        if (!empty($tmp[0]) and !empty($tmp[1])) {
            // 後敬称があれば「 後敬称」
            if (!empty($tmp[4])) {
                $tmp[4] = ' '.$tmp[4];
            }
            $out_data = 'N;CHARSET=utf-8:'.$tmp[0].';'.$tmp[1].$tmp[4].";;;\r\n";
        // 姓名どちらかが欠けていればどちらかのみ出力
        } else {
            $out_data = 'N;CHARSET=utf-8:'.$tmp[0].$tmp[1].';'.$tmp[4].";;;\r\n";
        }
        // 上記いずれの場合でも「ふりがな」の X-IRMC-N のフィールド数と揃えるために ; を付与
        unset($tmp);
    }

    // 行頭 X-PHONETIC-FIRST-NAME:
    if (preg_match('/^X-PHONETIC-FIRST-NAME:(.+)/u', $data[$i], $matches)) {
        // 次行の行頭 X-PHONETIC-LAST-NAME:
        if (preg_match('/^X-PHONETIC-LAST-NAME:(.+)/u', $data[$i+1], $matches2)) {
            // 姓名結合してふりがな情報を出力
            $out_data = 'SOUND;X-IRMC-N;CHARSET=utf-8:'.mb_convert_kana($matches2[1], "rnhkV", "UTF-8").';'.mb_convert_kana($matches[1], "rnhkV", "UTF-8").";;;\r\n";
            // 行カウンタを進める
            $count_add = 1;
        } else {
            // 姓のみふりがな情報を出力
            $out_data = 'SOUND;X-IRMC-N;CHARSET=utf-8:'.mb_convert_kana($matches[1], "rnhkV", "UTF-8").";;;;\r\n";
        }
        // 上記いずれの場合でも N のフィールド数と揃えるために ; を付与
    }
    // 行頭 X-PHONETIC-LAST-NAME:
    if (preg_match('/^X-PHONETIC-LAST-NAME:(.+)/u', $data[$i], $matches)) {
        // 次行の行頭 X-PHONETIC-FIRST-NAME:
        if (preg_match('/^X-PHONETIC-FIRST-NAME:(.+)/u', $data[$i+1], $matches2)) {
            // 姓名結合してふりがな情報を出力
            $out_data = 'SOUND;X-IRMC-N;CHARSET=utf-8:'.mb_convert_kana($matches[1], "rnhkV", "UTF-8").';'.mb_convert_kana($matches2[1], "rnhkV", "UTF-8").";;;\r\n";
            // 行カウンタを進める
            $count_add = 1;
        } else {
            // 姓のみふりがな情報を出力
            $out_data = 'SOUND;X-IRMC-N;CHARSET=utf-8:'.mb_convert_kana($matches[1], "rnhkV", "UTF-8").";;;;\r\n";
        }
        // 上記いずれの場合でも N のフィールド数と揃えるために ; を付与
    }

    // 行頭 BEGIN:, END:, VERSION:, EMAIL はそのまま出力
    if (preg_match('/^BEGIN:/u', $data[$i], $matches) or
        preg_match('/^END:/u', $data[$i], $matches) or
        preg_match('/^VERSION:/u', $data[$i], $matches) or
        preg_match('/^EMAIL/u', $data[$i], $matches)) {
        $out_data = $data[$i];
    }
    // 行頭 TEL は括弧・空白・ハイフンを取り除いて出力
    if (preg_match('/^TEL/u', $data[$i], $matches)) {
        $out_data = preg_replace('/[\(\)\-\s]/', '', $data[$i])."\r\n";
    }
    // それ以外はエンコード指定して出力
    if (empty($out_data)) {
        if (preg_match('/(.+):(.+)$/u', $data[$i], $matches)) {
            $out_data = $matches[1].';CHARSET=utf-8:'.$matches[2]."\r\n";
        }
    }

    // 複数行処理した場合はカウンタを進める
    $i += $count_add;

    // ファイルに出力
    fwrite($fp, $out_data);

    // 行 END:VCARD で出力ファイルクローズ
    if (preg_match('/^END:VCARD$/u', $data[$i], $matches)) {
        fclose($fp);
        // 人数をインクリメント
        $member_num++;
    }
}

?>

とりあえず大丈夫なはず。

Nokia PC Suite でインポート

変換した vCard を Nokia PC Suite を使って NM706i にインポートします。

ということで個人的にはギリギリ許容範囲で Google の連絡先の反映が可能になりました。

そりゃもちろん、Android スマホなら、連絡先は自動同期で手間なしだわ、着信時の表示情報は多いわ、着信履歴も使いやすいわ…と、NM706i のほうが機能的には劣ります。が、ちょっと使いづらいガジェットを愛でるというのもオタクの嗜みなので、しばらくは NM706i を使ってみようと思います。

スポンサーリンク
レクタングル(大)
レクタングル(大)