文章有误,修改中,不用看了
大家好,又是没活干的一天,今天用nestjs写一个不道德的程序,请记住,不道德
刚刚构思的时候感觉半个小时就写完了,真正开始后还是用了几个小时的。就是当你访问我的链接的的时候,我怎么拿到你的微信名,和微信聊天文件
效果如下:
其实说起来思路也简单,就是一路排除各种文件夹,最后定位到微信存放信息所在的文件夹,只支持PC
不过还是有一些小的知识点的
获取Pc用户名
就是这个C:Users
首先从C:Users
下获取所有文件夹,然后过滤掉不符合条件的
const files = fs.readdirSync(usersPath);
const users = files.filter((file) => {
const filePath = `${usersPath}/${file}`;
const stats = fs.statSync(filePath);
const excludedFolders = [
'Default',
'All Users',
'Default User',
'Public',
];
// stats.isDirectory() 判断给定路径是否是一个目录
return (
stats.isDirectory() &&
!file.startsWith('.') &&
!excludedFolders.includes(file)
);
});
stats.isDirectory()
:判断给定路径是否是一个目录,即判断是否为文件夹。!file.startsWith('.')
:排除以点开头的文件或文件夹,通常是隐藏文件或文件夹。!excludedFolders.includes(file)
:排除excludedFolders
数组中包含的文件夹名称。
确定WeChat Files的路径
大概找到Pc的用户名(数组)之后,再进一步确定当前用户的文件夹下是否有WeChat Files
路径
这个方法会返回包含WeChat Files
的路径
function checkFolderPath(userFolder) {
const folderPath = `C:/Users/${userFolder}/Documents/WeChat Files`;
try {
fs.accessSync(folderPath, fs.constants.R_OK);
return folderPath;
} catch (err) {
return null;
}
}
获取当前电脑(用户)下所有登录过的微信路径
因为当前电脑如果登录过多个微信的话,路径是这样的
WeChat Files
|-weixin1
|-weixin2
|-common
|--
所有我们需要获取到可能是用户路径的路径,那就找用户路径的不同吧,那就是用户路径下会有一个account_
开头的文件夹,而后面的字符串就是你的微信名了,知道怎么搞,代码就好写了
首先排除掉肯定不是用户路径的文件夹
const folders = fs.readdirSync(folderPath, { withFileTypes: true });
folders
.filter(
(folder) => folder.isDirectory() && !notFolders.includes(folder.name),
)
.map((folder) => `${folderPath}/${folder.name}`);
fs.readdirSync()
方法同步地读取指定路径folderPath
下的文件和文件夹列表获取微信名
到上一步返回路径中文件夹里不包含account_
的文件夹,然后截取account_
后的字符
function getWeiName(folderPath) {
const folders = fs.readdirSync(folderPath, { withFileTypes: true });
let str = '';
folders.forEach((folder) => {
if (folder.name.includes('account_')) {
str = folder.name.substring(8);
}
});
return str;
}
这样就获取到了所有的微信名
获取聊天记录的文件
这个很简单,写个递归,把文件夹里的文件存起来返回就行了
function getAllFilesInDir(dirPath) {
const filesList = [];
function walkDir(currentPath) {
const files = fs.readdirSync(currentPath);
for (const file of files) {
const filePath = path.join(currentPath, file);
const stats = fs.statSync(filePath);
if (stats.isFile()) {
filesList.push(filePath);
} else if (stats.isDirectory()) {
walkDir(filePath);
}
}
}
walkDir(dirPath);
return filesList;
}
几个API简单介绍下
stats.isFile()
方法返回true
,表示当前项是一个文件stats.isDirectory()
方法返回true
,表示当前项是一个子目录,递归调用walkDir
函数path.join()
方法将其路径与当前目录路径拼接,得到完整的文件或子目录路径filePath
到这基本上就完成了,代码使用了同步的文件系统操作,如fs.readdirSync()
和fs.statSync()
,如果在处理大量文件或目录时,可能会导致代码执行阻塞,这个就是玩玩而已
写到这里才感觉,隐私原来这么容易获取,全靠道德约束啊
源码地址:wangshaojie/weixin: 获取微信用户名和聊天记录里的文件 (github.com)