logo
0
0
WeChat Login
cnb<h3114931694@gmail.com>
更新前后端分离文件夹,方便阅读

地理位置验证与文件下载系统

项目介绍

本项目是一个基于Web技术的地理位置验证与文件下载系统,旨在通过获取用户位置信息和设备指纹,为文件下载提供安全验证机制。系统采用混合定位策略,优先使用高精度GPS定位,失败时自动降级为IP定位,确保在各种网络环境下都能提供有效的位置验证。

功能特性

核心功能

  • 混合定位验证:优先使用Geolocation API获取高精度位置,失败时自动降级为IP定位
  • 设备指纹采集:生成唯一的设备指纹,用于识别和验证设备
  • IP地址记录:自动获取并记录用户IP地址
  • 智能降级策略:确保任何情况下都能获取基础验证信息
  • 文件下载服务:支持多个文件的下载功能
  • 环形等待动画:提供友好的用户体验
  • 数据持久化:使用SQLite数据库存储验证记录
  • 提前退出处理:用户关闭浏览器时自动保存部分数据
  • STUN服务器测试:使用多个STUN服务器检测网络NAT类型和公网IP

技术优势

  • 可靠性高:多重定位策略确保验证成功率
  • 用户体验好:流畅的动画过渡和即时响应
  • 数据完整:任何情况下都能获取IP定位和设备指纹
  • 开发效率高:集成nodemon实现自动重启
  • 易于部署:轻量级设计,依赖少

技术栈

前端

  • HTML5:页面结构
  • CSS3:样式和动画
  • JavaScript:交互逻辑和定位功能

后端

  • Node.js:运行环境
  • Express:Web框架
  • SQLite3:轻量级数据库
  • CORS:跨域支持

开发工具

  • Nodemon:自动重启服务器
  • npm:包管理

安装指南

前提条件

  • Node.js:版本14.0或更高
  • npm:版本6.0或更高

安装步骤

  1. 克隆项目

    git clone <项目仓库地址>
    cd file-demo
    
  2. 安装依赖

    cd 2
    npm install
    
  3. 启动服务器

    • 开发模式(自动重启):
      npm run dev
      
    • 生产模式
      npm start
      
    • 使用启动脚本(推荐):
      node start.js
      
  4. 访问系统 打开浏览器,访问 http://localhost:3000

  5. 管理数据库

    • 查看数据
      node check.js
      
    • 清空数据
      node clear.js
      

使用说明

下载流程

  1. 访问系统:打开 http://localhost:3000
  2. 选择文件:点击"下载文件"或"下载文件2"按钮
  3. 位置验证
    • 系统会尝试获取您的位置信息
    • 显示环形等待动画
    • 自动进行位置验证
  4. 文件下载:验证完成后自动开始下载文件

定位策略

  • GPS定位:如果您允许位置权限,系统会使用GPS获取精确位置
  • IP定位:如果GPS定位失败或被拒绝,系统会使用IP地址获取大致位置
  • 设备指纹:任何情况下都会生成并记录设备指纹

API文档

前端API

Geolocation API

  • 用途:获取用户精确位置
  • 调用方式navigator.geolocation.getCurrentPosition()
  • 返回值:包含经纬度、精度等位置信息

IP定位API

  • 端点GET /api/ip-location
  • 用途:通过IP地址获取大致位置
  • 返回值
    {
      "success": true,
      "latitude": 39.9042,
      "longitude": 116.4074,
      "ip": "::ffff:127.0.0.1"
    }
    

后端API

记录成功

  • 端点POST /api/record-success
  • 用途:记录定位成功的信息
  • 请求体
    {
      "latitude": 39.9042,
      "longitude": 116.4074,
      "deviceFingerprint": "eef8db6",
      "locationType": "geolocation",
      "ipLocation": {
        "type": "ip",
        "latitude": 39.9042,
        "longitude": 116.4074
      }
    }
    
  • 响应
    {
      "success": true,
      "message": "Successfully recorded",
      "recordId": 1
    }
    

记录失败

  • 端点POST /api/record-failure
  • 用途:记录定位失败的信息
  • 请求体
    {
      "deviceFingerprint": "eef8db6"
    }
    
  • 响应
    {
      "success": true,
      "message": "Successfully recorded",
      "recordId": 1
    }
    

记录拒绝

  • 端点POST /api/record-reject
  • 用途:记录用户拒绝下载的信息
  • 请求体
    {
      "deviceFingerprint": "eef8db6"
    }
    
  • 响应
    {
      "success": true,
      "message": "Successfully recorded",
      "recordId": 1
    }
    

