如何通过命令行在 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

插入、更新、删除数据的逻辑是一样的。

您可以在下面找到 insertdelete 的示例,因为这是您的问题。

要插入数据,请使用 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           ║
╚═══╩═════════════════╩═══════════════╝

现在如何找到带有特定书签的标签?

  1. 首先找到您要使用的书签 例如此问题的标题“%我如何添加或删除书签标签%”

    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
  1. 然后你去 moz_bookmarks table 在那里你可以找到实际的记录(id 来自 moz_placesfk 来自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=80id=81(在你的例子中可能不同):

现在是棘手的部分,您必须获得 GUID。您可以通过 GUI 获得一个 - SQLite Manager 及其 SELECT GENERATE_GUID()。但是,我们需要一个没有gui的,所以我们必须创建它。

如果你查看 gecko 的 python makeGuid() 函数,你会看到它们正在使用 md5hex。我将使用类似的函数 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

就是这样。