我如何以编程方式将数据导入Gnome联系人?

问题描述 投票:3回答:1

我想通过Python或命令行将联系人导入Gnome Contacts。我愿意进行一些编程,但是找不到所需的文档。

Gnome Contacts使用libfolks库,其中包括folks-import实用程序,但是没有手册页,并且folks-import --help的输出不是很有帮助:

Usage:
  folks-import [OPTION…] — import meta-contact information to libfolks

Help Options:
  -h, --help            Show help options

Application Options:
  -s, --source=name     Source backend name (default: ‘pidgin’)
  --source-filename     Source filename (default: specific to source backend)

联系人存储在本地SQLite3数据库的~/.local/share/evolution/addressbook/system/contacts.db中,因此我可以直接写入此文件。但是,我最好不要没有好的文档,特别是因为数据库似乎嵌入了二进制和vCard数据。

在Ubuntu 18.04上,您可以通过以下方式安装Gnome Contacts和libfolks工具:

sudo apt install gnome-contacts folks-tools

您可以通过以下方式检查本地联系人数据库:

sqlite3 ~/.local/share/evolution/addressbook/system/contacts.db .dump

未能解决我的问题的相关答案:

ubuntu-18.04 gnome vcard gnome-3
1个回答
0
投票

在我眼中,除了使用Evolution外,还有两种导入联系人的方法。没有Evolution,没有自动工具可以做到这一点。

  1. 第一种方法是使用folks-import导入联系人的简便方法。我已经检查了源,它似乎是来自pidgin的blist.xml文件的导入程序。

    • blist.xml-好友列表的本地副本,用于保持本地应用的别名以及之间的群组和好友顺序。出于好奇,我已经在blist.xml上尝试了此方法,并且该方法对某些联系人有效。

