LevelDB:如何从其 leveldb 中读取 Skype8 的对话

LevelDB: How to read conversation of Skype8 from its leveldb

Skype 8 的 leveldb 位于文件夹

C:\Users\machine-user-name\AppData\Roaming\Microsoft\Skype 对于 Desktop\IndexedDB\file__0.indexeddb.leveldb

我正在使用c#阅读skype 8 leveldb的内容。 这是我的代码,用于打开和迭代 leveldb 的所有键和值。

void IteratorSkypeDb()
{
    var path = @"C:\Users\ptandukar\AppData\Roaming\Microsoft\Skype for Desktop\IndexedDB\file__0.indexeddb.leveldb";
    Options options = new Options();
    using (var db = new DB(options, path))
    {
        using (var iterator = db.CreateIterator(new ReadOptions()))
        {
            iterator.SeekToFirst();
            while (iterator.IsValid())
            {
                var key = iterator.KeyAsString();
                var value = iterator.ValueAsString();
                Console.WriteLine($"{key}-{value}");
                iterator.Next();
                }
            }
        }
    }
}

但是,我在初始化数据库时遇到了以下异常:

System.UnauthorizedAccessException: 'Invalid argument: idb_cmp1does not match existing comparator : leveldb.BytewiseComparator'

有人能解释一下吗?

仅供参考:我使用了 https://github.com/Reactive-Extensions/LevelDB 中的示例代码 它有一个未加载到我的 VS2017 中的本机项目,但我设法从其他 link 下载 leveldb.dll 并将其复制到 bin\debug 文件夹到 运行 程序。

您需要定义一个名为 idb_cmp1 的比较器。请参阅 github. Unclear if it is connected to the implementation of LevelDB/IndexDB used by google (see this question/answer that references the same name, implementation of the comparator that is here 上的文档,但似乎足够复杂以至于难以重新实现)

如果你只需要读取数据,而且你想读取所有数据,而且数据无序也不是问题,那么创建任何名为idb_cmp1的比较器都是可能的没关系。二进制比较器的未经测试代码:

// Simple binary comparer
var comparator = Comparator.Create("idb_cmp1", (x, y) =>
{
    NativeArray<byte> nx = (NativeArray<byte>)x;
    NativeArray<byte> ny = (NativeArray<byte>)y;

    long count = Math.Min((long)nx.count, (long)ny.count);

    for (int i = 0; i < count; i++)
    {
        int cmp = nx[i].CompareTo(ny[i]);

        if (cmp != 0)
        {
            return cmp;
        }
    }

    return 0;
});

我尝试使用 https://github.com/tg123/IronLeveldb 并取得了一些成功。 唯一的问题是编码看起来很奇怪,我找不到使用这个库读出整个数据库的方法。我将整个 LevelDb 文件夹复制到一个测试文件夹和 运行 此代码:

var db = IronLeveldbBuilder.BuildFromPath(@"C:\test\leveldb");
        IEnumerable<IByteArrayKeyValuePair> data = db.SeekFirst();
        foreach (IByteArrayKeyValuePair pair in data)
        {
            Console.BackgroundColor = ConsoleColor.Blue;
            Console.WriteLine($"****{Encoding.Default.GetString(pair.Key.ToArray(), 0, pair.Key.Length)}****");
            Console.ResetColor();
            Console.WriteLine(Encoding.Default.GetString(pair.Value.ToArray(), 0, pair.Value.Length));
        }

我刚刚添加了 *** 以使键从值中脱颖而出。 结果很有趣,我好像也有 Skype 屏蔽的消息(垃圾邮件)。

(键值对的)前几个值似乎是 "column names"

c o n v i d 创建时间 对话是我创造的时间 con v i d count s create time 对话 I d _ count s Typ e created Time 我的记忆创造了时间 对话 I d _ 是我的 M e s s a g e c e t e t e d Time 警报 C o n v i d 信息 。对话 I d a l e r t s R e a d Time i m e s t a m p

然后进一步讨论一些对话数据:

**** 0 1 9 : 1 3 4 1 9 5 1 e a a 3 8 4 7 e 5 a 3 8 4 a f 9 5 2 a a f 0 0 d 9 @t h re a d 。天空 1 7 4 3 5 8 1 1 3 8 5 3 9 3 0 3 4 0 9 3**** 1535543604069"composetime"2018-08-29T11:53:23.825Z"clientmessageid"17435811385393034093"conversationLink"zhttps://db5-client-s.gateway.messenger.live.com/v1/users/ME/conversations/19:1341951eaa3847e5a384af952@aaf00 =43=]"content"-我已经做了 DNS 健康检查,但仍有一些东西处于警告或错误状态,可能是由于传播,所以我也会继续检查。"type"消息"conversationid"019:1341951eaa3847e5a384af952aaf00d9@thread.skype"from"Ohttps://db5-client-s.gateway.messenger.live.com/v1/users/ME/contacts/8:evn26041{$ "cuid"17435811385393034093"conversationId"019:1341951eaa3847e5a384af952aaf00d9@thread.skype"createdTimeN P6XXvB"创作者” 8:evn26041"content"-我已经做了 DNS 健康检查,但仍有一些东西处于警告或错误状态,可能是由于传播,所以我也会继续检查。"messagetypeRichText"内容类型_” properties_"_isEphemeralF"fileEncryptionKeys"_countsTypeI"_isMyMessageI {