5

如何在 chrome 书签文件中添加新的书签条目?我的要求是,我需要通过我的应用程序添加一个书签条目。请指定创建校验和(MD5)背后的逻辑。

4

5 回答 5

6

不管这样做的安全性/黑客性如何,方法如下:

  1. 确保 Chrome 已关闭。
  2. 删除(或重命名)Bookmarks.bak
  3. 完全删除校验和条目Bookmarks
  4. Bookmarks将JSON编辑到您心中的内容
  5. 重新打开 Chrome

在没有备份和校验和的情况下,Chrome 将使用新的 JSON 并生成新的校验和。

如果您想更无缝/不那么激进地执行此操作,您可以查看它们如何在原始源代码中生成校验和并实现相同的算法(参见此处,第 57 行)。

当然,请记住,Google 可以更改可能破坏兼容性的内容。但是,这确实有效,我只是在我编写的 Java 应用程序中做到了。

于 2012-10-17T22:29:36.730 回答
4

显然,这很骇人听闻,仅适用于知道自己在做什么的人,但是,由于 Chrome Mobile 不允许用户导出/导入自己的书签(不完全对用户友好!),有时别无选择 - 想象一下必须清理手动创建一个包含数千个条目的书签文件。

无论如何,这是一个有效的 Python 实现:

roots = ['bookmark_bar', 'other', 'synced']

def checksum_bookmarks(bookmarks):
    md5 = hashlib.md5()

    def checksum_node(node):
        md5.update(node['id'].encode())
        md5.update(node['name'].encode('utf-16le'))
        if node['type'] == 'url':
            md5.update(b'url')
            md5.update(node['url'].encode())
        else:
            md5.update(b'folder')
            if 'children' in node:
                for c in node['children']:
                    checksum_node(c)

    for root in roots:
        checksum_node(bookmarks['roots'][root])
    return md5.hexdigest()

只要你只是添加书签,你可能没问题,但对于任何更复杂的事情(例如,进行重大清理、编辑和删除书签,尤其是在涉及多个设备时),请务必重置“Chrome 同步”,或者它会给你所有已删除的内容,以及每个更改的书签的额外副本:设置 -> 同步 -> 管理同步数据 -> 重置同步

于 2017-11-22T15:25:51.110 回答
3

我的建议:不要。这是类似黑客的行为。Chrome 的“API”中不包含书签文件,它可以在没有警告的情况下更改。我们不知道如果您在 Chrome 运行时更改文件会发生什么。Chrome 在每次写入之前都会读取该文件吗?还是在启动时只读取一次?配置文件和同步书签呢?

我建议在 Chrome 的扩展 API 中使用书签对象。

于 2012-07-03T12:06:47.517 回答
0

这是 C# 解决方案:

public static string CalculateCheckSum(string bookmarksText)
{
    var bytes = new List<byte>();

    void DigestUrl(JToken url)
    {
        bytes.AddRange(Encoding.ASCII.GetBytes(url["id"].Value<string>()!));
        bytes.AddRange(Encoding.Unicode.GetBytes(url["name"].Value<string>()!));
        bytes.AddRange(Encoding.ASCII.GetBytes("url"));
        bytes.AddRange(Encoding.ASCII.GetBytes(url["url"].Value<string>()!));
    }

    void DigestFolder(JToken folder)
    {
        bytes.AddRange(Encoding.ASCII.GetBytes(folder["id"].Value<string>()!));
        bytes.AddRange(Encoding.Unicode.GetBytes(folder["name"].Value<string>()!));
        bytes.AddRange(Encoding.ASCII.GetBytes("folder"));

        foreach (var item in folder["children"])
        {
            if (item?["type"]?.Value<string>() == "folder")
            {
                DigestFolder(item);
            }
            else
            {
                DigestUrl(item);
            }
        }
    }

    var json = JToken.Parse(bookmarksText);

    DigestFolder(json["roots"]?["bookmark_bar"]);
    DigestFolder(json["roots"]?["other"]);
    DigestFolder(json["roots"]?["synced"]);

    using var md5 = new MD5CryptoServiceProvider();

    var result = md5.ComputeHash(bytes.ToArray());

    return BitConverter.ToString(result).Replace("-", "").ToLower();
}

首先使用File.ReadAllText方法从bookmarks文件中读取所有文本,然后调用此方法。

于 2021-06-12T01:51:24.983 回答
0

尽管帖子的年代久远,但对于那些寻求生成校验和的脚本的人来说,答案仍然是相关的。

这是我的 NodeJS 解决方案,灵感来自 Python 和 Chromium 源代码。

import { createHash } from 'crypto';

const regenChecksum = (roots) => {
    const digest = createHash('md5');
    const digestUrl = (url) => {
        digest.update(url['id'], 'ascii');
        digest.update(url['name'], 'utf16le');
        digest.update(Buffer.from('url'));
        digest.update(url['url'], 'ascii');
    };

    const digestFolder = (folder) => {
        digest.update(folder['id'], 'ascii');
        digest.update(folder['name'], 'utf16le');
        const bytes = Buffer.from('folder');
        digest.update(bytes);
        folder['children']?.forEach((child) => {
            updateDigest(child);
        });

    };

    const updateDigest = (node) => {
        node.type === 'folder' ? digestFolder(node) : digestUrl(node);
    };

    updateDigest(roots['bookmark_bar']);
    updateDigest(roots['other']);
    updateDigest(roots['synced']);
    return digest.digest('hex');
};

要点:https ://gist.github.com/dcantu476/ac8d4ae63a6a22c6a6fda7d8f9fb3039

于 2021-05-02T16:23:41.367 回答