用爬虫+钉钉机器人来简化工作

我们开发的项目为了安全,密码都是临时生成的,需要老师登陆网站获取,每次登陆挺麻烦的,我觉得这个过程可以自动化去做。

需要做的事情有自动登陆,自动获取密码,也可以自动发到钉钉群里。

自动登陆因为有图形验证码在,不是很好做,所以我换了一种方式,登录后获取cookie保存下来,通过定时的请求来刷新session和cookie生效时间,只要保证一定频率的请求就永远不会失效。

自动获取密码有对应的接口,剩下的就是自动发到钉钉群里了,其实这个也简单,钉钉群有机器人,可以通过一个webhook来发送消息给机器人,机器人发到群里,还可以@某些人,支持markdown,链接,文字等。

详情见: https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.45484a97s4tZLA&treeId=257&articleId=105735&docType=1

接下来工作很明了,使用axios发请求,使用cheerio解析dom,然后通过webhook来吧密码转发到群里。同时为了保证cookie的有效性,会定时刷新,机器人最多一分钟20条消息,我把时间间隔定在了10秒。

还有一个问题是临时密码的有效期是24小时,我本来想找到生成密码的接口,一旦获取不到,就刷新,然后在获取。但是生成密码的接口没找到,就暂时只做到了这样,可以获取,如果失效了再手动去生成下。以后会考虑优化。

代码24小时跑在服务器上。

代码如下(保密数据隐藏了):

const axios = require('axios');
const chalk = require('chalk');
const cheerio = require('cheerio');


const http = axios.create({
    baseURL: 'http://xxx/',
    headers: {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Connection': 'keep-alive',
        'Cookie': "td_cookie=18446744073516097524; cloudwise_client_id=36e51b13-36ec-2435-92bf-cc43b54dd8a3; CAKEPHP=ktejrvcf56cf7e8m114j14g4q3; CW_Start=1537522907731",
        'Host': 'xxx.com',
        'Referer': 'http://xxx',
        'Upgrade-Insecure-Requests': 1,
        'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
     }
});

const httpGet = (url) => {
    return new Promise((resolve, reject) => {
        http.get(url).then((res) => {
            console.log(chalk.green('res:'), res.status);
            resolve(res.data);
        }).catch((...args) => {
            reject(...args);
        });
    })
}

const httpPost = (url, data) => {
    return new Promise((resolve, reject) => {
        http.post(url, data).then((res) => {
            console.log(chalk.green('res:'), res.status);
            resolve(res.data);
        }).catch((...args) => {
            reject(...args);
        });
    })
}

const queryTempPassword = () => httpGet('/getPasssSuccess');

const generateTempPassword = () => httpPost('/randomPassword', {
    send: '生成临时密码'
});

const sendMessageToRobot = (msg) => {
    axios({
        url:'https://oapi.dingtalk.com/robot/send?access_token=XXXXX',
        method: 'post',
        data: {
            "msgtype": "text",
            "text": {
                "content": msg
            }
        }
    }).then((res) =>{
        console.log(res.data);
    })
}

setInterval(() => {
    queryTempPassword().then((data) => {
        const $ = cheerio.load(data);
        console.log('临时密码:' + $('#resText').text());
        sendMessageToRobot("临时密码:" + $('#resText').text());
    }).catch((err) => {
        console.log(chalk.red(err));
    });
},10000,0);

你可能感兴趣的:(用爬虫+钉钉机器人来简化工作)