如何在chrome bookmarkfile中添加新的书签条目?我的要求是,我需要通过我的应用程序添加书签条目。请指定创建校验和(MD5)背后的逻辑。
答案 0 :(得分:6)
无论这样做的安全性/拙劣性,都是这样的:
Bookmarks.bak
Bookmarks
Bookmarks
JSON 如果没有备份且没有校验和,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
文件中的所有文本,然后调用此方法。