在谷歌浏览器中创建书签校验和的逻辑

时间:2012-07-03 10:02:36

标签: google-chrome google-chrome-extension

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

5 个答案:

答案 0 :(得分:6)

无论这样做的安全性/拙劣性,都是这样的:

  1. 确保Chrome已关闭。
  2. 删除(或重命名)Bookmarks.bak
  3. 完全从Bookmarks
  4. 中删除校验和条目
  5. 根据您的内容编辑Bookmarks JSON
  6. 重新开启Chrome
  7. 如果没有备份且没有校验和,Chrome将使用新的JSON并生成新的校验和。

    如果您希望更无缝/更少积极地执行此操作,您可以查看它们如何在原始源代码中生成校验和并实现相同的算法(请参阅第57行的here)。

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

显然这只是hackish,只适用于知道自己在做什么的人,但是,由于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同步” “,或者它会返回所有已删除的内容,以及每个更改的书签的额外副本:  设置 - >同步 - >管理同步数据 - >重置同步

答案 3 :(得分: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

答案 4 :(得分: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 文件中的所有文本,然后调用此方法。