'use strict' const puppeteer = require('puppeteer'); const DataListen = require('./collectors/listen'); const MongoClient = require('mongodb').MongoClient; const axios = require('axios') const moment = require('moment') const fs = require('fs'); const os = require('os') // 'C://bauer_V2/input_image'; const username = '*****@zd-junhao.com'; const password = '*****'; (async () => { try { let onlyone = 0; let timers = 0; //定时器 let TOKEN = ''; let mongo = await MongoClient.connect('mongodb://admin:******@a.zd-junhao.com:63443/cutter?authSource=admin', { poolSize: 5 }); let data2 = await mongo.collection('bauerInfo') // 设备清单库 let data3 = await mongo.collection('DeviceRealStatus') //单独设备状态 let page = null; let browser = null; let allpages = null; await intBeaur() // 初始化 async function intBeaur() { page = null; onlyone = 0; timers = 0; TOKEN = ''; clearInterval(timers) if (allpages) clearInterval(allpages.timer) allpages = null; if (browser) await browser.close(); browser = null; browser = await puppeteer.launch({ headless: false,//不使用无头chrome模式 timeout: 0, defaultViewport: { width: 1920, height: 1180 } }); page = await BauerLogin(username, password) console.log('初始化完成'); page.on('response', getResponse); } // 监听设备列表请求获取token async function getResponse(response) { const url = response.url(); if (url.includes('/equipment/dashboard-equipment-list')) { try { onlyone++ if (onlyone == 3) { console.log('开始抓取', url); const responseData = await response.text(); const bauerMachines = JSON.parse(responseData); // 拿到token=>定时获取设备状态及报警信息 clearInterval(timers) const token = await response.request().headers().authorization await getDeviceInfo(token); // 更新数据库+打开其他页面 for (const [index, machine] of bauerMachines.entries()) { const number = machine.id; delete machine.id; let dbData = await data2.findOne({ number: number }); machine.number = number; if (dbData) { await data2.update({ number: number }, { $set: machine }); } else { await data2.insert(machine); } // 打开其他页面 await OpenOtherPage(machine, index, data3) } } } catch (error) { console.log('token监听错误', error); // 关闭浏览重来 fs.appendFileSync('devicelog.txt', JSON.stringify(error) + os.EOL); await intBeaur() } } } // 定时请求设备状态 async function getDeviceInfo(token) { TOKEN = token console.log('当前token', token); try { let datas = await mongo.collection('DeviceStatus') // 设备状态库 let data1 = await mongo.collection('bauerAlarms') //设备报警库 GetDeviceDb(TOKEN, datas, data1) timers = setInterval(async () => { await GetDeviceDb(TOKEN, datas, data1) }, 1000 * 60); } catch (error) { console.log('设备状态错误2', error); // 关闭浏览重来 fs.appendFileSync('devicelog.txt', JSON.stringify(error) + os.EOL); await intBeaur() } } // 设备状态抓取方法 async function GetDeviceDb(TOKEN, datas, data1) { try { // 获取设备状态 const db = await axios({ method: "GET", url: `https://api-webbgm.bauer.de/v1/equipment/dashboard-equipment-list?status_id=1`, headers: { 'Authorization': TOKEN } }) const nowtime = Date.now() for (let k = 0; k < db.data.length; k++) { const el = db.data[k]; const obj = { device_num: el.construction_number, status: el.status, time_minute: moment(nowtime).format('YYYY-MM-DD HH:mm'), time_day: moment(nowtime).format('YYYY-MM-DD'), time_day_long: moment(moment(nowtime).format('YYYY-MM-DD')).valueOf() } await datas.insert(obj) // 日志输出 fs.appendFileSync('devicelog.txt', JSON.stringify(obj) + os.EOL); } // 获取设备报警 const dblist = await axios({ method: "GET", url: `https://api-webbgm.bauer.de/v1/message/message-list`, headers: { 'Authorization': TOKEN } }) if (dblist.data && dblist.data.data.length) { console.log('有报警', dblist.data.data); for (let j = 0; j < dblist.data.data.length; j++) { const el = dblist.data.data[j]; el.timstamp = parseInt(new Date(el.date).getTime() / 1000); await data1.insert(el); } } else { console.log('无报警', dblist.data.data); } console.log('抓取设备状态', moment(nowtime).format('YYYY-MM-DD HH:mm')); } catch (error) { // 关闭浏览重来 console.log('设备状态错误3',error); } } // 新建页面登陆 async function BauerLogin(username, password) { const page = await browser.newPage(); // 登录直接进入监控的webbgm await page.goto('https://webbgm.bauer.de/login?lang=en', { timeout: 0 }); // 输入账号密码 await page.type('input[type="text"]', username, { delay: 100 }); await page.type('input[type="password"]', password, { delay: 100 }); await page.click('button[type="submit"]'); // 等待登录完成 await page.waitForNavigation({ timeout: 0 }); return page } // 打开其他页面 async function OpenOtherPage(machine, index, data3) { const newPage = await browser.newPage(); await newPage.goto('https://webbgm.bauer.de/equipment/' + machine.number + '/b-tronic', { timeout: 0 }) allpages = new DataListen(newPage, machine.construction_number, index, data3); } } catch (err) { console.log('程序错误', err); } })();