服务器打卡部署文档

文档声明

仅供学习交流使用

我们不鼓励、不赞成、不支持任何人,使用任何违规方式完成实习和打卡任务。

同时,鉴于项目的特殊性,开发者可能在任何时间停止更新或删除项目。

更新日志

2023-12-24

  • 新增手机app

  • 新增密钥功能

  • 支持用户独立代理userAgent
    2023-12-24

  • 支持周报选择开关和提交日期。

  • 支持月报选择开关和提交日期。

  • 支持补签选择开关。

  • 支持选择打卡日期。

  • 支持打上班和下班卡时间自定义。

功能介绍

本项目支持

  • 表单填写验证账号密码是否正确
  • 签到(默认周日不签到)
  • 补签(支持30天内,默认开启)
  • 日报
  • 周报
  • 月报(默认开启)
  • 补交日报
  • 补交周报
  • 动态代理IP不封号

使用教程

  1. 需要填写的内容
  • 手机号:
  • 密码:
  • 详细地址:(标准格式为:河南省 · 漯河市 · 舞阳县 · 文峰乡贾湖文化广场东南角10号(附近))
  • 日报
  • 周报
  • 补交日报(支持30天内,需要填写开始的日期和结束的日期,不能提前提交日报。)
  • 补交周报(最多只能补交17周)

快速开始

服务器选择

大部分阿某里,某讯服务器 IP 已经被官方封禁。不推荐使用。建议选择一些其他厂商的服务器。这里提供一个我在使用的服务器厂商亿速云。如果使用人数比较多,建议上高配置。

服务器系统选择

本教程推荐 Ubuntu系统,版本选择服务厂商的最新版即可。

设置服务安全

这里提供亿速云的操作流程

image.png

配置SSH连接服务器

查看服务器ip
image.png
根据自己的电脑系统(不是服务器系统)下载FinalShell工具,安装好。
image.png
image.png

安装宝塔面板

1
wget -O install.sh https:#download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh ed8484bec

后面全部默认输入y

  1. 当看到这个的时候,把外网面板地址复制粘贴到浏览器的地址栏中,username为账号,password为密码

image.png

  1. 安装推荐套件

image.png

配置数据库

  1. 创建数据库

image.png
image.png
推荐名称都用gongxueyun方便后面的操作

  1. 登录数据库

