微信聊天的图片都是以.dat格式保存下载的,搜了下网上的资料,只找到了python代码的实现,
这里用nodejs实现了一下。
新版电脑微信存储图片位置:
.\FileStorage\MsgAttach\d793770e32c06bd55098717dff82c5a6\Image
旧版电脑微信存储图片位置:
.\FileStorage\Image\
Nodejs实现批量转换:
- const fs = require('fs')
- const path = require('path')
-
- const base = 0xFF
- const next = 0xD8
- const gifA = 0x47
- const gifB = 0x49
- const pngA = 0x89
- const pngB = 0x50
-
- //扫描路劲
- const filePath = 'E:/Image/2022-11'
-
- //转化后输出图片的路径
- const outPath = 'E:/vxphoto/'
-
- //读取目录下所有.dat文件
- const files = fs.readdirSync(filePath)
- const datArry = []
- files.forEach(function (item) {
- if (path.extname(item) == '.dat') {
- datArry.push(item);
- }
- })
-
- // 将所有.dat文件依次转化为.jpg文件,输出路径为上面的outPath
- for (let i = 0; i < datArry.length; i++) {
- convert(datArry[i])
- process.stdout.write(`${i + 1}/${datArry.length} \r`)
- }
-
- //.dat转化为.jpg图片
- function convert (item) {
- let absPath = path.join(filePath, item);
- let imgPath = path.join(outPath, item + '.jpg');
- fs.readFile(absPath, (_err, content) => {
- if (content?.length) {
- let firstV = content[0]
- let nextV = content[1]
- let jT = firstV ^ base
- let jB = nextV ^ next
- let gT = firstV ^ gifA
- let gB = nextV ^ gifB
- let pT = firstV ^ pngA
- let pB = nextV ^ pngB
- let v = firstV ^ base
- if (jT == jB) {
- v = jT
- } else if (gT == gB) {
- v = gT
- } else if (pT == pB) {
- v = pT
- }
-
- let bb = content.map(br => {
- return br ^ v
- })
- fs.writeFileSync(imgPath, bb)
- }
- })
- }
-