我相信通过 Web 扩展书签 API 是不可能的。这是保留的,只能在附加组件中使用。
引用:
WebExtensions 的 JavaScript API 可以在扩展的内部使用
背景脚本和与
扩展,包括浏览器操作或页面操作弹出窗口、侧边栏、
选项页或新标签页。其中一些 API 也可以
由扩展的内容脚本访问(请参阅
内容脚本指南)。
要使用更强大的 API,您需要在您的
扩展的 manifest.json
我不知道你使用的是 windows 还是 *nix。总体思路是操作 SQLite 数据库。
对于书签,您需要一个名为 places.sqlite 的文件,您可以在 Windows 上找到 - C:\Users\login\AppData\Roaming\Mozilla\Firefox\Profiles
在 *nix 上你可以这样做:
find . -name 'places.sqlite',通常你会在家里的某个地方得到它:
例如
/home/tukanos/.mozilla/firefox/tf8oiuhk.default/places.sqlite
我现在只介绍 windows 和 powershell(你也可以为 *nix 这样做):
我认为关注best practices guide 以获取places.sqlfile 也是一个好主意。请务必在开始更改文件之前阅读它。
注意:在使用它之前备份您的places.sqlite!
在powershell中你会
Import-Module pssqlite
(如果您使用的是PS版本here)
然后获取places.sqlite的路径
$db = 'C:\Users\login\AppData\Roaming\Mozilla\Firefox\Profiles\tf8oiuhk.default\places.sqlite'
查询sql数据库:
$sqlFirefoxQuery = "SELECT places.id,
places.URL,
places.GUID,
bookmarks.title,
bookmarks.id,
bookmarks.parent
FROM moz_places as places
JOIN moz_bookmarks as bookmarks
ON places.id = bookmarks.fk"
Invoke-SqliteQuery -DataSource $db -QueryTimeout 20 -Query $sqlFirefoxQuery | Out-file -Encoding UTF8 Bookmarks_firefox.txt
插入、更新、删除数据的逻辑相同。
您可以在下面找到insert 和delete 的示例,因为那是您的问题。
插入数据使用 sql INSERT INTO
例如:
insert into moz_bookmarks (attributes) VALUES (your_values), (next_values)
例如
INSERT INTO moz_bookmarks (type, parent, title, dateAdded)
VALUES (1,5,'MyBookmark',CURRENT_TIMESTAMP)
要删除值,您应该使用 sql 的 delete:
DELETE FROM from moz_places
WHERE id=1112
(别忘了关闭 Firefox)
使用您的数据库链接 - 查找属性:https://developer.mozilla.org/en-US/docs/Mozilla/Tech/Places/Database
编辑 - 如何从 sqlite DB 中获取 标签?
简单地列出书签目录中的所有标签:
select * from moz_bookmarks where parent=4
解释:
这将为您获取存储在 places.sqlite 文件中的所有书签。标签存储在列title TAGs 文件夹的id=4
您可以从表moz_bookmarks_roots中查看ID:
╔═══╦═════════════════╦═══════════════╗
║ ║ root_name ║ folder_id ║
╠═══╬═════════════════╬═══════════════╣
║ 1 ║ places ║ 1 ║
║ 2 ║ menu ║ 2 ║
║ 3 ║ toolbar ║ 3 ║
║ 4 ║ tags ║ 4 ║
║ 5 ║ unfiled ║ 5 ║
╚═══╩═════════════════╩═══════════════╝
现在如何找到带有某些书签的标签?
-
首先找到您要使用的书签
例如这个问题的标题“%How can I add or remove a bookmark tag%”
SELECT * FROM moz_places where title LIKE '%How can I add or remove a bookmark tag%'
结果:
id : 20079
url : https://stackoverflow.com/questions/51124179/how-can-i-add-or-remove-a-bookmark-tag-in-firefox-via-the-command-line/51264053?noredirect=1#
comment89523757_51264053
title : How can I add or remove a bookmark tag in Firefox via the command line? - Stack Overflow
rev_host : moc.wolfrevokcats.
visit_count : 1
hidden : 0
typed : 0
favicon_id : 238
frecency : 125
last_visit_date : 1531301813682000
guid : w6vYlxdKQU6V
foreign_count : 2
url_hash : 47357855952022
-
然后您转到moz_bookmarks 表,您可以在其中找到实际记录(id 来自moz_places 是fk 来自moz_bookmarks)。
select * from moz_bookmarks where fk=20079
这个结果:
id : 76
type : 1
fk : 20079
parent : 75
position : 0
title : How can I add or remove a bookmark tag in Firefox via the command line? - Stack Overflow
keyword_id :
folder_type :
dateAdded : 1531298577890000
lastModified : 1531298577894000
guid : R0961JLfZYKj
id : 78
type : 1
fk : 20079
parent : 77
position : 0
title :
keyword_id :
folder_type :
dateAdded : 1531298593884000
lastModified : 1531298593884000
guid : BW__oMQbHerd
如您所见,您获得了两条记录。一个有parent=75,这是书签文件夹。第二个是fk=20079 (id) 到parent=77 的映射,这是实际的标签:
SELECT * FROM moz_bookmarks where id = 77
title 属性中的标签在哪里获得:
id : 77
type : 2
fk :
parent : 4
position : 0
title : stack_overflow test
keyword_id :
folder_type :
dateAdded : 1531298593878000
lastModified : 1531298593884000
guid : AVcyFpGkrfzV
所以我的标签是:stack_overflowtest
places.sqlite 的 E-R 架构,您可以找到 here。
编辑2忘记直接回答问题了。
当更改 sqlite 数据库时关闭 Firefox 实例。
添加标签 - 你必须了解逻辑(我必须选择一个还没有标签的新书签):
首先要创建一个新书签
$sqlFirefoxQuery = "SELECT * FROM moz_places where title LIKE '%Cnn%'"
PS C:\> Invoke-SqliteQuery -DataSource $db -QueryTimeout 20 -Query $sqlFirefoxQuery
id : 20223
url : https://edition.cnn.com/
title : CNN International - Breaking News, US News, World News and Video
rev_host : moc.nnc.noitide.
visit_count : 1
hidden : 0
typed : 0
favicon_id : 2015
frecency : 75
last_visit_date : 1531392673997000
guid : qqCRafq4FIcn
foreign_count : 1
url_hash : 47358730651511
然后我从moz_bookmarks表中选择:
$sqlFirefoxQuery = "select * from moz_bookmarks where fk=20223"
PS C:\> Invoke-SqliteQuery -DataSource $db -QueryTimeout 20 -Query $sqlFirefoxQuery
id : 79
type : 1
fk : 20223
parent : 75
position : 1
title : CNN International - Breaking News, US News, World News and Video
keyword_id :
folder_type :
dateAdded : 1531392718191000
lastModified : 1531392718197000
guid : 2ywnKBmbDWJI
如您所见,只有一条记录而不是两条(检查上面我选择 moz_bookmarks 并找到两条记录的部分)
然后您必须在moz_bookmarks 餐桌上找到免费的id(s)。就我而言,它是id=80 和id=81(在您的情况下可能会有所不同):
现在是您必须获得GUID 的棘手部分。您可以通过 GUI 获得一个 - SQLite Manager 及其 SELECT GENERATE_GUID()。但是,我们需要一个没有 gui 的,所以我们必须创建它。
如果您检查壁虎的 python makeGuid() 函数,您会发现它们正在使用 md5、hex。我会用hex()和randomblob()类似的功能来做。
首先生成标签记录:
然后是记录本身(type=2,parent=4):
id : 80
type : 2
fk :
parent : 4
position : 0
title : news insert_firefox_tag_example
keyword_id :
folder_type :
dateAdded : 1531298593878000
lastModified : 1531298593884000
guid : <generated_GUID>
实际插入:
$sqlFirefoxQuery = "INSERT INTO moz_bookmarks (id, type, parent, position, title, dateAdded, lastModified, guid)
VALUES (80,
2,
4,
0,
'news insert_firefox_tag_example',
strftime('%s',CURRENT_TIMESTAMP)*1000000,
strftime('%s',CURRENT_TIMESTAMP)*1000000,
hex(randomblob(2)) || hex(randomblob(2)) || hex(randomblob(2)))"
然后你必须创建链接它的记录:
id : 81
type : 1
fk : 20223
parent : 80
position : 0
title :
keyword_id :
folder_type :
dateAdded : 1531298593884000
lastModified : 1531298593884000
guid : <generated_GUID>
实际插入:
$sqlFirefoxQuery = "INSERT INTO moz_bookmarks (id, type, fk, parent, position, dateAdded, lastModified, guid)
VALUES (81,
1,
20223,
80,
0,
strftime('%s',CURRENT_TIMESTAMP)*1000000,
strftime('%s',CURRENT_TIMESTAMP)*1000000,
hex(randomblob(2)) || hex(randomblob(2)) || hex(randomblob(2)))"
现在您可以查看添加了两个新标签 news insert_firefox_tag_example 的记录。
要更新带有new_tag的标签(您也必须添加当前标签!):
$sqlFirefoxQuery = "UPDATE moz_bookmarks
SET title = 'stack_overflow test new_tag'
WHERE id = 77"
然后执行:
Invoke-SqliteQuery -DataSource $db -QueryTimeout 20 -Query $sqlFirefoxQuery
您将获得更新的标签:
PS C:\> $sqlFirefoxQuery = "SELECT * FROM moz_bookmarks where id = 77"
PS C:\> Invoke-SqliteQuery -DataSource $db -QueryTimeout 20 -Query $sqlFirefoxQuery
id : 77
type : 2
fk :
parent : 4
position : 0
title : stack_overflow test new_tag
keyword_id :
folder_type :
dateAdded : 1531298593878000
lastModified : 1531298593884000
guid : AVcyFpGkrfzV
要删除标签,您只需输入一个空字符串即可(不要忘记更改可能会在 Firefox 重新启动后看到):
$sqlFirefoxQuery = "UPDATE moz_bookmarks
SET title = ''
WHERE id = 77"
结果:
PS C:\> $sqlFirefoxQuery = "SELECT * FROM moz_bookmarks where id = 77"
PS C:\> Invoke-SqliteQuery -DataSource $db -QueryTimeout 20 -Query $sqlFirefoxQuery
id : 77
type : 2
fk :
parent : 4
position : 0
title :
keyword_id :
folder_type :
dateAdded : 1531298593878000
lastModified : 1531298593884000
guid : AVcyFpGkrfzV
原来如此。