ダミー住所録(.vcf)の作り方


アプリなどの開発/試験用にダミーの個人情報を詰まった住所録を作る場合に
1件1件手で打って行くとか大変なので、2通りの方法で大量のデータを携帯電話に入れる方法について説明いたします。
ここで説明するのは、 __Google連絡先を使った方法__ と __vCardを使った方法__ です。


# 個人情報の作成
疑似的な個人情報を作成するサービスを提供してくれているサイト様

## 日本人
+ https://yamagata.int21h.jp/tool/testdata/
+ https://hogehoge.tk/personal/

## 欧米人
+ https://mockaroo.com/
+ https://www.randomaddressgenerator.com/alaska-male-address-generator/

# Google連絡先（コンタクト）を使った方法

メリット

* CSV形式をインポート出来るので大量のデータ作成とスマホ同期が非常に簡単
	
デメリット

* Googleアカウントとネットワークが必要
* 顔写真のインポート/エクスポートは出来ない(Google連絡先の仕様)[^1]
* 端末固有の細かい設定は出来ない

## 手順

下記リンク先の手順を参考にしてください。

[Gmailにエクセルで作った連絡先をインポートしたい（PC編/2018年11月現在）](https://www.e-presence.jp/archives/3806)

あとはスマホ端末から同じGoogleアカウントにログインして同期すれば完了です。


# vCardを使った方法

メリット

* Googleアカウントとネットワーク環境が不要
* 端末固有の細かい設定が可能

デメリット

* 汎用的な変換ツールが無い
* 端末で使用できるタグを知っておく必要がある

## 手順

エクセルとVBAを使って作成します。
今回登録する内容は、下記のアドレス帳に必要な最小限の項目に絞りました。

```
BEGIN:VCARD
VERSION:3.0
FN:[名前(表示名)]
N:[姓];[名];[ミドルネーム];[敬称]
X-PHONETIC-FIRST-NAME:[ふりがな(名)]
X-PHONETIC-LAST-NAME:[ふりがな(姓)]
TEL;TYPE=WORK:[電話番号]
EMAIL;TYPE=WORK:[メールアドレス]
PHOTO;ENCODING=b;TYPE=JPEG:[連絡先画像]
END:VCARD
```


図のようにセル列毎に登録する項目を作ります。


![Screenshot_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112253/babc9d32-3aee-137c-dc4e-e390e3c1eac5.jpeg)



エクセルVBAで下記のコードを貼り付けます。


```VBA
Option Explicit

'データ開始行を指定
Global Const cstDataRow = 2

'パラメータシート列指定
Global Const cstParamCol_L_Name = "B"   '表示名(姓)
Global Const cstParamCol_F_Name = "C"   '表示名(名)
Global Const cstParamCol_L_Furi = "D"   'フリガナ(姓)
Global Const cstParamCol_F_Furi = "E"   'フリガナ(名)
Global Const cstParamCol_Phone_Type1 = "F" '電話番号(TYPE)
Global Const cstParamCol_Phone_Num1 = "G" '電話番号
Global Const cstParamCol_Mail_Type1 = "H" 'メール(TYPE)
Global Const cstParamCol_Mail1 = "I" 'メール
Global Const cstParamCol_Photo = "J" 'Photo(連絡先画像)
Global Const Max = 50 '住所録の数

Sub make_address_utf8() '

    Dim i, row As Long
    Dim adoStm As Object
    Set adoStm = CreateObject("ADODB.Stream")

	With adoStm
		.Type = 2 ' 1：バイナリ・2：テキスト

		.Charset = "UTF-8"
		.Open

        For i = 0 To (Max-1)
            row = cstDataRow + i
            .WriteText "BEGIN:VCARD", 1
            .WriteText "VERSION:3.0", 1

            .WriteText "FN:" & Cells(row, cstParamCol_L_Name) & " " & Cells(row, cstParamCol_F_Name), 1
            .WriteText "N:" & Cells(row, cstParamCol_L_Name) & ";" & Cells(row, cstParamCol_F_Name) & ";;;", 1

            .WriteText "X-PHONETIC-FIRST-NAME:" & Cells(row, cstParamCol_F_Furi), 1
            .WriteText "X-PHONETIC-LAST-NAME:"  & Cells(row, cstParamCol_L_Furi), 1

            .WriteText "TEL;TYPE=" & Cells(row, cstParamCol_Phone_Type1) & ":" & Cells(row, cstParamCol_Phone_Num1), 1
            .WriteText "EMAIL;TYPE=" & Cells(row, cstParamCol_Mail_Type1) & ":" & Cells(row, cstParamCol_Mail1), 1

            .WriteText "PHOTO;ENCODING=b;TYPE=JPEG:" & Cells(row, cstParamCol_Photo), 1
            .WriteText "END:VCARD", 1
        Next i

		' 2.Postionsを0にして、バイナリモードにする
        .Position = 0	'
        .Type = 1 		' adTypeBinary
  
		' 3.Positionを3にして読込みBOM分の3バイトを除外
        .Position = 3
         Dim bin: bin = .Read()
        .Close
	End With
  
	' BOMを除外したバイナリデータをファイルに出力する
	Set adoStm = CreateObject("ADODB.Stream")
	With adoStm
		.Type = 1  'dTypeBinary
		.Open
		.Write (bin)
		.SaveToFile ThisWorkbook.Path & "\contacts-utf8.vcf", 2  ' force overwrite
		.Close
	End With
    Set adoStm = Nothing
End Sub
```


マクロを実行させるとcontacts.vcfがエクセルと同じ場所に作られます。
セルが空白時の例外処理とかないので必要でしたら自分で追加してください[^2]
出来上がったvcfファイルをスマホ端末で読み込めば完了です。

## 連絡先画像について

電話帳で使用できる連絡先画像をvCardで使うには下記の条件があります。[^3]

* 連絡先画像はJPEG形式であること
* 画像の大きさは最大で幅300ピクセル、高さ300ピクセルで、ファイルサイズは50kByteを超えない事
* データをbase64にエンコードする必要があります。

ファイルをbase64に変更するには下記のサービスを使ってみて下さい

https://tm-webtools.com/Tools/Base64Image

"data:image/jpeg;base64,"を除いた全値がJPEGデータのbase64形式になります。
![Screenshot_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112253/1224e51f-bc39-0f93-b1cb-4f0b2e008e6e.jpeg)

赤枠を箇所を除いた全データがbase64形式のJPEGデータになりますのでPhotoセルに貼り付ければ完了です。


















[^1]: vCardを使えば顔写真もインポートする事は出来ます
[^2]: 無意味な項目は端末が読み込む際に無視してくれるはずなので(たぶん)問題ないと思います
[^3]: 実際のところ各端末でどう扱っているかは分からないがPBAPの仕様に合わせていれば問題ないと思いこう書きました