1 Star 0 Fork 0

叶秋明 / autoYiBan

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
main.js 6.67 KB
一键复制 编辑 原始数据 按行查看 历史
叶秋明 提交于 2021-08-12 12:27 . update comment main.js
const puppeteer = require('puppeteer');
const axios = require("axios");
const fs = require('fs')
getConfig().then(config => {
// 获取用户的信息
let users = config.userInfos
for (let i = 0; i < users.length; i++) {
// 建立闭包,是使得若干的用户的提交操作可以独立进行,而不会相互干扰
(i => {
// 启动无头浏览器(没有界面的浏览器)
puppeteer.launch(
{
headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox'],
timeout: 60000
}
).then(async browser => {
try {
console.log(`当前用户:${await users[i].name}`);
// 创建新的标签页
const page = await browser.newPage();
// 配置页面的用户代理
await page.setUserAgent("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")
// 前往易班的页面并且等待跳转
await page.goto('https://c.uyiban.com/#/');
// 等待页面跳转成功
await page.waitForSelector("#oauth_uname_w", {
timeout: 60000
}).catch(err => {
console.log(err);
page.reload()
})
// 向页面输入用户名和密码
await page.type("#oauth_uname_w", users[i].username)
await page.type("#oauth_upwd_w", users[i].password)
// 点击登陆,设置点击的延迟,模仿真实用户点击
await page.click("button.oauth_check_login", {delay: 100})
// 获取页面的重要cookie
const cookies = await page.cookies("https://uyiban.com")
// 等待时间,因为服务器将cookie存到数据库需要一段时间
await page.waitForTimeout(6000)
// 获取未完成的任务列表
const completed_task_res = await getUncompletedTask(cookies).catch((err) => {
console.log(err);
})
const taskList = completed_task_res.data.data
await console.log(completed_task_res.data)
// 连续的向服务器提交任务信息
await repeat(0, j => j < taskList.length, (resolve, j) => {
if (Number.parseInt(taskList[j].StartTime) < Date.now()) {
submitTask(cookies, users[i].dataJson, taskList[j])
}
resolve()
}).catch(err => console.log(err))
await browser.close()
} catch (err) {
console.log(err);
} finally {
await browser.close()
}
}).catch(err => console.log(err)).finally(err => {
console.log(err);
}
);
})(i)
}
})
// 获取未完成的易班任务
async function getUncompletedTask(cookies) {
let phpsessid = parseCookies(cookies).phpsessid
let token = parseCookies(cookies).token
console.log(phpsessid);
console.log(token);
let endTime = `${new Date().getUTCFullYear()}-${new Date().getUTCMonth() + 1}-${new Date().getUTCDate()}`
let startTimeMills = new Date(endTime) - 1000 * 60 * 60 * 24 * 14
let startTime = `${new Date(startTimeMills).getUTCFullYear()}-${new Date(startTimeMills).getUTCMonth() + 1}-${new Date(startTimeMills).getUTCDate()}`
return axios.create({
baseURL: "https://api.uyiban.com",
headers: {
"Cookie": `PHPSESSID=${phpsessid}; csrf_token=${token};`,
"Origin": "https://app.uyiban.com"
},
method: "GET"
}).request({url: `/officeTask/client/index/uncompletedList?StartTime=${startTime}%2000%3A00&EndTime=${endTime}%2023%3A59&CSRF=${token}`})
}
// 解析cookie,获取其中的两个关键的cookie
function parseCookies(cookies) {
let phpsessid = ""
let token = ""
for (let cookie of cookies) {
if (cookie.name === 'PHPSESSID') {
phpsessid = cookie.value
continue
}
if (cookie.name === 'csrf_token') {
token = cookie.value
}
}
return {phpsessid, token}
}
// 连续进行异步操作
async function repeat(i, condition, func) {
if (condition(i)) {
new Promise(resolve => {
func(resolve, i)
}).then(() => {
repeat(i + 1, condition, func)
}).catch(err => {
console.log(err);
})
}
}
// 向易班的接口发送请求的基础配置
function requestYiBan(cookie) {
return axios.create({
baseURL: "https://api.uyiban.com",
headers: {
"Cookie": `PHPSESSID=${parseCookies(cookie).phpsessid}; csrf_token=${parseCookies(cookie).token}`,
"Origin": "https://app.uyiban.com",
"Content-Type": "application/x-www-form-urlencoded",
"sec-ch-ua": "",
"sec-ch-ua-mobile": "?1",
"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",
"Sec-Fetch-Site": "same-site",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Dest": "empty",
"Referer": "https://app.uyiban.com/",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9"
},
})
}
// 获取用户的信息文件
async function getConfig() {
try {
const data = fs.readFileSync('D:\\code\\YinBan\\src\\users.json', 'utf8');
// parse JSON string to JSON object
return JSON.parse(data)
} catch (err) {
console.log(`Error reading file from disk: ${err}`);
}
}
// 通过易班大的接口提交任务
function submitTask(cookie, dataJson, task) {
// console.log(task.TaskId,task.Title);
let extendJson = {
"TaskId": task.TaskId,
"title": "任务信息",
"content": [{"label": "任务名称", "value": task.Title}, {
"label": "发布机构", "value": "学生工作处"
}]
}
let data = `data=${encodeURIComponent(JSON.stringify(dataJson))}&extend=${encodeURIComponent(JSON.stringify(extendJson))}`
requestYiBan(cookie).post(`/workFlow/c/my/apply/4b7ff0829b85446271cbc41d1b880be4?CSRF=${parseCookies(cookie).token}`, data).then(res => {
console.log(res.data);
})
}
1
https://gitee.com/ye-qiuming/autoYiBan.git
git@gitee.com:ye-qiuming/autoYiBan.git
ye-qiuming
autoYiBan
autoYiBan
master

搜索帮助