index.js 5.4 KB

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