如何通过命令行在Firefox中添加或删除书签标签?

时间:2018-07-01 14:27:59

标签: database sqlite firefox database-schema bookmarks

我一直在看places databaseWeb Extension Bookmarks API,但是我不确定该怎么做或是否有可能。

1 个答案:

答案 0 :(得分:2)

我相信无法通过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这样做):

我认为遵循places.sqlfile的{​​{3}}也是一个好主意。开始更改文件之前,请务必先阅读它。

注意:在使用places.sqlite之前先对其进行备份!

在powershell中,您会

Import-Module pssqlite 

(如果使用的PS版本是<5.0,则下载模块best practices guide

然后获取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)

使用您的数据库链接-查找属性:here

编辑-如何从sqlite DB获取标签

仅列出书签目录中的所有标签:

select * from moz_bookmarks where parent=4

说明: 这将使您获得所有存储在places.sqlite文件中的书签。标记存储在TAGs文件夹具有id = 4的列title

您可以从表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://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)。 / p>

    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=20079id)到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

您可以找到https://developer.mozilla.org/en-US/docs/Mozilla/Tech/Places/Databaseplaces.sqlite的E-R模式。

编辑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的部分上方并找到两条记录)

然后,您必须在表id上找到免费的moz_bookmarks。就我而言,它是id=80id=81(在您的情况下可以不同):

现在到了棘手的部分,您必须获得GUID。您可以通过GUI获取一个-here及其SELECT GENERATE_GUID()。但是,我们需要一个没有gui的程序,因此我们必须创建它。

如果您检查壁虎的python SQLite Manager函数,您会发现它们正在使用md5hex。我将使用类似的功能hex()randomblob()来做到这一点。

首先生成标签记录: 然后是记录本身(类型= 2,父代= 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

就这样。