image.png

  1. 创建数据库表单

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    CREATE TABLE `users` (
    `phone` varchar(15) NOT NULL,
    `password` varchar(255) NOT NULL,
    `address` varchar(300) NOT NULL,
    `province` varchar(80) NOT NULL,
    `city` varchar(80) NOT NULL,
    `area` varchar(80) NOT NULL,
    `latitude` decimal(10,8) NOT NULL,
    `longitude` decimal(11,8) NOT NULL,
    `bujiao` tinyint(1) DEFAULT NULL,
    `bujiao_start_date` date DEFAULT NULL,
    `bujiao_end_date` date DEFAULT NULL,
    `reedy` tinyint(1) DEFAULT NULL,
    `requirement_week_num` int(11) DEFAULT NULL,
    `token` text,
    `user_id` varchar(255) DEFAULT NULL,
    `days` varchar(225) DEFAULT '180',
    `punch_status` varchar(255) DEFAULT '未签到',
    `registration_date` date DEFAULT NULL,
    `daily_report_status` varchar(255) DEFAULT '未提交日报',
    `weekly_report_status` varchar(255) DEFAULT '未提交周报',
    `zhobao` tinyint(1) DEFAULT NULL,
    `xuanbujiao` tinyint(1) DEFAULT NULL,
    PRIMARY KEY (`phone`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

    image.png
    后面的SQL代码都是这样操纵的

  2. 创建数据库定时事件

  • 给数据库权限,打开FinalShell工具,连接服务器,执行下面的指令。

    1
    mysql -u root -p
  • 获取数据库root密码。

image.png

  • 输入密码

image.png
image.png

  • 给指定数据库权限,如果数据库名称是和我一样的就不用修改,不一样的情况需要将 ‘gongxueyun‘@’localhost’ 改成 ‘xxxxx‘@’localhost’。这个“xxxx”代表你设置的数据库名称。

    1
    GRANT SUPER ON *.* TO 'gongxueyun'@'localhost';
  • 当出现 Query OK, 0 rows affected的时候就成功了。CTRL+D退出数据库

image.png

  • 回到数据库网页,在SQL中执行以下代码。如果数据库名称是和我一样的就不用修改,不一样的情况需要将 ‘gongxueyun‘@’localhost’ 改成 ‘xxxxx‘@’localhost’。这个“xxxx”代表你设置的数据库名称。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    DELIMITER $$

    CREATE DEFINER=`gongxueyun`@`localhost` EVENT `ResetDailyReportStatus`
    ON SCHEDULE EVERY 1 DAY
    STARTS '2023-12-09 00:00:00'
    ON COMPLETION NOT PRESERVE
    ENABLE
    DO
    UPDATE users SET daily_report_status = '未提交日报'$$

    CREATE DEFINER=`gongxueyun`@`localhost` EVENT `ResetWeeklyReportStatus`
    ON SCHEDULE EVERY 1 WEEK
    STARTS '2023-12-09 02:00:00'
    ON COMPLETION NOT PRESERVE
    ENABLE
    DO
    IF DAYOFWEEK(CURRENT_DATE) = 2 THEN
    UPDATE users SET weekly_report_status = '未提交周报';
    END IF$$

    CREATE DEFINER=`gongxueyun`@`localhost` EVENT `reset_punch_status`
    ON SCHEDULE EVERY 1 DAY
    STARTS '2023-12-09 06:00:00'
    ON COMPLETION NOT PRESERVE
    ENABLE
    DO
    UPDATE users SET punch_status = '未签到'$$

    CREATE DEFINER=`gongxueyun`@`localhost` EVENT `ress`
    ON SCHEDULE EVERY 1 DAY
    STARTS '2023-12-09 15:30:00'
    ON COMPLETION NOT PRESERVE
    ENABLE
    DO
    UPDATE users SET punch_status = '未签到'$$

    DELIMITER ;
    COMMIT;
  • 开启事件计划状态

    1
    SET GLOBAL event_scheduler="ON"
  1. 创建触发器
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DELIMITER $$

    CREATE TRIGGER `ruqi` BEFORE INSERT ON `users`
    FOR EACH ROW
    BEGIN
    SET NEW.registration_date = NOW();
    END
    $$

    DELIMITER ;

搭建前端

  1. 添加站点
  • 有域名就提前解析域名,这里不做演示,不知道可以百度。这里提供一个没有域名也可以搭建的方法。在域名栏中,可以填写已经解析好的域名或者直接写服务器的IP。

image.png

  1. 安装必要插件,在搜索栏中搜索PM2管理器 。

image.png

  • 将node更新到最新版本。

image.png

  1. 上传前端文件。

高德开放平台密钥获取。没有账号自己注册一个。
image.png
image.png
image.png
image.png

  • 打开前端文件夹找到app.js文件,修改以下参数。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    const GAODE_MAPS_API_KEY = ""; //高德开放平台密钥

    # 连接到 MySQL 数据库
    const con = mysql.createConnection({
    host: "", //服务器的IP地址
    user: "gongxueyun", //数据库的用户名
    password: "",//数据库密码(不是root密码)
    database: "gongxueyun", //数据库名称
    port: 3306 // 数据库端口一般默认为3306
    });
  • 上传文件。

image.png

  • 先删除原来index.html文件,然后双击解压上传的压缩包。

image.png

  1. 运行前端

image.png

  • 在启动文件栏中,找到刚刚上传的文件,选择里面的app.js文件。路径一般为**/www/wwwroot/域名/app.js。**

image.png
image.png

  1. 开放端口
  • 协议选择TCP/UDP,需要开放两个端口,操作两次。一个是前端网页3000端口,一个是数据库3306端口。

image.png

  1. 开启反代

目标URL填写:http://127.0.0.1:3000。
image.png

  1. 访问网址。

如果是域名就直接访问域名即可。如果是IP,访问格式如下:

1
IP:3000  

配置后端

  1. 修改数据库连接参数,找到sql/mysql.py文件。修改get_db_connection这个函数的一些参数。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 连接数据库
    def get_db_connection():
    # 数据库配置
    db_config = {
    "host": "",#服务器的IP地址
    "user": "gongxueyun", #数据库的用户名
    "password": "", #数据库密码(不是root密码)
    "database": "gongxueyun", #数据库名称
    "port": 3306 # 数据库端口一般默认为3306
    }
    # 连接数据库并返回连接对象
    connection = mysql.connector.connect(**db_config)
    return connection, connection.cursor(dictionary=True)
  2. 修改代理获取参数,找到IP/IP.py文件。

    1
    json_file_path = '.\henan_area_codes.json' #这个是城市区域编码
  • 获取代理IP的api。注册快代理,这个需要实名认证,你也可以找不需要的,但必须要有国内的IP同时支持你服务器IP的调用。有的代理是不支持香港服务器调用的。

image.png
26fa3ea3e78fcbcbe880b4f75a61a62.png
你会得到这样的链接

1
https:#dps.kdlapi.com/api/getdps/?secret_id=xxxxx&num=1&signature=xxxxxxxx&area=410102&pt=1&format=json&sep=1

找到area参数,将后面的数字换成 **{district_code}**。然后修改 IP/IP.py 文件下面的代码。

1
district_url = f"https:#dps.kdlapi.com/api/getdps/?secret_id=xxxxx&num=1&signature=xxxxxxxx&area={district_code}&pt=1&format=json&sep=1"
  • 给快代理添加API使用白名单。

image.png

  1. 修改config/info.py文件(选改)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    def __init__(self, login_info, path):
    self.password = login_info.get("password").strip()
    try:
    self.phone = login_info.get("phone").strip()
    int(self.phone)
    except Exception as f:
    config_module_log.info("手机号格式错误(带有非数字)")
    config_module_log.error(f)
    exit(-1)
    self.address = login_info["address"]
    self.latitude = login_info["latitude"]
    self.longitude = login_info['longitude']
    self.start_time = login_info.get("start_time","08") #上班打卡时间
    self.end_time = login_info.get("end_time","18") #下班打卡时间
    self.token = login_info.get("token")
    self.user_id = login_info.get("user_id")
    self.plan_id = login_info.get("plan_id")
    self.city = login_info['city']
    self.province = login_info['province']
    self.path = path
    self.is_repeat_clock_in = login_info.get('is_repeat_clock_in',True) #补签(默认开启)
    self.is_submit_daily = login_info['xuanbujiao'] #日报的开关
    self.is_submit_weekly = login_info['zhobao'] #周报的开关
    self.submit_weekly_time = login_info.get("submit_weekly_time",6) #周报提交时间(默认每周六)
    self.submit_month_report_time = login_info.get('submit_month_report_time',1) #月报提交时间(默认为每个月1号)如果需要关闭留空即可,删除“,1”这两个文字
    self.bujiaorubao=login_info["bujiao"] #补交日报开关
    self.bujiao_start_date=login_info.get('bujiao_start_date',"")# 开始日期
    self.bujiao_end_date=login_info.get('bujiao_end_date',"")# 结束日期
    self.bujiaozhobao = login_info["reedy"] #补交周报开关
    self.requirement_week_num=login_info.get('requirement_week_num',"") # 补交的周数量
  2. 修改textFile/submit_time.json文件(选改可以保持默认)

    1
    2
    3
    4
    5
    {
    "daily_next_submit_Time": 8, #日报下次提交时间
    "weekly_next_submit_Time": 6, #周报下次提交时间
    "month_next_submit_Report": 1 #月报下次提交时间
    }
  3. 上传后端文件。

image.png

  • 双击解压文件,解压路径为 /www/wwwroot/gong。

image.png

  • 使用ssh连接工具FinalShell,连接服务器。逐条执行下面的指令

    1
    2
    3
    cd /www/wwwroot/gong #到执行目录下
    apt install python3-pip #安装pip3工具,当遇到选择的时候全部选择Y
    pip3 install -r requirements.txt #安装必要的库
  • 试运行一下,没有报错就是好的。

    1
    python3 main.py

    image.png

配置执行定时任务

  1. 这步执行两次一次是上班卡,一次是下班卡。

执行周期选择:每天8点和每天18点
脚本内容:

1
2
cd /www/wwwroot/gong 
/usr/bin/python3 main.py >> /www/wwwroot/gong/logfile.log 2>&1

image.png

配置查验工具

在查验工具的文件夹中找到为database_config.json文件,修改数据库参数。支持配置多个数据库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"1": {
"host": "",#服务器的IP地址
"user": "gongxueyun", #数据库的用户名
"password": "", #数据库密码(不是root密码)
"database": "gongxueyun", #数据库名称
"port": 3306 # 数据库端口一般默认为3306
},
"2": {
"host": "",#服务器的IP地址
"user": "gongxueyun", #数据库的用户名
"password": "", #数据库密码(不是root密码)
"database": "gongxueyun", #数据库名称
"port": 3306 # 数据库端口一般默认为3306
}

}