├── img ├── baidu │ ├── 1领取资源.jpg │ ├── 2确认领取.jpg │ ├── 3创建应用.jpg │ ├── 5创建完成.jpg │ ├── 4填写应用信息.jpg │ └── 6Key复制.jpg └── actions │ ├── 5最终结果.jpg │ ├── 8查看日志.jpg │ ├── 2确认fork.jpg │ ├── 7点击build.jpg │ ├── 1点击fork按钮.jpg │ ├── 3settings界面.jpg │ ├── 4secrets界面.jpg │ └── 6查看workflow.jpg ├── requirements.txt ├── Dockerfile ├── timer.py ├── Dockerfile_arm ├── .github └── workflows │ ├── build_docker_image.yml │ └── jksb_schedule.yml ├── parameter.py ├── readme.md ├── jksb.py └── utils.py /img/baidu/1领取资源.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yann-zhou/zzu_auto_jksb/HEAD/img/baidu/1领取资源.jpg -------------------------------------------------------------------------------- /img/baidu/2确认领取.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yann-zhou/zzu_auto_jksb/HEAD/img/baidu/2确认领取.jpg -------------------------------------------------------------------------------- /img/baidu/3创建应用.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yann-zhou/zzu_auto_jksb/HEAD/img/baidu/3创建应用.jpg -------------------------------------------------------------------------------- /img/baidu/5创建完成.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yann-zhou/zzu_auto_jksb/HEAD/img/baidu/5创建完成.jpg -------------------------------------------------------------------------------- /img/actions/5最终结果.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yann-zhou/zzu_auto_jksb/HEAD/img/actions/5最终结果.jpg -------------------------------------------------------------------------------- /img/actions/8查看日志.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yann-zhou/zzu_auto_jksb/HEAD/img/actions/8查看日志.jpg -------------------------------------------------------------------------------- /img/baidu/4填写应用信息.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yann-zhou/zzu_auto_jksb/HEAD/img/baidu/4填写应用信息.jpg -------------------------------------------------------------------------------- /img/baidu/6Key复制.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yann-zhou/zzu_auto_jksb/HEAD/img/baidu/6Key复制.jpg -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | APScheduler==3.7.0 2 | requests~=2.27.1 3 | urllib3~=1.26.9 4 | # Pillow==9.2.0 5 | -------------------------------------------------------------------------------- /img/actions/2确认fork.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yann-zhou/zzu_auto_jksb/HEAD/img/actions/2确认fork.jpg -------------------------------------------------------------------------------- /img/actions/7点击build.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yann-zhou/zzu_auto_jksb/HEAD/img/actions/7点击build.jpg -------------------------------------------------------------------------------- /img/actions/1点击fork按钮.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yann-zhou/zzu_auto_jksb/HEAD/img/actions/1点击fork按钮.jpg -------------------------------------------------------------------------------- /img/actions/3settings界面.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yann-zhou/zzu_auto_jksb/HEAD/img/actions/3settings界面.jpg -------------------------------------------------------------------------------- /img/actions/4secrets界面.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yann-zhou/zzu_auto_jksb/HEAD/img/actions/4secrets界面.jpg -------------------------------------------------------------------------------- /img/actions/6查看workflow.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yann-zhou/zzu_auto_jksb/HEAD/img/actions/6查看workflow.jpg -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # python版本,可根据需求进行修改 2 | FROM python:3.8-alpine3.15 3 | RUN mkdir /code 4 | # 将python程序添加到镜像 5 | ADD ./*.py /code/ 6 | # 将项目依赖添加到镜像 7 | ADD requirements.txt /code/ 8 | WORKDIR /code 9 | RUN pip install -i https://mirrors.aliyun.com/pypi/simple/ -U pip && \ 10 | pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ && \ 11 | pip install -r requirements.txt 12 | # 设置该项以忽略证书错误(alpine镜像内不存在该文件,暂时舍弃该命令) 13 | # RUN sed -i -E 's/MinProtocol[=\ ]+.*/MinProtocol = TLSv1.0/g' /etc/ssl/openssl.cnf 14 | 15 | # 调整时间 16 | ENV TZ=Asia/Shanghai \ 17 | DEBIAN_FRONTEND=noninteractive 18 | 19 | # 镜像运行时执行的命令,这里的配置等于运行 python timer.py 20 | ENTRYPOINT ["python","timer.py"] -------------------------------------------------------------------------------- /timer.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | import time 3 | from apscheduler.schedulers.blocking import BlockingScheduler 4 | from parameter import jksb_timer, logger_level 5 | import jksb 6 | import logging 7 | 8 | logging.basicConfig(level=logger_level, format='%(asctime)s - %(name)s - [%(levelname)s] - %(message)s') 9 | logger = logging.getLogger('jksb_timer') 10 | 11 | 12 | def run_jksb(): 13 | jksb.run() 14 | 15 | 16 | if __name__ == '__main__': 17 | schedular = BlockingScheduler() 18 | time_list = eval(jksb_timer) 19 | for idt, t in enumerate(time_list): 20 | schedular.add_job(run_jksb, "cron", hour=t[0], minute=t[1], jitter=t[2]) 21 | logger.info("已添加第"+str(idt+1)+"个计划任务,预计在"+str(t[0])+"时"+str(t[1])+"分打卡,随机偏移量为"+str(t[2])+"秒") 22 | schedular.start() 23 | -------------------------------------------------------------------------------- /Dockerfile_arm: -------------------------------------------------------------------------------- 1 | # python版本,可根据需求进行修改 2 | FROM python:3.8-alpine3.15 3 | RUN mkdir /code 4 | # 将python程序添加到镜像 5 | ADD ./*.py /code/ 6 | # 将项目依赖添加到镜像 7 | ADD requirements.txt /code/ 8 | WORKDIR /code 9 | RUN apk --update add libxml2-dev libxslt-dev libffi-dev gcc musl-dev libgcc openssl-dev curl && \ 10 | apk add jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev 11 | RUN pip install -i https://mirrors.aliyun.com/pypi/simple/ -U pip && \ 12 | pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ && \ 13 | pip install -r requirements.txt 14 | # 设置该项以忽略证书错误(alpine镜像内不存在该文件,暂时舍弃该命令) 15 | # RUN sed -i -E 's/MinProtocol[=\ ]+.*/MinProtocol = TLSv1.0/g' /etc/ssl/openssl.cnf 16 | 17 | # 调整时间 18 | ENV TZ=Asia/Shanghai \ 19 | DEBIAN_FRONTEND=noninteractive 20 | 21 | # 镜像运行时执行的命令,这里的配置等于运行 python timer.py 22 | ENTRYPOINT ["python","timer.py"] -------------------------------------------------------------------------------- /.github/workflows/build_docker_image.yml: -------------------------------------------------------------------------------- 1 | name: Build Docker Image 2 | on: 3 | push: 4 | branches: 5 | - master 6 | 7 | env: 8 | APP_NAME: zzu_auto_jksb 9 | DOCKERHUB_REPO: yannzhou/zzu_auto_jksb 10 | 11 | jobs: 12 | build: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Checkout 16 | uses: actions/checkout@v2 17 | - name: Set up QEMU 18 | uses: docker/setup-qemu-action@v1 19 | - name: Set up Docker Buildx 20 | uses: docker/setup-buildx-action@v1 21 | - name: Login to DockerHub 22 | uses: docker/login-action@v1 23 | with: 24 | username: ${{ secrets.DOCKERHUB_USERNAME }} 25 | password: ${{ secrets.DOCKERHUB_TOKEN }} 26 | - name: Build and push amd64/arm64 Docker Image 27 | id: docker_build 28 | uses: docker/build-push-action@v2 29 | with: 30 | push: true 31 | platforms: | 32 | linux/amd64 33 | linux/arm64/v8 34 | build-args: | 35 | APP_NAME=${{ env.APP_NAME }} 36 | APP_VERSION=${{ env.APP_VERSION }} 37 | tags: | 38 | ${{ env.DOCKERHUB_REPO }}:latest 39 | # - name: Build and push arm64 Docker image 40 | # run: docker buildx build --file ./Dockerfile_arm --platform linux/arm64/v8 -t yannzhou/zzu_auto_jksb:arm64 . --push -------------------------------------------------------------------------------- /.github/workflows/jksb_schedule.yml: -------------------------------------------------------------------------------- 1 | name: Start jksb 2 | 3 | on: 4 | workflow_dispatch: 5 | schedule: 6 | - cron: '05 16,17,23 * * *' 7 | 8 | jobs: 9 | build: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v2 13 | - name: Set up Python 3.8 14 | uses: actions/setup-python@v2 15 | with: 16 | python-version: 3.8 17 | - name: Install dependencies 18 | run: | 19 | python -m pip install --upgrade pip 20 | if [ -f requirements.txt ]; then pip install -r requirements.txt; fi 21 | - name: Start zzu_auto_jksb 22 | env: 23 | jksb_username: ${{ secrets.jksb_username }} 24 | jksb_password: ${{ secrets.jksb_password }} 25 | jksb_code_province: ${{ secrets.jksb_code_province }} 26 | jksb_code_city: ${{ secrets.jksb_code_city }} 27 | jksb_location: ${{ secrets.jksb_location }} 28 | jksb_vaccine: ${{ secrets.jksb_vaccine }} 29 | jksb_jingdu: ${{ secrets.jksb_jingdu }} 30 | jksb_weidu: ${{ secrets.jksb_weidu }} 31 | jksb_send_type: ${{ secrets.jksb_send_type }} 32 | jksb_send_parameter: ${{ secrets.jksb_send_parameter }} 33 | jksb_baidu_API_Key: ${{ secrets.jksb_baidu_API_Key }} 34 | jksb_baidu_Secret_Key: ${{ secrets.jksb_baidu_Secret_Key }} 35 | jksb_zhb_parameter: ${{ secrets.jksb_zhb_parameter }} 36 | run: | 37 | python jksb.py -------------------------------------------------------------------------------- /parameter.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import os 3 | 4 | # 获取需要的各个参数 5 | username = os.getenv('jksb_username') 6 | password = os.getenv('jksb_password') 7 | code_province = os.getenv('jksb_code_province') 8 | code_city = os.getenv('jksb_code_city') 9 | location = os.getenv('jksb_location') 10 | vaccine = os.getenv('jksb_vaccine') 11 | jingdu = os.getenv('jksb_jingdu') 12 | weidu = os.getenv('jksb_weidu') 13 | send_type = os.getenv('jksb_send_type') # send_type可选bark,serverchan,email 14 | send_parameter = os.getenv('jksb_send_parameter') # send_type为email时,send_parameter应为json字符串,格式为:{"host": "smtp服务器地址", "user": "邮箱登录名", "password": "邮箱密码", "receiver": "接收邮件的邮箱"} 15 | zhb_parameter = os.getenv('jksb_zhb_parameter') 16 | logger_level = os.getenv('jksb_logger_level') 17 | jksb_timer = os.getenv('jksb_timer') 18 | # baidu_API_Key = os.getenv("jksb_baidu_API_Key") 19 | # baidu_Secret_Key = os.getenv("jksb_baidu_Secret_Key") 20 | 21 | # 检查参数是否都有值 22 | if username is None: 23 | raise Exception("参数jksb_username无值") 24 | if password is None: 25 | raise Exception("参数jksb_password无值") 26 | if code_province is None: 27 | raise Exception("参数jksb_code_province无值") 28 | if code_city is None: 29 | raise Exception("参数jksb_code_city无值") 30 | if location is None: 31 | raise Exception("参数jksb_location无值") 32 | if vaccine is None: 33 | raise Exception("参数jksb_vaccine无值") 34 | if jingdu is None: 35 | raise Exception("参数jksb_jingdu无值") 36 | if weidu is None: 37 | raise Exception("参数jksb_weidu无值") 38 | if send_type is None: 39 | raise Exception("参数jksb_send_type无值") 40 | if send_parameter is None: 41 | raise Exception("参数jksb_send_parameter无值") 42 | # if baidu_API_Key is None: 43 | # raise Exception("参数jksb_baidu_API_Key无值") 44 | # if baidu_Secret_Key is None: 45 | # raise Exception("参数jksb_baidu_Secret_Key无值") 46 | 47 | # 设置日志等级 48 | if logger_level == 'DEBUG': 49 | logger_level = logging.DEBUG 50 | elif logger_level == 'WARNING': 51 | logger_level = logging.WARNING 52 | elif logger_level == 'ERROR': 53 | logger_level = logging.ERROR 54 | elif logger_level == 'INFO': 55 | logger_level = logging.CRITICAL 56 | else: 57 | logger_level = logging.INFO 58 | 59 | 60 | url_login = 'https://jksb.v.zzu.edu.cn/vls6sss/zzujksb.dll/login' 61 | header = { 62 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36', 63 | 'Content-Type': 'application/x-www-form-urlencoded', 64 | } 65 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | --- 2 | ### 由于国家政策的调整以及学校相关措施的落实,现在学校已不进行每日打卡,该项目从2022年12月25日起停止更新,希望大家做好防护,祝大家有一个健康强健的身体,有缘再见! 3 | 4 | --- 5 | 6 | # ZZU_auto_jksb 7 | 8 | [](https://github.com/Yann-zhou/zzu_auto_jksb/actions/workflows/build_docker_image.yml) 9 |  10 |  11 |  12 | 13 | ## 一、项目简介 14 | 15 | 该项目可以帮助你自动进行每日健康上报,项目使用python作为后台,只需简单配置即可自动运行,已添加docker与GitHub Actions支持 16 | 如果有可以长时间开机的服务器或者可以使用docker的软路由或树莓派,**强烈建议**您使用docker模式进行打卡,学校后台会记录打卡机器的IP地址,如果使用GitHub Actions的话,IP地址会显示在国外,使用docker就不会有这个问题了。 17 | 18 | **如果觉得本项目不错的话,请watch本项目及时获取更新** 19 | 20 | --- 21 | ### 更新日志 22 | 23 | - 2022.12.25 停止项目的所有功能 24 | - 2022.11.27 更新打卡系统参数名称 25 | - 2022.09.09 打卡系统删除了验证码 26 | - 2022.09.07 打卡系统验证码变更为了手写汉字,增加对应的手写汉字识别功能 27 | - 2022.09.06 打卡系统添加汉语验证码,添加汉语大写数字识别功能 28 | - 2022.09.04 打卡系统添加了验证码,使用百度云API进行在线识别,[百度云API获取教程](#2) 29 | 30 | --- 31 | 32 | ## 二、使用方法 33 | ### 1. 直接调用原始文件 34 | (1) 将以下值加入系统环境变量 35 | ``` 36 | jksb_username 健康上报系统中的用户名 37 | jksb_password 健康上报系统中的密码 38 | jksb_code_province 当前所在省份代码(河南为41) 39 | jksb_code_city 当前所在城市代码(郑州为4101) 40 | jksb_location 当前所在地详细地址 41 | jksb_vaccine 疫苗接种情况 42 | jksb_jingdu 当前所在地经度 43 | jksb_weidu 当前所在地纬度 44 | jksb_send_type 后续通知方法类型(可选bark,serverchan,email) 45 | jksb_send_parameter 根据send_type进行选择, 46 | send_type为bark时,该项为推送URL, 47 | send_type为serverchan时,该项为SCT开头的sendkey 48 | send_type为email时,该项格式为:{"host": "smtp服务器地址", "user": "邮箱登录名", "password": "邮箱密码", "receiver": "接收邮件的邮箱"} 49 | jksb_baidu_API_Key (已废弃,不要使用该参数)百度手写文字识别APIKey 50 | jksb_baidu_Secret_Key (已废弃,不要使用该参数)百度手写文字识别SecretKey 51 | jksb_zhb_parameter (已废弃,不要使用该参数)郑好办核酸检测查询抓包内容,留空则默认将“昨天是否进行过核酸检测”项填写为“做了” 52 | jksb_logger_level (可选)日志等级 53 | ``` 54 | 参数填写规则请参考[参数填写详细规则](#1) 55 | 56 | (2) 调用jksb.py中的run方法即可运行 57 | 58 | ### 2. 使用docker容器 59 | 本项目已构建完成amd64与适用于树莓派4B的armv8架构的docker镜像,使用以下命令可以启动docker容器 60 | 61 | 参数填写规则请参考[参数填写详细规则](#1) 62 | ```bash 63 | docker run -d -e jksb_username=学号 \ 64 | -e jksb_password=密码 \ 65 | -e jksb_code_province=省份代码 \ 66 | -e jksb_code_city=城市代码 \ 67 | -e jksb_location=位置信息 \ 68 | -e jksb_vaccine=疫苗情况 \ 69 | -e jksb_jingdu=所在地经度 \ 70 | -e jksb_weidu=所在地纬度 \ 71 | -e jksb_send_type=通知类型 \ 72 | -e jksb_send_parameter=通知参数 \ 73 | -e jksb_timer=运行时间 \ 74 | --restart always \ 75 | yannzhou/zzu_auto_jksb:latest 76 | ``` 77 | 如您想自己构建docker镜像: 78 | 79 | 本仓库内已集成dockerfile,在仓库根目录执行以下命令即可自动构建docker镜像 80 | ```bash 81 | docker build -t 镜像名:版本号 . 82 | ``` 83 | > 注意命令最后有一个点 84 | 85 | 构建完成后,按照“直接调用原始文件”部分提到的参数列表在docker的运行命令内或yaml文件内加入相应的环境变量即可 86 | 87 | ### 3. 使用GitHub Actions 88 | 本仓库内已集成GitHub Actions配置文件,您只需Fork本仓库后配置以下Secrets即可在每日0点5分、1点5分、7点5分进行自动打卡 89 | 90 | 参数填写规则请参考[参数填写详细规则](#1) 91 | ``` 92 | jksb_username: 学号 93 | jksb_password: 密码 94 | jksb_code_province: 省份代码 95 | jksb_code_city: 城市代码 96 | jksb_location: 具体地址 97 | jksb_vaccine: 疫苗情况 98 | jksb_jingdu: 经度 99 | jksb_weidu: 纬度 100 | jksb_send_type: 通知类型 101 | jksb_send_parameter: 通知参数 102 | jksb_baidu_API_Key: (已废弃,不要使用该参数)百度手写文字识别APIKey 103 | jksb_baidu_Secret_Key: (已废弃,不要使用该参数)百度手写文字识别SecretKey 104 | zhb_parameter: (已废弃,不要使用该参数)郑好办查询参数 105 | ``` 106 | --- 107 | 108 | #### GitHub Actions配置教程 109 | 1. 首先fork本项目 110 |  111 | 2. 确认fork操作 112 |  113 | 3. 添加secret 114 |  115 | 4. 重复执行该步骤直到所有变量均已添加 116 |  117 | 5. 最终添加后的结果 118 |  119 | 120 | #### 查看GitHub Actions日志 121 | 1. 打开Actions页面 122 |  123 | 2. 打开具体的job 124 |  125 | 3. 打开详细日志 126 |  127 | 128 | --- 129 | 130 |
131 | 132 | ## 参数填写详细规则 133 | - jksb_username: 学号 134 | - jksb_password: 密码 135 | - jksb_code_province:所在地身份证号编码的前两位 136 | - jksb_code_city:所在地身份证号编码的前四位 137 | (例如人在河南郑州就是jksb_code_province=41,jksb_code_city=4101) 138 | - jksb_location:填写实际地址 139 | - jksb_vaccine:按照以下情况填写数字1~5 140 | (1: 接种一针,2: 接种两针,3:尚未接种,4:有禁忌症无法接种,5:接种三针) 141 | - jksb_jingdu与jksb_weidu:在这个网站中拾取经纬度后填入即可:https://jingweidu.bmcx.com/ 142 | - jksb_send_type:共有三种:{email, serverchan, bark},配置该参数的目的是在打卡完成后给您发送通知,请尽量使用serverchan方式进行通知,出错概率较低。 143 | - jksb_send_parameter:与上一项搭配使用。 144 | send_type为bark时,该项为推送URL, 145 | send_type为serverchan时,该项为SCT开头的sendkey 146 | send_type为email时,该项格式为:{"host": "smtp服务器地址", "user": "邮箱登录名", "password": "邮箱授权码", "receiver": "接收邮件的邮箱"} 147 | *例如当您使用sereverchan模式时,jksb_send_type=serverchan, jksb_send_parameter=SCTxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx* 148 | *当您使用email模式时,jksb_send_type=email, jksb_send_parameter={"host": "smtp.163.com", "user": "example@163.com, "password": "yourIdentifyCode", "receiver": "example@163.com"}* 149 | - ~~zhb_parameter相关参数:默认情况下,脚本会将核酸检测情况填写为“做了”,如您想自动采集核酸检测信息,请使用fiddler抓取您使用手机扫描任一场所码时对URL `https://unified-area-code-n-service.jianguan.henan.gov.cn/nucleicapi/nucvac/info` 发送的请求中"param"项的参数填到此处即可。~~ 150 | - ~~jksb_baidu_API_Key:百度手写文字识别APIKey~~ 151 | ~~jksb_baidu_Secret_Key:百度手写文字识别SecretKey~~ 152 | 153 | 154 | --- 155 | 156 | 157 | #### 百度云API获取教程 158 | 1. 注册并登录百度智能云平台