以下提交日报的内容已失效:可以去看
https://gitee.com/ye-qiuming/nnu_yiban
分析
首先,要想使用浏览器登陆易班,我们需要一个特定的请求头.登陆时,易班中的js代码会对window.navigator进行检查设备是否为手机.登录过程通过简单的发送请求难以获取到Cookie,因为这其中有很多JS代码需要运行.所以应该使用无头浏览器获取到Cookie,之后在使用Cookie调用易班的接口.无头浏览器,笔者使用Python中的selenium,发送请求,笔者使用requests.
使用Chrome访问易班校本化
- 设置请求头
用户代理字符串设置为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
- 获取未完成任务:
https://api.uyiban.com/officeTask/client/index/uncompletedList
方法: GET
参数:StartTime:2021-08-13,查询的起始日期,后面可以加上时间,
参数:EndTime: 2021-08-27,查询的终止日期,后面可以加上时间.
参数:CSRF:校验身份的参数,在易班的API都有 - 提交任务:
https://api.uyiban.com/workFlow/c/my/apply/*****(这个跟的是工作流ID)
方法:POST
参数:CSRF:校验身份的参数,在易班的API都有,
表单类型:“Content-Type”: “application/x-www-form-urlencoded”,
提交的数据格式:data=日报的信息&extend(任务信息)
- 从具体的任务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: str(driver.current_url