diff --git a/README.md b/README.md index 3ca7b8a..d88cc2c 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,5 @@ # buy_pig_plan | 买猪计划 -#### 写在前面 - -以前,有个人经常给我女朋友打骚扰电话,这家伙实在太可气了,得给他点教训,让他知道骚扰电话的厉害。于是有了这个程序。 -在持续的攻击一段时间后我也悄悄的对目标做过一些回访,看看用户体验,顺便记录下来看看攻击效果: - -| 时间 | 目标状态 | -|------------|--------------------------------------------------------------| -| 2018.08.18 | 佯装某机构人员电话回访,对方态度**不耐烦**,没讲几句就挂断电话 | - - #### 项目介绍 > 买猪计划:一个电话攻击、留言攻击的工具 @@ -45,6 +35,8 @@ git clone https://github.com/aqiongbei/bomer.git - 安装依赖 ```sh +# 由于安装puppeteer时候需要下载chromium,而下载chromium需要外网,所以建议对puppeteer使用国内镜像下载,加上下面这句 +npm config set puppeteer_download_host=https://npm.taobao.org/mirrors npm install ``` diff --git a/app_pptr.js b/app_pptr.js index bcbf590..aa89abc 100644 --- a/app_pptr.js +++ b/app_pptr.js @@ -1,118 +1,121 @@ -'use strict' - -const config = require('config'); -const colors = require('colors'); -const cron = require('node-cron'); -const puppeteer = require('puppeteer'); - -const util = require('./utils/util'); -const {WEB_TYPE, TASK_TYPE, TASK_STATUS} = util.taskConst; - -const flow = require('./flow/flow'); -const TARGET = config.get('targetInfo'); - -process.on('uncaughtException', function (err) { - log.error(err); -}); - -process.on('unhandledRejection', function(err, p) { - log.error(err.stack); -}); - -if (config.util.getEnv('NODE_ENV') != 'production') { - (async () => { - await puppeteerAttack(TASK_TYPE.call, WEB_TYPE.call.lxb); - // await puppeteerAttack(TASK_TYPE.comment, WEB_TYPE.comment.shangqiao); - })(); - return ; -} - -let task = cron.schedule(config.get('attackTime'), async function(){ - await puppeteerAttack(TASK_TYPE.call, WEB_TYPE.call.lxb); - console.log(config); -}, false); - -task.start(); - -async function puppeteerAttack(task_type, web_type) { - const {url_list, page, browser} = await init(task_type, web_type); - let done = 0; - let failed = 0; - let locked = 0; - let times = 0; - - for (let item of url_list) { - times ++ ; - let startTime = new Date(); - let sleepTime = config.get('everyTaskSleepTime'); - let feedBack = ''; - - console.log(`==================TASK TIMES: ${times}==================`.yellow) - console.log(`TASK INFO:`.yellow, `WEB NAME: ${item.name} WEB TYPE: ${item.web_type}`.green); - - item.result = await puppeteerFlow(page, item); - - if (item.result.status == 'done') { - done ++; - } - - if (item.result.status == 'failed') { - if (item.result.msg.includes('[TYPE ERROR]') || item.result.msg.includes('[TIME OUT ERROR]')) { - util.deleteUrl(item.task_type, item.web_type, item.id); - } - sleepTime = 0; - failed ++; - } - - if (item.result.status == 'locked') { - locked ++; - } - - console.log(`TASK RESULT:`.yellow, `STATUS: ${item.result.status} MSG:${item.result.msg}`.green); - console.log(`USED TIME: ${(new Date() - startTime) / 1000} S`.red); - console.log(`SLEEP TIME: ${sleepTime / 1000} S`.red); - - await page.waitFor(sleepTime); - } - - await browser.close(); - console.log(`==================TASK REPORT==================`.yellow) - console.log(`done: ${done} failed: ${failed} locked: ${locked}`.yellow); -} - -async function init (task_type, web_type) { - const url_list = util.getRandomUrl(task_type, web_type, config.get('attackTimes')); - const browser = await puppeteer.launch({ - executablePath: config.get('chromium').path, - headless: config.get('chromium').headless, - slowMo: config.get('chromium').slowMo, - devtools: false, - args: ['--ash-host-window-bounds=1024x768'], - }); - const page = await browser.newPage(); - - page.setDefaultNavigationTimeout(0); - page.setViewport({width: 1024, height: 768}); - - console.log(JSON.stringify(url_list, null, 4)); - return {url_list, page, browser}; -} - -async function puppeteerFlow(page, item) { - let result = { - status: '', - msg: '' - }; - - try { - await page.goto(item.url, {timeout: 30 * 1000}); - } catch (e) { - result.msg = `[TIME OUT ERROR] ${e}`; - } - - if (!result.msg) { - result = await flow[item.task_type][item.web_type](page, item, TARGET); - } - - return result; +'use strict' + +const config = require('config'); +const colors = require('colors'); +const cron = require('node-cron'); +const puppeteer = require('puppeteer'); +const events = require('events'); +const e = new events(); +e.setMaxListeners(0); + +const util = require('./utils/util'); +const {WEB_TYPE, TASK_TYPE, TASK_STATUS} = util.taskConst; + +const flow = require('./flow/flow'); +const TARGET = config.get('targetInfo'); + +process.on('uncaughtException', function (err) { + console.log(err); +}); + +process.on('unhandledRejection', function(err, p) { + console.log(err.stack); +}); + +if (config.util.getEnv('NODE_ENV') != 'production') { + (async () => { + await puppeteerAttack(TASK_TYPE.call, WEB_TYPE.call.lxb); + // await puppeteerAttack(TASK_TYPE.comment, WEB_TYPE.comment.shangqiao); + })(); + return ; +} + +let task = cron.schedule(config.get('attackTime'), async function(){ + await puppeteerAttack(TASK_TYPE.call, WEB_TYPE.call.lxb); + console.log(config); +}, false); + +task.start(); + +async function puppeteerAttack(task_type, web_type) { + const {url_list, page, browser} = await init(task_type, web_type); + let done = 0; + let failed = 0; + let locked = 0; + let times = 0; + + for (let item of url_list) { + times ++ ; + let startTime = new Date(); + let sleepTime = config.get('everyTaskSleepTime'); + let feedBack = ''; + + console.log(`==================TASK TIMES: ${times}==================`.yellow) + console.log(`TASK INFO:`.yellow, `WEB NAME: ${item.name} WEB TYPE: ${item.web_type}`.green); + + item.result = await puppeteerFlow(page, item); + + if (item.result.status == 'done') { + done ++; + } + + if (item.result.status == 'failed') { + if (item.result.msg.includes('[TYPE ERROR]') || item.result.msg.includes('[TIME OUT ERROR]')) { + util.deleteUrl(item.task_type, item.web_type, item.id); + } + sleepTime = 0; + failed ++; + } + + if (item.result.status == 'locked') { + locked ++; + } + + console.log(`TASK RESULT:`.yellow, `STATUS: ${item.result.status} MSG:${item.result.msg}`.green); + console.log(`USED TIME: ${(new Date() - startTime) / 1000} S`.red); + console.log(`SLEEP TIME: ${sleepTime / 1000} S`.red); + + await page.waitFor(sleepTime); + } + + await browser.close(); + console.log(`==================TASK REPORT==================`.yellow) + console.log(`done: ${done} failed: ${failed} locked: ${locked}`.yellow); +} + +async function init (task_type, web_type) { + const url_list = util.getRandomUrl(task_type, web_type, config.get('attackTimes')); + const browser = await puppeteer.launch({ + executablePath: config.get('chromium').path, + headless: config.get('chromium').headless, + slowMo: config.get('chromium').slowMo, + devtools: false, + args: ['--ash-host-window-bounds=1024x768'], + }); + const page = await browser.newPage(); + + page.setDefaultNavigationTimeout(0); + page.setViewport({width: 1024, height: 768}); + + console.log(JSON.stringify(url_list, null, 4)); + return {url_list, page, browser}; +} + +async function puppeteerFlow(page, item) { + let result = { + status: '', + msg: '' + }; + + try { + await page.goto(item.url, {timeout: 30 * 1000}); + } catch (e) { + result.msg = `[TIME OUT ERROR] ${e}`; + } + + if (!result.msg) { + result = await flow[item.task_type][item.web_type](page, item, TARGET); + } + + return result; } \ No newline at end of file diff --git a/flow/call/baidu_lxb.js b/flow/call/baidu_lxb.js index 1497354..17b9619 100644 --- a/flow/call/baidu_lxb.js +++ b/flow/call/baidu_lxb.js @@ -1,55 +1,55 @@ -'use strict' -const {WEB_TYPE, TASK_TYPE, TASK_STATUS} = require('../../utils/task_const'); - -async function flow(page, item, target) { - let result = { - status: '', - msg: '' - }; - - page.on('dialog', async dialog => { - await dialog.dismiss(); - }); - - try { - await page.type('.lxb-cb-input', target.phone, {delay: 10}); - await page.click('.lxb-cb-input-btn'); - await page.waitFor(1 * 1000); - - try { - result.msg = await page.$eval('.lxb-cb-tip', e => e.innerText); - } catch (e) { - try { - result.msg = await page.$eval('.lxb-cb-info-tip-con', e => e.innerText); - } catch (e) { - try { - result.msg = await page.$eval('.lxb-cb-error-tip', e => e.innerText); - } catch (e) { - result.msg = `[MSG ERROR] ${e}`; - } - } - } - } catch (e) { - result.msg = `[TYPE ERROR] ${e}`; - } - - result.status = getTaskStatus(result.msg); - - return result; -} - -function getTaskStatus(text) { - let status = TASK_STATUS.failed; - let doneReg = /已短信提醒|正在呼叫|将给您回电|请准备接听/g; - let lockedReg = /过于频繁|频繁/g; - - if (doneReg.test(text)) { - status = TASK_STATUS.done; - } else if (lockedReg.test(text)) { - status = TASK_STATUS.locked; - } - - return status; -} - +'use strict' +const {WEB_TYPE, TASK_TYPE, TASK_STATUS} = require('../../utils/task_const'); + +async function flow(page, item, target) { + let result = { + status: '', + msg: '' + }; + + page.on('dialog', async dialog => { + await dialog.dismiss(); + }); + + try { + await page.type('.lxb-cb-input', target.phone, {delay: 10}); + await page.click('.lxb-cb-input-btn'); + await page.waitFor(1 * 1000); + + try { + result.msg = await page.$eval('.lxb-cb-tip', e => e.innerText); + } catch (e) { + try { + result.msg = await page.$eval('.lxb-cb-info-tip-con', e => e.innerText); + } catch (e) { + try { + result.msg = await page.$eval('.lxb-cb-error-tip', e => e.innerText); + } catch (e) { + result.msg = `[MSG ERROR] ${e}`; + } + } + } + } catch (e) { + result.msg = `[TYPE ERROR] ${e}`; + } + + result.status = getTaskStatus(result.msg); + + return result; +} + +function getTaskStatus(text) { + let status = TASK_STATUS.failed; + let doneReg = /已短信提醒|正在呼叫|将给您回电|请准备接听/g; + let lockedReg = /过于频繁|频繁/g; + + if (doneReg.test(text)) { + status = TASK_STATUS.done; + } else if (lockedReg.test(text)) { + status = TASK_STATUS.locked; + } + + return status; +} + module.exports = flow; \ No newline at end of file diff --git a/flow/call/baidu_shangqiao.js b/flow/call/baidu_shangqiao.js index 5251fd6..527cb12 100644 --- a/flow/call/baidu_shangqiao.js +++ b/flow/call/baidu_shangqiao.js @@ -1,21 +1,21 @@ -'use strict' - -async function flow(page, item, target) { - let result = { - status: '', - msg: '' - }; - - page.on('dialog', async dialog => { - result.msg = dialog.message(); - await dialog.dismiss(); - }); - - await page.type('#telInput', target.phone, {delay: 10}); - await page.click('#callBtn'); - await page.waitFor(1 * 1000); - - return result; -} - +'use strict' + +async function flow(page, item, target) { + let result = { + status: '', + msg: '' + }; + + page.on('dialog', async dialog => { + result.msg = dialog.message(); + await dialog.dismiss(); + }); + + await page.type('#telInput', target.phone, {delay: 10}); + await page.click('#callBtn'); + await page.waitFor(1 * 1000); + + return result; +} + module.exports = flow; \ No newline at end of file diff --git a/flow/call/other.js b/flow/call/other.js index a2bfda7..e258fe3 100644 --- a/flow/call/other.js +++ b/flow/call/other.js @@ -1,42 +1,42 @@ -'use strict' - -async function flow(page, item, target) { - let result = { - status: '', - msg: '' - }; - - if (item.feedBack.type == 'dialog') { - page.on('dialog', async dialog => { - result.msg = dialog.message(); - await dialog.dismiss(); - }); - } - - for(let flow of item.flow) { - switch (flow.action) { - case 'type': - await page.type(flow.ele, target.phone, {delay: 10}); - break; - case 'click': - await page.click(flow.ele); - break; - default: - throw new Error('UNKNOW ACTION TYPE'); - break; - } - } - - if (item.feedBack.type == 'html') { - // TODO - // 企点的提示是通过两个元素的display来实现的 - await page.waitForSelector(item.feedBack.ele); - result.msg = await page.$eval(item.feedBack.ele, e => e.innerText); - } else if (item.feedBack.type == 'dialog') { - await page.waitFor(1 * 1000); - } - - return result; -} - +'use strict' + +async function flow(page, item, target) { + let result = { + status: '', + msg: '' + }; + + if (item.feedBack.type == 'dialog') { + page.on('dialog', async dialog => { + result.msg = dialog.message(); + await dialog.dismiss(); + }); + } + + for(let flow of item.flow) { + switch (flow.action) { + case 'type': + await page.type(flow.ele, target.phone, {delay: 10}); + break; + case 'click': + await page.click(flow.ele); + break; + default: + throw new Error('UNKNOW ACTION TYPE'); + break; + } + } + + if (item.feedBack.type == 'html') { + // TODO + // 企点的提示是通过两个元素的display来实现的 + await page.waitForSelector(item.feedBack.ele); + result.msg = await page.$eval(item.feedBack.ele, e => e.innerText); + } else if (item.feedBack.type == 'dialog') { + await page.waitFor(1 * 1000); + } + + return result; +} + module.exports = flow; \ No newline at end of file diff --git a/flow/comment/baidu_shangqiao.js b/flow/comment/baidu_shangqiao.js index 589246f..7f2a502 100644 --- a/flow/comment/baidu_shangqiao.js +++ b/flow/comment/baidu_shangqiao.js @@ -1,67 +1,67 @@ -'use strict' -const {WEB_TYPE, TASK_TYPE, TASK_STATUS} = require('../../utils/task_const'); - -async function flow(page, item, target) { - let result = { - status: '', - msg: '' - }; - - page.on('dialog', async dialog => { - await dialog.dismiss(); - }); - - try { - await page.type('#nb-nodeboard-set-content-js', target.comment, {delay: 1}); - - let eleArr = await page.$$eval('.nb-nodeboard-input', function (eleList) { - let result = []; - for (let item of eleList) { - result.push({ - id: item.id, - text: item.placeholder - }) - } - return result; - }); - - console.log(eleArr) - - for(let item of eleArr) { - let id = item.id; - let text = item.text; - - if (text.includes('电话')) { - await page.type(`#${id}`, target.phone, {delay: 1}); - } else if (text.includes('姓名')) { - await page.type(`#${id}`, target.name, {delay: 1}); - } else if (text.includes('邮箱')){ - await page.type(`#${id}`, target.email, {delay: 1}); - } else if (text.includes('必填')) { - await page.type(`#${id}`, target.phone, {delay: 1}); - } - } - - await page.click('#nb_nodeboard_send'); - await page.waitFor('#nb_nodeboard_success', {timeout: 3000}); - result.msg = await page.$eval('#nb_nodeboard_success', e => e.innerText); - } catch (e) { - result.msg = `[TYPE ERROR] ${e}`; - } - - result.status = getTaskStatus(result.msg); - - return result; -} - -function getTaskStatus(text) { - let status = TASK_STATUS.failed; - - if (text && text.includes('感谢留言')) { - status = TASK_STATUS.done; - } - - return status; -} - +'use strict' +const {WEB_TYPE, TASK_TYPE, TASK_STATUS} = require('../../utils/task_const'); + +async function flow(page, item, target) { + let result = { + status: '', + msg: '' + }; + + page.on('dialog', async dialog => { + await dialog.dismiss(); + }); + + try { + await page.type('#nb-nodeboard-set-content-js', target.comment, {delay: 1}); + + let eleArr = await page.$$eval('.nb-nodeboard-input', function (eleList) { + let result = []; + for (let item of eleList) { + result.push({ + id: item.id, + text: item.placeholder + }) + } + return result; + }); + + console.log(eleArr) + + for(let item of eleArr) { + let id = item.id; + let text = item.text; + + if (text.includes('电话')) { + await page.type(`#${id}`, target.phone, {delay: 1}); + } else if (text.includes('姓名')) { + await page.type(`#${id}`, target.name, {delay: 1}); + } else if (text.includes('邮箱')){ + await page.type(`#${id}`, target.email, {delay: 1}); + } else if (text.includes('必填')) { + await page.type(`#${id}`, target.phone, {delay: 1}); + } + } + + await page.click('#nb_nodeboard_send'); + await page.waitFor('#nb_nodeboard_success', {timeout: 3000}); + result.msg = await page.$eval('#nb_nodeboard_success', e => e.innerText); + } catch (e) { + result.msg = `[TYPE ERROR] ${e}`; + } + + result.status = getTaskStatus(result.msg); + + return result; +} + +function getTaskStatus(text) { + let status = TASK_STATUS.failed; + + if (text && text.includes('感谢留言')) { + status = TASK_STATUS.done; + } + + return status; +} + module.exports = flow; \ No newline at end of file diff --git a/flow/flow.js b/flow/flow.js index 110cbfe..2e859d5 100644 --- a/flow/flow.js +++ b/flow/flow.js @@ -1,16 +1,16 @@ -'use strict' - -module.exports = { - call: { - other: require('../flow/call/other'), - baidu_lxb: require('../flow/call/baidu_lxb') - // baidu_shangqiao: require('../flow/call/baidu_shangqiao') - }, - comment: { - baidu_shangqiao: require('../flow/comment/baidu_shangqiao') - }, - sms: { - // TODO - } - +'use strict' + +module.exports = { + call: { + other: require('../flow/call/other'), + baidu_lxb: require('../flow/call/baidu_lxb') + // baidu_shangqiao: require('../flow/call/baidu_shangqiao') + }, + comment: { + baidu_shangqiao: require('../flow/comment/baidu_shangqiao') + }, + sms: { + // TODO + } + } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 9703fbd..1af4b0f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "Bomber", + "name": "buy_pig_plan", "version": "1.0.0", "lockfileVersion": 1, "requires": true, @@ -15,7 +15,7 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", "requires": { - "es6-promisify": "5.0.0" + "es6-promisify": "^5.0.0" } }, "ajv": { @@ -24,10 +24,10 @@ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "asn1": { @@ -77,7 +77,7 @@ "dev": true, "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "boolbase": { @@ -91,7 +91,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -112,12 +112,12 @@ "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", "dev": true, "requires": { - "css-select": "1.2.0", - "dom-serializer": "0.1.0", - "entities": "1.1.1", - "htmlparser2": "3.9.2", - "lodash": "4.17.10", - "parse5": "3.0.3" + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" } }, "co": { @@ -137,7 +137,7 @@ "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "dev": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "concat-map": { @@ -150,10 +150,10 @@ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "requires": { - "buffer-from": "1.1.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "config": { @@ -176,10 +176,10 @@ "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", "dev": true, "requires": { - "boolbase": "1.0.0", - "css-what": "2.1.0", + "boolbase": "~1.0.0", + "css-what": "2.1", "domutils": "1.5.1", - "nth-check": "1.0.1" + "nth-check": "~1.0.1" } }, "css-what": { @@ -194,7 +194,7 @@ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "debug": { @@ -217,8 +217,8 @@ "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", "dev": true, "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.1" + "domelementtype": "~1.1.1", + "entities": "~1.1.1" }, "dependencies": { "domelementtype": { @@ -241,7 +241,7 @@ "integrity": "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=", "dev": true, "requires": { - "domelementtype": "1.3.0" + "domelementtype": "1" } }, "domutils": { @@ -250,8 +250,8 @@ "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "dev": true, "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" + "dom-serializer": "0", + "domelementtype": "1" } }, "ecc-jsbn": { @@ -261,7 +261,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "entities": { @@ -280,7 +280,7 @@ "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "requires": { - "es6-promise": "4.2.4" + "es6-promise": "^4.0.3" } }, "extend": { @@ -333,7 +333,7 @@ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", "requires": { - "pend": "1.2.0" + "pend": "~1.2.0" } }, "forever-agent": { @@ -348,9 +348,9 @@ "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "dev": true, "requires": { - "asynckit": "0.4.0", + "asynckit": "^0.4.0", "combined-stream": "1.0.6", - "mime-types": "2.1.19" + "mime-types": "^2.1.12" } }, "fs.realpath": { @@ -364,7 +364,7 @@ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "glob": { @@ -372,12 +372,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "har-schema": { @@ -392,8 +392,8 @@ "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "dev": true, "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" + "ajv": "^5.1.0", + "har-schema": "^2.0.0" } }, "htmlparser2": { @@ -402,12 +402,12 @@ "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", "dev": true, "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.4.2", - "domutils": "1.5.1", - "entities": "1.1.1", - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "domelementtype": "^1.3.0", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" } }, "http-signature": { @@ -416,9 +416,9 @@ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.2" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "https-proxy-agent": { @@ -426,8 +426,8 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", "requires": { - "agent-base": "4.2.1", - "debug": "3.1.0" + "agent-base": "^4.1.0", + "debug": "^3.1.0" } }, "inflight": { @@ -435,8 +435,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -526,7 +526,7 @@ "integrity": "sha1-ceRkU3p++BwV8tudl+kT/A/2BvA=", "dev": true, "requires": { - "mime-db": "1.35.0" + "mime-db": "~1.35.0" } }, "minimatch": { @@ -534,7 +534,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -571,7 +571,7 @@ "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", "dev": true, "requires": { - "boolbase": "1.0.0" + "boolbase": "~1.0.0" } }, "oauth-sign": { @@ -585,7 +585,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { @@ -599,7 +599,7 @@ "integrity": "sha1-BC95L/3TaFFVHPTp4Gazh0q0W1w=", "dev": true, "requires": { - "@types/node": "10.5.4" + "@types/node": "*" } }, "path-is-absolute": { @@ -644,14 +644,14 @@ "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.6.0.tgz", "integrity": "sha512-88epdIp3lw0LxI+sIHgdgZdq/u5zRnzgU2vJGvcyuGqHQrtRUeICTexTyT1KoKhTGG0mAKFRV9c7IJ179agm7A==", "requires": { - "debug": "3.1.0", - "extract-zip": "1.6.7", - "https-proxy-agent": "2.2.1", - "mime": "2.3.1", - "progress": "2.0.0", - "proxy-from-env": "1.0.0", - "rimraf": "2.6.2", - "ws": "5.2.2" + "debug": "^3.1.0", + "extract-zip": "^1.6.6", + "https-proxy-agent": "^2.2.1", + "mime": "^2.0.3", + "progress": "^2.0.0", + "proxy-from-env": "^1.0.0", + "rimraf": "^2.6.1", + "ws": "^5.1.1" } }, "qs": { @@ -665,13 +665,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "request": { @@ -680,26 +680,26 @@ "integrity": "sha1-MvACNc0I1IK00NaNuTqCnA7VdW4=", "dev": true, "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.7.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.2", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.0.3", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.19", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.2", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.3.2" + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" } }, "rimraf": { @@ -707,7 +707,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "safe-buffer": { @@ -727,15 +727,15 @@ "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", "dev": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.2", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "safer-buffer": "2.1.2", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" } }, "string_decoder": { @@ -743,7 +743,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } }, "tough-cookie": { @@ -752,7 +752,7 @@ "integrity": "sha1-7GDO44rGdQY//JelwYlwV47oNlU=", "dev": true, "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "tunnel-agent": { @@ -761,7 +761,7 @@ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -793,9 +793,9 @@ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" } }, "wrappy": { @@ -808,7 +808,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", "requires": { - "async-limiter": "1.0.0" + "async-limiter": "~1.0.0" } }, "yauzl": { @@ -816,7 +816,7 @@ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", "requires": { - "fd-slicer": "1.0.1" + "fd-slicer": "~1.0.1" } } } diff --git a/utils/mailer.js b/utils/mailer.js index 84651f6..f8f5e09 100644 --- a/utils/mailer.js +++ b/utils/mailer.js @@ -1,25 +1,25 @@ -'use strict' - -const config = require('config'); -const mailer = require('nodemailer'); -const account = config.get('email').account; -const mailer = config.get('email').mailer; - - -let accountOptions = { - host: account.type, - port: 587, - secure: false, - auth: { - user: account.user, - pass: account.pass - } -}; - -let mailerOptions = { - from: mailer.from, - to: mailer.to, - subject: , - html: 'Hello world?' - }; +'use strict' + +const config = require('config'); +const mailer = require('nodemailer'); +const account = config.get('email').account; +const mailer = config.get('email').mailer; + + +let accountOptions = { + host: account.type, + port: 587, + secure: false, + auth: { + user: account.user, + pass: account.pass + } +}; + +let mailerOptions = { + from: mailer.from, + to: mailer.to, + subject: , + html: 'Hello world?' + }; } \ No newline at end of file diff --git a/utils/task_const.js b/utils/task_const.js index be3d8f8..c313549 100644 --- a/utils/task_const.js +++ b/utils/task_const.js @@ -1,28 +1,28 @@ -'use strict' - -const WEB_TYPE = { - call: { - lxb: 'baidu_lxb' - }, - comment: { - lxb: 'baidu_lxb', - shangqiao: 'baidu_shangqiao' - }, - sms: { - // TODO - } -} - -const TASK_TYPE = { - sms: 'sms', // TODO - call: 'call', - comment: 'comment' // TODO -} - -const TASK_STATUS = { - done: 'done', - locked: 'locked', - failed: 'failed' -} - +'use strict' + +const WEB_TYPE = { + call: { + lxb: 'baidu_lxb' + }, + comment: { + lxb: 'baidu_lxb', + shangqiao: 'baidu_shangqiao' + }, + sms: { + // TODO + } +} + +const TASK_TYPE = { + sms: 'sms', // TODO + call: 'call', + comment: 'comment' // TODO +} + +const TASK_STATUS = { + done: 'done', + locked: 'locked', + failed: 'failed' +} + module.exports = {WEB_TYPE, TASK_TYPE, TASK_STATUS}; \ No newline at end of file diff --git a/utils/util.js b/utils/util.js index 34c2f9e..88225a0 100644 --- a/utils/util.js +++ b/utils/util.js @@ -1,80 +1,80 @@ -'use strict' - -const fs = require('fs'); -const path = require('path'); -const colors = require('colors'); -const {WEB_TYPE, TASK_TYPE, TASK_STATUS} = require('./task_const'); - -function readJson (task_type, web_type) { - return JSON.parse(fs.readFileSync(path.join('.', 'sources', task_type, `${web_type}.json`), 'utf8')); -} - -function writeJson (task_type, web_type, data, bundle) { - if (bundle) { - bundle = `_${bundle}`; - } else { - bundle = ''; - } - fs.writeFileSync(path.join('.', 'sources', task_type, `${web_type}${bundle}.json`), JSON.stringify(data, null, 4), 'utf8'); -} - -function getRandomArray (max, length) { - var arr = []; - - if (length > max) { - length = max; - } - - for (let i = 1; i <= length; i ++) { - let ran = Math.round(Math.random() * max); - if (arr.includes(ran)) { - i --; - } else { - arr.push(ran); - } - } - - return arr; -} - -function getRandomUrl(task_type, web_type, num) { - let allUrl = readJson(task_type, web_type); - - if (!num) { - return allUrl; - } - - let result = []; - let randomArray = getRandomArray(allUrl.length - 1, num); - - for (let ran of randomArray) { - result.push(allUrl[ran]); - } - - return result; -} - -function deleteUrl (task_type, web_type, id) { - let fileContent = readJson(task_type, web_type); - let deleteItem = {}; - fileContent = fileContent.filter(item => { - if (item.id == id) { - deleteItem = item; - return false; - } - return true; - }); - console.log(`DELETE URL: id: ${id} ${JSON.stringify(deleteItem, null, 4)}`.red) - writeJson(task_type, web_type, fileContent); -} - -module.exports = { - deleteUrl: deleteUrl, - taskConst: { - WEB_TYPE: WEB_TYPE, - TASK_TYPE: TASK_TYPE, - TASK_STATUS: TASK_STATUS - }, - writeJson: writeJson, - getRandomUrl: getRandomUrl +'use strict' + +const fs = require('fs'); +const path = require('path'); +const colors = require('colors'); +const {WEB_TYPE, TASK_TYPE, TASK_STATUS} = require('./task_const'); + +function readJson (task_type, web_type) { + return JSON.parse(fs.readFileSync(path.join('.', 'sources', task_type, `${web_type}.json`), 'utf8')); +} + +function writeJson (task_type, web_type, data, bundle) { + if (bundle) { + bundle = `_${bundle}`; + } else { + bundle = ''; + } + fs.writeFileSync(path.join('.', 'sources', task_type, `${web_type}${bundle}.json`), JSON.stringify(data, null, 4), 'utf8'); +} + +function getRandomArray (max, length) { + var arr = []; + + if (length > max) { + length = max; + } + + for (let i = 1; i <= length; i ++) { + let ran = Math.round(Math.random() * max); + if (arr.includes(ran)) { + i --; + } else { + arr.push(ran); + } + } + + return arr; +} + +function getRandomUrl(task_type, web_type, num) { + let allUrl = readJson(task_type, web_type); + + if (!num) { + return allUrl; + } + + let result = []; + let randomArray = getRandomArray(allUrl.length - 1, num); + + for (let ran of randomArray) { + result.push(allUrl[ran]); + } + + return result; +} + +function deleteUrl (task_type, web_type, id) { + let fileContent = readJson(task_type, web_type); + let deleteItem = {}; + fileContent = fileContent.filter(item => { + if (item.id == id) { + deleteItem = item; + return false; + } + return true; + }); + console.log(`DELETE URL: id: ${id} ${JSON.stringify(deleteItem, null, 4)}`.red) + writeJson(task_type, web_type, fileContent); +} + +module.exports = { + deleteUrl: deleteUrl, + taskConst: { + WEB_TYPE: WEB_TYPE, + TASK_TYPE: TASK_TYPE, + TASK_STATUS: TASK_STATUS + }, + writeJson: writeJson, + getRandomUrl: getRandomUrl } \ No newline at end of file