本文的起因是,我想用MATLAB读取本地浏览器的Cookies文件(读了干啥就不用说了吧)。
1.尝试以文本文件打开
一般地,Chrome浏览器的本地Cookies文件位于用户文件夹下的AppDataLocalGoogleChromeUser DataDefaulCookies。因为没有文件扩展名,首先尝试以文本文件打开。
fid = fopen('Cookies','rt');
str = fscanf(fid,'%s')
fclose(fid)
可以看到,大部分是乱码,但在字符串开头,能够看到“SQLiteformat 3"等字样。原来这是一个SQLite数据库文件。
2.尝试使用sqlite对象进行读取
sqlite是一个轻量级的数据库引擎,MATLAB自带了相关的接口,无需加载驱动,可以直接对SQLite进行连接、读取、写入操作。
conn = sqlite('Cookies');
sqlquery = 'select * from cookies';
data = fetch(conn,sqlquery);
然而失败了...
查了一下文档,MATLAB的SQLite接口仅支持double、int64、char数据类型,所以失败可能跟不支持的数据类型有关。
3.安装JDBC驱动来读取SQLite
除了MATLAB自带的SQLite接口,也可以通过安装JDBC驱动来读取SQLite数据库,功能更加丰富。二者的区别如下:
SQLite的JDBC驱动下载地址在MATLAB文档已经给出:https://ww2.mathworks.cn/products/database/driver-installation.html
驱动版本为3.27.2.1,是一个.jar的java类文件。
1.配置数据库
下面就可以开始配置SQLite数据库了,首先,在APP下拉菜单找到Database Explorer这个APP,点开。或者也可以在命令行输入以下代码:
databaseExplorer
然后,选择Configure Data Source-> Configure JDBC data source。
然后在弹出的窗口,Name自己设一个(这里设为cookies),Vendor选择OTHER, Driver Location输入刚刚下载的JDBC驱动的全路径文件名。下面的Driver输入org.sqlite.JDBC,URL输入jdbc:sqlite:subname,其中subname为想连接的数据库文件的全路径文件名(这里就是Cookies文件)。然后点击下方的Test,在弹出的Test对话框,Username和password自己随便设(别使用奇奇怪怪的字符就行),然后Test,弹出Connection Successful!的对话框就表示设置成功。
Save之后就可以使用这个数据库了。
2. 读取数据库
可以使用图形界面或者命令行的形式。
使用图形界面,在Database Explorer App单击New Query来添加一个数据库。在弹出的对话框,Data Source可以下拉找到我们刚刚配置的cookies数据源,Username和Password使用刚刚设的,然后connect。(在此之前,关闭Chrome浏览器,不然Cookies文件处于锁定状态,无法读取。)
在打开的数据库文件右侧可以勾选实现Select命令,上方有join,where等命令。
可以使用Import Data导出数据到MATLAB的workspace。(Import Data也可以用于生成相应的m代码,sqlquery等等)
上述读取数据的过程可以用如下命令行的形式体现出来:
datasource = "cookies";
username = "myCookies";
password = "123456";
conn = database(datasource,username,password);
sqlquery = "select host_key,name,encrypted_value,expires_utc from cookies where host_key = '.zhihu.com' or host_key = 'www.zhihu.com'";
data = fetch(conn,sqlquery);
close(conn);
4.Cookies中encrypted_value的解密
注意到,cookies中的值是加密的,使用的是AES加密,在本地机器上可以直接解密。遗憾的是,MATLAB上面没有自带的AES加密/解密功能。(MATLAB官方论坛上有人提过这个问题,似乎这个AES加密解密的代码是受美国出口管制的,Mathworks出于这个考虑所以没有相关的功能)
怎么办呢?当然是选择胶水语言python。
for ii = 1:size(data,1)
temp = py.win32.win32crypt.CryptUnprotectData(data.encrypted_value{ii});
temp = cell(temp);
data.value{ii} = char(temp{1,2});
end
注意数据类型的转换,利用cell函数将python返回的tuple对象转换为cell,char函数将bytes对象转换为字符数组。
提取出的cookies可以去和Chrome浏览器中看到的进行比对。(可能有新的cookies)
5. 总结
- MATLAB可以读取各种JDBC/ODBC的数据库。
- 自带的SQLite接口功能有限。
- 利用python中的win32包实现Cookies值的解密。
- 注意python返回的数据对象需要转换为MATLAB支持的数据对象。
最后是专栏目录。
易夕:MATLAB Tricks 专栏目录zhuanlan.zhihu.com