const puppeteer = require('puppeteer'); const fs = require('fs'); let info; try { info = require('./config')(); } catch (e) { try { info = require('./config.example')(); } catch (e) { console.log("配置文件错误"); process.exit(); return; } } if (!info || !info[0] || !info[0][0] || !info[0][1] || info[0][0] === 'reply_info' || info[0][1] === 'sign') { console.log("配置文件错误"); process.exit(); return; } let infoOK = []; function getDate() { const now = new Date(); return now.getFullYear() + "-" + ((now.getMonth() + 1 < 10) ? "0" + (now.getMonth() + 1) : (now.getMonth() + 1)) + "-" + ((now.getDate() < 10) ? "0" + now.getDate() : now.getDate()); } async function interval() { const browser = await puppeteer.launch({ // headless: false, // 是否隐藏窗口(默认true) // defaultViewport: {width: 800, height: 600} // 截图大小 }); let lastDay = null; // 记录上一秒的日期 setInterval(async function () { const now = new Date(); const day = now.getDate(); const hour = now.getHours(); const min = now.getMinutes(); const sec = now.getSeconds(); if (lastDay !== null && lastDay !== day) { // 日期变动,清空数组 infoOK = []; } lastDay = day; if ((hour === 0 && min < 30) || (hour === 0 && min === 15 && sec <= 10) || hour >= 16) { return; } for (let i = 0, j = info.length; i < j; i++) { if (info[i] && info[i][0] && info[i][1] && !infoOK[i]) { infoOK[i] = true; try { await run(browser, info[i][0], info[i][1]); } catch (e) { console.log("[" + hour + " " + min + " " + sec + "]", i, e); setTimeout(function () { infoOK[i] = false; // 出错,一分钟后重试 }, 60000); // return; } } } }, 1000); } function sleep(time) { return new Promise(function (resolve) { setTimeout(function () { resolve(); }, time); }); } async function run(browser, replyInfo, sign) { return new Promise(async function (resolve, reject) { const page = await browser.newPage(); try { await page.goto("https://testmis.ssti.net.cn/xswxcs/?reply_info=" + replyInfo + "&sign=" + sign); } catch (e) { await page.close(); reject(e); return; } if (page.url().indexOf("https://open.weixin.qq.com/") !== -1) { await page.close(); reject("URL Error"); return; } try { await page.goto("https://testmis.ssti.net.cn/xswxcs/pages/Epidemic/EpidemicApply.aspx", {waitUntil: 'networkidle2'}); } catch (e) { await page.close(); reject(e); return; } if (page.url().indexOf("https://open.weixin.qq.com/") !== -1) { await page.close(); reject("URL Error"); return; } try { const msg = await page.$eval("#layui-m-layer0 .layui-m-layercont", el => el.innerText); if (msg.indexOf("每日开放时间为") !== -1) { await page.close(); reject("Time Error"); return; } } catch (e) { // 捕捉可能的eval错误 } let name; try { name = await page.$eval("#div2 input", el => el.value); } catch (e) { await page.close(); reject("Get Name Error"); return; } await page.on('response', async (response) => { if (response.url() === "https://testmis.ssti.net.cn/xswxcs/Api/MedicalObHandle.ashx?action=add") { const data = await response.json(); if (data["msg"].indexOf("成功") !== -1) { console.log(name + " 成功"); try { await page.screenshot({path: "img/" + name + "-" + getDate() + '.png'}); } catch (e) { // 捕捉可能的截图错误 } // await sleep(2000); await page.close(); resolve(); } else { console.log(name + " 失败:" + data["msg"]); await page.close(); reject(data["msg"]); } } else { // 不应该还有其他请求(也可能是提交URL发生改变) await page.close(); reject("Unknown URL: " + response.url()); } }); try { await page.click("#Apply_Epidemic"); } catch (e) { await page.close(); reject("Submit Error"); } // await sleep(2000); // await page.close(); // resolve(); }); } // 新建文件夹 function mkdir() { return new Promise(function (resolve, reject) { fs.mkdir("./img", (err) => { if (err && err.code !== 'EEXIST') { reject(err); } else { resolve(); } }); }); } // 初始化 async function init() { await mkdir(); interval(); } init();