首页 > 其他分享 >中科大每日健康打卡平台的自动打卡脚本

中科大每日健康打卡平台的自动打卡脚本

时间:2023-01-15 14:55:36浏览次数:55  
标签:脚本 中科大 url self json post data 打卡

健康打卡脚本

基本就是复现该大佬的工作,这是博客用Python实现中科大健康打卡脚本 - 逸風亭 (fyz666.xyz)

这是GitHub源码库GitHub - windshadow233/USTC-Auto-Health-Report: 基于Python requests库的中科大健康打卡脚本

但是他可能没有把细节问题说清楚,也没有一个明确的流程来进行复现,并且可能有些地方没有更新,所以这里重新整理一下,让更多人可以更快的实现脚本自动打卡。

大佬基本把路都铺平了,所以我就把不同点、需要更改的接口和具体实现流程记录下,只要按照以下步骤操作就可以做到一键打卡了,如果你有一个服务器还可以实现全天候自动打卡。

步骤流程:

  1. Beautiful Soup4 和 requests 库的安装;
  2. 需要的文件的准备;
  3. 脚本一键打卡;

依赖库的安装

  1. 终端输入 pip install beautifulsoup4 安装Beautiful Soup4;
  2. 终端输入 pip install requests 安装requests库;

准备文件

json表单文件:

该文件包含需要提交的表单内容,是分析打卡过程中得到的需要提交的表单,大佬的代码里的表单内容是很久之前的表单了,这里更新了一下,原理都是一样的。

post.json

{
    "juzhudi": "西校区",
    "dorm_building": "1",
    "dorm": "110",
    "body_condition": "1",
    "body_condition_detail": "" ,
    "has_fever": "0",
    "last_touch_sars": "0",
    "last_touch_sars_date": "" ,
    "last_touch_sars_detail": "" ,
    "is_danger": "0",
    "is_goto_danger": "0",
    "jinji_lxr": "我",
    "jinji_guanxi": "父子",
    "jiji_mobile": "18854081208",
    "other_detail": "" 
}

注意更改你的居住地、宿舍号、紧急联系人和联系方式的内容。

如果现在在家里,需要提交的表单内容就不同了,可以参考以下表单进行提交:

post_home.json

{
    "juzhudi": "xx省xx市xx区",
    "q_0": "良好",
    "body_condition_detail": "" ,
    "q_2": "" ,
    "q_3": "" ,
    "jinji_lxr": "紧急联系人" ,
    "jinji_guanxi": "父子",
    "jiji_mobile": "18854081208",
    "other_detail": "" 
}

上面两个表单是每日打卡所提交的,而我们也许还想要一键把出校报备也实现,所以再增加一个json文件来存储报备需要的表单信息。

transport.json

{
    "return_college[]": "东校区",
    "reason": "科研工作",
    "comment": "",
    "t": "3"
}

这个也可以改一下去的校区和工作目的。

上述的表单如果发生了变化,则需要在浏览器中重新查找提交的表单,在开发者模式看提交了哪些内容。


`ustc_passport_login.py`

定义了登录的类,被下一个python文件使用

import requests
from bs4 import BeautifulSoup


class USTCPassportLogin(object):
    def __init__(self):
        self.passport = "https://passport.ustc.edu.cn/login"
        self.sess = requests.session()
        self.sess.headers = {
            "User-Agent": 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36'
        }

    def _get_cas_lt(self):
        """
        获取登录时需要提供的验证字段
        """
        response = self.sess.get(self.passport)
        CAS_LT = BeautifulSoup(response.text, 'html.parser').find(attrs={'id': 'CAS_LT'}).get('value')
        return CAS_LT

    def login(self, username, password):
        """
        登录,需要提供用户名、密码
        """
        self.sess.cookies.clear()
        try:
            CAS_LT = self._get_cas_lt()
            login_data = {
                'username': username,
                'password': password,
                'warn': '',
                'CAS_LT': CAS_LT,
                'showCode': '',
                'button': '',
                'model': 'uplogin.jsp',
                'service': ''
            }

            self.sess.post(self.passport, login_data, allow_redirects=False)
            return self.sess.cookies.get("logins") is not None
        except Exception as e:
            print(e)
            return False

