我們開發(fā)的項(xiàng)目為了安全,密碼都是臨時(shí)生成的进副,需要老師登陸網(wǎng)站獲取这揣,每次登陸挺麻煩的,我覺得這個(gè)過程可以自動(dòng)化去做影斑。
需要做的事情有自動(dòng)登陸给赞,自動(dòng)獲取密碼,也可以自動(dòng)發(fā)到釘釘群里矫户。
自動(dòng)登陸因?yàn)橛袌D形驗(yàn)證碼在片迅,不是很好做,所以我換了一種方式皆辽,登錄后獲取cookie保存下來柑蛇,通過定時(shí)的請(qǐng)求來刷新session和cookie生效時(shí)間,只要保證一定頻率的請(qǐng)求就永遠(yuǎn)不會(huì)失效驱闷。
自動(dòng)獲取密碼有對(duì)應(yīng)的接口耻台,剩下的就是自動(dòng)發(fā)到釘釘群里了,其實(shí)這個(gè)也簡單空另,釘釘群有機(jī)器人盆耽,可以通過一個(gè)webhook來發(fā)送消息給機(jī)器人,機(jī)器人發(fā)到群里扼菠,還可以@某些人摄杂,支持markdown,鏈接循榆,文字等析恢。
接下來工作很明了,使用axios發(fā)請(qǐng)求秧饮,使用cheerio解析dom映挂,然后通過webhook來吧密碼轉(zhuǎn)發(fā)到群里。同時(shí)為了保證cookie的有效性浦楣,會(huì)定時(shí)刷新袖肥,機(jī)器人最多一分鐘20條消息,我把時(shí)間間隔定在了10秒振劳。
還有一個(gè)問題是臨時(shí)密碼的有效期是24小時(shí)椎组,我本來想找到生成密碼的接口,一旦獲取不到历恐,就刷新寸癌,然后在獲取专筷。但是生成密碼的接口沒找到,就暫時(shí)只做到了這樣蒸苇,可以獲取磷蛹,如果失效了再手動(dòng)去生成下。以后會(huì)考慮優(yōu)化溪烤。
代碼24小時(shí)跑在服務(wù)器上味咳。
代碼如下(保密數(shù)據(jù)隱藏了):
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: '生成臨時(shí)密碼'
});
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('臨時(shí)密碼:' + $('#resText').text());
sendMessageToRobot("臨時(shí)密碼:" + $('#resText').text());
}).catch((err) => {
console.log(chalk.red(err));
});
},10000,0);