如何共享我的 Google Chrome 搜索引擎条目?

Laz*_*zer 49 google-chrome google-search

我使用“编辑搜索引擎”在 Google Chrome 中创建了一些搜索条目。

我如何与我的同事分享其中的一些条目?

Pet*_*ček 28

编辑 2020-07-27:

此解决方案的导出部分在 Chrome 84 中不再起作用(settings脚本中使用的对象不再可用)。如果没有导出部分,导入脚本不是很有用,但它仍然可以用于导入具有设置的现有 JSON 文件或将搜索引擎设置从旧版本的 Chrome/Chromium 传输到当前版本。

这是一个无需使用任何外部工具或编辑注册表即可导出和导入 Chrome 搜索引擎设置的简单解决方案:

  1. 在 Chrome 中打开“搜索引擎设置”页面 ( chrome://settings/searchEngines)。
  2. 打开 Chrome 开发者工具。
  • 快捷键:F12Ctrl+Shift+I(在 Windows 上,其他平台上的快捷键可能有所不同)。
  • 手动导航:右上角三点菜单>更多工具>开发者工具
  1. 单击Chrome 开发者工具顶部菜单栏中的控制台
  2. 将以下脚本之一粘贴到控制台中,然后按Enter

要下载带有搜索引擎设置的 JSON 文件:

(function exportSEs() {
  /* Auxiliary function to download a file with the exported data */
  function downloadData(filename, data) {
    const file = new File([data], { type: 'text/json' });
    const elem = document.createElement('a');
    elem.href = URL.createObjectURL(file);
    elem.download = filename;
    elem.click();
  }

  /* Actual search engine export magic */
  settings.SearchEnginesBrowserProxyImpl.prototype.getSearchEnginesList()
    .then((searchEngines) => {
      downloadData('search_engines.json', JSON.stringify(searchEngines.others));
    });
}());
Run Code Online (Sandbox Code Playgroud)

要从使用上述脚本创建的 JSON 文件导入设置:

(async function importSEs() {
  /* Auxiliary function to open a file selection dialog */
  function selectFileToRead() {
    return new Promise((resolve) => {
      const input = document.createElement('input');
      input.setAttribute('type', 'file');
      input.addEventListener('change', (e) => {
        resolve(e.target.files[0]);
      }, false);
      input.click();
    });
  }

  /* Auxiliary function to read data from a file */
  function readFile(file) {
    return new Promise((resolve) => {
      const reader = new FileReader();
      reader.addEventListener('load', (e) => {
        resolve(e.target.result);
      });
      reader.readAsText(file);
    });
  }

  const file = await selectFileToRead();
  const content = await readFile(file);
  const searchEngines = JSON.parse(content);
  searchEngines.forEach(({ name, keyword, url }) => {
    /* Actual search engine import magic */
    chrome.send('searchEngineEditStarted', [-1]);
    chrome.send('searchEngineEditCompleted', [name, keyword, url]);
  });
}());
Run Code Online (Sandbox Code Playgroud)

笔记

  • 我在 Windows 8.1 上的 Chrome 75.0.3770.100 中测试了脚本。
  • 脚本仅在其他搜索引擎部分导出和导入搜索引擎,但可以轻松调整它们以包括默认搜索引擎。
  • 不要尝试将脚本作为书签分发,书签不会在chrome://URL 上执行(去过那里,做过)。

  • @OlivierCailloux 感谢您的建议。不幸的是,导出脚本在 Chrome 的最新稳定版本 (84) 中停止工作。由于该脚本现在仅适用于旧版本,因此我认为扩展它不值得付出努力。如果我找到支持当前 Chrome 的方法,我会更新我的答案。 (3认同)
  • @PetrSrníček 我进行了相当粗略的 DOM 遍历,以使 Chrome 88 的导出再次正常工作 https://superuser.com/a/1626575/55621。请随意改进并更新此答案。这节省了我大量的时间(我使用 Chrome 搜索引擎作为热键......并且往往有 50-100 个)。 (2认同)

Wil*_*rin 11

这是在 Linux 上将 chrome 搜索引擎导出为 CSV 的单个命令:

sqlite3 -csv ~/.config/chromium/Default/Web\ Data 'select short_name,keyword,url from keywords' > ~/search-engines.csv
Run Code Online (Sandbox Code Playgroud)

您需要安装 sqlite3。~/.config/chrome如果您使用的是 Windows,请替换为相应的 Windows 路径。应该是这样的%AppData%\Local\Google\Chrome\User Data

导出为 SQL 以便在别处重新导入

您可以导出为 sqlite 插入语句,而不是导出为 CSV:

(printf 'begin transaction;\n'; sqlite3 ~/.config/chromium/Default/Web\ Data 'select short_name,keyword,url,favicon_url from keywords' | awk -F\| '{ printf "insert into keywords (short_name, keyword, url, favicon_url) values ('"'"%s"'"', '"'"%s"'"', '"'"%s"'"', '"'"%s"'"');\n", $1, $2, $3, $4 }'; printf 'end transaction;\n') > ~/search-engine-export.sql
Run Code Online (Sandbox Code Playgroud)

然后复制~/search-engine-export.sql到另一台机器上,用这个命令导入:

sqlite3 ~/.config/chromium/Default/Web\ Data < search-engine-export.sql
Run Code Online (Sandbox Code Playgroud)

确保Web Data如上所述用机器上的路径替换路径。

  • 您可能必须处理 ' 字符。您可以在 awk `function esc(s){gsub("\x27","\x27\x27",s);return s}` 中添加 $1 和 $2 ====&gt; esc($1), esc (2 美元) (2认同)

Dan*_*n H 6

这是可能的,但这已经足够你不想痛苦了。

  1. 在您的 Chrome 配置文件中找到网络数据文件。在 Windows 7 中,它将在这里: "%USERPROFILE%\AppData\Local\Google\Chrome\User Data\Default\Web Data"

  2. 在 Ubuntu 中使用SQLite Studio或 sqlite等 SQLite 程序打开文件(sudo apt-get install sqlite)并在 SQLite Studio 中导出关键字表或在 Linux 中运行以下命令: sqlite3 "Web Data" ".dump keywords" > keywords.sql SQLite Studio 导出对话框

  3. 让您的同事导入关键字,执行与此过程相反的操作。

就像我说的,可能,但很痛苦。

我编写了一个 Javascript 解析器,将 SQL 从 Web 数据转换为几乎通用的HTML格式的 Netscape 书签文件格式(具有讽刺意味的是,该格式的最终​​标准似乎是 Microsoft),如果您有兴趣将关键字导入其他浏览器,如 Firefox或歌剧。

如果您对替代解决方案感兴趣,我创建了Shortmarks以允许您在任何浏览器中使用相同的自定义搜索引擎集,并且我计划很快实现与他人共享的功能。几天后即将发布的版本将在我完成对新功能的测试后立即包含我上面提到的导入代码。


Jac*_*ton 6

...捎带https://superuser.com/a/1458616/55621但尝试更新它以与当前版本的 Chrome 一起使用。这在 Mac 上大约适用于 Chrome 88。

要下载带有搜索引擎设置的 JSON 文件:

(function exportSEs() {
  /* Auxiliary function to download a file with the exported data */
  function downloadData(filename, data) {
    const file = new File([data], { type: 'text/json' });
    const elem = document.createElement('a');
    elem.href = URL.createObjectURL(file);
    elem.download = filename;
    elem.click();
  }

  let searchEngines = [];
  document.querySelector('settings-ui').shadowRoot
    .querySelector('settings-main').shadowRoot
    .querySelector('settings-basic-page').shadowRoot
    .querySelector('settings-search-page').shadowRoot
    .querySelector('settings-search-engines-page').shadowRoot
    .querySelector('settings-search-engines-list#otherEngines').shadowRoot
    .querySelectorAll('settings-search-engine-entry')
    .forEach($el => searchEngines.push(
      {
        name: $el.shadowRoot.querySelector('#name-column').textContent,
        keyword: $el.shadowRoot.querySelector('#keyword-column').textContent,
        url: $el.shadowRoot.querySelector('#url-column').textContent
      })
    )

  downloadData('search_engines.json', JSON.stringify(searchEngines));
}());
Run Code Online (Sandbox Code Playgroud)

要从使用上述脚本创建的 JSON 文件导入设置:

(async function importSEs() {
  /* Auxiliary function to open a file selection dialog */
  function selectFileToRead() {
    return new Promise((resolve) => {
      const input = document.createElement('input');
      input.setAttribute('type', 'file');
      input.addEventListener('change', (e) => {
        resolve(e.target.files[0]);
      }, false);
      input.click();
    });
  }

  /* Auxiliary function to read data from a file */
  function readFile(file) {
    return new Promise((resolve) => {
      const reader = new FileReader();
      reader.addEventListener('load', (e) => {
        resolve(e.target.result);
      });
      reader.readAsText(file);
    });
  }

  const file = await selectFileToRead();
  const content = await readFile(file);
  const searchEngines = JSON.parse(content);
  searchEngines.forEach(({ name, keyword, url }) => {
    /* Actual search engine import magic */
    chrome.send('searchEngineEditStarted', [-1]);
    chrome.send('searchEngineEditCompleted', [name, keyword, url]);
  });
}());
Run Code Online (Sandbox Code Playgroud)

这很可能会因 Chrome 的后续版本而中断,并且可能有更好的方法来遍历 dom。


Rob*_*ark 6

使用 Google Takeout https://takeout.google.com将 Chrome 搜索引擎导出到 json 文件。

选择Chrome,然后选择All Chrome data included、 或SearchEngines

导出将包含一个SearchEngines.json文件。

在此输入图像描述 在此输入图像描述 在此输入图像描述


Ash*_*dal 6

基于https://superuser.com/a/1626575/44976

这仅涵盖导出(因为对于我的用例,我希望将搜索引擎从 Chrome 导出到 Firefox)

对于 Chrome,112.0.5615.49以下代码片段适用于 macOS。导航到 chrome://settings/searchEngines 后在 DevTools 控制台中执行

出口Search Engines

(function exportSEs() {
  /* Auxiliary function to download a file with the exported data */
  function downloadData(filename, data) {
    const file = new File([data], { type: 'text/json' });
    const elem = document.createElement('a');
    elem.href = URL.createObjectURL(file);
    elem.download = filename;
    elem.click();
  }

  let searchEngines = [];
  document.querySelector('settings-ui').shadowRoot
    .querySelector('settings-main').shadowRoot
    .querySelector('settings-basic-page').shadowRoot
    .querySelector('settings-search-page').shadowRoot
    .querySelector('settings-search-engines-page').shadowRoot
    .querySelector('settings-search-engines-list').shadowRoot
    .querySelectorAll('settings-search-engine-entry')
    .forEach($el => searchEngines.push(
      {
        name: $el.shadowRoot.querySelector('#name-column').textContent,
        keyword: $el.shadowRoot.querySelector('#shortcut-column').textContent,
        url: $el.shadowRoot.querySelector('#url-column-padded').textContent
      })
    )

  downloadData('search_engines.json', JSON.stringify(searchEngines));
}());
Run Code Online (Sandbox Code Playgroud)

出口Site Search

下面的代码片段和上面的代码片段之间的唯一区别是迭代的目标 has #activeEngines(这会导致Site Search导出而不是导出Search Engines

(function exportSEs() {
  /* Auxiliary function to download a file with the exported data */
  function downloadData(filename, data) {
    const file = new File([data], { type: 'text/json' });
    const elem = document.createElement('a');
    elem.href = URL.createObjectURL(file);
    elem.download = filename;
    elem.click();
  }

  let searchEngines = [];
  document.querySelector('settings-ui').shadowRoot
    .querySelector('settings-main').shadowRoot
    .querySelector('settings-basic-page').shadowRoot
    .querySelector('settings-search-page').shadowRoot
    .querySelector('settings-search-engines-page').shadowRoot
    .querySelector('settings-search-engines-list#activeEngines').shadowRoot
    .querySelectorAll('settings-search-engine-entry')
    .forEach($el => searchEngines.push(
      {
        name: $el.shadowRoot.querySelector('#name-column').textContent,
        keyword: $el.shadowRoot.querySelector('#shortcut-column').textContent,
        url: $el.shadowRoot.querySelector('#url-column-padded').textContent
      })
    )

  downloadData('search_engines.json', JSON.stringify(searchEngines));
}());
Run Code Online (Sandbox Code Playgroud)


Eri*_*tch 5

Chrome 103.0 于 2022 年 6 月 7 日更新:

出口

使用这个答案中的方法来获取SearchEngines.json

进口

我必须将此答案的导入代码修改为以下内容:

(async function importSEs() {
    /* Auxiliary function to open a file selection dialog */
    function selectFileToRead() {
        return new Promise((resolve) => {
            const input = document.createElement('input');
            input.setAttribute('type', 'file');
            input.addEventListener('change', (e) => {
                resolve(e.target.files[0]);
            }, false);
            input.click();
        });
    }
    /* Auxiliary function to read data from a file */
    function readFile(file) {
        return new Promise((resolve) => {
            const reader = new FileReader();
            reader.addEventListener('load', (e) => {
                resolve(e.target.result);
            });
            reader.readAsText(file);
        });
    }
    const file = await selectFileToRead();
    const content = await readFile(file);
    const searchEngines = JSON.parse(content);
    searchEngines["Search Engines"].forEach(({ short_name, keyword, url }) => {
        /* Actual search engine import magic */
        chrome.send('searchEngineEditStarted', [-1]);
        chrome.send('searchEngineEditCompleted', [short_name, keyword, url]);
    });
}());
Run Code Online (Sandbox Code Playgroud)

在 Chrome 控制台中运行此命令chrome://settings/searchEngines


wiz*_*log -2

截至目前,不,你不能。但是,您可以与同事共享书签。

链接到 Google 书签共享 截至目前,Google App 用户无法共享书签或书签列表。