|
|
@@ -0,0 +1,126 @@
|
|
|
+const puppeteer = require('puppeteer');
|
|
|
+const fs = require('fs');
|
|
|
+
|
|
|
+
|
|
|
+//need: reply_info, sign
|
|
|
+//from url: https://testmis.ssti.net.cn/xswxcs/?reply_info=******&sign=******
|
|
|
+const info = [
|
|
|
+ ['reply_info', 'sign']
|
|
|
+];
|
|
|
+
|
|
|
+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();
|
|
|
+ if (lastDay === null) {
|
|
|
+ lastDay = day;
|
|
|
+ } else if (lastDay !== day) {
|
|
|
+ // 日期变动,清空数组
|
|
|
+ infoOK = [];
|
|
|
+ }
|
|
|
+ if ((hour === 0 && min <= 30) || 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(i, e);
|
|
|
+ setTimeout(function () {
|
|
|
+ infoOK[i] = false; // 出错,一分钟后重试
|
|
|
+ }, 60000);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, 1000);
|
|
|
+}
|
|
|
+
|
|
|
+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) {
|
|
|
+ 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) {
|
|
|
+ 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错误
|
|
|
+ }
|
|
|
+ const name = await page.$eval("#div2 input", el => el.value);
|
|
|
+ console.log(name);
|
|
|
+ await page.click("#Apply_Epidemic");
|
|
|
+ try {
|
|
|
+ await page.screenshot({path: "img/" + name + "-" + getDate() + '.png'});
|
|
|
+ } catch (e) {
|
|
|
+ // 捕捉可能的截图错误
|
|
|
+ }
|
|
|
+
|
|
|
+ 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();
|