AnnVoV / blog

24 stars 2 forks source link

来写个脚本定会议室 #25

Open AnnVoV opened 5 years ago

AnnVoV commented 5 years ago

思路

1.先找到预定会议室的接口,一般需要登录认证,看需要哪个cookie 2.退出登录,重新登录,看set-cookie 是在哪个response 里给的 3.如果入参没有什么加密的东西,比较简单的话那么直接通过这个接口发请求就可以了 4.如果入参比较复杂,自己比较难构造,那就使用puppeteer 模拟登录行为,最终拿到cookie

puppeteer + node-schedule

const request = require('request-promise-native');
const puppeteer = require('puppeteer');

const fakeLogin = async () => {
    const url = 'http://it.netease.com/meeting/index.html';
    const browser = await puppeteer.launch({});
    const page = await browser.newPage();
    await page.goto(url);
    await page.waitFor(1000);
    await page.type('#corp_id_for_corpid', 'name');
    await page.type('#corp_id_for_corppw', 'pass');
    await page.waitFor(1000);
    await page.click('#corp button');
    await page.waitFor(1000);
    await page.goto('http://it.netease.com/portal/security/getCurrentUserInfo.du');
    await page.waitFor(1000);
    return page.cookies();
};

async function setOrder(Cookie) {
   function getOrderDate() {
        const date = new Date();
        const year = date.getFullYear();
        const month = date.getMonth() + 1;
        const day = date.getDate();
        const fullSet = (val) => {
            return (val > 10) ? val : `0${val}`;
        };
        return `${year}-${fullSet(month)}-${fullSet(day)}`;
    }
    const date = getOrderDate();
    const options = {
        method: 'POST',
        uri: 'http://it.netease.com/portal/meeting/insertMeeting.du',
        headers: {
            Cookie,
        },
        body: {
            "subject": "code review",
            "content": "今天看谁的代码^_^",
            "meetingMembers": [
                {
                    "attendUser": "ann",
                    "attendUsername": "ann",
                },
            ],
            "sendPopoNow": true,
            "sendMailNow": false,
            "sendPopo": true,
            "sendMail": false,
            "roomId": 171,
            "location": "杭州-大厦",
            "roomName": "B楼-3F-No.xxx",
            "meetingTimelines": [
                {
                    date,
                    "start": 17,
                    "end": 19,
                },
            ],
        },
        json: true,
    };
    try {
        const rsData = await request(options);
        console.log(rsData);
    } catch (err) {
        console.log(err);
    }

}

module.exports = function () {
    fakeLogin()
    .then((cookieArr) => {
        const cookieObj = cookieArr[0];
        const cookieStr = `${cookieObj.name}=${cookieObj.value}`;
        setOrder(cookieStr);
    });
};
// 定时任务
const schedule = require('node-schedule');
const task = require('./meeting');

// 定义规则
let rule = new schedule.RecurrenceRule();
rule.dayOfWeek = 5;
rule.hour = 9;
rule.minute = 0;
rule.second = 0;

// 每周五早上9点执行任务
let job = schedule.scheduleJob(rule, () => {
    task();
});

执行

{
"scripts": {
    "start": "node schedule.js 2>&1 > ./logs &",
  },
}