不需要更改

ustc_auto_report.py

登录使用的类,我将每日健康打卡(还有报备)的步骤也添加进去了,使用里面的函数方法即可实现一键打卡。

这里我遇到了一个文件打开的编码问题,如果你的编码方式是UTF-8,那就不需要修改,如果不是就需要更改一下文件打开的时候的编码方式。

import json
from bs4 import BeautifulSoup
import datetime
from ustc_passport_login import USTCPassportLogin

class USTCAutoHealthReport(object):
    def __init__(self):
        # 用于登录
        self.login_bot = USTCPassportLogin()
        self.sess = self.login_bot.sess
        # CAS身份认证url
        self.cas_url = 'https://passport.ustc.edu.cn/login?service=https%3A%2F%2Fweixine.ustc.edu.cn%2F2020%2Fcaslogin'
        # 打卡url
        self.clock_in_url = 'https://weixine.ustc.edu.cn/2020/daliy_report'
        # 每周报备url
        self.report_url = 'https://weixine.ustc.edu.cn/2020/apply/daliy/ipost'
        # 图片上传get url
        self.upload_url = 'https://weixine.ustc.edu.cn/2020/upload/xcm'
        # 图片上传post url
        self.upload_image_url = 'https://weixine.ustc.edu.cn/2020img/api/upload_for_student'
        # 每日进出校申请url
        self.stayinout_apply_url = 'https://weixine.ustc.edu.cn/2020/stayinout_apply'
        # 身份认证token
        self.token = ''


    def _get_token(self):
        """
        获取打卡时需要提供的验证字段
        """
        response = self.sess.get(self.cas_url)
        s = BeautifulSoup(response.text, 'html.parser')
        token = s.find(attrs={'name': '_token'}).get('value')
        return token

    def _check_success(self, response):
        """
        简单check一下有没有成功打卡、报备
        """
        s = BeautifulSoup(response.text, 'html.parser')
        msg = s.select('.alert')[0].text
        return '成功' in msg

    def login(self, username, password):
        """
        登录,需要提供用户名、密码
        """
        self.token = ''
        is_success = self.login_bot.login(username, password)
        if is_success:
            self.token = self._get_token()
        return is_success

    def daily_clock_in(self, post_data_file):
        """
        打卡函数,需要提供包含表单内容的json文件
        打卡函数,需要提供包含表单内容的json文件(示例见post.json)
        打卡成功返回True,打卡失败返回False
        """
        try:
            with open(post_data_file, 'r', encoding='UTF-8') as f:
                post_data = json.loads(f.read())
            post_data['_token'] = self.token
            response = self.sess.post(self.clock_in_url, data=post_data)
            return self._check_success(response)
        except Exception as e:
            print(e)
            return False

    def report(self, data_file):
        """
        2022年3月18日起每日进出校申请
        出入校报备,需要提供包含表单内容的json文件(示例见report.json)
        申请成功返回True,申请失败返回False
        :param data_file表单数据文件
        """
        try:
            with open(data_file, 'r', encoding='UTF-8') as f:
                post_data = json.loads(f.read())
            now = datetime.datetime.now()
            post_data['_token'] = self.token
            post_data['start_date'] = now.strftime("%Y-%m-%d %H:%M:%S")
            post_data['end_date'] = now.strftime("%Y-%m-%d 23:59:59")
            response = self.sess.post(self.report_url, data=post_data)
            return self._check_success(response)

        except Exception as e:
            print(e)
            return False

report = USTCAutoHealthReport()
report.login('PB20220000', '666666')

#如果你在家
report.daily_clock_in('D:\\YourDirectoryHere\\post_home.json')

#如果你在学校
#report.daily_clock_in('D:\\YourDirectoryHere\\post.json')
#report.report('D:\\YourDirectoryHere\\transport.json')

这里需要更改最后几行,把login内容改为你的学号和密码,把打卡和报备的路径改为你存储json文件的路径。
注意!如果你在家就要注释掉另外两行防止产生问题!

脚本一键打卡

report.sh

#!/bin/bash
python ustc_auto_report.py

只要双击运行脚本文件就可以同时实现打卡和报备了!

问题是还要每天记得去点一下依然麻烦,有几种考量方式,一个是把打卡脚本添加进开机自启里,只要每次开机就会自动运行,但存在的问题是也许你可能一天都没打开过电脑,或者是开机的时候没联网导致打卡失败;

另一个方法是,如果你有服务器账号,就可以在服务器端配置以上的流程,并写一个每天循环提交的脚本来持续运行,为了防止可能出现的各种意外,比如服务器检修,所以每天打卡报备两次更加保险;

或者可以直接使用系统服务来执行定时任务,输入 crontab -e 修改crontab文件,并输入以下命令:

00 00,12 * * * python /directory/ustc_auto_report.py

保存之后服务器即可实现每天两次自动打卡了,省心省力b( ̄▽ ̄)d

标签:脚本,中科大,url,self,json,post,data,打卡
From: https://www.cnblogs.com/hhr346/p/17053487.html

相关文章

  • 中科大邮箱系统的附件上传的控件安装问题
    今天发现用邮箱上传附件的时候出现了附件大小的限制,超过48M的附件就会上传失败提示了不能使用拖拽上传,但是明明是用“添加附件”上传却依然是同样的提示,然后就注意到了......
  • shell 脚本if语句
    思路:判断/root/test/下是否有14这个文件,如果有.就拷贝到/home目录下例:#!/bin/bashif  [-f/root/test/14]||cp/root/test/14/home  then       echo......
  • 哪种编程语言更适合编写Selenium Web驱动程序脚本,Python还是Java?
    在本文中,我们将学习哪种编程语言更适合编写SeleniumWeb驱动程序脚本,Python或Java。从选项池中选择理想的编程语言可能很困难。Python,Java和Selenium都有自己的一套功能。越......
  • Python是一种编程语言还是简单的脚本语言?
    在本文中,我们将了解Python编程还是简单的脚本语言,什么是脚本语言以及脚本和编程语言之间的区别。GuidoVanRossum开发了Python,这是最著名的编程语言之一。Python因其清......
  • Javascript脚本运算符执行顺序对照表
    Javascript脚本运算符执行顺序对照表:在线查看Javascript脚本运算符执行优先级别 ​​窍门:Ctrl+F快速查找​​Javascript脚本运算符优先级,是描述在计算机计算表达式时执行......
  • PyTorch图像分类打卡
    本次学习的基本情况概述学习流程参考内容同济子豪兄的开源文档我的打卡内容......
  • Docker部署Java项目运行命令脚本
    项目名称x-schools-server部署教程cd/app/webapps/x-schools-server#全部移除cd/app/webapps/x-schools-serverdockerstop$(dockerps-aqf"name=x-schools-......
  • 使用powershell脚本自动安装程序的几种方法
    经常会遇到需要重复安装程序时,可以用脚本自动安装,避免不停按鼠标这种重复劳动。在不修改原版安装程序,尽量使用Windows自带脚本工具情况下,对于不同的安装包,有几种方法1.安......
  • nmap脚本详解
    nmap--script前言我们通过nmapscript来大幅扩展nmap的功能,nmap具有强大的脚本引擎NSE(NmapScriptingEngine),它允许用户编写(和共享)简单的脚本(使用lua编程语言)自动化各......
  • 2023/1/14 20221321杨渝学习打卡
    python学习学习链接:https://www.bilibili.com/video/BV14r4y1k7F9/?spm_id_from=333.999.0.0&vd_source=a989a1afa6cb8b6527dd9bf059d71439元组字典元组元组,英文为t......