监控指定QQ头像变动的简易PHP程序项目

摘要:由于腾讯QQ账号较为开放的头像调用方式,我们可以利用此特点实现对特定用户的QQ头像监控更迭并记录QQ头像文件。本文旨在研究使用PHP脚本结合云服务器“计划任务”功能,实现对特定用户的QQ头像监控更迭并记录QQ头像文件。

关键词:腾讯QQ;社交头像;PHP;自动化脚本

1、引言

首先,如果我们有相关需求采用人工监控的方式肯定是不现实的,最直接理由的就是人工无法保证24h时刻在线。所以我们自然会选择可以24h开机运行云端服务器通过自动化执行脚本的方式来实现这个自动化操作。

图1-1

我选择了使用php程序来完成这个自动化操作。其大致原理是服务器周期自动执行php文件,而php程序就来完成这个QQ头像监控&采集的操作。

2、采集

2.1 PHP程序

我这里直接放成品:

<?php
// 获取当前PHP文件的绝对路径
$currentPath = __FILE__;
// 去除文件名,并添加斜杠
$savePath = dirname($currentPath) . "/";
// 创建保存目录(如果不存在)
if (!is_dir(dirname($savePath))) {
	mkdir(dirname($savePath), 0755, true);
}

// 定义目标QQ号
$qqNumber = '7407';
// 构造下载URL
$url = "https://q2.qlogo.cn/headimg_dl?dst_uin=$qqNumber&spec=5";
//赋值目录到下载目录
$downloadPath = $savePath;
// 下载头像文件
$imageData = file_get_contents($url);
if ($imageData === false) {
	die("无法下载头像文件");
}
// 将头像文件保存到指定目录,命名f2,用于对比
$filePath = $downloadPath . "f2";
$result = file_put_contents($filePath, $imageData);
if ($result === false) {
	die("无法保存头像文件到指定目录");
}
echo "头像文件下载成功,文件保存到:$filePath";

//获取对比文件路径
$file2Path =$filePath;
$file1Path =$savePath . "f1";
// 计算文件的MD5值
$md5File1 = md5_file($file1Path);
$md5File2 = md5_file($file2Path);
// 比较MD5值是否相同
if ($md5File1 === $md5File2) {
	// 文件相同执行代码块a
	echo "文件内容相同";
	//判断文件是否存在后删除f2文件
	if (file_exists($file2Path)) {
		if (unlink($file2Path)) {
			echo "文件删除成功!";
		} else {
			echo "文件删除失败!";
		}
	} else {
		echo "文件不存在!";
	}
} else {
	// 文件不同执行代码块b
	echo "文件内容不同";
	// 生成文件名,使用当前北京时间
	$currentTime = date('YmdHis');
	$fileName = "头像抓取时间avatar_$currentTime.jpg";
	//指定源路径(用于对比的f2)
	$sourceFilePath = $file2Path;
	//指定目标路径
	$destinationFilePath = $savePath . "logo/" . $fileName;
	// 创建目标路径(如果logo/不存在)
    if (!is_dir(dirname($destinationFilePath))) {
	mkdir(dirname($destinationFilePath), 0755, true);
    }
	//先判断源路径是否存在
	if (file_exists($sourceFilePath)) {
		// 再复制文件到目标路径
		if (copy($sourceFilePath, $destinationFilePath)) {
			//重命名前,删除原来f1
			if (file_exists($file1Path)) {
				if (unlink($file1Path)) {
					echo "原f1文件删除成功!";
				} else {
					echo "原f1文件删除失败!";
				}
			} else {
				echo "文件不存在!";
			}
			// 再将原路径文件重命名为f1
			if (rename($sourceFilePath, $file1Path)) {
				echo "文件复制成功,原文件已重命名为f1";
			} else {
				echo "文件复制成功,但重命名失败";
			}
		} else {
			echo "文件复制失败";
		}
	} else {
		echo "源文件不存在";
	}
}
?>

代码基本都打上了注释,比较简单,但我这里还是简要说明一下。

首先最关键的是我们要知道官方获取QQ头像的接口:

https://q2.qlogo.cn/headimg_dl?dst_uin=QQ号&amp;spec=5

通过这个接口我们就可以获取到指定QQ号的QQ头像。

// 定义目标QQ号
$qqNumber = '7407';
// 构造下载URL
$url = "https://q2.qlogo.cn/headimg_dl?dst_uin=$qqNumber&spec=5";

第二步,暂存头像文件为“f2”。

//赋值目录到下载目录
$downloadPath = $savePath;
// 下载头像文件
$imageData = file_get_contents($url);
if ($imageData === false) {
	die("无法下载头像文件");
}
// 将头像文件保存到指定目录,命名f2,用于对比
$filePath = $downloadPath . "f2";
$result = file_put_contents($filePath, $imageData);
if ($result === false) {
	die("无法保存头像文件到指定目录");
}
echo "头像文件下载成功,文件保存到:$filePath";

