美文网首页
用爬虫+钉钉机器人来简化工作

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

作者: 凌霄光 | 来源:发表于2018-09-21 21:02 被阅读660次

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

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

    自动登陆因为有图形验证码在,不是很好做,所以我换了一种方式,登录后获取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);
    
    

    相关文章

      网友评论

          本文标题:用爬虫+钉钉机器人来简化工作

          本文链接:https://www.haomeiwen.com/subject/vdiznftx.html