Commit a3e6b3aa by huangchao
parents 6ec3aab0 c209fe6f
let version = '1.0'
let release = `<div><br/>
<br/>1. <br/>
加入对贷超 MGT 的支持. 支持点击"<贷超名MGT>"打开贷超对应管理系统, 点击包名 ID 打开 GooglePlay<br/>
<br/>2. <br/>
在线列表上下线颜色区分. 上线: 绿色, 下线: 红色.<br/>
<br/>other:<br/>
当监控中有上下线变化才会发送邮件, 并且会带上当前在线下线列表<br/>
上下线通知邮件中第一行, "《》" 中的是 VTPM 本次监控情况涉及 APP 数量, "【】" 中是本次监控通知中贷超 APP 涉及数量<br/>
<div/>
<br/>
<br/>
<br/>
`
// 依赖
var gplay = require('google-play-scraper') var gplay = require('google-play-scraper')
var nodemailer = require('nodemailer') var nodemailer = require('nodemailer')
// 工具
var fs = require('fs') var fs = require('fs')
var username = require('os').userInfo().username var username = require('os').userInfo().username
var request = require('request') var request = require('request')
var util = require('util') var util = require('util')
var getPromiss = util.promisify(request.get) var getPromiss = util.promisify(request.get)
// 地址
let subApi = "https://git.starwin.tech/nongyingchen/AppMonitorSubscriber/raw/master/subscriber.json" let subApi = "https://git.starwin.tech/nongyingchen/AppMonitorSubscriber/raw/master/subscriber.json"
log(`当前奔跑在:${username}`) log(`当前奔跑在:${username}`)
let ding = 'https://oapi.dingtalk.com/robot/send?access_token=' let ding = 'https://oapi.dingtalk.com/robot/send?access_token='
let debugDingding = `${ding}bf03c69128b771107b8715911b8a76db61a55cbd8b00e1a2c955578c2a3da719` let debugDingding = `${ding}bf03c69128b771107b8715911b8a76db61a55cbd8b00e1a2c955578c2a3da719`
let notifyDingding = `${ding}61403ec65efd7a9e40cb6d490e1bfab8aff28800696918a23ec4dffdf5aa1315` let notifyDingding = `${ding}61403ec65efd7a9e40cb6d490e1bfab8aff28800696918a23ec4dffdf5aa1315`
let daichao = `admin/loan/listactive?current=0&size=10000&descs%5B0%5D=priority&packageId=10002` let daichao = `admin/loan/listactive?current=0&size=10000&descs%5B0%5D=priority&packageId=10002`
let daichaoRegion = [ let daichaoRegion = {
'http://admin.uuang.co.id/', 'http://admin.uuang.co.id/': '印尼贷超',
'http://admin.ph.g-cashing.com/', 'http://admin.ph.g-cashing.com/': '菲律宾贷超',
'http://admin.a.vaylaco.com/' 'http://admin.a.vaylaco.com/': '越南贷超'
] }
// Config ------------------------------------------------------------ // Config ------------------------------------------------------------
let sec = 1000; let sec = 1000;
...@@ -87,8 +107,8 @@ let allNames = names => { ...@@ -87,8 +107,8 @@ let allNames = names => {
return Array.from(new Set(an)) return Array.from(new Set(an))
} }
function log(content) { function log(content, useRelease = false) {
if (isTest()) { if (isTest() || useRelease) {
console.log(`[${new Date().toLocaleString()}]: ${content}`) console.log(`[${new Date().toLocaleString()}]: ${content}`)
} }
} }
...@@ -108,7 +128,7 @@ try { ...@@ -108,7 +128,7 @@ try {
isFirstRun = false isFirstRun = false
} catch (err) { } catch (err) {
isFirstRun = true isFirstRun = true
console.log(`状态文件不存在, 直接使用空的{}\n${err.toString()}`) log(`状态文件不存在, 直接使用空的{}\n${err.toString()}`, true)
} }
// 获取记录上次更新监控名得文件 // 获取记录上次更新监控名得文件
...@@ -116,13 +136,13 @@ try { ...@@ -116,13 +136,13 @@ try {
let fileNames = JSON.parse(fs.readFileSync(monitorApps, 'utf-8')) let fileNames = JSON.parse(fs.readFileSync(monitorApps, 'utf-8'))
if (Array.isArray(fileNames)) { if (Array.isArray(fileNames)) {
monitorNames['vn'] = fileNames monitorNames['vn'] = fileNames
console.log('原来只记录数组形式, 现在变更为对象形式, 原数组放到vn数组中') log('原来只记录数组形式, 现在变更为对象形式, 原数组放到vn数组中', true)
} else { } else {
monitorNames = fileNames monitorNames = fileNames
} }
isFirstRun = false isFirstRun = false
} catch (err) { } catch (err) {
console.log(`监控列表文件不存在, 直接使用空的{}\n${err.toString()}`) log(`监控列表文件不存在, 直接使用空的{}\n${err.toString()}`, true)
} }
let newOnline = [] // 新上架 let newOnline = [] // 新上架
let newOffline = [] // 新下架 let newOffline = [] // 新下架
...@@ -130,6 +150,7 @@ let permissionChange = {} // 权限变化 ...@@ -130,6 +150,7 @@ let permissionChange = {} // 权限变化
let failedApps = [] // 获取失败的 let failedApps = [] // 获取失败的
let newTopMonitorNames = {} let newTopMonitorNames = {}
let errorLog = [] // 错误记录 let errorLog = [] // 错误记录
let newDeploy = true
log('log 打开') log('log 打开')
...@@ -141,12 +162,16 @@ if (isTest()) { ...@@ -141,12 +162,16 @@ if (isTest()) {
startMonitor() startMonitor()
} }
sendEmail(`开始监控-----------------------`)
async function startMonitor() { async function startMonitor() {
log('开始监控') log('开始监控')
while (start) { while (start) {
log(`抓取一圈`) log(`抓取一圈`)
await getConfig() await getConfig()
.then(() => { // 部署通知, 更新说明
sendEmail(`<div>爬虫部署版本: ${version}</div>更新说明: ${release}`)
})
.then(getDaichao) .then(getDaichao)
.then(getTop100) .then(getTop100)
.then(() => fs.writeFileSync(monitorApps, JSON.stringify(monitorNames))) // 保存到本地 .then(() => fs.writeFileSync(monitorApps, JSON.stringify(monitorNames))) // 保存到本地
...@@ -179,7 +204,7 @@ async function startMonitor() { ...@@ -179,7 +204,7 @@ async function startMonitor() {
lastIntervalTime = lastIntervalTime * 2 lastIntervalTime = lastIntervalTime * 2
let content = `监控出错${err}\n间隔时间调整为${(lastIntervalTime) / minute}分钟` let content = `监控出错${err}\n间隔时间调整为${(lastIntervalTime) / minute}分钟`
content += markError() content += markError()
console.log(content) log(content, true)
sendEmail(content, developer) sendEmail(content, developer)
dingDing(content) dingDing(content)
if (err.toString().includes('ENOSPC')) { if (err.toString().includes('ENOSPC')) {
...@@ -217,8 +242,9 @@ function generateDailyOnlineReport() { ...@@ -217,8 +242,9 @@ function generateDailyOnlineReport() {
async function getDaichao() { async function getDaichao() {
let allRegionDaichaoApps = [] let allRegionDaichaoApps = []
for (index in daichaoRegion) { for (region in daichaoRegion) {
let region = daichaoRegion[index] // for (index in Object.keys(daichaoRegion)) {
// let region = daichaoRegion[index]
daichaoApiUrl = region + daichao daichaoApiUrl = region + daichao
log(` 贷超 url: ${daichaoApiUrl}`) log(` 贷超 url: ${daichaoApiUrl}`)
await getPromiss(daichaoApiUrl) await getPromiss(daichaoApiUrl)
...@@ -237,7 +263,8 @@ async function getDaichao() { ...@@ -237,7 +263,8 @@ async function getDaichao() {
daichaoAppInfoes[app.packageName] = { daichaoAppInfoes[app.packageName] = {
name: app.name, name: app.name,
daichaoId: app.id, daichaoId: app.id,
mgt: `${region}#/loan/` mgt: `${region}#/loan/`,
region: daichaoRegion[region]
} }
} }
if (isTest()) { if (isTest()) {
...@@ -409,7 +436,7 @@ async function getTop100() { ...@@ -409,7 +436,7 @@ async function getTop100() {
requestOptions: { timeout: requestTimeout } requestOptions: { timeout: requestTimeout }
}) })
.then(res => { .then(res => {
console.log(`获取到 <${monitorRegion[region]}>[${monitorType[type]}]排名: ${i * 120} ~ ${i * 120 + getNum}`) log(`获取到 <${monitorRegion[region]}>[${monitorType[type]}]排名: ${i * 120} ~ ${i * 120 + getNum}`, true)
if (res && res.length && res.length > 0) { if (res && res.length && res.length > 0) {
res.forEach(app => { res.forEach(app => {
...@@ -428,7 +455,7 @@ async function getTop100() { ...@@ -428,7 +455,7 @@ async function getTop100() {
} }
}) })
.catch(err => { .catch(err => {
console.log(`获取排名<${monitorRegion[region]}> 错误: ${err.message}`) log(`获取排名<${monitorRegion[region]}> 错误: ${err.message}`, true)
throw err throw err
}) })
} }
...@@ -469,17 +496,17 @@ async function monitorIfOnline(names) { ...@@ -469,17 +496,17 @@ async function monitorIfOnline(names) {
}) })
.catch((err) => { .catch((err) => {
if (err.toString().includes('404')) { if (err.toString().includes('404')) {
console.log(`获取不到: ${name}, error: ${err}`) log(`获取不到: ${name}, error: ${err}`, true)
failedApps.push(name) failedApps.push(name)
judgeNewOffline(name) judgeNewOffline(name)
let a = status[name] || {} let a = status[name] || {}
status[name] = { ...a, status: false, date: Date().toString() } status[name] = { ...a, status: false, date: Date().toString() }
} else if (err.toString().includes('ETIMEDOUT')) { } else if (err.toString().includes('ETIMEDOUT')) {
console.log(`连接超时: ${err.toString()}`) log(`连接超时: ${err.toString()}`, true)
throw err throw err
} else { } else {
errorLog.push(`Motitor Online Error: ${link(name, true)} - ${err.message}`) errorLog.push(`Motitor Online Error: ${link(name, true)} - ${err.message}`)
console.log(`获取在线错误: ${name}, ${err.message}`) log(`获取在线错误: ${name}, ${err.message}`, true)
} }
}) })
} }
...@@ -661,6 +688,8 @@ function genMail() { ...@@ -661,6 +688,8 @@ function genMail() {
} }
// 有变化也发送当前监控在线情况 // 有变化也发送当前监控在线情况
emailContent += '<br/><br/><br/>'
emailContent += '在线/下线 情况:'
emailContent += generateDailyOnlineReport() emailContent += generateDailyOnlineReport()
emailContent += nowGenerate emailContent += nowGenerate
...@@ -674,14 +703,14 @@ function genMail() { ...@@ -674,14 +703,14 @@ function genMail() {
errorLog = [] errorLog = []
newTopMonitorNames = {} newTopMonitorNames = {}
return `<div>${firstLine}</div><br/>${emailContent}` return `<div>${firstLine}</div><br/>${emailContent}<br/>version: ${version}`
} }
function isOurs(name, countOurs) { function isOurs(name, countOurs) {
let prefix = '' let prefix = ''
if (daichaoApps.includes(name)) { if (daichaoApps.includes(name)) {
prefix = `<a href="${daichaoAppInfoes[name].mgt}${daichaoAppInfoes[name] && prefix = `🏦(贷超.${daichaoAppInfoes[name].region}[${daichaoAppInfoes[name].daichaoId}]__<a href="${daichaoAppInfoes[name].mgt}${daichaoAppInfoes[name] &&
daichaoAppInfoes[name].daichaoId || ''}">🏦(贷超 [${daichaoAppInfoes[name].daichaoId}] _ < ${daichaoAppInfoes[name].name} >(->MGT)) | </a>` daichaoAppInfoes[name].daichaoId || ''}"> < ${daichaoAppInfoes[name].name} >(->MGT)) | </a>`
} }
if (ourAppIds.includes(name)) { if (ourAppIds.includes(name)) {
if (prefix != '') { if (prefix != '') {
...@@ -719,7 +748,7 @@ function aliveContent(date, lastSend) { ...@@ -719,7 +748,7 @@ function aliveContent(date, lastSend) {
function sendEmail(content, to = notifyEmail) { function sendEmail(content, to = notifyEmail) {
if (content == null || content == undefined || content == '') { if (content == null || content == undefined || content == '') {
console.log('没有生成内容, 检查心跳') log('没有生成内容, 检查心跳', true)
let date = new Date() let date = new Date()
let lastDing = new Date(status.lastDingDate || 'Tue Jan 29 2019 19:32:24 GMT+0800 (CST)') let lastDing = new Date(status.lastDingDate || 'Tue Jan 29 2019 19:32:24 GMT+0800 (CST)')
let lastSend = new Date(status.lastSendDate || 'Tue Jan 29 2019 19:32:24 GMT+0800 (CST)') let lastSend = new Date(status.lastSendDate || 'Tue Jan 29 2019 19:32:24 GMT+0800 (CST)')
...@@ -743,7 +772,7 @@ function sendEmail(content, to = notifyEmail) { ...@@ -743,7 +772,7 @@ function sendEmail(content, to = notifyEmail) {
} }
return return
} }
console.log(`发送email: ${content.length}`) log(`发送email: ${content.length}`, true)
// if (content.indexOf('Error') != -1) { // if (content.indexOf('Error') != -1) {
// to = developer // to = developer
// } else { // } else {
...@@ -758,7 +787,7 @@ function sendEmail(content, to = notifyEmail) { ...@@ -758,7 +787,7 @@ function sendEmail(content, to = notifyEmail) {
secure: false, secure: false,
auth: { auth: {
user: myEmail, user: myEmail,
pass: 'rwGxHWrxYKJJ2xnu' pass: '3Yth5apYLqNiAjMq'
} }
}) })
...@@ -775,9 +804,9 @@ function sendEmail(content, to = notifyEmail) { ...@@ -775,9 +804,9 @@ function sendEmail(content, to = notifyEmail) {
trans.sendMail(mailOption, (error, info) => { trans.sendMail(mailOption, (error, info) => {
if (error) { if (error) {
return console.log(`发生错误: ${error}`); return log(`发生错误: ${error}`, true);
} }
console.log(`message ${info.messageId} send: ${info.response}`) log(`message ${info.messageId} send: ${info.response}`, true)
}) })
dingDing(content, notifyDingding) dingDing(content, notifyDingding)
......
...@@ -60,7 +60,7 @@ ...@@ -60,7 +60,7 @@
"ky.com.haimaloan":"2017 youdong", "ky.com.haimaloan":"2017 youdong",
"com.qcash.meiko":"2018 Qcash", "com.qcash.meiko":"2018 Qcash",
"com.tdong.tco":"2019 Tdong", "com.tdong.tco":"2019 Tdong",
"com.vndoa.usehaloow":"2020 VNDloan", "com.zccd.afsrv":"2020 VNDloan",
"com.yuioqwe.cash":"No.2021 Wdong/Wcash", "com.yuioqwe.cash":"No.2021 Wdong/Wcash",
"com.bsnwjqwe.vgn":"2022 Fast Dong", "com.bsnwjqwe.vgn":"2022 Fast Dong",
"com.oweiq.saldh":"2023 Lucky Wallet", "com.oweiq.saldh":"2023 Lucky Wallet",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment