易班打卡——自动填写健康日报

以下提交日报的内容已失效:可以去看https://gitee.com/ye-qiuming/nnu_yiban

分析

首先,要想使用浏览器登陆易班,我们需要一个特定的请求头.登陆时,易班中的js代码会对window.navigator进行检查设备是否为手机.登录过程通过简单的发送请求难以获取到Cookie,因为这其中有很多JS代码需要运行.所以应该使用无头浏览器获取到Cookie,之后在使用Cookie调用易班的接口.无头浏览器,笔者使用Python中的selenium,发送请求,笔者使用requests.

使用Chrome访问易班校本化

  1. 设置请求头
    用户代理字符串设置为Mozilla/5.0 (iPhone; CPU iPhone OS 14_7_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 yiban_iOS/5.0在这里插入图片描述2. 使用Chrome移动端体调试功能
    访问https://c.uyiban.com/#/在这里插入图片描述

接口获取

易班需要的user-agent的值为:
Mozilla/5.0 (iPhone; CPU iPhone OS 14_7_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 yiban_iOS/5.0

  1. 获取未完成任务:https://api.uyiban.com/officeTask/client/index/uncompletedList
    方法: GET
    参数:StartTime:2021-08-13,查询的起始日期,后面可以加上时间,
    参数:EndTime: 2021-08-27,查询的终止日期,后面可以加上时间.
    参数:CSRF:校验身份的参数,在易班的API都有
  2. 提交任务:https://api.uyiban.com/workFlow/c/my/apply/*****(这个跟的是工作流ID)
    方法:POST
    参数:CSRF:校验身份的参数,在易班的API都有,
    表单类型:“Content-Type”: “application/x-www-form-urlencoded”,
    提交的数据格式:data=日报的信息&extend(任务信息)
  3. 从具体的任务ID(task_id)获取工作流ID(workflow_id):https://api.uyiban.com/officeTask/client/index/detail
    方法:GET
    参数:TaskId:任务ID
    参数:CSRF:校验身份的字符串签名

实现相关类

import datetime
import json
import time
from urllib.parse import quote
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import requests


class YiBanHelper:
    def __init__(self, **args):
        # 使用用户名或密码或者cookie初始化,优先使用cookie
        assert ('phpsessid' and 'csrf_token' in args.keys()) or ('username' and 'password' in args.keys()), "参数错误"
        # 初始化未完成的任务
        self.uncompletedTasks = None
        # self.wf_id = ""
        if 'phpsessid' and 'csrf_token' in args.keys():
            self.cookie = {
   "phpsessid": args.get('phpsessid'), "csrf_token": args.get('csrf_token')}
            return
        elif 'username' and 'password' in args.keys():
            # 添加chrome的参数
            options = webdriver.ChromeOptions()
            # 使用无头模式
            options.add_argument('--headless')
            # 禁用GPU
            options.add_argument('--disable-gpu')
            # 添加请求头,这一项很重要
            options.add_argument(
                'user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 14_7_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, '
                'like Gecko) '
                'Mobile/15E148 yiban_iOS/5.0')

            # 或者  使用下面的设置, 提升速度
            options.add_argument('blink-settings=imagesEnabled=false')
            driver = webdriver.Chrome(executable_path="driver/chromedriver.exe", options=options)
            driver.get("https://c.uyiban.com/#/")
            # 等待出现指定的元素,最多等待10s
            WebDriverWait(driver, 10).until(
                lambda d: d.find_element_by_id("oauth_uname_w"))

            un = driver.find_element_by_id("oauth_uname_w")
            # 填写用户名和密码,点击登陆按钮
            un.send_keys(args.get('username'))
            password = driver.find_element_by_id("oauth_upwd_w")
            password.send_keys(args.get('password'))
            btn = driver.find_element_by_css_selector("button.oauth_check_login")
            btn.click()
            # 等待页面跳转完成
            WebDriverWait(driver, 10).until(
                lambda d: 
  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值