Skip to main content

VCard Format and Google Takeout


VCard Format and Google Takeout

Just wanted to share a little tip, based on a mistake I made. When you are downloading Circles or Contacts using Google Takeout, you have the option to select CSV or VCF format. CSV is going to be more useful down the road, but the one thing that VCF is good for is importing into mail and address book clients. If you go the VCF route, you will see a bunch of files, each named after a G+ Circle (or if you are exporting from Contacts, it will be the various labels you might have used). It will look like a mistake and that Takeout didn't actually export the contacts. But all you have to do is double-click on that file and your address book should prompt you to import all the contacts for that specific Circle or Label.

For example, I'm on a Mac and the below image was for my "Active Engagers" Circle here on G+. When I double click on it, the Apple Contacts app opens up and prompts to import the individual contacts for that circle.

I at first thought that the export was flawed because the files were so small and the individual contacts are obvious. They are grouped and need to be opened up by the contact manager.

Comments

  1. Also, always get the JSON checkout as well. It will likely be the defacto standard later for importing. (Programmers love JSON.)

    ReplyDelete
  2. Yes, John Lewis, and the JSON format is going to be particularly important for people's posts.

    ReplyDelete
  3. John Lewis JSON does not apply to Contacts exports -- those are VCard (VCF) and CSV if I recall correctly, and as Gideon Rosenblatt's noted.

    ReplyDelete
  4. Edward Morbius, actually, that's what I recalled too, but just to be sure, I checked earlier today and JSON is an option.

    I could swear this is new.
    https://lh3.googleusercontent.com/TWW4SRt9ldmE-CnRrdVBrSd7iGUdngsawdvpbWhlWeJWHi0wrNAYQoReJTznlLfx5MH_byYrQL1eicZCyWpH0l69GotIheoEX99U=s0

    ReplyDelete
  5. Edward Morbius, actually, that's what I recalled too, but just to be sure, I checked earlier today and JSON is an option.

    I could swear this is new.
    https://lh3.googleusercontent.com/kbsxTliA5HcR5idvRMrsYXg_5DB7LYlbnGxZ2mew22vdPGPcNu0AKZvF1JNQUINQTUfZTcgTap7Mubvm70KINzkHHQ-FfWjCuSrZ=s0

    ReplyDelete
  6. Edward Morbius, actually, that's what I recalled too, but just to be sure, I checked earlier today and JSON is an option.

    I could swear this is new.
    https://lh3.googleusercontent.com/TUoqdb53yS_cUjTHXP9X4j3LiXtgqw6fKnGn0N9NOm7YvJyj2UDQocvItWIpzHZuiED2CyuKk7ABPDTjXxP2-2zpjs-wL2sPHSqO=s0

    ReplyDelete
  7. Edward Morbius, actually, that's what I recalled too, but just to be sure, I checked earlier today and JSON is an option.

    I could swear this is new.
    https://lh3.googleusercontent.com/FW3Sj83CG5ryI1Nr19SlxlkmC8DifJw8rxjrpAS_IGmpmp161nkyOl0W1GvHMNWY7QWwBcGxBG7h1JeiyPd71Y1DhMYuKEtTnZda=s0

    ReplyDelete
  8. Edward Morbius, actually, that's what I recalled too, but just to be sure, I checked earlier today and JSON is an option.

    I could swear this is new.
    https://lh3.googleusercontent.com/xerD6TRERgkERO0tTMNv0Ph7UzlzGJOTh8qTyvGhpmR5EzFeq3q0GN_5yzSNGh6LqigBhZOn_Fu5d6O3wM8XknuOrwMP-0ZPpyba=s0

    ReplyDelete
  9. Edward Morbius, actually, that's what I recalled too, but just to be sure, I checked earlier today and JSON is an option.

    I could swear this is new.
    https://lh3.googleusercontent.com/FDcAqUXwQuPpEExcnWKUxxXUTDTrSjNGpxzcKvRetFA0QkQaZkf6tHmzT7qb--mCf8fM9QPL89raJGc-KMDsazR0QA3VKINYb971=s0

    ReplyDelete
  10. Edward Morbius, actually, that's what I recalled too, but just to be sure, I checked earlier today and JSON is an option.

    I could swear this is new.
    https://lh3.googleusercontent.com/8YLXGLwuPHwnCABfV5YHylRWTtjgpjru_Q-yJouCRplseXqhEqxbr6T-NqFM-g9Tu30Uczjf-6zwPg7imrVobhHc2aQO2GZrudIC=s0

    ReplyDelete
  11. Edward Morbius, actually, that's what I recalled too, but just to be sure, I checked earlier today and JSON is an option.

    I could swear this is new.
    https://lh3.googleusercontent.com/NAn4FeYCH_kgySqHvaM18qIeU2bkDMerSkapHgXPd283LNHY1iMvn8wN8k79Ybj_NKTKNwe8ZrRhuBAGkuab6uDUACgJDn6BlX8r=s0

    ReplyDelete
  12. Edward Morbius, actually, that's what I recalled too, but just to be sure, I checked earlier today and JSON is an option.

    I could swear this is new.
    https://lh3.googleusercontent.com/y7r5QWXauFL4eZQBX8OHTA_zNMorqYpsllFul208IqX_p9kb3w7tqpsac9kUBamIQ0lcrPcjaQuUZPYrL6tZ_RzlsCFSh_fTexwJ=s0

    ReplyDelete
  13. Edward Morbius, actually, that's what I recalled too, but just to be sure, I checked earlier today and JSON is an option.

    I could swear this is new.
    https://lh3.googleusercontent.com/BojqCC3jNxJC-IdEbzrrEu5rZjTMAzZ9k74CDy5leEBrTktDs6YnsaD1XXhfyt9I-5nRYybQfYgR2w4FFyIPG_sPcxi0nNagpgRe=s0

    ReplyDelete
  14. Edward Morbius, actually, that's what I recalled too, but just to be sure, I checked earlier today and JSON is an option.

    I could swear this is new.
    https://lh3.googleusercontent.com/ReafjQJ_n_YBBqZ4ldvERlP__m4Pm_BWpYKufcnSNW_b0W3rU6DHOlL_Ui7VEoGH4QDqnnHOK1WKe8tiE_aLDuiLt2oAd2I7MtpV=s0

    ReplyDelete
  15. Edward Morbius, actually, that's what I recalled too, but just to be sure, I checked earlier today and JSON is an option.

    I could swear this is new.
    https://lh3.googleusercontent.com/cWmrDZM71ECodhl64k1y9xNu2p4PRQ0v_WfIiJazuGNKwhtZ4Nu54Qyb-okrc8bbQN4LEDQFMOx4AdU26J-5fT0h1CZsc2VwnTv9=s0

    ReplyDelete
  16. Edward Morbius, actually, that's what I recalled too, but just to be sure, I checked earlier today and JSON is an option.

    I could swear this is new.
    https://lh3.googleusercontent.com/n-oZrYbt91n5x6edN80GuzW8DI_7vL0HvzQ7qggfUNsf4OrKxXRKMCO755bousa6uw8oGjXUfwGSpX5shQzyHUNsZyyKLpDBP_Ul=s0

    ReplyDelete
  17. Edward Morbius, actually, that's what I recalled too, but just to be sure, I checked earlier today and JSON is an option.

    I could swear this is new.
    https://lh3.googleusercontent.com/fGIQ7c_wUvXO-aPm1_52c-njfhMV0bANAYsBIRKsJtHhe1cUU-_PLeu3xdzpDgfr2zgHxV2s-v9yAdLcHfooMFm3-mg8-au1OsoX=s0

    ReplyDelete
  18. Edward Morbius, actually, that's what I recalled too, but just to be sure, I checked earlier today and JSON is an option.

    I could swear this is new.
    https://lh3.googleusercontent.com/Sw5LbBrBCvjww8hRPT8Sz-3YBbhpfEUvfE6DcTOx9sH3c_G3EEzOzE3QHTivW_J7hNRKPRbYlATDZczxYwlh2eBfx3Ff7Q3vkfcg=s0

    ReplyDelete
  19. Edward Morbius, actually, that's what I recalled too, but just to be sure, I checked earlier today and JSON is an option.

    I could swear this is new.
    https://lh3.googleusercontent.com/iDGxefk-PZHpGV1VHZQNISmLJZ5tDFQ9Lqrji6OhT77lfp4D2sX6RQmcarEAlrzSXEtW33yMyY6R42yy2jRQUy3VTLo0OddfIMNZ=s0

    ReplyDelete
  20. Edward Morbius, actually, that's what I recalled too, but just to be sure, I checked earlier today and JSON is an option.

    I could swear this is new.
    https://lh3.googleusercontent.com/vtDb52p8F53V-cVC-cEWTvNmrIlEop5pWVW8EkEJAw-1sqkYh6gvJkx2i0a-i9ANQeiggUsIcfmXQP3P1E3US0FmjhVSQQUIKTMv=s0

    ReplyDelete
  21. Edward Morbius, actually, that's what I recalled too, but just to be sure, I checked earlier today and JSON is an option.

    I could swear this is new.
    https://lh3.googleusercontent.com/p09CTVmRnD9C0gJtK02jzuvxbwFPHBgMR22Q6jp8rdp1ckLIj4KPHWoZp0KgvPZGhnYJo-jUF-Q_ahYLsZScgp_0DlBxXTP7_S1v=s0

    ReplyDelete
  22. Edward Morbius, actually, that's what I recalled too, but just to be sure, I checked earlier today and JSON is an option.

    I could swear this is new.
    https://lh3.googleusercontent.com/yzADCnPQiy-4jHm_91sNicCXLi_scDlMGOJGYEhlQ3_YOktnNFTukFq8lps7FeUhtfYiucIlfbJ_Js7gDHLKdhKv44TF1B8M4zyA=s0

    ReplyDelete
  23. Edward Morbius, actually, that's what I recalled too, but just to be sure, I checked earlier today and JSON is an option.

    I could swear this is new.
    https://lh3.googleusercontent.com/KQ_e6fUg7X-EUQM7Gcait2EsDn8M1ZECa7a_GZjrhLiyLurH85EO2m0jRtfPlUHgqrh4BpjFPONf-Oi4tdOS-uxlcxT9e_muSmSO=s0

    ReplyDelete
  24. Edward Morbius, actually, that's what I recalled too, but just to be sure, I checked earlier today and JSON is an option.

    I could swear this is new.
    https://lh3.googleusercontent.com/5GniJFtkHUZ2T4CVFkk-uLx95diC8i6M66KaJeD7zwpHO10QX0KKxR-GQsUzKwPAZOk6oCGzh1AdGbowAtorU4Sekoyj-1JapJXw=s0

    ReplyDelete
  25. Gideon Rosenblatt Good to know, thanks.

    ReplyDelete
  26. Yes. JSON is new.

    The VCF files (and the other formats) are small because there's very little in them.
    BEGIN:VCARD
    VERSION:4.0
    FN:$fullName
    N:$lastName;$firstName
    NICKNAME:$nickname
    URL:$googlePlusProfileUrl
    END:VCARD

    And that's it. I * think * but I'm not certain that if you import these into Google Contacts, it uses the Url and the G+API to lookup and get all the other public contact info. $googlePlusProfileUrl is sufficient to do this. At the moment, I'd recommend this route get as much as possible into Google.Contacts from available sources and then export it to some other contacts file.

    Which suggests more code to write! Take the Takeout.G+Circles.JSON code and add all the data you can get from the G+Api.people.get call to produce a much bigger JSON contacts file.

    ps. JSON option is broken. It actually produces the same old, same old, HTML. I guess it's a work in progress.

    ReplyDelete
  27. Julian Bond do you know when this showed up? The fact that we're seeing any changes here is actually important news, in and of itself.

    ReplyDelete
  28. Gideon Rosenblatt I didn't notice it until you mentioned it today. My last test run on Circles was 22-Oct-2018.

    ReplyDelete
  29. ah, so I didn't missselect... I was wondering why I was seeing html files when I was sure I selected json.

    ReplyDelete
  30. Update: Google+ Circles now actually exports to JSON. It no longer creates HTML files even when you've selected JSON.
    Unfortunately it's still rather useless as it contains way too limited information:
    {
    "person": [{
    "firstName": "FiXato",
    "lastName": ".",
    "displayName": "FiXato",
    "nickname": "FiXato",
    "profileUrl": "https://plus.google.com/108667492429930081201"
    }],
    "name": "CircleName"
    }

    ReplyDelete
  31. Unfortunately for Google Contacts (not Circles) they still haven't fixed my reported bug with Group Labels that contain periods in them, not having the .vcf file extension for all the Contacts in that group.

    ReplyDelete
  32. Filip H.F. Slagter yeah, it seems like, right now at least, they're leaning toward the view that the only data that belongs to the end-user is the mere social tie itself and nothing about the person on the other side.

    ReplyDelete
  33. Gideon Rosenblatt which is kinda weird, as you can set which of the data you want to share with others...

    ReplyDelete
  34. Filip H.F. Slagter At least with the profileUrl you can use that as an identification number to associate.

    CircleCount Do you have a DB of profileUrls (The Google+ user IDs associated with each Google+ Account?)

    ReplyDelete
  35. On my list of code that needs writing.

    Take the Takeout.G+Circles.json, extract the profile URLs, extract the user ID from each URL, use that to do a G+Api.people.get call to populate and then write out a much enhanced JSON/VCF file.

    ReplyDelete
  36. John Lewis CircleCount deleted all their data due to the GDPR.

    ReplyDelete
  37. Julian Bond That's actually been on my todo list too, lol.

    ReplyDelete
  38. Filip H.F. Slagter "NOOOOOOOO!" <-- my Luke Skywalker impression.

    ReplyDelete
  39. John Lewis gooooooood, embrace the dark side!

    I could do my Darth Vader impression, but I need to get very very drunk to bury my head in my hands and breath heavily 😂

    ReplyDelete
  40. I can't remember if Beautiful Soup (Python) and deal with JSON. I'll have to look, but it's my very favorite way to parse marked up things. I'll check and report back.

    ReplyDelete
  41. And... no. BS4 doesn't natively extract from JSON.... it's built for XML/HTML constructs. Pity.

    ReplyDelete
  42. John Lewis no need to extra libraries. Python supports json natively, and allows you to load json files as dictionaries:
    realpython.com - Working With JSON Data in Python – Real Python
    https://docs.python.org/2/library/json.html

    ReplyDelete
  43. Got the API part of my Ruby script ready; just need to get the json aggregation done after dinner. :)
    Once I got the command line version ready (which requires setting up a Google Cloud Console dev account to get app credentials), I'll also see if I can make a web-based version of it; as long as it doesn't eat into my own Cloud quota.

    ReplyDelete
  44. Filip H.F. Slagter, this is the script for aggregating profile details from the API with the rudimentary Takeout details for Contacts and Circles?

    ReplyDelete
  45. Interesting: The Profiles sitemaps were last updated 2017-03-01.

    ReplyDelete
  46. Edward Morbius, wait, do you think that means there were only 50K users back then?

    ReplyDelete
  47. Gideon Rosenblatt No. Each sitemap has ~50k entries.

    Robots.txt > Sitemaps > 50k profiles sitemaps > ~50k profiles/file

    ReplyDelete
  48. Gideon Rosenblatt You can provide multiple Sitemap files, but each Sitemap file that you provide must have no more than 50,000 URLs and must be no larger than 50MB (52,428,800 bytes). If you would like, you may compress your Sitemap files using gzip to reduce your bandwidth requirement; however the sitemap file once uncompressed must be no larger than 50MB. If you want to list more than 50,000 URLs, you must create multiple Sitemap files.

    If you do provide multiple Sitemaps, you should then list each Sitemap file in a Sitemap index file. Sitemap index files may not list more than 50,000 Sitemaps and must be no larger than 50MB (52,428,800 bytes) and can be compressed. You can have more than one Sitemap index file. The XML format of a Sitemap index file is very similar to the XML format of a Sitemap file.


    https://www.sitemaps.org/protocol.html?x
    sitemaps.org - - Protocol

    ReplyDelete
  49. Got working code to merge the Google+ REST API Person#get data into the Google+ Circles Takeout json. Just need to clean it up and write some documentation on how to actually use it.
    Hopefully I have some free time tomorrow to actually finish it up, so I can release it. :)

    Advance Warning: For now it'll require a recent installation of Ruby (https://www.ruby-lang.org/en/downloads/), setting up a project on https://console.cloud.google.com/ to get a credentials file, and perhaps a bit of understanding of the commandline.
    ruby-lang.org - Download Ruby

    ReplyDelete
  50. Well that's annoying. There are fields in the G+.people.get API docs that simply don't exist any more or are not delivered, even if the profile has them set to Public. So even if you work through adding API data to your circles download JSON, you'll never get any email addresses, for instance.

    https://developers.google.com/+/web/api/rest/latest/people

    {
    "kind": "plus#person",
    "etag": etag,
    "nickname": string,
    "occupation": string,
    "skills": string,
    "birthday": string,
    "gender": string,
    "emails": [],
    "urls": [ { "value": string, "type": string, "label": string } ],
    "objectType": string,
    "id": string,
    "displayName": string,
    "name": { "formatted": string, "familyName": string, "givenName": string, "middleName": string, "honorificPrefix": string, "honorificSuffix": string },
    "tagline": string,
    "braggingRights": string,
    "aboutMe": string,
    "relationshipStatus": string,
    "url": string,
    "image": { "url": string, },
    "organizations": [ { "name": string, "department": string, "title": string, "type": string, "startDate": string, "endDate": string, "location": string, "description": string, "primary": boolean } ],
    "placesLived": [ { "value": string, "primary": boolean } ],
    "isPlusUser": boolean,
    "language": string,
    "ageRange": { "min": integer, "max": integer },
    "plusOneCount": integer,
    "circledByCount": integer,
    "verified": boolean,
    "cover": { "layout": string, "coverPhoto": { "url": string, "height": integer, "width": integer }, "coverInfo": { "topImageOffset": integer, "leftImageOffset": integer } },
    "domain": string
    }


    ReplyDelete
  51. Julian Bond Which is why we keep telling people to use Takeout often... it's going to change over the timeframe. This is an important lesson!

    ReplyDelete
  52. John Lewis it would help though if you could exclude the media files from the Google+ Stream takeout though, so you don't have to download 40GB+ every time...

    ReplyDelete
  53. John Lewis I suppose change is quite likely. But so far we've only seen two minor changes in the last year or so.
    - activitylog fixed, when it was broken
    - Circles JSON added
    And that's it.

    ReplyDelete

Post a Comment

New comments on this blog are moderated. If you do not have a Google identity, you are welcome to post anonymously. Your comments will appear here after they have been reviewed. Comments with vulgarity will be rejected.

”go"