index.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  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. const sec = now.getSeconds();
  27. if (lastDay === null) {
  28. lastDay = day;
  29. } else if (lastDay !== day) {
  30. // 日期变动,清空数组
  31. infoOK = [];
  32. }
  33. if ((hour === 0 && min < 30) || (hour === 0 && min === 30 && sec <= 30) || hour >= 16) {
  34. return;
  35. }
  36. for (let i = 0, j = info.length; i < j; i++) {
  37. if (info[i] && info[i][0] && info[i][1] && !infoOK[i]) {
  38. infoOK[i] = true;
  39. try {
  40. await run(browser, info[i][0], info[i][1]);
  41. } catch (e) {
  42. console.log("[" + hour + " " + min + " " + sec + "]", i, e);
  43. setTimeout(function () {
  44. infoOK[i] = false; // 出错,一分钟后重试
  45. }, 60000);
  46. // return;
  47. }
  48. }
  49. }
  50. }, 1000);
  51. }
  52. function sleep(time) {
  53. return new Promise(function (resolve) {
  54. setTimeout(function () {
  55. resolve();
  56. }, time);
  57. });
  58. }
  59. async function run(browser, replyInfo, sign) {
  60. return new Promise(async function (resolve, reject) {
  61. const page = await browser.newPage();
  62. try {
  63. await page.goto("https://testmis.ssti.net.cn/xswxcs/?reply_info=" + replyInfo + "&sign=" + sign);
  64. } catch (e) {
  65. await page.close();
  66. reject(e);
  67. return;
  68. }
  69. if (page.url().indexOf("https://open.weixin.qq.com/") !== -1) {
  70. await page.close();
  71. reject("URL Error");
  72. return;
  73. }
  74. try {
  75. await page.goto("https://testmis.ssti.net.cn/xswxcs/pages/Epidemic/EpidemicApply.aspx", {waitUntil: 'networkidle2'});
  76. } catch (e) {
  77. await page.close();
  78. reject(e);
  79. return;
  80. }
  81. if (page.url().indexOf("https://open.weixin.qq.com/") !== -1) {
  82. await page.close();
  83. reject("URL Error");
  84. return;
  85. }
  86. try {
  87. const msg = await page.$eval("#layui-m-layer0 .layui-m-layercont", el => el.innerText);
  88. if (msg.indexOf("每日开放时间为") !== -1) {
  89. await page.close();
  90. reject("Time Error");
  91. return;
  92. }
  93. } catch (e) {
  94. // 捕捉可能的eval错误
  95. }
  96. let name;
  97. try {
  98. name = await page.$eval("#div2 input", el => el.value);
  99. } catch (e) {
  100. await page.close();
  101. reject("Get Name Error");
  102. return;
  103. }
  104. await page.on('response', async (response) => {
  105. if (response.url() === "https://testmis.ssti.net.cn/xswxcs/Api/MedicalObHandle.ashx?action=add") {
  106. const data = await response.json();
  107. if (data["msg"].indexOf("成功") !== -1) {
  108. console.log(name + " 成功");
  109. try {
  110. await page.screenshot({path: "img/" + name + "-" + getDate() + '.png'});
  111. } catch (e) {
  112. // 捕捉可能的截图错误
  113. }
  114. // await sleep(2000);
  115. await page.close();
  116. resolve();
  117. } else {
  118. console.log(name + " 失败:" + data["msg"]);
  119. await page.close();
  120. reject(data["msg"]);
  121. }
  122. } else {
  123. // 不应该还有其他请求(也可能是提交URL发生改变)
  124. await page.close();
  125. reject("Unknown URL: " + response.url());
  126. }
  127. });
  128. try {
  129. await page.click("#Apply_Epidemic");
  130. } catch (e) {
  131. await page.close();
  132. reject("Submit Error");
  133. }
  134. // await sleep(2000);
  135. // await page.close();
  136. // resolve();
  137. });
  138. }
  139. // 新建文件夹
  140. function mkdir() {
  141. return new Promise(function (resolve, reject) {
  142. fs.mkdir("./img", (err) => {
  143. if (err && err.code !== 'EEXIST') {
  144. reject(err);
  145. } else {
  146. resolve();
  147. }
  148. });
  149. });
  150. }
  151. // 初始化
  152. async function init() {
  153. await mkdir();
  154. interval();
  155. }
  156. init();