如何通过命令行在 Firefox 中添加或删除书签标签?
How can I add or remove a bookmark tag in Firefox via the command line?
我一直在查看 places database and at the Web Extension Bookmarks API,但我不确定该怎么做或是否可行。
我认为无法通过 Web 扩展书签 API。这是保留的,只能在 add-on.
内使用
引用:
JavaScript APIs for WebExtensions can be used inside the extension's
background scripts and in any other documents bundled with the
extension, including browser action or page action popups, sidebars,
options pages, or new tab pages. A few of these APIs can also be
accessed by an extension's content scripts (see the list in the
content script guide).
To use the more powerful APIs you need to request permission in your
extension's 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 这样做):
我认为为 places.sqlfile
遵循 best practices guide 也是个好主意。请务必在开始更改文件之前阅读它。
注意:在玩之前备份你的places.sqlite!
在 powershell 中你会
Import-Module pssqlite
(如果您使用 PS 版本 < 5.0,请下载模块 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)
使用您的数据库 link - 查找属性:https://developer.mozilla.org/en-US/docs/Mozilla/Tech/Places/Database
编辑 - 如何从 sqlite 数据库中获取 标签?
简单地列出书签目录中的所有标签:
select * from moz_bookmarks where parent=4
说明:
这将为您获取存储在 places.sqlite 文件中的所有书签。标签存储在 title
列中,TAGs 文件夹的 id=4
您可以在 table moz_bookmarks_roots
:
中查看 ID
╔═══╦═════════════════╦═══════════════╗
║ ║ root_name ║ folder_id ║
╠═══╬═════════════════╬═══════════════╣
║ 1 ║ places ║ 1 ║
║ 2 ║ menu ║ 2 ║
║ 3 ║ toolbar ║ 3 ║
║ 4 ║ tags ║ 4 ║
║ 5 ║ unfiled ║ 5 ║
╚═══╩═════════════════╩═══════════════╝
现在如何找到带有特定书签的标签?
首先找到您要使用的书签
例如此问题的标题“%我如何添加或删除书签标签%”
SELECT * FROM moz_places where title LIKE '%How can I add or remove a bookmark tag%'
结果:
id : 20079
url : https://whosebug.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
table 在那里你可以找到实际的记录(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_overflow
test
您可以找到 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
然后我 select 来自 moz_bookmarks
table:
$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
如您所见,只有一条记录而不是两条(检查上面我 select moz_bookmarks
的部分并找到两条记录)
然后您必须在 table moz_bookmarks
找到免费的 id
(s)。在我的例子中是 id=80
和 id=81
(在你的例子中可能不同):
现在是棘手的部分,您必须获得 GUID
。您可以通过 GUI 获得一个 - SQLite Manager 及其 SELECT GENERATE_GUID()
。但是,我们需要一个没有gui的,所以我们必须创建它。
如果你查看 gecko 的 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)))"
然后你必须创建link它的记录:
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
就是这样。
我一直在查看 places database and at the Web Extension Bookmarks API,但我不确定该怎么做或是否可行。
我认为无法通过 Web 扩展书签 API。这是保留的,只能在 add-on.
内使用引用:
JavaScript APIs for WebExtensions can be used inside the extension's background scripts and in any other documents bundled with the extension, including browser action or page action popups, sidebars, options pages, or new tab pages. A few of these APIs can also be accessed by an extension's content scripts (see the list in the content script guide).
To use the more powerful APIs you need to request permission in your extension's 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 这样做):
我认为为 places.sqlfile
遵循 best practices guide 也是个好主意。请务必在开始更改文件之前阅读它。
注意:在玩之前备份你的places.sqlite!
在 powershell 中你会
Import-Module pssqlite
(如果您使用 PS 版本 < 5.0,请下载模块 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)
使用您的数据库 link - 查找属性:https://developer.mozilla.org/en-US/docs/Mozilla/Tech/Places/Database
编辑 - 如何从 sqlite 数据库中获取 标签?
简单地列出书签目录中的所有标签:
select * from moz_bookmarks where parent=4
说明:
这将为您获取存储在 places.sqlite 文件中的所有书签。标签存储在 title
列中,TAGs 文件夹的 id=4
您可以在 table moz_bookmarks_roots
:
╔═══╦═════════════════╦═══════════════╗
║ ║ root_name ║ folder_id ║
╠═══╬═════════════════╬═══════════════╣
║ 1 ║ places ║ 1 ║
║ 2 ║ menu ║ 2 ║
║ 3 ║ toolbar ║ 3 ║
║ 4 ║ tags ║ 4 ║
║ 5 ║ unfiled ║ 5 ║
╚═══╩═════════════════╩═══════════════╝
现在如何找到带有特定书签的标签?
首先找到您要使用的书签 例如此问题的标题“%我如何添加或删除书签标签%”
SELECT * FROM moz_places where title LIKE '%How can I add or remove a bookmark tag%'
结果:
id : 20079
url : https://whosebug.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
table 在那里你可以找到实际的记录(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_overflow
test
您可以找到 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
然后我 select 来自 moz_bookmarks
table:
$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
如您所见,只有一条记录而不是两条(检查上面我 select moz_bookmarks
的部分并找到两条记录)
然后您必须在 table moz_bookmarks
找到免费的 id
(s)。在我的例子中是 id=80
和 id=81
(在你的例子中可能不同):
现在是棘手的部分,您必须获得 GUID
。您可以通过 GUI 获得一个 - SQLite Manager 及其 SELECT GENERATE_GUID()
。但是,我们需要一个没有gui的,所以我们必须创建它。
如果你查看 gecko 的 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)))"
然后你必须创建link它的记录:
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
就是这样。