index.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. const puppeteer = require('puppeteer');
  2. const fs = require('fs');
  3. //need: reply_info, sign
  4. //from url: https://testmis.ssti.net.cn/xswxcs/?reply_info=******&sign=******
  5. const info = [
  6. ['reply_info', 'sign']
  7. ];
  8. let infoOK = [];
  9. function getDate() {
  10. const now = new Date();
  11. return now.getFullYear() + "-" +
  12. ((now.getMonth() + 1 < 10) ? "0" + (now.getMonth() + 1) : (now.getMonth() + 1)) + "-" +
  13. ((now.getDate() < 10) ? "0" + now.getDate() : now.getDate());
  14. }
  15. async function interval() {
  16. const browser = await puppeteer.launch({
  17. // headless: false, // 是否隐藏窗口(默认true)
  18. // defaultViewport: {width: 800, height: 600} // 截图大小
  19. });
  20. let lastDay = null; // 记录上一秒的日期
  21. setInterval(async function () {
  22. const now = new Date();
  23. const day = now.getDate();
  24. const hour = now.getHours();
  25. const min = now.getMinutes();
  26. if (lastDay === null) {
  27. lastDay = day;
  28. } else if (lastDay !== day) {
  29. // 日期变动,清空数组
  30. infoOK = [];
  31. }
  32. if ((hour === 0 && min <= 30) || hour >= 16) {
  33. return;
  34. }
  35. for (let i = 0, j = info.length; i < j; i++) {
  36. if (info[i] && info[i][0] && info[i][1] && !infoOK[i]) {
  37. infoOK[i] = true;
  38. try {
  39. await run(browser, info[i][0], info[i][1]);
  40. } catch (e) {
  41. console.log(i, e);
  42. setTimeout(function () {
  43. infoOK[i] = false; // 出错,一分钟后重试
  44. }, 60000);
  45. return;
  46. }
  47. }
  48. }
  49. }, 1000);
  50. }
  51. async function run(browser, replyInfo, sign) {
  52. return new Promise(async function (resolve, reject) {
  53. const page = await browser.newPage();
  54. try {
  55. await page.goto("https://testmis.ssti.net.cn/xswxcs/?reply_info=" + replyInfo + "&sign=" + sign);
  56. } catch (e) {
  57. reject(e);
  58. return;
  59. }
  60. if (page.url().indexOf("https://open.weixin.qq.com/") !== -1) {
  61. await page.close();
  62. reject("URL Error");
  63. return;
  64. }
  65. try {
  66. await page.goto("https://testmis.ssti.net.cn/xswxcs/pages/Epidemic/EpidemicApply.aspx", {waitUntil: 'networkidle2'});
  67. } catch (e) {
  68. reject(e);
  69. return;
  70. }
  71. if (page.url().indexOf("https://open.weixin.qq.com/") !== -1) {
  72. await page.close();
  73. reject("URL Error");
  74. return;
  75. }
  76. try {
  77. const msg = await page.$eval("#layui-m-layer0 .layui-m-layercont", el => el.innerText);
  78. if (msg.indexOf("每日开放时间为") !== -1) {
  79. await page.close();
  80. reject("Time Error");
  81. return;
  82. }
  83. } catch (e) {
  84. // 捕捉可能的eval错误
  85. }
  86. const name = await page.$eval("#div2 input", el => el.value);
  87. console.log(name);
  88. await page.click("#Apply_Epidemic");
  89. try {
  90. await page.screenshot({path: "img/" + name + "-" + getDate() + '.png'});
  91. } catch (e) {
  92. // 捕捉可能的截图错误
  93. }
  94. await page.close();
  95. resolve();
  96. });
  97. }
  98. // 新建文件夹
  99. function mkdir() {
  100. return new Promise(function (resolve, reject) {
  101. fs.mkdir("./img", (err) => {
  102. if (err && err.code !== 'EEXIST') {
  103. reject(err);
  104. } else {
  105. resolve();
  106. }
  107. });
  108. });
  109. }
  110. // 初始化
  111. async function init() {
  112. await mkdir();
  113. interval();
  114. }
  115. init();