我想通过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
未能解决我的问题的相关答案:
在我眼中,除了使用Evolution外,还有两种导入联系人的方法。没有Evolution,没有自动工具可以做到这一点。
第一种方法是使用folks-import
导入联系人的简便方法。我已经检查了源,它似乎是来自pidgin的blist.xml
文件的导入程序。
blist.xml
-好友列表的本地副本,用于保持本地应用的别名以及之间的群组和好友顺序。出于好奇,我已经在blist.xml
上尝试了此方法,并且该方法对某些联系人有效。为了创建blist.xml
(这里是blist.xml
和blist.h,您可以使用source之类的人的作品并对其进行调整。
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
文件时遇到问题,第二个选项在那里。