【问题标题】:How can I add or remove a bookmark tag in Firefox via the command line?如何通过命令行在 Firefox 中添加或删除书签标签?
【发布时间】:2018-12-09 23:22:01
【问题描述】:

我一直在查看places databaseWeb Extension Bookmarks API,但我不确定如何操作或是否可行。

【问题讨论】:

  • 感谢您接受答复。它让我感兴趣,但请不要忘记在 SO 上你应该创建 - 如何创建一个最小完整和可验证的示例 stackoverflow.com/help/mcve

标签: database sqlite firefox database-schema bookmarks


【解决方案1】:

我相信通过 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

插入、更新、删除数据的逻辑相同。

您可以在下面找到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)

使用您的数据库链接 - 查找属性: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           ║
╚═══╩═════════════════╩═══════════════╝

现在如何找到带有某些书签的标签?

  1. 首先找到您要使用的书签 例如这个问题的标题“%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
  1. 然后您转到moz_bookmarks 表,您可以在其中找到实际记录(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_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=80id=81(在您的情况下可能会有所不同):

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

如果您检查壁虎的 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)))"

然后你必须创建链接它的记录:

    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

原来如此。

【讨论】:

  • 是的,我查看了数据库的文档,但我不知道哪个字段代表一个标签,或者我需要插入什么来更新它们
  • @Andrew 啊,我明白了。我将使用标签表示编辑答案。这不是那么直截了当。
  • @Andrew 现在我添加了一种查找标签的方法。我创建了一个示例并遵循它。
猜你喜欢
  • 2016-03-08
  • 2018-07-23
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 2017-03-12
  • 1970-01-01
相关资源
最近更新 更多