index.js 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. 'use strict'
  2. const puppeteer = require('puppeteer');
  3. const DataListen = require('./collectors/listen');
  4. const MongoClient = require('mongodb').MongoClient;
  5. const axios = require('axios')
  6. const moment = require('moment')
  7. const fs = require('fs');
  8. const os = require('os')
  9. // 'C://bauer_V2/input_image';
  10. const username = 'huanghao@zd-junhao.com';
  11. const password = 'ZJJH7890';
  12. (async () => {
  13. try {
  14. let onlyone = 0;
  15. let timers = 0; //定时器
  16. let TOKEN = '';
  17. let mongo = await MongoClient.connect('mongodb://admin:jhgk2020@a.zd-junhao.com:63443/cutter?authSource=admin', { poolSize: 5 });
  18. let data2 = await mongo.collection('bauerInfo') // 设备清单库
  19. let data3 = await mongo.collection('DeviceRealStatus') //单独设备状态
  20. let page = null;
  21. let browser = null;
  22. let allpages = null;
  23. await intBeaur()
  24. // 初始化
  25. async function intBeaur() {
  26. page = null;
  27. onlyone = 0;
  28. timers = 0;
  29. TOKEN = '';
  30. clearInterval(timers)
  31. if (allpages) clearInterval(allpages.timer)
  32. allpages = null;
  33. if (browser) await browser.close(); browser = null;
  34. browser = await puppeteer.launch({
  35. headless: false,//不使用无头chrome模式
  36. timeout: 0,
  37. defaultViewport: { width: 1920, height: 1180 }
  38. });
  39. page = await BauerLogin(username, password)
  40. console.log('初始化完成');
  41. page.on('response', getResponse);
  42. }
  43. // 监听设备列表请求获取token
  44. async function getResponse(response) {
  45. const url = response.url();
  46. if (url.includes('/equipment/dashboard-equipment-list')) {
  47. try {
  48. onlyone++
  49. if (onlyone == 3) {
  50. console.log('开始抓取', url);
  51. const responseData = await response.text();
  52. const bauerMachines = JSON.parse(responseData);
  53. // 拿到token=>定时获取设备状态及报警信息
  54. clearInterval(timers)
  55. const token = await response.request().headers().authorization
  56. await getDeviceInfo(token);
  57. // 更新数据库+打开其他页面
  58. for (const [index, machine] of bauerMachines.entries()) {
  59. const number = machine.id;
  60. delete machine.id;
  61. let dbData = await data2.findOne({ number: number });
  62. machine.number = number;
  63. if (dbData) {
  64. await data2.update({ number: number }, { $set: machine });
  65. } else {
  66. await data2.insert(machine);
  67. }
  68. // 打开其他页面
  69. await OpenOtherPage(machine, index, data3)
  70. }
  71. }
  72. } catch (error) {
  73. console.log('token监听错误', error);
  74. // 关闭浏览重来
  75. fs.appendFileSync('devicelog.txt', JSON.stringify(error) + os.EOL);
  76. await intBeaur()
  77. }
  78. }
  79. }
  80. // 定时请求设备状态
  81. async function getDeviceInfo(token) {
  82. TOKEN = token
  83. console.log('当前token', token);
  84. try {
  85. let datas = await mongo.collection('DeviceStatus') // 设备状态库
  86. let data1 = await mongo.collection('bauerAlarms') //设备报警库
  87. GetDeviceDb(TOKEN, datas, data1)
  88. timers = setInterval(async () => {
  89. await GetDeviceDb(TOKEN, datas, data1)
  90. }, 1000 * 60);
  91. } catch (error) {
  92. console.log('设备状态错误2', error);
  93. // 关闭浏览重来
  94. fs.appendFileSync('devicelog.txt', JSON.stringify(error) + os.EOL);
  95. await intBeaur()
  96. }
  97. }
  98. // 设备状态抓取方法
  99. async function GetDeviceDb(TOKEN, datas, data1) {
  100. try {
  101. // 获取设备状态
  102. const db = await axios({
  103. method: "GET",
  104. url: `https://api-webbgm.bauer.de/v1/equipment/dashboard-equipment-list?status_id=1`,
  105. headers: {
  106. 'Authorization': TOKEN
  107. }
  108. })
  109. const nowtime = Date.now()
  110. for (let k = 0; k < db.data.length; k++) {
  111. const el = db.data[k];
  112. const obj = {
  113. device_num: el.construction_number,
  114. status: el.status,
  115. time_minute: moment(nowtime).format('YYYY-MM-DD HH:mm'),
  116. time_day: moment(nowtime).format('YYYY-MM-DD'),
  117. time_day_long: moment(moment(nowtime).format('YYYY-MM-DD')).valueOf()
  118. }
  119. await datas.insert(obj)
  120. // 日志输出
  121. fs.appendFileSync('devicelog.txt', JSON.stringify(obj) + os.EOL);
  122. }
  123. // 获取设备报警
  124. const dblist = await axios({
  125. method: "GET",
  126. url: `https://api-webbgm.bauer.de/v1/message/message-list`,
  127. headers: {
  128. 'Authorization': TOKEN
  129. }
  130. })
  131. if (dblist.data && dblist.data.data.length) {
  132. console.log('有报警', dblist.data.data);
  133. for (let j = 0; j < dblist.data.data.length; j++) {
  134. const el = dblist.data.data[j];
  135. el.timstamp = parseInt(new Date(el.date).getTime() / 1000);
  136. await data1.insert(el);
  137. }
  138. } else {
  139. console.log('无报警', dblist.data.data);
  140. }
  141. console.log('抓取设备状态', moment(nowtime).format('YYYY-MM-DD HH:mm'));
  142. } catch (error) {
  143. // 关闭浏览重来
  144. console.log('设备状态错误3',error);
  145. }
  146. }
  147. // 新建页面登陆
  148. async function BauerLogin(username, password) {
  149. const page = await browser.newPage();
  150. // 登录直接进入监控的webbgm
  151. await page.goto('https://webbgm.bauer.de/login?lang=en', { timeout: 0 });
  152. // 输入账号密码
  153. await page.type('input[type="text"]', username, { delay: 100 });
  154. await page.type('input[type="password"]', password, { delay: 100 });
  155. await page.click('button[type="submit"]');
  156. // 等待登录完成
  157. await page.waitForNavigation({ timeout: 0 });
  158. return page
  159. }
  160. // 打开其他页面
  161. async function OpenOtherPage(machine, index, data3) {
  162. const newPage = await browser.newPage();
  163. await newPage.goto('https://webbgm.bauer.de/equipment/' + machine.number + '/b-tronic', { timeout: 0 })
  164. allpages = new DataListen(newPage, machine.construction_number, index, data3);
  165. }
  166. } catch (err) {
  167. console.log('程序错误', err);
  168. }
  169. })();