Как добавить или удалить тег закладки в Firefox через командную строку? - PullRequest
0 голосов
/ 01 июля 2018

Я просматривал базу данных мест и API расширений веб-закладок , но я не уверен, как это сделать или возможно ли это.

1 Ответ

0 голосов
/ 10 июля 2018

Я полагаю, что это невозможно с помощью API закладок веб-расширения. Это зарезервировано и может быть использовано только в дополнении.

Цитировать:

API-интерфейсы JavaScript для WebExtensions можно использовать внутри расширений фоновые сценарии и любые другие документы, прилагаемые к расширение, включая действия браузера или всплывающие окна действий, боковые панели, страницы параметров или страницы новой вкладки. Некоторые из этих API также могут быть доступ к сценариям содержимого расширения (см. список в руководство по содержанию скрипта).

Чтобы использовать более мощные API, вам нужно запросить разрешение в вашем manifest.json расширения

Я не знаю, находитесь ли вы на Windows или * nix. Общая идея заключается в манипулировании базой данных SQLite.

Для закладок вам нужен файл с именем place.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. Обязательно прочитайте его, прежде чем начинать изменять файл.

ПРИМЕЧАНИЕ : сделайте резервную копию своих мест. Пожалуйста, перед игрой с ней!

В PowerShell вы бы

Import-Module pssqlite 

(Скачать модуль здесь , если вы используете версию PS <5.0) </p>

Тогда найдите свой путь для 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's delete:

DELETE FROM from moz_places
     WHERE id=1112

(не забудьте закрыть Firefox)

Используйте ссылку на базу данных - чтобы найти атрибуты: https://developer.mozilla.org/en-US/docs/Mozilla/Tech/Places/Database

Редактировать - Как получить тег из базы данных sqlite?

Чтобы просто перечислить все вкладки в каталоге закладок:

select * from moz_bookmarks where parent=4

Объяснение: Это даст вам все закладки, хранящиеся в вашем файле place.sqlite. Теги хранятся в столбце title папка TAG имеет идентификатор = 4

Вы можете проверить идентификатор из таблицы moz_bookmarks_roots:

╔═══╦═════════════════╦═══════════════╗
║   ║ 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             : /10270295/kak-dobavit-ili-udalit-teg-zakladki-v-firefox-cherez-komandnuy-stroku
                  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_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

Схему E-R для places.sqlite вы можете найти здесь .

Редактировать 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 (s) за столом moz_bookmarks. В моем случае это id=80 и id=81 (в вашем случае они могут отличаться):

Теперь начинается сложная часть, где вы должны получить GUID. Вы можете получить его через графический интерфейс - SQLite Manager и его SELECT GENERATE_GUID(). Однако нам нужен один без графического интерфейса, поэтому мы должны его создать.

Если вы проверите функцию 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

Вот и все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...