第三步,暂存头像文件“f2”与原有头像对比md5值,以此判断头像文件是否一样“也就是判断对方有没有换新头像”

//获取对比文件路径
$file2Path =$filePath;
$file1Path =$savePath . "f1";
// 计算文件的MD5值
$md5File1 = md5_file($file1Path);
$md5File2 = md5_file($file2Path);
// 比较MD5值是否相同
if ($md5File1 === $md5File2) {
	// 文件相同执行代码块a
	echo "文件内容相同";
	//判断文件是否存在后删除f2文件
	if (file_exists($file2Path)) {
		if (unlink($file2Path)) {
			echo "文件删除成功!";
		} else {
			echo "文件删除失败!";
		}
	} else {
		echo "文件不存在!";
	}
} else {
	// 文件不同执行代码块b
	echo "文件内容不同";
	// 生成文件名,使用当前北京时间
	$currentTime = date('YmdHis');
	$fileName = "头像抓取时间avatar_$currentTime.jpg";
	//指定源路径(用于对比的f2)
	$sourceFilePath = $file2Path;
	//指定目标路径
	$destinationFilePath = $savePath . "logo/" . $fileName;
	// 创建目标路径(如果logo/不存在)
    if (!is_dir(dirname($destinationFilePath))) {
	mkdir(dirname($destinationFilePath), 0755, true);
    }
	//先判断源路径是否存在
	if (file_exists($sourceFilePath)) {
		// 再复制文件到目标路径
		if (copy($sourceFilePath, $destinationFilePath)) {
			//重命名前,删除原来f1
			if (file_exists($file1Path)) {
				if (unlink($file1Path)) {
					echo "原f1文件删除成功!";
				} else {
					echo "原f1文件删除失败!";
				}
			} else {
				echo "文件不存在!";
			}
			// 再将原路径文件重命名为f1
			if (rename($sourceFilePath, $file1Path)) {
				echo "文件复制成功,原文件已重命名为f1";
			} else {
				echo "文件复制成功,但重命名失败";
			}
		} else {
			echo "文件复制失败";
		}
	} else {
		echo "源文件不存在";
	}
}

其中如果没有头像文件一样,即没有更换头像。那么程序删除这个“f2”文件,并直接结束程序。

当然如果头像不一样,即更新了头像。则进行存档和更新“f1”两个操作。

存档操作,就是把“f2”文件复制到“logo/”文件夹下,这是头像存档目录。并按照“北京时间”重命名,这样我们就能通过存档文件名知道对方是在什么时刻更换的头像。

更新“f1”,“f1”文件是用来和下一个“f2”文件比对用的。所以如果有“f2”比对成功,那么它将作为下一轮的“f1”。而具体程序操作则是将原有“f1”删除,然后将“f2”重命名为“f1”。

2.2 自动化

OK,这就是PHP程序的大致流程。但这里还缺了最重要的一步,就是设置服务器自动化任务,需要服务器自动化周期性执行该PHP程序。

这里我采用的宝塔面板的“计划任务”功能。

图2-1

设定每分钟运行一次,则可将误差缩减到一分钟。即指定用户切换头像超过1分钟后,程序将采集这次记录。


3、查看

监控和采集任务完成了,但当我们每次需要查看记录的头像数据时,都需要登录服务器或者FTP。这极不方便,所以做一个前端网页,访问可直接查看数据。

还是直接放成品:

<!DOCTYPE html>
<html>
<head>
    <title>图片列表</title>
    <style>
        /* 样式代码可以在这里添加 */
        .image-container {
            display: flex;
            align-items: center;
            justify-content: center;
            gap: 10px;
        }
        .image-container img {
            max-width: 200px;
            max-height: 200px;
        }
        .image-container span {
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 14px;
        }
    </style>
</head>
<body>
    <?php
    // 指定图片文件夹路径(当前php文件路径)
    $folderPath = './';
    // 获取文件夹中的所有文件
    $files = glob($folderPath . '*.{jpg,jpeg,png,gif}', GLOB_BRACE);
    // 遍历文件列表并显示图片和文件名
    foreach ($files as $file) {
        $filename = pathinfo($file, PATHINFO_FILENAME);
        echo '<div class="image-container">';
        echo '< img src="' . $file . '" alt="Image">';
        echo '<span>' . $filename . '</span>';
        echo '</div>';
    }
    ?>
</body>
</html>

比较简单,写有注释,可以自行研究修改。用户浏览器访问这个php文件链接,就可以查看对应目录的头像采集数据。

页面效果:

图3-1

4、演示

最后这是简单的视频演示:

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
留言 抢沙发
头像
来都来了,不说两句?
提交
头像

昵称

取消
昵称表情代码图片

    请登录后查看评论内容