记录部分下载数据(用户提前关闭)

  • 端点POST /api/record-partial-download
  • 用途:记录用户在下载过程中提前关闭页面的信息
  • 请求体
    {
      "deviceFingerprint": "eef8db6",
      "pageIP": "127.0.0.1",
      "error": "User exited during download process",
      "pageDuration": 11389,
      "downloadDuration": null,
      "downloadClicked": false,
      "locationType": "unknown",
      "hadIPData": false,
      "hadLocationData": false,
      "userAgent": "Mozilla/5.0 ...",
      "screenWidth": 1920,
      "screenHeight": 1080,
      "language": "zh-CN",
      "platform": "Win32"
    }
    
  • 响应
    {
      "success": true,
      "message": "Partial download data recorded successfully (user exited early)",
      "recordId": 1
    }
    

记录STUN测试数据

  • 端点POST /api/record-stun-test
  • 用途:记录STUN服务器测试结果
  • 请求体
    {
      "deviceFingerprint": "eef8db6",
      "serverIP": "127.0.0.1",
      "mainIPInfo": {
        "ip": "192.168.1.1",
        "ip_data": {
          "country": "China"
        }
      },
      "stunResults": {
        "results": [...],
        "ipCountries": {...},
        "allIPsSame": true
      },
      "completed": true,
      "duration": 25000
    }
    
  • 响应
    {
      "success": true,
      "message": "STUN test data recorded successfully",
      "recordId": 1
    }
    

文件下载

  • 端点GET /download/file

  • 用途:下载第一个示例文件

  • 响应:文本文件下载

  • 端点GET /download/file2

  • 用途:下载第二个示例文件

  • 响应:文本文件下载

项目结构

file-demo/
├── index.html                    # 前端主页
├── test-exit.html               # 提前关闭测试页面
├── fullRTCip.js                 # STUN测试核心逻辑
├── stun-servers-formatted.js     # STUN服务器列表
├── database.db                  # SQLite数据库(根目录)
├── 2/                          # 后端目录
│   ├── server.js               # Express服务器
│   ├── package.json            # 项目配置
│   ├── package-lock.json       # 依赖锁定
│   ├── start.js               # 服务器启动脚本
│   ├── check.js               # 数据检查脚本
│   ├── clear.js               # 数据清空脚本
│   ├── check-data.js          # 检查users表
│   ├── check-stun-data.js     # 检查stun_tests表
│   └── clear-data.js          # 清空数据
├── js/                         # 前端脚本目录
│   ├── device-fingerprint.js   # 设备指纹生成
│   ├── webrtc-ip-detector.js  # WebRTC IP检测
│   ├── api-recorder.js        # API记录器
│   └── location-service.js     # 位置服务
└── README.md                    # 项目文档

配置说明

服务器配置

  • 端口:默认3000(可在server.js中修改)
  • 数据库:默认使用项目根目录的database.db
  • CORS:默认允许所有跨域请求

IP定位配置

  • 模拟数据:当前使用模拟数据实现IP到地理位置的映射
  • 扩展方式:可替换为真实的IP地理位置数据库(如MaxMind GeoIP)

开发配置

  • 自动重启:使用nodemon实现文件修改后自动重启
  • 开发命令npm run dev
  • 生产命令npm start

注意事项

浏览器兼容性

  • Geolocation API:需要浏览器支持并允许位置权限
  • IP定位:所有现代浏览器都支持
  • CSS动画:需要浏览器支持CSS3动画

隐私合规

  • 位置权限:系统会明确请求用户授权
  • 数据存储:仅存储必要的验证信息
  • 数据使用:位置信息仅用于验证,不用于其他用途

安全考虑

  • 设备指纹:用于识别设备,不涉及个人隐私
  • IP地址:标准的网络验证信息
  • 数据传输:建议在生产环境中使用HTTPS

性能优化

  • 定位策略:IP定位速度快,作为基础验证
  • 并行执行:IP定位和GPS定位并行执行
  • 响应时间:定位完成后立即开始下载

许可证

本项目采用 MIT 许可证。详见 LICENSE 文件。

后续扩展

功能扩展

  • 多文件支持:添加更多文件的下载功能
  • 文件管理:实现文件上传和管理功能
  • 用户认证:添加用户登录和权限控制
  • 日志系统:增强系统日志和监控

技术扩展

  • 真实IP定位:集成MaxMind GeoIP等真实IP地理位置数据库
  • 缓存机制:添加位置信息缓存,提高性能
  • CDN集成:使用CDN加速文件下载
  • 容器化:使用Docker容器化部署

联系方式

如有问题或建议,请联系项目维护者。


项目状态:已完成核心功能开发,可直接部署使用。 最后更新:2026年1月18日