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