为了创建blist.xml(这里是blist.xmlblist.h,您可以使用source之类的人的作品并对其进行调整。

  1. 第二种方法很难,您必须正确填充sqlite中的表。这是数据库结构:
vcftoxml.py

然后您需要创建一堆遵循以下结构逻辑的插入物:

    BEGIN TRANSACTION;
    CREATE TABLE IF NOT EXISTS "folder_id_phone_list" (
        "uid"   TEXT NOT NULL,
        "value" TEXT,
        FOREIGN KEY("uid") REFERENCES "folder_id"("uid")
    );
    CREATE TABLE IF NOT EXISTS "folder_id_email_list" (
        "uid"   TEXT NOT NULL,
        "value" TEXT,
        FOREIGN KEY("uid") REFERENCES "folder_id"("uid")
    );
    CREATE TABLE IF NOT EXISTS "folder_id" (
        "uid"   TEXT,
        "Rev"   TEXT,
        "file_as"   TEXT,
        "file_as_localized" TEXT,
        "nickname"  TEXT,
        "full_name" TEXT,
        "given_name"    TEXT,
        "given_name_localized"  TEXT,
        "family_name"   TEXT,
        "family_name_localized" TEXT,
        "is_list"   INTEGER,
        "list_show_addresses"   INTEGER,
        "wants_html"    INTEGER,
        "x509Cert"  INTEGER,
        "vcard" TEXT,
        "bdata" TEXT,
        PRIMARY KEY("uid")
    );
    CREATE TABLE IF NOT EXISTS "keys" (
        "key"   TEXT,
        "value" TEXT,
        "folder_id" TEXT,
        PRIMARY KEY("key"),
        FOREIGN KEY("folder_id") REFERENCES "folders"
    );
    CREATE TABLE IF NOT EXISTS "folders" (
        "folder_id" TEXT,
        "version"   INTEGER,
        "multivalues"   TEXT,
        "lc_collate"    TEXT,
        "countrycode"   VARCHAR(2),
        PRIMARY KEY("folder_id")
    );
    INSERT INTO "keys" VALUES ('eds-reserved-namespace-is-populated','1','folder_id');
    INSERT INTO "keys" VALUES ('revision','2019-11-04T07:28:25Z(0)','folder_id');
    INSERT INTO "folders" VALUES ('folder_id',11,'email;prefix:phone','en_US.UTF-8','US');
    CREATE INDEX IF NOT EXISTS "UID_INDEX_phone_folder_id" ON "folder_id_phone_list" (
        "uid"
    );
    CREATE INDEX IF NOT EXISTS "INDEX_email_folder_id" ON "folder_id_email_list" (
        "value"
    );
    CREATE INDEX IF NOT EXISTS "UID_INDEX_email_folder_id" ON "folder_id_email_list" (
        "uid"
    );
    CREATE INDEX IF NOT EXISTS "SINDEX_family_name_folder_id" ON "folder_id" (
        "family_name_localized"
    );
    CREATE INDEX IF NOT EXISTS "INDEX_family_name_folder_id" ON "folder_id" (
        "family_name"
    );
    CREATE INDEX IF NOT EXISTS "SINDEX_given_name_folder_id" ON "folder_id" (
        "given_name_localized"
    );
    CREATE INDEX IF NOT EXISTS "INDEX_given_name_folder_id" ON "folder_id" (
        "given_name"
    );
    CREATE INDEX IF NOT EXISTS "INDEX_full_name_folder_id" ON "folder_id" (
        "full_name"
    );
    CREATE INDEX IF NOT EXISTS "INDEX_nickname_folder_id" ON "folder_id" (
        "nickname"
    );
    CREATE INDEX IF NOT EXISTS "SINDEX_file_as_folder_id" ON "folder_id" (
        "file_as_localized"
    );
    CREATE INDEX IF NOT EXISTS "INDEX_file_as_folder_id" ON "folder_id" (
        "file_as"
    );
    CREATE INDEX IF NOT EXISTS "keysindex" ON "keys" (
        "folder_id"
    );
    COMMIT;

要注意的重要事项是uid,例如对于第一条记录:INSERT INTO "folder_id_phone_list" VALUES ('pas-id-5DBFDF5A00000000','+0000000000'); INSERT INTO "folder_id_phone_list" VALUES ('pas-id-5DBFDF5A00000000','+131545678'); INSERT INTO "folder_id_phone_list" VALUES ('pas-id-5DBFE7F200000001','+45646546565465'); INSERT INTO "folder_id_email_list" VALUES ('pas-id-5DBFDF5A00000000','[email protected]'); INSERT INTO "folder_id_email_list" VALUES ('pas-id-5DBFDF5A00000000','[email protected]'); INSERT INTO "folder_id_email_list" VALUES ('pas-id-5DBFE7F200000001','[email protected]'); INSERT INTO "folder_id" VALUES ('pas-id-5DBFDF5A00000000','2019-11-04T08:28:52Z(15)','a header mail, this','001-)71)/1KA)9?O79M��',NULL,'john smith','this','020-O79M�','a header mail','001-)71)/1KA)9?',0,0,0,0,'BEGIN:VCARD VERSION:3.0 UID:pas-id-5DBFDF5A00000000 X-URIS:www.testing.com FN:John Smith N:a header mail;This;is;; X-EVOLUTION-FILE-AS:a header mail\, This REV:2019-11-04T08:28:52Z(15) TEL;TYPE=VOICE,HOME:+0000000000 TEL;TYPE=CELL:+131545678 EMAIL;TYPE=PERSONAL:[email protected] EMAIL;TYPE=HOME:[email protected] ADR;TYPE=WORK:p.o. box;456;Stree work;New York;New York;456465;USA ADR;TYPE=HOME:p.o. box;456;Street;City;New York State;13676;USA BDAY:2019-11-04 PHOTO;VALUE=uri:file:///home/osboxes/.local/share/evolution/addressbook/sys tem/photos/pas_id_5DBFDF5A00000000_photo-file0.image%252Fpng END:VCARD',NULL); INSERT INTO "folder_id" VALUES ('pas-id-5DBFE7F200000001','2019-11-04T08:57:22Z(17)','sdaf','019-M/)3',NULL,'sdaf','sdaf','019-M/)3','','000-',0,0,0,0,'BEGIN:VCARD VERSION:3.0 EMAIL;TYPE=PERSONAL:[email protected] TEL;TYPE=CELL:+45646546565465 ADR;TYPE=HOME:asdf;;asdfsdfasdf;;sadf;;asdf FN:sdaf N:;sdaf;;; X-EVOLUTION-FILE-AS:sdaf UID:pas-id-5DBFE7F200000001 REV:2019-11-04T08:57:22Z(17) END:VCARD',NULL); INSERT INTO "folder_id" VALUES ('pas-id-5DBFE7F800000002','2019-11-04T08:57:28Z(19)','next','014-C1WO',NULL,'next','next','014-C1WO','','000-',0,0,0,0,'BEGIN:VCARD VERSION:3.0 FN:next N:;next;;; X-EVOLUTION-FILE-AS:next UID:pas-id-5DBFE7F800000002 REV:2019-11-04T08:57:28Z(19) END:VCARD',NULL); INSERT INTO "keys" VALUES ('eds-reserved-namespace-is-populated','1','folder_id'); INSERT INTO "keys" VALUES ('revision','2019-11-04T08:57:28Z(20)','folder_id'); INSERT INTO "folders" VALUES ('folder_id',11,'email;prefix:phone','en_US.UTF-8','US'); (定义为pas-id-5DBFDF5A00000000)。我将其视为固定字符串new HashMap<string, Field?>,然后为十六进制数字pas-id-(出现一个随机数),最后一个为计数器5DBFDF5A(下一个为00000000)。

我个人会选择第一个选项,但是如果创建00000001文件时遇到问题,第二个选项在那里。

© www.soinside.com 2019 - 2024. All rights reserved.