如何在 chrome 书签文件中添加新的书签条目?我的要求是,我需要通过我的应用程序添加一个书签条目。请指定创建校验和(MD5)背后的逻辑。
5 回答
不管这样做的安全性/黑客性如何,方法如下:
- 确保 Chrome 已关闭。
- 删除(或重命名)
Bookmarks.bak
- 完全删除校验和条目
Bookmarks
Bookmarks
将JSON编辑到您心中的内容- 重新打开 Chrome
在没有备份和校验和的情况下,Chrome 将使用新的 JSON 并生成新的校验和。
如果您想更无缝/不那么激进地执行此操作,您可以查看它们如何在原始源代码中生成校验和并实现相同的算法(参见此处,第 57 行)。
当然,请记住,Google 可以更改可能破坏兼容性的内容。但是,这确实有效,我只是在我编写的 Java 应用程序中做到了。
显然,这很骇人听闻,仅适用于知道自己在做什么的人,但是,由于 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 同步”,或者它会给你所有已删除的内容,以及每个更改的书签的额外副本:设置 -> 同步 -> 管理同步数据 -> 重置同步
我的建议:不要。这是类似黑客的行为。Chrome 的“API”中不包含书签文件,它可以在没有警告的情况下更改。我们不知道如果您在 Chrome 运行时更改文件会发生什么。Chrome 在每次写入之前都会读取该文件吗?还是在启动时只读取一次?配置文件和同步书签呢?
我建议在 Chrome 的扩展 API 中使用书签对象。
这是 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
文件中读取所有文本,然后调用此方法。
尽管帖子的年代久远,但对于那些寻求生成校验和的脚本的人来说,答案仍然是相关的。
这是我的 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