我们开发的项目为了安全,密码都是临时生成的,需要老师登陆网站获取,每次登陆挺麻烦的,我觉得这个过程可以自动化去做。
需要做的事情有自动登陆,自动获取密码,也可以自动发到钉钉群里。
自动登陆因为有图形验证码在,不是很好做,所以我换了一种方式,登录后获取cookie保存下来,通过定时的请求来刷新session和cookie生效时间,只要保证一定频率的请求就永远不会失效。
自动获取密码有对应的接口,剩下的就是自动发到钉钉群里了,其实这个也简单,钉钉群有机器人,可以通过一个webhook来发送消息给机器人,机器人发到群里,还可以@某些人,支持markdown,链接,文字等。
接下来工作很明了,使用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);
网友评论