├── backend ├── teseshsst.txt ├── test.jpg ├── .gitattributes ├── lupaProject.json ├── tsconfig.json ├── watermark.js ├── package.json ├── keyGen.js ├── .gitignore ├── chevron.js ├── test.js ├── rhino.js └── neutrogena.json ├── fontend ├── .gitattributes ├── messages │ ├── error.json │ ├── submitConfirm.json │ ├── infoPrompt.json │ ├── finalMessage.json │ ├── addressInitial.json │ ├── stack.json │ ├── balance.json │ ├── infoInitial.json │ ├── rebates.json │ ├── backendLog.json │ └── help.json ├── package.json ├── rebatesList.json ├── LICENCE.txt ├── .gitignore ├── yarn.lock ├── package-lock.json └── Bot.js └── README.md /backend/teseshsst.txt: -------------------------------------------------------------------------------- 1 | ["1TWFJB6GW15K2Z7B79B5KUJHZ1KGJF2Z2F5HKGEMB77D834FVW"] -------------------------------------------------------------------------------- /backend/test.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NoRiskNoReward/Rebate-Bot/HEAD/backend/test.jpg -------------------------------------------------------------------------------- /backend/.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /fontend/.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /backend/lupaProject.json: -------------------------------------------------------------------------------- 1 | { 2 | "comment": "This is only default config! It may not be appriopriate to your project. Check more on atom.io/packages/atom-lupa", 3 | "filePattern": "src/**/*.js" 4 | } -------------------------------------------------------------------------------- /fontend/messages/error.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Hey,", 3 | "description": "details", 4 | "color": 16711731, 5 | "timestamp": "2020-10-07T04:20:04.579Z", 6 | "author": { 7 | "name": "Rebates Bot | Error", 8 | "url": "https://rebates.atshop.io/" 9 | } 10 | } -------------------------------------------------------------------------------- /fontend/messages/submitConfirm.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "", 3 | "color": 1953362, 4 | "timestamp": "2020-10-12T22:09:10.360Z", 5 | "author": { 6 | "name": "Rebates Bot | Rebates | Submission successful", 7 | "url": "https://rebates.atshop.io/" 8 | }, 9 | "fields": [ 10 | { 11 | "name": "🎉Success🎉", 12 | "value": "Your request has been submitted. Please allow 1 - 5 minutes for a reponse" 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /fontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rebate-bot", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node Bot.js" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "axios": "^0.20.0", 14 | "chalk": "^4.1.0", 15 | "discord.js": "^12.3.1", 16 | "request": "^2.88.2", 17 | "request-promise-native": "^1.0.9" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /fontend/messages/infoPrompt.json: -------------------------------------------------------------------------------- 1 | { 2 | "color": 1953362, 3 | "timestamp": "2020-10-12T22:09:10.360Z", 4 | "thumbnail": { 5 | "url": "https://i.imgur.com/XlQZ2tc.jpg" 6 | }, 7 | "author": { 8 | "name": "Rebates Bot | Rebates | Submit", 9 | "url": "https://rebates.atshop.io/" 10 | }, 11 | "footer": { 12 | "text": "To cancel reply 'Cancel'" 13 | }, 14 | "fields": [ 15 | { 16 | "name": "palceholder", 17 | "value": "placeholder" 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /fontend/rebatesList.json: -------------------------------------------------------------------------------- 1 | { 2 | "allRebates": [ 3 | { 4 | "price": ".25 Token", 5 | "rebates": [ 6 | "Energizer $5 VCC (FAST)[MUST DO 4 OR TOKEN WILL BE DEDUCTED EXTRA FOR OTHER REBATES!!!]", 7 | "iTunes $10 Virtual GC", 8 | "Starbucks $10 Virtual GC" 9 | ], 10 | "paths": ["energizer", "itunes", "starbucks"] 11 | }, 12 | { 13 | "price": ".5 Token", 14 | "rebates": [ 15 | "Nature $10 VCC", 16 | "Bandaid $10 VCC" 17 | ], 18 | "paths": ["nature", "bandaid"] 19 | } 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /fontend/messages/finalMessage.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Hey,", 3 | "color": 1953362, 4 | "timestamp": "2020-10-12T22:09:10.360Z", 5 | "thumbnail": { 6 | "url": "https://i.imgur.com/XlQZ2tc.jpg" 7 | }, 8 | "author": { 9 | "name": "Rebates Bot | Rebates", 10 | "url": "https://rebates.atshop.io/" 11 | }, 12 | "fields": [ 13 | { 14 | "name": "Message", 15 | "value": "placeholder" 16 | }, 17 | { 18 | "name": "Info", 19 | "value": "placeholder" 20 | }, 21 | { 22 | "name": "Image", 23 | "value": "placeholder" 24 | } 25 | ] 26 | } -------------------------------------------------------------------------------- /fontend/messages/addressInitial.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Hey,", 3 | "description": "Lets check if you're address can be considered valid", 4 | "color": 1953362, 5 | "timestamp": "2020-10-12T22:09:10.360Z", 6 | "thumbnail": { 7 | "url": "https://i.imgur.com/XlQZ2tc.jpg" 8 | }, 9 | "author": { 10 | "name": "Rebates Bot | Rebates | Address", 11 | "url": "https://rebates.atshop.io/" 12 | }, 13 | "footer": { 14 | "text": "To cancel reply 'Cancel'" 15 | }, 16 | "fields": [ 17 | { 18 | "name": "Street Address", 19 | "value": "Please reply with your street address" 20 | } 21 | ] 22 | } -------------------------------------------------------------------------------- /fontend/messages/stack.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Hey,", 3 | "description": "Below you can find information regarding your new key! If you believe a mistake has been made contact an admin. Support tickets can be made in the ``#tickets`` channel!", 4 | "color": 1953362, 5 | "timestamp": "", 6 | "author": { 7 | "name": "Rebates Bot | Balance", 8 | "url": "https://rebates.atshop.io/" 9 | }, 10 | "fields": [ 11 | { 12 | "name": "Current 🔑", 13 | "value": "", 14 | "inline": true 15 | }, 16 | { 17 | "name": "Where do I purchase 🔑's ?", 18 | "value": "https://rebates.atshop.io/", 19 | "inline": true 20 | } 21 | ] 22 | } -------------------------------------------------------------------------------- /fontend/LICENCE.txt: -------------------------------------------------------------------------------- 1 | ISC License (ISC) 2 | Copyright 2020 DanTechBoy 3 | 4 | Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. 5 | 6 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -------------------------------------------------------------------------------- /backend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "CommonJS", 4 | "target": "ES2018", 5 | "outDir": "dist", 6 | "lib": [ 7 | "ESNext", 8 | "ESNext.Array", 9 | "ESNext.AsyncIterable", 10 | "ESNext.Intl", 11 | "ESNext.Symbol", 12 | "DOM" 13 | ], 14 | "sourceMap": false, 15 | "inlineSourceMap": true, 16 | "inlineSources": true, 17 | "incremental": true, 18 | "esModuleInterop": true, 19 | "experimentalDecorators": true, 20 | "emitDecoratorMetadata": true 21 | }, 22 | "include": [ 23 | "src/**/*" 24 | ], 25 | "exclude": [ 26 | "node_modules" 27 | ] 28 | } -------------------------------------------------------------------------------- /fontend/messages/balance.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Hey,", 3 | "description": "Below you can find information regarding your current balance! If you believe a mistake has been made contact an admin. Support tickets can be made in the ``#tickets`` channel!", 4 | "color": 1953362, 5 | "timestamp": "", 6 | "author": { 7 | "name": "Rebates Bot | Balance", 8 | "url": "https://rebates.atshop.io/" 9 | }, 10 | "fields": [ 11 | { 12 | "name": "Current 🔑 Balance", 13 | "value": "", 14 | "inline": true 15 | }, 16 | { 17 | "name": "Where do I purchase 🔑's ?", 18 | "value": "https://rebates.atshop.io/", 19 | "inline": true 20 | } 21 | ] 22 | } -------------------------------------------------------------------------------- /fontend/messages/infoInitial.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Great choice👍,", 3 | "description": "You selected option ``#``, ``optiondescription``, for ``ticketprice``. To continue I'll need a little more information.", 4 | "color": 1953362, 5 | "timestamp": "2020-10-12T22:09:10.360Z", 6 | "thumbnail": { 7 | "url": "https://i.imgur.com/XlQZ2tc.jpg" 8 | }, 9 | "author": { 10 | "name": "Rebates Bot | Rebates | Submit", 11 | "url": "https://rebates.atshop.io/" 12 | }, 13 | "footer": { 14 | "text": "To cancel reply 'Cancel'" 15 | }, 16 | "fields": [ 17 | { 18 | "name": "Email", 19 | "value": "Please reply with your email so you can receive tracking info regarding your rebate. I promise not to send love letters😳" 20 | } 21 | ] 22 | } -------------------------------------------------------------------------------- /fontend/messages/rebates.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Hey,", 3 | "description": "Below you can find a list of the rebates we currently support. To naviagte between pages use the ⬅️ and ➡️ emoji below. If you have any questions regarding the rebates please contact an admin or ask in the ``#general-chat`` channel.", 4 | "color": 1953362, 5 | "timestamp": "2020-10-07T05:02:55.087Z", 6 | "thumbnail": { 7 | "url": "https://i.imgur.com/XlQZ2tc.jpg" 8 | }, 9 | "author": { 10 | "name": "Rebates Bot | Rebates", 11 | "url": "https://rebates.atshop.io/" 12 | }, 13 | "fields": [ 14 | { 15 | "name": "placeholder", 16 | "value": "placeholder", 17 | "inline": false 18 | }, 19 | { 20 | "name": "\u200b", 21 | "value": "\u200b", 22 | "inline": false 23 | } 24 | ] 25 | } -------------------------------------------------------------------------------- /fontend/messages/backendLog.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": "Love", 3 | "embeds": [ 4 | { 5 | "author": { 6 | "name": "Backend Log" 7 | }, 8 | "color": 15258703, 9 | "fields": [ 10 | { 11 | "name": "Status", 12 | "value": "More text", 13 | "inline": true 14 | }, 15 | { 16 | "name": "Rebate", 17 | "value": "Yup", 18 | "inline": true 19 | }, 20 | { 21 | "name": "Key Used", 22 | "value": "okay..." 23 | }, 24 | { 25 | "name": "Additional Info", 26 | "value": "You're welcome :wink:" 27 | }, 28 | { 29 | "name": "Image", 30 | "value": "okay..." 31 | }, 32 | { 33 | "name": "Address", 34 | "value": "You're welcome :wink:", 35 | "inline": true 36 | }, 37 | { 38 | "name": "User", 39 | "value": "Yup", 40 | "inline": true 41 | } 42 | ] 43 | } 44 | ] 45 | } -------------------------------------------------------------------------------- /backend/watermark.js: -------------------------------------------------------------------------------- 1 | const Jimp = require('jimp'); 2 | var fs = require('fs'); 3 | const fses = require('fs').promises; 4 | var s; 5 | (async () => { 6 | s = await watermark('ss'); 7 | console.log(s); 8 | })(); 9 | async function watermark(ORIGINAL_IMAGE) { 10 | var bitmap = await fses.readFile( 11 | './images/48c0cece-3ecf-4ef0-9edb-20552623773f.jpeg' 12 | ); 13 | // convert binary data to base64 encoded string 14 | var ORIGINAL_IMAGE = new Buffer(bitmap).toString('base64'); 15 | 16 | const LOGO = 'https://i.imgur.com/34rIGBW.png'; 17 | 18 | const LOGO_MARGIN_PERCENTAGE = 1; 19 | 20 | const main = async () => { 21 | const [image, logo] = await Promise.all([ 22 | Jimp.read(Buffer.from(ORIGINAL_IMAGE, 'base64')), 23 | Jimp.read(LOGO), 24 | ]); 25 | 26 | logo.resize(image.bitmap.width, Jimp.AUTO); 27 | 28 | const xMargin = (image.bitmap.width * LOGO_MARGIN_PERCENTAGE) / 100; 29 | const yMargin = (image.bitmap.width * LOGO_MARGIN_PERCENTAGE) / 100; 30 | 31 | const X = image.bitmap.width - logo.bitmap.width - xMargin; 32 | const Y = image.bitmap.height - logo.bitmap.height - yMargin; 33 | 34 | return image.composite(logo, X, Y, [ 35 | { 36 | mode: Jimp.BLEND_SCREEN, 37 | opacitySource: 0.1, 38 | opacityDest: 1, 39 | }, 40 | ]); 41 | }; 42 | var s; 43 | await main().then((img) => { 44 | img.getBase64(Jimp.AUTO, (err, res) => { 45 | s = res; 46 | }); 47 | }); 48 | return s; 49 | } 50 | -------------------------------------------------------------------------------- /backend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "script", 3 | "version": "1.0.0", 4 | "main": "app.js", 5 | "scripts": { 6 | "start": "node app.js", 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "license": "MIT", 10 | "dependencies": { 11 | "2captcha-node": "^2.1.2", 12 | "@feathersjs/feathers": "^4.5.8", 13 | "@feathersjs/socketio-client": "^4.5.8", 14 | "atshop-service-models": "^0.38.4", 15 | "axios": "^0.20.0", 16 | "chalk": "^4.1.0", 17 | "cheerio": "^1.0.0-rc.5", 18 | "chromedriver": "^85.0.0", 19 | "depcheck": "^1.2.0", 20 | "discord.js": "^12.2.0", 21 | "dotenv": "^8.2.0", 22 | "escape-string-regexp": "^4.0.0", 23 | "express": "^4.17.1", 24 | "form-data": "^3.0.0", 25 | "fs": "^0.0.1-security", 26 | "generate-password": "^1.5.1", 27 | "human-names": "^1.0.11", 28 | "node-html-to-image": "^3.1.0", 29 | "pg": "^8.3.2", 30 | "prompt": "^1.0.0", 31 | "puppeteer": "^5.5.0", 32 | "puppeteer-extra": "^3.1.15", 33 | "puppeteer-extra-plugin-recaptcha": "^3.3.0", 34 | "puppeteer-extra-plugin-stealth": "^2.6.5", 35 | "puppeteer-full-page-screenshot": "^1.0.5", 36 | "puppeteer-page-proxy": "^1.2.8", 37 | "request": "^2.88.2", 38 | "request-promise": "^4.2.6", 39 | "request-promise-native": "^1.0.9", 40 | "selenium-webdriver": "^4.0.0-alpha.7", 41 | "sequelize": "^6.3.4", 42 | "socket.io-client": "^2.3.0", 43 | "unique-names-generator": "^4.3.1", 44 | "usps-webtools-promise": "^2.2.0", 45 | "uuid": "^8.3.2", 46 | "uuidv4": "^6.2.6" 47 | }, 48 | "devDependencies": { 49 | "express-queue": "0.0.12" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # REBATE BOT 2 | 3 | Before you say the code is horrible: 70% of this source code was written by previous shitty non devs that don't know how to do anything. It can't be rescued. I've since rewritten it and I might release or start a better server soon. 4 | ------------- 5 | - *Please drop a star if this helped you!* 6 | - *Need help setting this up or want me to set it up for you readily hosted? DM me on Discord (Risk#2020)* 7 | ------------- 8 | ![alt text](https://i.vimeocdn.com/video/976239642.webp?mw=700&mh=613) 9 | - Automated Discord bot for Submitting Rebates. 10 | 11 | *How to use?* 12 | 13 | - First NPM Install all the dependencies for both the front end and backend 14 | - Then you need to replace the pool database details at the top of app.js with your own postgres database and structure it like (Number of the row, KEY VALUE, TOKEN AMOUNT) 15 | ex. 45 | XKJBHFDWUDHOWDBWODIBWDOIWDBWOIDBNWOIDBWODI | 5 16 | - Replace the proxy API key for any new rebates or the rebates you want to use and the authentication details. use proxycheap if you don't want to do some recording. 17 | - For the discord bot change up config.json to include your own webhook log link and your own bot token. 18 | - Boom - unlimited (err) rebates submitted for your own self. 19 | 20 | Receipts are removed temporarily so you will need to make your own receipt templates using cheerio. 21 | *How to make receipts?* 22 | 1. Order a 1$ item on any receipt store you want. 23 | 2. Download Receipt as HTML 24 | 3. Use Cheerio to edit the html receipt (ctrl f a receipt example in app.js like walmart to learn how) 25 | 4. Just search up a cheerio tutorial online to manually edit the html elements on the fly like how all other receipt gens work. 26 | 27 | If you don't want to do this work and just want all the receipts ready made - contact my discord to buy the pack for 50$ 28 | 29 | *After all this - just do npm start on both and everything should now work* 30 | 31 | *How do I make new rebates?* 32 | 1. Get puppeteer recorder extension 33 | 2. Record yourself doing a rebate manually 34 | 3. Add it to the code like the other examples 35 | -------------------------------------------------------------------------------- /backend/keyGen.js: -------------------------------------------------------------------------------- 1 | const request = require('request-promise-native'); 2 | const fses = require('fs').promises; 3 | 4 | (async () => { 5 | var x; 6 | var arr = []; 7 | for (x = 0; x < 1; x++) { 8 | var s = await request.get( 9 | 'http://localhost:8000/addkey?admin=381f1c60-279e-4b3b-b75c-f65af90ae458&uses=3' 10 | ); 11 | await sleep(100); 12 | arr.push(s); 13 | } 14 | console.log(s); 15 | await fses.writeFile('./teseshsst.txt', JSON.stringify(arr)); 16 | // 17 | // arr=[] 18 | // 19 | // for(x=0;x<200;x++){ 20 | // var s =await request.get("http://localhost:8000/addkey?admin=381f1c60-279e-4b3b-b75c-f65af90ae458&uses=5") 21 | // await sleep(100) 22 | // arr.push(s) 23 | // } 24 | // await fses.writeFile("./five.txt", JSON.stringify(arr)) 25 | // 26 | // arr=[] 27 | // 28 | // for(x=0;x<200;x++){ 29 | // var s =await request.get("http://localhost:8000/addkey?admin=381f1c60-279e-4b3b-b75c-f65af90ae458&uses=10") 30 | // await sleep(100) 31 | // arr.push(s) 32 | // } 33 | // await fses.writeFile("./ten.txt", JSON.stringify(arr)) 34 | // 35 | // arr=[] 36 | // 37 | // for(x=0;x<50;x++){ 38 | // var s =await request.get("http://localhost:8000/addkey?admin=381f1c60-279e-4b3b-b75c-f65af90ae458&uses=25") 39 | // await sleep(100) 40 | // arr.push(s) 41 | // } 42 | // await fses.writeFile("./twentyfive.txt", JSON.stringify(arr)) 43 | // 44 | // 45 | // arr=[] 46 | // 47 | // for(x=0;x<50;x++){ 48 | // var s =await request.get("http://localhost:8000/addkey?admin=381f1c60-279e-4b3b-b75c-f65af90ae458&uses=50") 49 | // await sleep(100) 50 | // arr.push(s) 51 | // } 52 | // await fses.writeFile("./fifty.txt", JSON.stringify(arr)) 53 | // 54 | // 55 | // arr=[] 56 | // 57 | // for(x=0;x<50;x++){ 58 | // var s =await request.get("http://localhost:8000/addkey?admin=381f1c60-279e-4b3b-b75c-f65af90ae458&uses=100") 59 | // await sleep(100) 60 | // arr.push(s) 61 | // } 62 | // await fses.writeFile("./hundred.txt", JSON.stringify(arr)) 63 | 64 | function sleep(ms) { 65 | return new Promise((resolve) => setTimeout(resolve, ms)); 66 | } 67 | })(); 68 | -------------------------------------------------------------------------------- /fontend/messages/help.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Hey,", 3 | "description": "Below you can find information on the commands I currently support. If you have any questions or are running into issues, please contact a developer.", 4 | "color": 1953362, 5 | "timestamp": "", 6 | "thumbnail": { 7 | "url": "https://i.imgur.com/XlQZ2tc.jpg" 8 | }, 9 | "author": { 10 | "name": "Rebates Bot | Help", 11 | "url": "https://rebates.atshop.io/" 12 | }, 13 | "fields": [ 14 | { 15 | "name": "!rebates", 16 | "value": "This command will return a list of available rebates. Each page is ordered by price making it easy to find exactly what you're looking for. Rebates are updated every Sunday and maintenance is conducted as often as needed.", 17 | "inline": false 18 | }, 19 | { 20 | "name": "!rebateslist", 21 | "value": "This command will return a list of available rebates in a single list.", 22 | "inline": false 23 | }, 24 | { 25 | "name": "!balance [key]", 26 | "value": "The balance command will return the current balance connected to the key you provide. If you believe you are missing tickets or are encountering an error please contact an admin. Tickets can be purchased here https://rebates.atshop.io/", 27 | "inline": false 28 | }, 29 | { 30 | "name": "!submit [option] [key]", 31 | "value": "The submit command is used to submit a rebate request. All options can be found by using the !rebates command.", 32 | "inline": false 33 | }, 34 | { 35 | "name": "!rebatefast,[option],[key],[Address 1],[Address 2],[City],[State],[Zip],[Email],[Phone],[Full Name]", 36 | "value": "The submit command is used to submit a rebate request. All options can be found by using the !rebates command.", 37 | "inline": false 38 | }, 39 | { 40 | "name": "!stack [key1,key2]", 41 | "value": "The stack command is used to combine multiple keys into one.", 42 | "inline": false 43 | } 44 | ] 45 | } -------------------------------------------------------------------------------- /fontend/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | config.js* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # TypeScript v1 declaration files 46 | typings/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Microbundle cache 58 | .rpt2_cache/ 59 | .rts2_cache_cjs/ 60 | .rts2_cache_es/ 61 | .rts2_cache_umd/ 62 | 63 | # Optional REPL history 64 | .node_repl_history 65 | 66 | # Output of 'npm pack' 67 | *.tgz 68 | 69 | # Yarn Integrity file 70 | .yarn-integrity 71 | 72 | # dotenv environment variables file 73 | .env 74 | .env.test 75 | 76 | # parcel-bundler cache (https://parceljs.org/) 77 | .cache 78 | 79 | # Next.js build output 80 | .next 81 | 82 | # Nuxt.js build / generate output 83 | .nuxt 84 | dist 85 | 86 | # Gatsby files 87 | .cache/ 88 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 89 | # https://nextjs.org/blog/next-9-1#public-directory-support 90 | # public 91 | 92 | # vuepress build output 93 | .vuepress/dist 94 | 95 | # Serverless directories 96 | .serverless/ 97 | 98 | # FuseBox cache 99 | .fusebox/ 100 | 101 | # DynamoDB Local files 102 | .dynamodb/ 103 | 104 | # TernJS port file 105 | .tern-port 106 | -------------------------------------------------------------------------------- /backend/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | 106 | .images/ 107 | images -------------------------------------------------------------------------------- /backend/chevron.js: -------------------------------------------------------------------------------- 1 | const puppeteer = require('puppeteer-extra'); 2 | const nodeHtmlToImage = require('node-html-to-image'); 3 | const { v4: uuidv4 } = require('uuid'); 4 | const cheerio = require('cheerio'); 5 | const request = require('request-promise-native'); 6 | const RecaptchaPlugin = require('puppeteer-extra-plugin-recaptcha'); 7 | const StealthPlugin = require('puppeteer-extra-plugin-stealth'); 8 | const fullPageScreenshot = require('puppeteer-full-page-screenshot'); 9 | var generator = require('generate-password'); 10 | const { Builder, By, Key, until } = require('selenium-webdriver'); 11 | const chrome = require('selenium-webdriver/chrome'); 12 | const captchaSolver = require('2captcha-node').default; 13 | const { 14 | uniqueNamesGenerator, 15 | Config, 16 | adjectives, 17 | colors, 18 | animals, 19 | } = require('unique-names-generator'); 20 | 21 | const config1 = { 22 | dictionaries: [adjectives, colors], 23 | length: 1, 24 | }; 25 | const config2 = { 26 | dictionaries: [animals], 27 | length: 1, 28 | }; 29 | 30 | const captcha = captchaSolver('28e72152970789e583aa01e1ccef879c'); 31 | const axios = require('axios'); 32 | 33 | (async () => { 34 | var today = new Date('2020-07-01'); 35 | 36 | today.setDate(today.getDate() + getRandomInt(0, 31)); 37 | var installDate = new Date(); 38 | installDate.setDate(today.getDate() + getRandomInt(10, 20)); 39 | var dd = String(today.getDate()).padStart(2, '0'); 40 | var mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0! 41 | var yyyy = today.getFullYear(); 42 | var todays = today; 43 | today = mm + '/' + dd + '/' + yyyy; 44 | 45 | console.log(today); 46 | var data = { 47 | email: 'a.s7.2.723.33.82.7ds.a@gmail.com', 48 | item: 's', 49 | date: 'ss s', 50 | subprice: 166, 51 | quantity: '4', 52 | seller: 'ss', 53 | address2: null, 54 | itemname: 'ssssss', 55 | image: 'true', 56 | fullName: 'ss ss', 57 | address1: '2121 armstrong dr', 58 | address2: 'bando 9', 59 | stateAbbr: 'CA', 60 | city: 'Pleasanton', 61 | zip: '94588', 62 | }; 63 | var types = ['jpeg', 'jpg', 'jpg']; 64 | const ext = types[getRandomInt(0, 2)]; 65 | 66 | var fullName = data['fullName']; 67 | var address = data['address1']; 68 | var address2 = data['address2']; 69 | var stateAbbr = data['stateAbbr']; 70 | var city = data['city']; 71 | var zip = data['zip']; 72 | var date = today; 73 | var email = data['email']; 74 | 75 | var subprice = 13.47; 76 | var quantity = 3; 77 | var itemname = 78 | 'Delo 257004470 400 XLE SAE Synblend Synthetic Blend Oil 15W40'; 79 | var imageurl = 80 | 'https://i5.walmartimages.com/asr/e4250bd5-4397-4ff7-b497-b8b8ae0fbdcd_1.a0299ca2eddcd0fb79d159f7e12dd0c3.jpeg?odnWidth=undefined&odnHeight=undefined&odnBg=ffffff'; 81 | var firstName = fullName.split(' ').slice(0, -1).join(' '); 82 | var lastName = fullName.split(' ').slice(-1).join(' '); 83 | 84 | var addresses = null; 85 | if (address2) { 86 | addresses = `${address} ${address2}`; 87 | } else { 88 | addresses = `${address}`; 89 | } 90 | 91 | //cash 92 | var date = today; 93 | var url = `http://localhost:8000/?email=${email}&seller=Amazon.com&imageurl=${imageurl}&date=${date}&subprice=${subprice}&quantity=${quantity}&itemname=${itemname}&fullName=${fullName}&address=${addresses}&stateAbbr=${stateAbbr}&city=${city}&zip=${zip}`; 94 | console.log(url); 95 | 96 | console.log(JSON.stringify(data)); 97 | 98 | var id = uuidv4(); 99 | puppeteer.use(StealthPlugin()); 100 | 101 | puppeteer.use( 102 | RecaptchaPlugin({ 103 | provider: { 104 | id: '2captcha', 105 | token: '28e72152970789e583aa01e1ccef879c', // REPLACE THIS WITH YOUR OWN 2CAPTCHA API KEY ⚡ 106 | }, 107 | visualFeedback: true, // colorize reCAPTCHAs (violet = detected, green = solved) 108 | }) 109 | ); 110 | const browser = await puppeteer.launch({ headless: false }); 111 | 112 | const page = await browser.newPage(); 113 | await page.setViewport({ width: 1000, height: 800 }); 114 | // await page.authenticate({ 115 | // username: 'lff4fyij', 116 | // password: 'AsxCCUPkQLQkZ3no_country-UnitedStates', 117 | // }); 118 | await page.setDefaultNavigationTimeout(0); 119 | 120 | var phoneNum = getAreaCode() + getRandomInt(1000000, 9999999).toString(); 121 | await page.goto(url); 122 | var element = await page.$('body > center:nth-child(5) > b'); 123 | var text = await page.evaluate((element) => element.textContent, element); 124 | await page.screenshot({ 125 | path: `${__dirname}/images/${id}.${ext}`, 126 | fullPage: true, 127 | }); 128 | await page.goto('https://chevronpromotions.com/Claim/Index/1337'); 129 | await page.waitForSelector('#claimForm #FirstName'); 130 | 131 | await page.type('#claimForm #FirstName', firstName); 132 | 133 | await page.type('#claimForm #LastName', lastName); 134 | await page.type('#Address_City', city); 135 | 136 | await page.select('#claimForm #Address_SelectedState', stateAbbr); 137 | 138 | await page.type('#Address_ZipCode', zip); 139 | if (address2 != null) { 140 | await page.waitFor(1300); 141 | 142 | await page.click('#Address_SuiteNum'); 143 | 144 | await page.type('#Address_SuiteNum', address2); 145 | } 146 | 147 | await page.type('#claimForm #Address_Address1', address); 148 | 149 | await page.type('#claimForm #Email', email); 150 | await page.select('#claimForm #Promotion_SelectedChannel', '70'); 151 | 152 | await page.type('.container #Store_Address_Address1', addresses); 153 | await page.type('#claimForm #Store_Address_City', city); 154 | 155 | await page.select('#claimForm #Store_Address_SelectedState', stateAbbr); 156 | await page.type('#claimForm #Store_Address_ZipCode', zip); 157 | 158 | await page.type('#claimForm #Receipt_Number', text.substr(25)); 159 | 160 | await page.focus('#Receipt_PurchaseDate'); 161 | await page.$eval('#Receipt_PurchaseDate', (e) => 162 | e.removeAttribute('readonly') 163 | ); 164 | await page.type('#Receipt_PurchaseDate', today); 165 | await page.click( 166 | '#products_validation > .row:nth-child(14) #Promotion_SelectedProduct' 167 | ); 168 | 169 | const fileInput = await page.$('#Receipt_ProofPurchase'); 170 | await fileInput.uploadFile(`${__dirname}/images/${id}.${ext}`); 171 | await page.waitFor(750); 172 | await page.click('#btn-submit'); 173 | await page.waitFor(500); 174 | await page.waitForSelector( 175 | 'body > div:nth-child(3) > div > div > div > p:nth-child(1) > strong' 176 | ); 177 | element = await page.$( 178 | 'body > div:nth-child(3) > div > div > div > p:nth-child(1) > strong' 179 | ); 180 | text = await page.evaluate((element) => element.textContent, element); 181 | text = `Claim ID: ${text}`; 182 | })(); 183 | function getRandomInt(min, max) { 184 | min = Math.ceil(min); 185 | max = Math.floor(max); 186 | return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive 187 | } 188 | Array.prototype.contains = function (v) { 189 | for (var i = 0; i < this.length; i++) { 190 | if (this[i] === v) return true; 191 | } 192 | return false; 193 | }; 194 | Array.prototype.unique = function () { 195 | var arr = []; 196 | for (var i = 0; i < this.length; i++) { 197 | if (!arr.contains(this[i])) { 198 | arr.push(this[i]); 199 | } 200 | } 201 | return arr; 202 | }; 203 | function genArray() { 204 | var arr = []; 205 | for (var y = 0; y < 11; y++) { 206 | arr.push(getRandomInt(0, 11)); 207 | } 208 | arr = arr.unique(); 209 | var lmao = []; 210 | lmao.push(arr[0]); 211 | lmao.push(arr[1]); 212 | lmao.push(arr[2]); 213 | return lmao; 214 | } 215 | async function getResp(imageurl) { 216 | solver.decodeUrl( 217 | imageurl, 218 | { pollingInterval: 10000 }, 219 | function (err, result, invalid) { 220 | resolve(result.text); 221 | } 222 | ); 223 | } 224 | function abbrState(input, to) { 225 | var states = [ 226 | ['Arizona', 'AZ'], 227 | ['Alabama', 'AL'], 228 | ['Alaska', 'AK'], 229 | ['Arkansas', 'AR'], 230 | ['California', 'CA'], 231 | ['Colorado', 'CO'], 232 | ['Connecticut', 'CT'], 233 | ['Delaware', 'DE'], 234 | ['Florida', 'FL'], 235 | ['Georgia', 'GA'], 236 | ['Hawaii', 'HI'], 237 | ['Idaho', 'ID'], 238 | ['Illinois', 'IL'], 239 | ['Indiana', 'IN'], 240 | ['Iowa', 'IA'], 241 | ['Kansas', 'KS'], 242 | ['Kentucky', 'KY'], 243 | ['Louisiana', 'LA'], 244 | ['Maine', 'ME'], 245 | ['Maryland', 'MD'], 246 | ['Massachusetts', 'MA'], 247 | ['Michigan', 'MI'], 248 | ['Minnesota', 'MN'], 249 | ['Mississippi', 'MS'], 250 | ['Missouri', 'MO'], 251 | ['Montana', 'MT'], 252 | ['Nebraska', 'NE'], 253 | ['Nevada', 'NV'], 254 | ['New Hampshire', 'NH'], 255 | ['New Jersey', 'NJ'], 256 | ['New Mexico', 'NM'], 257 | ['New York', 'NY'], 258 | ['North Carolina', 'NC'], 259 | ['North Dakota', 'ND'], 260 | ['Ohio', 'OH'], 261 | ['Oklahoma', 'OK'], 262 | ['Oregon', 'OR'], 263 | ['Pennsylvania', 'PA'], 264 | ['Rhode Island', 'RI'], 265 | ['South Carolina', 'SC'], 266 | ['South Dakota', 'SD'], 267 | ['Tennessee', 'TN'], 268 | ['Texas', 'TX'], 269 | ['Utah', 'UT'], 270 | ['Vermont', 'VT'], 271 | ['Virginia', 'VA'], 272 | ['Washington', 'WA'], 273 | ['West Virginia', 'WV'], 274 | ['Wisconsin', 'WI'], 275 | ['Wyoming', 'WY'], 276 | ]; 277 | 278 | if (to == 'abbr') { 279 | input = input.replace(/\w\S*/g, function (txt) { 280 | return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); 281 | }); 282 | for (i = 0; i < states.length; i++) { 283 | if (states[i][0] == input) { 284 | return states[i][1]; 285 | } 286 | } 287 | } else if (to == 'name') { 288 | input = input.toUpperCase(); 289 | for (i = 0; i < states.length; i++) { 290 | if (states[i][1] == input) { 291 | return states[i][0]; 292 | } 293 | } 294 | } 295 | } 296 | async function monitor(selector, page, phoneNum, callback, prevValue) { 297 | var newVal; 298 | try { 299 | newVal = await page.$(selector); 300 | } catch (e) { 301 | return phoneNum; 302 | } 303 | var text; 304 | if (newVal !== prevValue) { 305 | text = await page.evaluate((newVal) => newVal.textContent, newVal); 306 | while (text == 'Please enter a valid phone number.') { 307 | await callback(newVal, page, phoneNum); 308 | await page.waitFor(1000); 309 | const s = await page.waitForSelector( 310 | '#create-new-profile__phone > span', 311 | { 312 | visible: true, 313 | } 314 | ); 315 | console.log(s); 316 | text = await page.evaluate((newVal) => newVal.textContent, newVal); 317 | if (text != 'Please enter a valid phone number.') { 318 | return phoneNum; 319 | } 320 | } 321 | return phoneNum; 322 | } 323 | /* add some delay */ 324 | await new Promise((_) => setTimeout(_, 1000)); 325 | /* call recursively */ 326 | if (text == 'Please enter a valid phone number.') { 327 | monitor(selector, callback, newVal); 328 | } 329 | } 330 | async function phone(page, phoneNum) { 331 | try { 332 | const s = await page.waitForSelector('#create-new-profile__phone > span', { 333 | visible: true, 334 | timeout: 500, 335 | }); 336 | } catch (e) { 337 | return phoneNum; 338 | } 339 | const input = await page.$('#phone'); 340 | await page.focus('#phone'); 341 | await page.keyboard.down('Control'); 342 | await page.keyboard.press('A'); 343 | await page.keyboard.up('Control'); 344 | await page.keyboard.press('Backspace'); 345 | phoneNum = getAreaCode() + getRandomInt(1000000, 9999999).toString(); 346 | await page.keyboard.type(phoneNum); 347 | return phoneNum; 348 | } 349 | function getAreaCode() { 350 | var code = [650, 925, 408, 510]; 351 | return code[~~(code.length * Math.random())].toString(); 352 | } 353 | -------------------------------------------------------------------------------- /backend/test.js: -------------------------------------------------------------------------------- 1 | const puppeteer = require('puppeteer-extra'); 2 | const nodeHtmlToImage = require('node-html-to-image'); 3 | const { v4: uuidv4 } = require('uuid'); 4 | const cheerio = require('cheerio'); 5 | const request = require('request-promise-native'); 6 | const RecaptchaPlugin = require('puppeteer-extra-plugin-recaptcha'); 7 | const StealthPlugin = require('puppeteer-extra-plugin-stealth'); 8 | const fullPageScreenshot = require('puppeteer-full-page-screenshot'); 9 | var generator = require('generate-password'); 10 | const { Builder, By, Key, until } = require('selenium-webdriver'); 11 | const chrome = require('selenium-webdriver/chrome'); 12 | const captchaSolver = require('2captcha-node').default; 13 | const { 14 | uniqueNamesGenerator, 15 | Config, 16 | adjectives, 17 | colors, 18 | animals, 19 | } = require('unique-names-generator'); 20 | 21 | const config1 = { 22 | dictionaries: [adjectives, colors], 23 | length: 1, 24 | }; 25 | const config2 = { 26 | dictionaries: [animals], 27 | length: 1, 28 | }; 29 | 30 | const captcha = captchaSolver('28e72152970789e583aa01e1ccef879c'); 31 | const axios = require('axios'); 32 | 33 | (async () => { 34 | var today = new Date('2020-09-12'); 35 | // today.setDate(today.getDate() + getRandomInt(0,31)); 36 | var installDate = new Date(); 37 | installDate.setDate(today.getDate() + getRandomInt(10, 20)); 38 | var dd = String(today.getDate()).padStart(2, '0'); 39 | var mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0! 40 | var yyyy = today.getFullYear(); 41 | var todays = today; 42 | today = mm + '/' + dd + '/' + yyyy; 43 | dd = String(installDate.getDate()).padStart(2, '0'); 44 | mm = String(installDate.getMonth() - 1).padStart(2, '0'); //January is 0! 45 | yyyy = installDate.getFullYear(); 46 | console.log(today); 47 | installDate = mm + '/' + dd + '/' + yyyy; 48 | console.log(installDate); 49 | 50 | var data = { 51 | email: 'mirandasimone247@gmail.com', 52 | item: 's', 53 | date: 'ss s', 54 | subprice: 166, 55 | quantity: '4', 56 | seller: 'ss', 57 | address2: null, 58 | itemname: 'ssssss', 59 | image: 'true', 60 | fullName: 'ss ss', 61 | address1: '2145 armstrong dr', 62 | stateAbbr: 'CA', 63 | city: 'Pleasanton', 64 | zip: '94588', 65 | }; 66 | var types = ['jpeg', 'jpeg', 'png']; 67 | const ext = types[getRandomInt(0, 2)]; 68 | 69 | var fullName = data['fullName']; 70 | var address = data['address1']; 71 | var address2 = data['address2']; 72 | var stateAbbr = data['stateAbbr']; 73 | var city = data['city']; 74 | var zip = data['zip']; 75 | var date = today; 76 | var email = data['email']; 77 | 78 | var subprice = 1047.79; 79 | var quantity = 1; 80 | var itemname = 'Go Rhino SPORT BAR 2.0 MID SIZE'; 81 | var firstName = fullName.split(' ').slice(0, -1).join(' '); 82 | var lastName = fullName.split(' ').slice(-1).join(' '); 83 | 84 | var addresses = null; 85 | if (address2) { 86 | addresses = `${address} ${address2}`; 87 | } else { 88 | addresses = `${address}`; 89 | } 90 | var passwords = generator.generateMultiple(3, { 91 | length: 15, 92 | uppercase: true, 93 | numbers: true, 94 | symbols: true, 95 | strict: true, 96 | lowercase: true, 97 | }); 98 | 99 | //cash 100 | var date = today; 101 | var url = `http://localhost:8000/dicks?email=${email}&seller=Amazon.com&date=${date}&subprice=${subprice}&quantity=${quantity}&itemname=${itemname}&fullName=${fullName}&address=${addresses}&stateAbbr=${stateAbbr}&city=${city}&zip=${zip}`; 102 | console.log(url); 103 | 104 | console.log(JSON.stringify(data)); 105 | 106 | var id = uuidv4(); 107 | puppeteer.use(StealthPlugin()); 108 | 109 | puppeteer.use( 110 | RecaptchaPlugin({ 111 | provider: { 112 | id: '2captcha', 113 | token: '28e72152970789e583aa01e1ccef879c', // REPLACE THIS WITH YOUR OWN 2CAPTCHA API KEY ⚡ 114 | }, 115 | visualFeedback: true, // colorize reCAPTCHAs (violet = detected, green = solved) 116 | }) 117 | ); 118 | const browser = await puppeteer.launch({ headless: false }); 119 | 120 | const page = await browser.newPage(); 121 | await page.setViewport({ width: 1000, height: 800 }); 122 | // await page.authenticate({ 123 | // username: 'lff4fyij', 124 | // password: 'AsxCCUPkQLQkZ3no_country-UnitedStates', 125 | // }); 126 | await page.setDefaultNavigationTimeout(0); 127 | 128 | var phoneNum = getAreaCode() + getRandomInt(1000000, 9999999).toString(); 129 | await page.goto(url); 130 | 131 | await page.screenshot({ 132 | path: `${__dirname}/images/${id}.${ext}`, 133 | fullPage: true, 134 | }); 135 | await page.goto('http://promosubmissions.com/R10462W/Home/EntryForm'); 136 | await page.waitForSelector('.form > #entryForm #ship_fname'); 137 | await page.type('.form > #entryForm #ship_fname', firstName); 138 | 139 | await page.waitForSelector('.form > #entryForm #ship_lname'); 140 | await page.type('.form > #entryForm #ship_lname', lastName); 141 | 142 | await page.waitForSelector('.form > #entryForm #ship_address'); 143 | await page.type('.form > #entryForm #ship_address', addresses); 144 | await page.waitForSelector('.form > #entryForm #ship_city'); 145 | await page.type('.form > #entryForm #ship_city', city); 146 | 147 | await page.select('.form > #entryForm #ship_state', stateAbbr); 148 | 149 | await page.waitForSelector('.form > #entryForm #ship_zip'); 150 | await page.type('.form > #entryForm #ship_zip', zip); 151 | 152 | await page.waitForSelector('.form > #entryForm #email'); 153 | await page.type('.form > #entryForm #email', email); 154 | 155 | await page.select('.form > #entryForm #store', 'DICKS SPORTING GOODS'); 156 | await page.waitForSelector('#entryForm > #UPCs #upcList_0_'); 157 | await page.type('#entryForm > #UPCs #upcList_0_', '036282353978'); 158 | const inputUploadHandle = await page.$('#image'); 159 | inputUploadHandle.uploadFile(`${__dirname}/images/${id}.${ext}`); 160 | await page.waitFor(2500); 161 | await page.waitForSelector('.form > #entryForm #typeE > #checkType'); 162 | await page.click('.form > #entryForm #typeE > #checkType'); 163 | 164 | await page.waitForSelector('#entryForm #terms'); 165 | await page.click('#entryForm #terms'); 166 | await page.solveRecaptchas(); 167 | await page.waitForSelector('#EntryForm #submit'); 168 | await page.click('#EntryForm #submit'); 169 | 170 | await page.waitForSelector('#submit'); 171 | await page.click('#submit'); 172 | 173 | var text = 174 | 'Please check your email as you should soon receive a link to verify and confirm your email address'; 175 | 176 | // 177 | // await page.solveRecaptchas() 178 | // await page.waitForSelector('#register #btnEnroll2Rebates') 179 | // await page.click('#register #btnEnroll2Rebates') 180 | })(); 181 | function getRandomInt(min, max) { 182 | min = Math.ceil(min); 183 | max = Math.floor(max); 184 | return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive 185 | } 186 | Array.prototype.contains = function (v) { 187 | for (var i = 0; i < this.length; i++) { 188 | if (this[i] === v) return true; 189 | } 190 | return false; 191 | }; 192 | Array.prototype.unique = function () { 193 | var arr = []; 194 | for (var i = 0; i < this.length; i++) { 195 | if (!arr.contains(this[i])) { 196 | arr.push(this[i]); 197 | } 198 | } 199 | return arr; 200 | }; 201 | function genArray() { 202 | var arr = []; 203 | for (var y = 0; y < 11; y++) { 204 | arr.push(getRandomInt(0, 11)); 205 | } 206 | arr = arr.unique(); 207 | var lmao = []; 208 | lmao.push(arr[0]); 209 | lmao.push(arr[1]); 210 | lmao.push(arr[2]); 211 | return lmao; 212 | } 213 | async function getResp(imageurl) { 214 | solver.decodeUrl( 215 | imageurl, 216 | { pollingInterval: 10000 }, 217 | function (err, result, invalid) { 218 | resolve(result.text); 219 | } 220 | ); 221 | } 222 | function abbrState(input, to) { 223 | var states = [ 224 | ['Arizona', 'AZ'], 225 | ['Alabama', 'AL'], 226 | ['Alaska', 'AK'], 227 | ['Arkansas', 'AR'], 228 | ['California', 'CA'], 229 | ['Colorado', 'CO'], 230 | ['Connecticut', 'CT'], 231 | ['Delaware', 'DE'], 232 | ['Florida', 'FL'], 233 | ['Georgia', 'GA'], 234 | ['Hawaii', 'HI'], 235 | ['Idaho', 'ID'], 236 | ['Illinois', 'IL'], 237 | ['Indiana', 'IN'], 238 | ['Iowa', 'IA'], 239 | ['Kansas', 'KS'], 240 | ['Kentucky', 'KY'], 241 | ['Louisiana', 'LA'], 242 | ['Maine', 'ME'], 243 | ['Maryland', 'MD'], 244 | ['Massachusetts', 'MA'], 245 | ['Michigan', 'MI'], 246 | ['Minnesota', 'MN'], 247 | ['Mississippi', 'MS'], 248 | ['Missouri', 'MO'], 249 | ['Montana', 'MT'], 250 | ['Nebraska', 'NE'], 251 | ['Nevada', 'NV'], 252 | ['New Hampshire', 'NH'], 253 | ['New Jersey', 'NJ'], 254 | ['New Mexico', 'NM'], 255 | ['New York', 'NY'], 256 | ['North Carolina', 'NC'], 257 | ['North Dakota', 'ND'], 258 | ['Ohio', 'OH'], 259 | ['Oklahoma', 'OK'], 260 | ['Oregon', 'OR'], 261 | ['Pennsylvania', 'PA'], 262 | ['Rhode Island', 'RI'], 263 | ['South Carolina', 'SC'], 264 | ['South Dakota', 'SD'], 265 | ['Tennessee', 'TN'], 266 | ['Texas', 'TX'], 267 | ['Utah', 'UT'], 268 | ['Vermont', 'VT'], 269 | ['Virginia', 'VA'], 270 | ['Washington', 'WA'], 271 | ['West Virginia', 'WV'], 272 | ['Wisconsin', 'WI'], 273 | ['Wyoming', 'WY'], 274 | ]; 275 | 276 | if (to == 'abbr') { 277 | input = input.replace(/\w\S*/g, function (txt) { 278 | return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); 279 | }); 280 | for (i = 0; i < states.length; i++) { 281 | if (states[i][0] == input) { 282 | return states[i][1]; 283 | } 284 | } 285 | } else if (to == 'name') { 286 | input = input.toUpperCase(); 287 | for (i = 0; i < states.length; i++) { 288 | if (states[i][1] == input) { 289 | return states[i][0]; 290 | } 291 | } 292 | } 293 | } 294 | async function monitor(selector, page, phoneNum, callback, prevValue) { 295 | var newVal; 296 | try { 297 | newVal = await page.$(selector); 298 | } catch (e) { 299 | return phoneNum; 300 | } 301 | var text; 302 | if (newVal !== prevValue) { 303 | text = await page.evaluate((newVal) => newVal.textContent, newVal); 304 | while (text == 'Please enter a valid phone number.') { 305 | await callback(newVal, page, phoneNum); 306 | await page.waitFor(1000); 307 | const s = await page.waitForSelector( 308 | '#create-new-profile__phone > span', 309 | { 310 | visible: true, 311 | } 312 | ); 313 | console.log(s); 314 | text = await page.evaluate((newVal) => newVal.textContent, newVal); 315 | if (text != 'Please enter a valid phone number.') { 316 | return phoneNum; 317 | } 318 | } 319 | return phoneNum; 320 | } 321 | /* add some delay */ 322 | await new Promise((_) => setTimeout(_, 1000)); 323 | /* call recursively */ 324 | if (text == 'Please enter a valid phone number.') { 325 | monitor(selector, callback, newVal); 326 | } 327 | } 328 | async function phone(page, phoneNum) { 329 | try { 330 | const s = await page.waitForSelector('#create-new-profile__phone > span', { 331 | visible: true, 332 | timeout: 500, 333 | }); 334 | } catch (e) { 335 | return phoneNum; 336 | } 337 | const input = await page.$('#phone'); 338 | await page.focus('#phone'); 339 | await page.keyboard.down('Control'); 340 | await page.keyboard.press('A'); 341 | await page.keyboard.up('Control'); 342 | await page.keyboard.press('Backspace'); 343 | phoneNum = getAreaCode() + getRandomInt(1000000, 9999999).toString(); 344 | await page.keyboard.type(phoneNum); 345 | return phoneNum; 346 | } 347 | function getAreaCode() { 348 | var code = [650, 925, 408, 510]; 349 | return code[~~(code.length * Math.random())].toString(); 350 | } 351 | -------------------------------------------------------------------------------- /backend/rhino.js: -------------------------------------------------------------------------------- 1 | const puppeteer = require('puppeteer-extra'); 2 | const nodeHtmlToImage = require('node-html-to-image'); 3 | const { v4: uuidv4 } = require('uuid'); 4 | const cheerio = require('cheerio'); 5 | const request = require('request-promise-native'); 6 | const RecaptchaPlugin = require('puppeteer-extra-plugin-recaptcha'); 7 | const StealthPlugin = require('puppeteer-extra-plugin-stealth'); 8 | const fullPageScreenshot = require('puppeteer-full-page-screenshot'); 9 | var generator = require('generate-password'); 10 | const { Builder, By, Key, until } = require('selenium-webdriver'); 11 | const chrome = require('selenium-webdriver/chrome'); 12 | const captchaSolver = require('2captcha-node').default; 13 | const { 14 | uniqueNamesGenerator, 15 | Config, 16 | adjectives, 17 | colors, 18 | animals, 19 | } = require('unique-names-generator'); 20 | 21 | const config1 = { 22 | dictionaries: [adjectives, colors], 23 | length: 1, 24 | }; 25 | const config2 = { 26 | dictionaries: [animals], 27 | length: 1, 28 | }; 29 | 30 | const captcha = captchaSolver('28e72152970789e583aa01e1ccef879c'); 31 | const axios = require('axios'); 32 | 33 | (async () => { 34 | var today = new Date('2020-07-01'); 35 | today.setDate(today.getDate() + getRandomInt(0, 31)); 36 | var installDate = new Date(); 37 | installDate.setDate(today.getDate() + getRandomInt(10, 20)); 38 | var dd = String(today.getDate()).padStart(2, '0'); 39 | var mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0! 40 | var yyyy = today.getFullYear(); 41 | var todays = today; 42 | today = mm + '/' + dd + '/' + yyyy; 43 | dd = String(installDate.getDate()).padStart(2, '0'); 44 | mm = String(installDate.getMonth() - 1).padStart(2, '0'); //January is 0! 45 | yyyy = installDate.getFullYear(); 46 | console.log(today); 47 | installDate = mm + '/' + dd + '/' + yyyy; 48 | console.log(installDate); 49 | 50 | var data = { 51 | email: 'a.s7.2.ssxdasdx.21.dasadssnjkds7ds.a@gmail.com', 52 | item: 's', 53 | date: 'ss s', 54 | subprice: 166, 55 | quantity: '4', 56 | seller: 'ss', 57 | address2: null, 58 | itemname: 'ssssss', 59 | image: 'true', 60 | fullName: 'ss ss', 61 | address1: '2145 armstrong dr', 62 | stateAbbr: 'CA', 63 | city: 'Pleasanton', 64 | zip: '94588', 65 | }; 66 | var types = ['jpeg', 'jpeg', 'png']; 67 | const ext = types[getRandomInt(0, 2)]; 68 | 69 | var fullName = data['fullName']; 70 | var address = data['address1']; 71 | var address2 = data['address2']; 72 | var stateAbbr = data['stateAbbr']; 73 | var city = data['city']; 74 | var zip = data['zip']; 75 | var date = today; 76 | var email = data['email']; 77 | 78 | var subprice = 1047.79; 79 | var quantity = 1; 80 | var itemname = 'Go Rhino SPORT BAR 2.0 MID SIZE'; 81 | var firstName = fullName.split(' ').slice(0, -1).join(' '); 82 | var lastName = fullName.split(' ').slice(-1).join(' '); 83 | 84 | var addresses = null; 85 | if (address2) { 86 | addresses = `${address} ${address2}`; 87 | } else { 88 | addresses = `${address}`; 89 | } 90 | var passwords = generator.generateMultiple(3, { 91 | length: 15, 92 | uppercase: true, 93 | numbers: true, 94 | symbols: true, 95 | strict: true, 96 | lowercase: true, 97 | }); 98 | 99 | //cash 100 | var date = today; 101 | var url = `http://localhost:8000/jegs2?email=${email}&seller=Amazon.com&date=${date}&subprice=${subprice}&quantity=${quantity}&itemname=${itemname}&fullName=${fullName}&address=${addresses}&stateAbbr=${stateAbbr}&city=${city}&zip=${zip}`; 102 | console.log(url); 103 | 104 | console.log(JSON.stringify(data)); 105 | 106 | var id = uuidv4(); 107 | puppeteer.use(StealthPlugin()); 108 | 109 | puppeteer.use( 110 | RecaptchaPlugin({ 111 | provider: { 112 | id: '2captcha', 113 | token: '28e72152970789e583aa01e1ccef879c', // REPLACE THIS WITH YOUR OWN 2CAPTCHA API KEY ⚡ 114 | }, 115 | visualFeedback: true, // colorize reCAPTCHAs (violet = detected, green = solved) 116 | }) 117 | ); 118 | const browser = await puppeteer.launch({ headless: false }); 119 | 120 | const page = await browser.newPage(); 121 | await page.setViewport({ width: 1000, height: 800 }); 122 | // await page.authenticate({ 123 | // username: 'lff4fyij', 124 | // password: 'AsxCCUPkQLQkZ3no_country-UnitedStates', 125 | // }); 126 | await page.setDefaultNavigationTimeout(0); 127 | 128 | var phoneNum = getAreaCode() + getRandomInt(1000000, 9999999).toString(); 129 | await page.goto(url); 130 | var element = await page.$( 131 | 'body > div > div > table > tbody > tr > td > table > tbody > tr > td > div > font > div > blockquote:nth-child(3) > div > blockquote:nth-child(2) > div > table:nth-child(3) > tbody > tr > td > table > tbody > tr > td > table:nth-child(6) > tbody > tr:nth-child(1) > td > span' 132 | ); 133 | var text = await page.evaluate((element) => element.textContent, element); 134 | 135 | await page.screenshot({ 136 | path: `${__dirname}/images/${id}.${ext}`, 137 | fullPage: true, 138 | }); 139 | 140 | await page.goto('https://gobigerewards.com/Claims/SubmitClaim.aspx?ptype=6'); 141 | 142 | await page.waitForSelector( 143 | '.row #ctl00_DefaultContent_FindPromoControl_PurchaseDateRadDatePicker_dateInput' 144 | ); 145 | await page.type( 146 | '.row #ctl00_DefaultContent_FindPromoControl_PurchaseDateRadDatePicker_dateInput', 147 | today 148 | ); 149 | 150 | await page.waitForSelector( 151 | '.row #DefaultContent_FindPromoControl_FindPromotionLinkButton' 152 | ); 153 | await page.click( 154 | '.row #DefaultContent_FindPromoControl_FindPromotionLinkButton' 155 | ); 156 | await page.waitForSelector( 157 | '.row > #PromotionDiv #DefaultContent_FindPromoControl_ProgramRepeater_SelectProgramUserControl_0_SelectProgram_0' 158 | ); 159 | await page.click( 160 | '.row > #PromotionDiv #DefaultContent_FindPromoControl_ProgramRepeater_SelectProgramUserControl_0_SelectProgram_0' 161 | ); 162 | await page.waitForSelector( 163 | '.col-sm-6 #ctl00_DefaultContent_ContactInfoControl_ContactFirstNameRadTextBox' 164 | ); 165 | await page.type( 166 | '.col-sm-6 #ctl00_DefaultContent_ContactInfoControl_ContactFirstNameRadTextBox', 167 | firstName 168 | ); 169 | 170 | await page.waitForSelector( 171 | '.col-sm-6 #ctl00_DefaultContent_ContactInfoControl_ContactLastNameRadTextBox' 172 | ); 173 | await page.type( 174 | '.col-sm-6 #ctl00_DefaultContent_ContactInfoControl_ContactLastNameRadTextBox', 175 | lastName 176 | ); 177 | 178 | await page.waitForSelector( 179 | '.col-sm-6 #ctl00_DefaultContent_ContactInfoControl_LocationLine1RadTextBox' 180 | ); 181 | await page.type( 182 | '.col-sm-6 #ctl00_DefaultContent_ContactInfoControl_LocationLine1RadTextBox', 183 | address 184 | ); 185 | 186 | if (address2 != null) { 187 | await page.type( 188 | '.col-sm-6 #ctl00_DefaultContent_ContactInfoControl_LocationLine2RadTextBox' 189 | ); 190 | } 191 | await page.waitForSelector( 192 | '.col-sm-6 #ctl00_DefaultContent_ContactInfoControl_LocationPostalCodeRadTextBox' 193 | ); 194 | await page.type( 195 | '.col-sm-6 #ctl00_DefaultContent_ContactInfoControl_LocationPostalCodeRadTextBox', 196 | zip 197 | ); 198 | 199 | await page.waitForSelector( 200 | '.row #ctl00_DefaultContent_ContactInfoControl_LocationStateProvinceAbbreviationRadComboBox_Input' 201 | ); 202 | await page.type( 203 | '.row #ctl00_DefaultContent_ContactInfoControl_LocationStateProvinceAbbreviationRadComboBox_Input', 204 | stateAbbr 205 | ); 206 | await page.keyboard.press('Enter'); 207 | await page.waitFor(1050); 208 | await page.waitForSelector( 209 | '.col-sm-6 #ctl00_DefaultContent_ContactInfoControl_EmailAddressRadTextBox' 210 | ); 211 | await page.type( 212 | '.col-sm-6 #ctl00_DefaultContent_ContactInfoControl_EmailAddressRadTextBox', 213 | email 214 | ); 215 | 216 | await page.waitForSelector( 217 | '.col-sm-6 #ctl00_DefaultContent_ContactInfoControl_PhoneNumberRadMaskedTextBox' 218 | ); 219 | await page.type( 220 | '.col-sm-6 #ctl00_DefaultContent_ContactInfoControl_PhoneNumberRadMaskedTextBox', 221 | phoneNum 222 | ); 223 | await page.waitForSelector( 224 | '#DefaultContent_DealershipDropDownPanel > .row > #DealershipDropdownList_chosen > .chosen-single > span' 225 | ); 226 | await page.click( 227 | '#DefaultContent_DealershipDropDownPanel > .row > #DealershipDropdownList_chosen > .chosen-single > span' 228 | ); 229 | 230 | await page.waitForSelector( 231 | '.row > #DealershipDropdownList_chosen > .chosen-drop > .chosen-search > .chosen-search-input' 232 | ); 233 | await page.type( 234 | '.row > #DealershipDropdownList_chosen > .chosen-drop > .chosen-search > .chosen-search-input', 235 | 'jegs' 236 | ); 237 | await page.keyboard.press('Enter'); 238 | await page.waitFor(1050); 239 | await page.waitForSelector( 240 | 'div #ctl00_DefaultContent_ProductInformationControl_SelectedProductRadComboBox_Input' 241 | ); 242 | await page.type( 243 | 'div #ctl00_DefaultContent_ProductInformationControl_SelectedProductRadComboBox_Input', 244 | '915000PS' 245 | ); 246 | await page.waitFor(1050); 247 | 248 | await page.waitForSelector( 249 | '#ctl00_DefaultContent_ProductInformationControl_SelectedProductRadComboBox_DropDown > div.rcbScroll.rcbWidth > ul > li > table > tbody > tr > td:nth-child(1)' 250 | ); 251 | await page.click( 252 | '#ctl00_DefaultContent_ProductInformationControl_SelectedProductRadComboBox_DropDown > div.rcbScroll.rcbWidth > ul > li > table > tbody > tr > td:nth-child(1)' 253 | ); 254 | await page.waitFor(750); 255 | 256 | await page.waitForSelector( 257 | '.col-sm-6 #ctl00_DefaultContent_ProductInformationControl_ProductQuantityRadNumericTextBox' 258 | ); 259 | await page.type( 260 | '.col-sm-6 #ctl00_DefaultContent_ProductInformationControl_ProductQuantityRadNumericTextBox', 261 | '1' 262 | ); 263 | 264 | await page.waitForSelector( 265 | '.col-sm-6 #ctl00_DefaultContent_ProductInformationControl_ProductInvoiceNumberRadTextBox' 266 | ); 267 | await page.type( 268 | '.col-sm-6 #ctl00_DefaultContent_ProductInformationControl_ProductInvoiceNumberRadTextBox', 269 | text 270 | ); 271 | 272 | await page.waitForSelector( 273 | '.row #ctl00_DefaultContent_ProductInformationControl_ProductInvoiceDateRadDatePicker_dateInput' 274 | ); 275 | await page.type( 276 | '.row #ctl00_DefaultContent_ProductInformationControl_ProductInvoiceDateRadDatePicker_dateInput', 277 | today 278 | ); 279 | 280 | await page.waitForSelector( 281 | '.col-sm-6 #ctl00_DefaultContent_ProductInformationControl_ProductInvoiceCostRadTextBox' 282 | ); 283 | await page.type( 284 | '.col-sm-6 #ctl00_DefaultContent_ProductInformationControl_ProductInvoiceCostRadTextBox', 285 | '1047.79' 286 | ); 287 | await page.click( 288 | 'div > #DefaultContent_ProductInformationControl_AddProductLinkButtonPanel #DefaultContent_ProductInformationControl_AddProductLinkButton' 289 | ); 290 | 291 | const inputFile = await page.$( 292 | '#ctl00_DefaultContent_FileUploadControl_FileUploadRadAsyncUploadfile0' 293 | ); 294 | await inputFile.uploadFile(`${__dirname}/images/${id}.${ext}`); 295 | await page.click('#DefaultContent_GoToConfirmLinkButton'); 296 | await page.waitForSelector('#DefaultContent_GoToSubmitLinkButton'); 297 | await page.click('#DefaultContent_GoToSubmitLinkButton'); 298 | await page.waitForSelector('#DefaultContent_ClaimSummary_ClaimIDValueLabel'); 299 | element = await page.$('#DefaultContent_ClaimSummary_ClaimIDValueLabel'); 300 | text = await page.evaluate((element) => element.textContent, element); 301 | })(); 302 | function getRandomInt(min, max) { 303 | min = Math.ceil(min); 304 | max = Math.floor(max); 305 | return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive 306 | } 307 | Array.prototype.contains = function (v) { 308 | for (var i = 0; i < this.length; i++) { 309 | if (this[i] === v) return true; 310 | } 311 | return false; 312 | }; 313 | Array.prototype.unique = function () { 314 | var arr = []; 315 | for (var i = 0; i < this.length; i++) { 316 | if (!arr.contains(this[i])) { 317 | arr.push(this[i]); 318 | } 319 | } 320 | return arr; 321 | }; 322 | function genArray() { 323 | var arr = []; 324 | for (var y = 0; y < 11; y++) { 325 | arr.push(getRandomInt(0, 11)); 326 | } 327 | arr = arr.unique(); 328 | var lmao = []; 329 | lmao.push(arr[0]); 330 | lmao.push(arr[1]); 331 | lmao.push(arr[2]); 332 | return lmao; 333 | } 334 | async function getResp(imageurl) { 335 | solver.decodeUrl( 336 | imageurl, 337 | { pollingInterval: 10000 }, 338 | function (err, result, invalid) { 339 | resolve(result.text); 340 | } 341 | ); 342 | } 343 | function abbrState(input, to) { 344 | var states = [ 345 | ['Arizona', 'AZ'], 346 | ['Alabama', 'AL'], 347 | ['Alaska', 'AK'], 348 | ['Arkansas', 'AR'], 349 | ['California', 'CA'], 350 | ['Colorado', 'CO'], 351 | ['Connecticut', 'CT'], 352 | ['Delaware', 'DE'], 353 | ['Florida', 'FL'], 354 | ['Georgia', 'GA'], 355 | ['Hawaii', 'HI'], 356 | ['Idaho', 'ID'], 357 | ['Illinois', 'IL'], 358 | ['Indiana', 'IN'], 359 | ['Iowa', 'IA'], 360 | ['Kansas', 'KS'], 361 | ['Kentucky', 'KY'], 362 | ['Louisiana', 'LA'], 363 | ['Maine', 'ME'], 364 | ['Maryland', 'MD'], 365 | ['Massachusetts', 'MA'], 366 | ['Michigan', 'MI'], 367 | ['Minnesota', 'MN'], 368 | ['Mississippi', 'MS'], 369 | ['Missouri', 'MO'], 370 | ['Montana', 'MT'], 371 | ['Nebraska', 'NE'], 372 | ['Nevada', 'NV'], 373 | ['New Hampshire', 'NH'], 374 | ['New Jersey', 'NJ'], 375 | ['New Mexico', 'NM'], 376 | ['New York', 'NY'], 377 | ['North Carolina', 'NC'], 378 | ['North Dakota', 'ND'], 379 | ['Ohio', 'OH'], 380 | ['Oklahoma', 'OK'], 381 | ['Oregon', 'OR'], 382 | ['Pennsylvania', 'PA'], 383 | ['Rhode Island', 'RI'], 384 | ['South Carolina', 'SC'], 385 | ['South Dakota', 'SD'], 386 | ['Tennessee', 'TN'], 387 | ['Texas', 'TX'], 388 | ['Utah', 'UT'], 389 | ['Vermont', 'VT'], 390 | ['Virginia', 'VA'], 391 | ['Washington', 'WA'], 392 | ['West Virginia', 'WV'], 393 | ['Wisconsin', 'WI'], 394 | ['Wyoming', 'WY'], 395 | ]; 396 | 397 | if (to == 'abbr') { 398 | input = input.replace(/\w\S*/g, function (txt) { 399 | return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); 400 | }); 401 | for (i = 0; i < states.length; i++) { 402 | if (states[i][0] == input) { 403 | return states[i][1]; 404 | } 405 | } 406 | } else if (to == 'name') { 407 | input = input.toUpperCase(); 408 | for (i = 0; i < states.length; i++) { 409 | if (states[i][1] == input) { 410 | return states[i][0]; 411 | } 412 | } 413 | } 414 | } 415 | async function monitor(selector, page, phoneNum, callback, prevValue) { 416 | var newVal; 417 | try { 418 | newVal = await page.$(selector); 419 | } catch (e) { 420 | return phoneNum; 421 | } 422 | var text; 423 | if (newVal !== prevValue) { 424 | text = await page.evaluate((newVal) => newVal.textContent, newVal); 425 | while (text == 'Please enter a valid phone number.') { 426 | await callback(newVal, page, phoneNum); 427 | await page.waitFor(1000); 428 | const s = await page.waitForSelector( 429 | '#create-new-profile__phone > span', 430 | { 431 | visible: true, 432 | } 433 | ); 434 | console.log(s); 435 | text = await page.evaluate((newVal) => newVal.textContent, newVal); 436 | if (text != 'Please enter a valid phone number.') { 437 | return phoneNum; 438 | } 439 | } 440 | return phoneNum; 441 | } 442 | /* add some delay */ 443 | await new Promise((_) => setTimeout(_, 1000)); 444 | /* call recursively */ 445 | if (text == 'Please enter a valid phone number.') { 446 | monitor(selector, callback, newVal); 447 | } 448 | } 449 | async function phone(page, phoneNum) { 450 | try { 451 | const s = await page.waitForSelector('#create-new-profile__phone > span', { 452 | visible: true, 453 | timeout: 500, 454 | }); 455 | } catch (e) { 456 | return phoneNum; 457 | } 458 | const input = await page.$('#phone'); 459 | await page.focus('#phone'); 460 | await page.keyboard.down('Control'); 461 | await page.keyboard.press('A'); 462 | await page.keyboard.up('Control'); 463 | await page.keyboard.press('Backspace'); 464 | phoneNum = getAreaCode() + getRandomInt(1000000, 9999999).toString(); 465 | await page.keyboard.type(phoneNum); 466 | return phoneNum; 467 | } 468 | function getAreaCode() { 469 | var code = [650, 925, 408, 510]; 470 | return code[~~(code.length * Math.random())].toString(); 471 | } 472 | -------------------------------------------------------------------------------- /fontend/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@discordjs/collection@^0.1.6": 6 | version "0.1.6" 7 | resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-0.1.6.tgz#9e9a7637f4e4e0688fd8b2b5c63133c91607682c" 8 | integrity sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ== 9 | 10 | "@discordjs/form-data@^3.0.1": 11 | version "3.0.1" 12 | resolved "https://registry.yarnpkg.com/@discordjs/form-data/-/form-data-3.0.1.tgz#5c9e6be992e2e57d0dfa0e39979a850225fb4697" 13 | integrity sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg== 14 | dependencies: 15 | asynckit "^0.4.0" 16 | combined-stream "^1.0.8" 17 | mime-types "^2.1.12" 18 | 19 | abort-controller@^3.0.0: 20 | version "3.0.0" 21 | resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" 22 | integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== 23 | dependencies: 24 | event-target-shim "^5.0.0" 25 | 26 | ajv@^6.12.3: 27 | version "6.12.6" 28 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 29 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 30 | dependencies: 31 | fast-deep-equal "^3.1.1" 32 | fast-json-stable-stringify "^2.0.0" 33 | json-schema-traverse "^0.4.1" 34 | uri-js "^4.2.2" 35 | 36 | ansi-styles@^4.1.0: 37 | version "4.3.0" 38 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 39 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 40 | dependencies: 41 | color-convert "^2.0.1" 42 | 43 | asn1@~0.2.3: 44 | version "0.2.4" 45 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 46 | integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== 47 | dependencies: 48 | safer-buffer "~2.1.0" 49 | 50 | assert-plus@1.0.0, assert-plus@^1.0.0: 51 | version "1.0.0" 52 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 53 | integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= 54 | 55 | asynckit@^0.4.0: 56 | version "0.4.0" 57 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 58 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 59 | 60 | aws-sign2@~0.7.0: 61 | version "0.7.0" 62 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 63 | integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= 64 | 65 | aws4@^1.8.0: 66 | version "1.10.1" 67 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428" 68 | integrity sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA== 69 | 70 | axios@^0.20.0: 71 | version "0.20.0" 72 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.20.0.tgz#057ba30f04884694993a8cd07fa394cff11c50bd" 73 | integrity sha512-ANA4rr2BDcmmAQLOKft2fufrtuvlqR+cXNNinUmvfeSNCOF98PZL+7M/v1zIdGo7OLjEA9J2gXJL+j4zGsl0bA== 74 | dependencies: 75 | follow-redirects "^1.10.0" 76 | 77 | bcrypt-pbkdf@^1.0.0: 78 | version "1.0.2" 79 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 80 | integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= 81 | dependencies: 82 | tweetnacl "^0.14.3" 83 | 84 | caseless@~0.12.0: 85 | version "0.12.0" 86 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 87 | integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= 88 | 89 | chalk@^4.1.0: 90 | version "4.1.0" 91 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" 92 | integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== 93 | dependencies: 94 | ansi-styles "^4.1.0" 95 | supports-color "^7.1.0" 96 | 97 | color-convert@^2.0.1: 98 | version "2.0.1" 99 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 100 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 101 | dependencies: 102 | color-name "~1.1.4" 103 | 104 | color-name@~1.1.4: 105 | version "1.1.4" 106 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 107 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 108 | 109 | combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: 110 | version "1.0.8" 111 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 112 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 113 | dependencies: 114 | delayed-stream "~1.0.0" 115 | 116 | core-util-is@1.0.2: 117 | version "1.0.2" 118 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 119 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 120 | 121 | dashdash@^1.12.0: 122 | version "1.14.1" 123 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 124 | integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= 125 | dependencies: 126 | assert-plus "^1.0.0" 127 | 128 | delayed-stream@~1.0.0: 129 | version "1.0.0" 130 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 131 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 132 | 133 | discord.js@^12.3.1: 134 | version "12.3.1" 135 | resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-12.3.1.tgz#8f58ac17d29b068dbfeb6c01fc7777bacd5324cf" 136 | integrity sha512-mSFyV/mbvzH12UXdS4zadmeUf8IMQOo/YdunubG1wWt1xjWvtaJz/s9CGsFD2B5pTw1W/LXxxUbrQjIZ/xlUdw== 137 | dependencies: 138 | "@discordjs/collection" "^0.1.6" 139 | "@discordjs/form-data" "^3.0.1" 140 | abort-controller "^3.0.0" 141 | node-fetch "^2.6.0" 142 | prism-media "^1.2.2" 143 | setimmediate "^1.0.5" 144 | tweetnacl "^1.0.3" 145 | ws "^7.3.1" 146 | 147 | ecc-jsbn@~0.1.1: 148 | version "0.1.2" 149 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 150 | integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= 151 | dependencies: 152 | jsbn "~0.1.0" 153 | safer-buffer "^2.1.0" 154 | 155 | event-target-shim@^5.0.0: 156 | version "5.0.1" 157 | resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" 158 | integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== 159 | 160 | extend@~3.0.2: 161 | version "3.0.2" 162 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 163 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 164 | 165 | extsprintf@1.3.0: 166 | version "1.3.0" 167 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 168 | integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= 169 | 170 | extsprintf@^1.2.0: 171 | version "1.4.0" 172 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 173 | integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= 174 | 175 | fast-deep-equal@^3.1.1: 176 | version "3.1.3" 177 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 178 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 179 | 180 | fast-json-stable-stringify@^2.0.0: 181 | version "2.1.0" 182 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 183 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 184 | 185 | follow-redirects@^1.10.0: 186 | version "1.13.0" 187 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" 188 | integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== 189 | 190 | forever-agent@~0.6.1: 191 | version "0.6.1" 192 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 193 | integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= 194 | 195 | form-data@~2.3.2: 196 | version "2.3.3" 197 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" 198 | integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== 199 | dependencies: 200 | asynckit "^0.4.0" 201 | combined-stream "^1.0.6" 202 | mime-types "^2.1.12" 203 | 204 | getpass@^0.1.1: 205 | version "0.1.7" 206 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 207 | integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= 208 | dependencies: 209 | assert-plus "^1.0.0" 210 | 211 | har-schema@^2.0.0: 212 | version "2.0.0" 213 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 214 | integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= 215 | 216 | har-validator@~5.1.3: 217 | version "5.1.5" 218 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" 219 | integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== 220 | dependencies: 221 | ajv "^6.12.3" 222 | har-schema "^2.0.0" 223 | 224 | has-flag@^4.0.0: 225 | version "4.0.0" 226 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 227 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 228 | 229 | http-signature@~1.2.0: 230 | version "1.2.0" 231 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 232 | integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= 233 | dependencies: 234 | assert-plus "^1.0.0" 235 | jsprim "^1.2.2" 236 | sshpk "^1.7.0" 237 | 238 | is-typedarray@~1.0.0: 239 | version "1.0.0" 240 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 241 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 242 | 243 | isstream@~0.1.2: 244 | version "0.1.2" 245 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 246 | integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= 247 | 248 | jsbn@~0.1.0: 249 | version "0.1.1" 250 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 251 | integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= 252 | 253 | json-schema-traverse@^0.4.1: 254 | version "0.4.1" 255 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 256 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 257 | 258 | json-schema@0.2.3: 259 | version "0.2.3" 260 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 261 | integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= 262 | 263 | json-stringify-safe@~5.0.1: 264 | version "5.0.1" 265 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 266 | integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= 267 | 268 | jsprim@^1.2.2: 269 | version "1.4.1" 270 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 271 | integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= 272 | dependencies: 273 | assert-plus "1.0.0" 274 | extsprintf "1.3.0" 275 | json-schema "0.2.3" 276 | verror "1.10.0" 277 | 278 | lodash@^4.17.19: 279 | version "4.17.20" 280 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" 281 | integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== 282 | 283 | mime-db@1.44.0: 284 | version "1.44.0" 285 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" 286 | integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== 287 | 288 | mime-types@^2.1.12, mime-types@~2.1.19: 289 | version "2.1.27" 290 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" 291 | integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== 292 | dependencies: 293 | mime-db "1.44.0" 294 | 295 | node-fetch@^2.6.0: 296 | version "2.6.1" 297 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" 298 | integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== 299 | 300 | oauth-sign@~0.9.0: 301 | version "0.9.0" 302 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" 303 | integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== 304 | 305 | performance-now@^2.1.0: 306 | version "2.1.0" 307 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 308 | integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= 309 | 310 | prism-media@^1.2.2: 311 | version "1.2.2" 312 | resolved "https://registry.yarnpkg.com/prism-media/-/prism-media-1.2.2.tgz#4f1c841f248b67d325a24b4e6b1a491b8f50a24f" 313 | integrity sha512-I+nkWY212lJ500jLe4tN9tWO7nRiBAVdMv76P9kffZjYhw20raMlW1HSSvS+MLXC9MmbNZCazMrAr+5jEEgTuw== 314 | 315 | psl@^1.1.28: 316 | version "1.8.0" 317 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" 318 | integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== 319 | 320 | punycode@^2.1.0, punycode@^2.1.1: 321 | version "2.1.1" 322 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 323 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 324 | 325 | qs@~6.5.2: 326 | version "6.5.2" 327 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 328 | integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== 329 | 330 | request-promise-core@1.1.4: 331 | version "1.1.4" 332 | resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" 333 | integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== 334 | dependencies: 335 | lodash "^4.17.19" 336 | 337 | request-promise-native@^1.0.9: 338 | version "1.0.9" 339 | resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" 340 | integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== 341 | dependencies: 342 | request-promise-core "1.1.4" 343 | stealthy-require "^1.1.1" 344 | tough-cookie "^2.3.3" 345 | 346 | request@^2.88.2: 347 | version "2.88.2" 348 | resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" 349 | integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== 350 | dependencies: 351 | aws-sign2 "~0.7.0" 352 | aws4 "^1.8.0" 353 | caseless "~0.12.0" 354 | combined-stream "~1.0.6" 355 | extend "~3.0.2" 356 | forever-agent "~0.6.1" 357 | form-data "~2.3.2" 358 | har-validator "~5.1.3" 359 | http-signature "~1.2.0" 360 | is-typedarray "~1.0.0" 361 | isstream "~0.1.2" 362 | json-stringify-safe "~5.0.1" 363 | mime-types "~2.1.19" 364 | oauth-sign "~0.9.0" 365 | performance-now "^2.1.0" 366 | qs "~6.5.2" 367 | safe-buffer "^5.1.2" 368 | tough-cookie "~2.5.0" 369 | tunnel-agent "^0.6.0" 370 | uuid "^3.3.2" 371 | 372 | safe-buffer@^5.0.1, safe-buffer@^5.1.2: 373 | version "5.2.1" 374 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 375 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 376 | 377 | safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 378 | version "2.1.2" 379 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 380 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 381 | 382 | setimmediate@^1.0.5: 383 | version "1.0.5" 384 | resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 385 | integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= 386 | 387 | sshpk@^1.7.0: 388 | version "1.16.1" 389 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" 390 | integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== 391 | dependencies: 392 | asn1 "~0.2.3" 393 | assert-plus "^1.0.0" 394 | bcrypt-pbkdf "^1.0.0" 395 | dashdash "^1.12.0" 396 | ecc-jsbn "~0.1.1" 397 | getpass "^0.1.1" 398 | jsbn "~0.1.0" 399 | safer-buffer "^2.0.2" 400 | tweetnacl "~0.14.0" 401 | 402 | stealthy-require@^1.1.1: 403 | version "1.1.1" 404 | resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" 405 | integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= 406 | 407 | supports-color@^7.1.0: 408 | version "7.2.0" 409 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 410 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 411 | dependencies: 412 | has-flag "^4.0.0" 413 | 414 | tough-cookie@^2.3.3, tough-cookie@~2.5.0: 415 | version "2.5.0" 416 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" 417 | integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== 418 | dependencies: 419 | psl "^1.1.28" 420 | punycode "^2.1.1" 421 | 422 | tunnel-agent@^0.6.0: 423 | version "0.6.0" 424 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 425 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 426 | dependencies: 427 | safe-buffer "^5.0.1" 428 | 429 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 430 | version "0.14.5" 431 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 432 | integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= 433 | 434 | tweetnacl@^1.0.3: 435 | version "1.0.3" 436 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" 437 | integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== 438 | 439 | uri-js@^4.2.2: 440 | version "4.4.0" 441 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" 442 | integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== 443 | dependencies: 444 | punycode "^2.1.0" 445 | 446 | uuid@^3.3.2: 447 | version "3.4.0" 448 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" 449 | integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== 450 | 451 | verror@1.10.0: 452 | version "1.10.0" 453 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 454 | integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= 455 | dependencies: 456 | assert-plus "^1.0.0" 457 | core-util-is "1.0.2" 458 | extsprintf "^1.2.0" 459 | 460 | ws@^7.3.1: 461 | version "7.3.1" 462 | resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" 463 | integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== 464 | -------------------------------------------------------------------------------- /fontend/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rebate-bot", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@discordjs/collection": { 8 | "version": "0.1.6", 9 | "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", 10 | "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==" 11 | }, 12 | "@discordjs/form-data": { 13 | "version": "3.0.1", 14 | "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", 15 | "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", 16 | "requires": { 17 | "asynckit": "^0.4.0", 18 | "combined-stream": "^1.0.8", 19 | "mime-types": "^2.1.12" 20 | } 21 | }, 22 | "abort-controller": { 23 | "version": "3.0.0", 24 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 25 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 26 | "requires": { 27 | "event-target-shim": "^5.0.0" 28 | } 29 | }, 30 | "ajv": { 31 | "version": "6.12.6", 32 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 33 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 34 | "requires": { 35 | "fast-deep-equal": "^3.1.1", 36 | "fast-json-stable-stringify": "^2.0.0", 37 | "json-schema-traverse": "^0.4.1", 38 | "uri-js": "^4.2.2" 39 | } 40 | }, 41 | "ansi-styles": { 42 | "version": "4.3.0", 43 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 44 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 45 | "requires": { 46 | "color-convert": "^2.0.1" 47 | } 48 | }, 49 | "asn1": { 50 | "version": "0.2.4", 51 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 52 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 53 | "requires": { 54 | "safer-buffer": "~2.1.0" 55 | } 56 | }, 57 | "assert-plus": { 58 | "version": "1.0.0", 59 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 60 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 61 | }, 62 | "asynckit": { 63 | "version": "0.4.0", 64 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 65 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 66 | }, 67 | "aws-sign2": { 68 | "version": "0.7.0", 69 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 70 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 71 | }, 72 | "aws4": { 73 | "version": "1.11.0", 74 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", 75 | "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" 76 | }, 77 | "axios": { 78 | "version": "0.20.0", 79 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.20.0.tgz", 80 | "integrity": "sha512-ANA4rr2BDcmmAQLOKft2fufrtuvlqR+cXNNinUmvfeSNCOF98PZL+7M/v1zIdGo7OLjEA9J2gXJL+j4zGsl0bA==", 81 | "requires": { 82 | "follow-redirects": "^1.10.0" 83 | } 84 | }, 85 | "bcrypt-pbkdf": { 86 | "version": "1.0.2", 87 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 88 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 89 | "requires": { 90 | "tweetnacl": "^0.14.3" 91 | }, 92 | "dependencies": { 93 | "tweetnacl": { 94 | "version": "0.14.5", 95 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 96 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 97 | } 98 | } 99 | }, 100 | "caseless": { 101 | "version": "0.12.0", 102 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 103 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 104 | }, 105 | "chalk": { 106 | "version": "4.1.0", 107 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", 108 | "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", 109 | "requires": { 110 | "ansi-styles": "^4.1.0", 111 | "supports-color": "^7.1.0" 112 | } 113 | }, 114 | "color-convert": { 115 | "version": "2.0.1", 116 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 117 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 118 | "requires": { 119 | "color-name": "~1.1.4" 120 | } 121 | }, 122 | "color-name": { 123 | "version": "1.1.4", 124 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 125 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 126 | }, 127 | "combined-stream": { 128 | "version": "1.0.8", 129 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 130 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 131 | "requires": { 132 | "delayed-stream": "~1.0.0" 133 | } 134 | }, 135 | "core-util-is": { 136 | "version": "1.0.2", 137 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 138 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 139 | }, 140 | "dashdash": { 141 | "version": "1.14.1", 142 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 143 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 144 | "requires": { 145 | "assert-plus": "^1.0.0" 146 | } 147 | }, 148 | "delayed-stream": { 149 | "version": "1.0.0", 150 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 151 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 152 | }, 153 | "discord.js": { 154 | "version": "12.5.1", 155 | "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.1.tgz", 156 | "integrity": "sha512-VwZkVaUAIOB9mKdca0I5MefPMTQJTNg0qdgi1huF3iwsFwJ0L5s/Y69AQe+iPmjuV6j9rtKoG0Ta0n9vgEIL6w==", 157 | "requires": { 158 | "@discordjs/collection": "^0.1.6", 159 | "@discordjs/form-data": "^3.0.1", 160 | "abort-controller": "^3.0.0", 161 | "node-fetch": "^2.6.1", 162 | "prism-media": "^1.2.2", 163 | "setimmediate": "^1.0.5", 164 | "tweetnacl": "^1.0.3", 165 | "ws": "^7.3.1" 166 | } 167 | }, 168 | "ecc-jsbn": { 169 | "version": "0.1.2", 170 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 171 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 172 | "requires": { 173 | "jsbn": "~0.1.0", 174 | "safer-buffer": "^2.1.0" 175 | } 176 | }, 177 | "event-target-shim": { 178 | "version": "5.0.1", 179 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 180 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 181 | }, 182 | "extend": { 183 | "version": "3.0.2", 184 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 185 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 186 | }, 187 | "extsprintf": { 188 | "version": "1.3.0", 189 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 190 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 191 | }, 192 | "fast-deep-equal": { 193 | "version": "3.1.3", 194 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 195 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 196 | }, 197 | "fast-json-stable-stringify": { 198 | "version": "2.1.0", 199 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 200 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 201 | }, 202 | "follow-redirects": { 203 | "version": "1.13.1", 204 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", 205 | "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==" 206 | }, 207 | "forever-agent": { 208 | "version": "0.6.1", 209 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 210 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 211 | }, 212 | "form-data": { 213 | "version": "2.3.3", 214 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 215 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 216 | "requires": { 217 | "asynckit": "^0.4.0", 218 | "combined-stream": "^1.0.6", 219 | "mime-types": "^2.1.12" 220 | } 221 | }, 222 | "getpass": { 223 | "version": "0.1.7", 224 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 225 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 226 | "requires": { 227 | "assert-plus": "^1.0.0" 228 | } 229 | }, 230 | "har-schema": { 231 | "version": "2.0.0", 232 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 233 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 234 | }, 235 | "har-validator": { 236 | "version": "5.1.5", 237 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", 238 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", 239 | "requires": { 240 | "ajv": "^6.12.3", 241 | "har-schema": "^2.0.0" 242 | } 243 | }, 244 | "has-flag": { 245 | "version": "4.0.0", 246 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 247 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 248 | }, 249 | "http-signature": { 250 | "version": "1.2.0", 251 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 252 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 253 | "requires": { 254 | "assert-plus": "^1.0.0", 255 | "jsprim": "^1.2.2", 256 | "sshpk": "^1.7.0" 257 | } 258 | }, 259 | "is-typedarray": { 260 | "version": "1.0.0", 261 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 262 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 263 | }, 264 | "isstream": { 265 | "version": "0.1.2", 266 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 267 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 268 | }, 269 | "jsbn": { 270 | "version": "0.1.1", 271 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 272 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 273 | }, 274 | "json-schema": { 275 | "version": "0.2.3", 276 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 277 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 278 | }, 279 | "json-schema-traverse": { 280 | "version": "0.4.1", 281 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 282 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 283 | }, 284 | "json-stringify-safe": { 285 | "version": "5.0.1", 286 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 287 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 288 | }, 289 | "jsprim": { 290 | "version": "1.4.1", 291 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 292 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 293 | "requires": { 294 | "assert-plus": "1.0.0", 295 | "extsprintf": "1.3.0", 296 | "json-schema": "0.2.3", 297 | "verror": "1.10.0" 298 | } 299 | }, 300 | "lodash": { 301 | "version": "4.17.20", 302 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", 303 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" 304 | }, 305 | "mime-db": { 306 | "version": "1.45.0", 307 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", 308 | "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==" 309 | }, 310 | "mime-types": { 311 | "version": "2.1.28", 312 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", 313 | "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", 314 | "requires": { 315 | "mime-db": "1.45.0" 316 | } 317 | }, 318 | "node-fetch": { 319 | "version": "2.6.1", 320 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 321 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 322 | }, 323 | "oauth-sign": { 324 | "version": "0.9.0", 325 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 326 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 327 | }, 328 | "performance-now": { 329 | "version": "2.1.0", 330 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 331 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 332 | }, 333 | "prism-media": { 334 | "version": "1.2.3", 335 | "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.3.tgz", 336 | "integrity": "sha512-fSrR66n0l6roW9Rx4rSLMyTPTjRTiXy5RVqDOurACQ6si1rKHHKDU5gwBJoCsIV0R3o9gi+K50akl/qyw1C74A==" 337 | }, 338 | "psl": { 339 | "version": "1.8.0", 340 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", 341 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" 342 | }, 343 | "punycode": { 344 | "version": "2.1.1", 345 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 346 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 347 | }, 348 | "qs": { 349 | "version": "6.5.2", 350 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 351 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 352 | }, 353 | "request": { 354 | "version": "2.88.2", 355 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", 356 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 357 | "requires": { 358 | "aws-sign2": "~0.7.0", 359 | "aws4": "^1.8.0", 360 | "caseless": "~0.12.0", 361 | "combined-stream": "~1.0.6", 362 | "extend": "~3.0.2", 363 | "forever-agent": "~0.6.1", 364 | "form-data": "~2.3.2", 365 | "har-validator": "~5.1.3", 366 | "http-signature": "~1.2.0", 367 | "is-typedarray": "~1.0.0", 368 | "isstream": "~0.1.2", 369 | "json-stringify-safe": "~5.0.1", 370 | "mime-types": "~2.1.19", 371 | "oauth-sign": "~0.9.0", 372 | "performance-now": "^2.1.0", 373 | "qs": "~6.5.2", 374 | "safe-buffer": "^5.1.2", 375 | "tough-cookie": "~2.5.0", 376 | "tunnel-agent": "^0.6.0", 377 | "uuid": "^3.3.2" 378 | } 379 | }, 380 | "request-promise-core": { 381 | "version": "1.1.4", 382 | "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", 383 | "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", 384 | "requires": { 385 | "lodash": "^4.17.19" 386 | } 387 | }, 388 | "request-promise-native": { 389 | "version": "1.0.9", 390 | "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", 391 | "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", 392 | "requires": { 393 | "request-promise-core": "1.1.4", 394 | "stealthy-require": "^1.1.1", 395 | "tough-cookie": "^2.3.3" 396 | } 397 | }, 398 | "safe-buffer": { 399 | "version": "5.2.1", 400 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 401 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 402 | }, 403 | "safer-buffer": { 404 | "version": "2.1.2", 405 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 406 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 407 | }, 408 | "setimmediate": { 409 | "version": "1.0.5", 410 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 411 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 412 | }, 413 | "sshpk": { 414 | "version": "1.16.1", 415 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 416 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 417 | "requires": { 418 | "asn1": "~0.2.3", 419 | "assert-plus": "^1.0.0", 420 | "bcrypt-pbkdf": "^1.0.0", 421 | "dashdash": "^1.12.0", 422 | "ecc-jsbn": "~0.1.1", 423 | "getpass": "^0.1.1", 424 | "jsbn": "~0.1.0", 425 | "safer-buffer": "^2.0.2", 426 | "tweetnacl": "~0.14.0" 427 | }, 428 | "dependencies": { 429 | "tweetnacl": { 430 | "version": "0.14.5", 431 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 432 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 433 | } 434 | } 435 | }, 436 | "stealthy-require": { 437 | "version": "1.1.1", 438 | "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", 439 | "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" 440 | }, 441 | "supports-color": { 442 | "version": "7.2.0", 443 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 444 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 445 | "requires": { 446 | "has-flag": "^4.0.0" 447 | } 448 | }, 449 | "tough-cookie": { 450 | "version": "2.5.0", 451 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 452 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 453 | "requires": { 454 | "psl": "^1.1.28", 455 | "punycode": "^2.1.1" 456 | } 457 | }, 458 | "tunnel-agent": { 459 | "version": "0.6.0", 460 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 461 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 462 | "requires": { 463 | "safe-buffer": "^5.0.1" 464 | } 465 | }, 466 | "tweetnacl": { 467 | "version": "1.0.3", 468 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", 469 | "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" 470 | }, 471 | "uri-js": { 472 | "version": "4.4.1", 473 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 474 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 475 | "requires": { 476 | "punycode": "^2.1.0" 477 | } 478 | }, 479 | "uuid": { 480 | "version": "3.4.0", 481 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 482 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" 483 | }, 484 | "verror": { 485 | "version": "1.10.0", 486 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 487 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 488 | "requires": { 489 | "assert-plus": "^1.0.0", 490 | "core-util-is": "1.0.2", 491 | "extsprintf": "^1.2.0" 492 | } 493 | }, 494 | "ws": { 495 | "version": "7.4.2", 496 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", 497 | "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==" 498 | } 499 | } 500 | } 501 | -------------------------------------------------------------------------------- /backend/neutrogena.json: -------------------------------------------------------------------------------- 1 | { 2 | "products": [ 3 | { 4 | "name": "Neutrogena Advanced Solutions Complete Acne Therapy System", 5 | "img": "https://i5.walmartimages.com/asr/b0e63da0-cabf-4dca-868b-9d4dd0249a0c_1.c3a9ef9b6b7a5e05dcf9b6588de4ce63.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 6 | "price": 40.03 7 | }, 8 | { 9 | "name": "Neutrogena Rapid Clear Acne Eliminating Spot Treatment Gel, 0.5 fl. oz", 10 | "img": "https://i5.walmartimages.com/asr/004329e6-14d8-4d2a-a87e-bb10eefabdf5_1.4413b2e98c2a38c84fcfa025b69c67f8.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 11 | "price": 7.47 12 | }, 13 | { 14 | "name": "Neutrogena Rapid Clear Maximum Strength Acne Treatment Pads, 60 ct", 15 | "img": "https://i5.walmartimages.com/asr/816fc869-ccff-4747-9889-3eb30bca1ddd_1.ac0082f7088d6eb53ca6d4499d29e0b2.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 16 | "price": 22.98 17 | }, 18 | { 19 | "name": "Neutrogena Oil-Free Cleansing Wipes, Pink Grapefruit - 25ct", 20 | "img": "https://i5.walmartimages.com/asr/f865bbc8-ab5d-47bd-9f8e-4b7884bb5539_1.1efc7f1c488b16bbcfc887de78a1e9e9.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 21 | "price": 12.98 22 | }, 23 | { 24 | "name": "Neutrogena Glycerin Facial Cleansing Bar for Acne-Prone Skin, 3.5 oz", 25 | "img": "https://i5.walmartimages.com/asr/9f78e258-884f-4dd4-84d8-18e89dce4664_1.25ede858f129bbd4226f9d78341afbd8.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 26 | "price": 7.57 27 | }, 28 | { 29 | "name": "Neutrogena Acne Proofing Daily Salicylic Acid Acne Treatment Exfoliating and Cleansing Face Scrub - 4.2oz", 30 | "img": "https://i5.walmartimages.com/asr/c0da1b99-b091-457c-9165-adf0b66b0f34.0a72fe170942d387dbad418168de2d48.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 31 | "price": 25 32 | }, 33 | { 34 | "name": "Neutrogena Acne Proofing cleanser / Salicylic Acid / GEL", 35 | "img": "https://i5.walmartimages.com/asr/bc3a5781-cba0-4f8a-95a2-8c0e9684f0a7.64a022edfb7568229f98c1f198e485d2.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 36 | "price": 9.28 37 | }, 38 | { 39 | "name": "Neutrogena Oil-Free Pink Grapefruit Acne Wash Face Scrub, 4.2 fl. oz", 40 | "img": "https://i5.walmartimages.com/asr/a7177b3e-66f3-4b08-a8e4-9bd0ed51eff1_1.1c6725f8dae1adf05c18d3ecee3acf21.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 41 | "price": 12.64 42 | }, 43 | { 44 | "name": "Neutrogena Oil-Free Pink Grapefruit Acne Facial Cleanser, 6 fl. oz", 45 | "img": "https://i5.walmartimages.com/asr/74c1d08d-32aa-4c20-aebb-c81d16979efe_1.bb3c27f0c12f2cf2ae30b50264c7f2db.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 46 | "price": 10.7 47 | }, 48 | { 49 | "name": "Neutrogena Body Clear Pink Grapefruit Acne Body Wash, 8.5 fl. oz", 50 | "img": "https://i5.walmartimages.com/asr/6d8c42d1-db34-4c81-9491-8f7af437b514_1.45befcf1d889633e553a9788c6489c91.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 51 | "price": 15.26 52 | }, 53 | { 54 | "name": "Neutrogena Oil-Free Acne Pink Grapefruit Cream Facial Cleanser, 6 oz", 55 | "img": "https://i5.walmartimages.com/asr/4d3d2db6-3544-46ca-944a-61d244c513df_1.9f451c5e03fcfe231dd8242f02ca1eb3.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 56 | "price": 11.38 57 | }, 58 | { 59 | "name": "Neutrogena Oil Free Acne Moisturizer Pink Grapefruit / LOTION", 60 | "img": "https://i5.walmartimages.com/asr/58249a71-3ae7-460b-9a86-5130c4814b99_1.ad76f3825077d4b27ac7212772f1c20d.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 61 | "price": 5.96 62 | }, 63 | { 64 | "name": "Neutrogena Pink Grapefruit Acne Prone Skin Hydrogel Sheet Mask - 1oz", 65 | "img": "https://i5.walmartimages.com/asr/d16659bd-5140-4439-9e5b-33764e0ee7f6_1.0c66d3be7f18b23d25f4bf4ae47c27ab.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 66 | "price": 4.79 67 | }, 68 | { 69 | "name": "Neutrogena Pink Grapefruit Acne Prone Peel-Off Face Mask, 1 ct", 70 | "img": "https://i5.walmartimages.com/asr/150afa3d-399d-40e7-9042-a0bd11420250_1.7f6dba1c4308db737c5ba4deacfc9af2.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 71 | "price": 3.17 72 | }, 73 | { 74 | "name": "Neutrogena Pink Grapefruit Acne Prone Skin Clay Face Mask 1ct/0.35oz", 75 | "img": "https://i5.walmartimages.com/asr/ee16ce23-c35a-4756-a8a1-fb66ccb83f19_1.2d8ef3078568b29799f31458bd9ad6f4.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 76 | "price": 2.49 77 | }, 78 | { 79 | "name": "Neutrogena Oil-Free Pink Grapefruit Acne Facial Cleanser - 9.1 fl oz", 80 | "img": "https://i5.walmartimages.com/asr/44e444f2-6036-40ed-b096-ab78c07cbcc4_1.e284026c3dd84f86eafed242db906f7b.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 81 | "price": 7.97 82 | }, 83 | { 84 | "name": "Neutrogena Oil-Free Pink Grapefruit Acne Wash Face Scrub, 6.7 oz", 85 | "img": "https://i5.walmartimages.com/asr/03f98364-a05b-4db5-930b-48580310bacc_1.93f56f438044d3395616e4b5165ce959.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 86 | "price": 12.07 87 | }, 88 | { 89 | "name": "2 Pack, Neutrogena Pink Grapefruit Oil-Free Makeup Remover Wipes, 25 ct", 90 | "img": "https://i5.walmartimages.com/asr/c7b52240-700c-424a-8c3a-689db5213ba4_1.3f415c4b1b273c26e5a13a13fbb4f93a.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 91 | "price": 21.35 92 | }, 93 | { 94 | "name": "Neutrogena Salicylic Acid Facial Cleanser for Redness, 6 fl. oz", 95 | "img": "https://i5.walmartimages.com/asr/944f82cd-2c25-4305-84ed-9e946668c3ab_1.3227cdaa8881edd19a927243ca0637cb.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 96 | "price": 15.47 97 | }, 98 | { 99 | "name": "Neutrogena Oil Free Acne Wash / Salicylic Acid / GEL", 100 | "img": "https://i5.walmartimages.com/asr/1ce15f57-1279-46fd-9ad7-3d89d899917f_1.ab5c12042e7b54a8adc9eccc6ea1f577.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 101 | "price": 24.99 102 | }, 103 | { 104 | "name": "Neutrogena Oil-Free Acne Face Wash Daily Scrub With Salicylic Acid - 4.2 fl oz", 105 | "img": "https://i5.walmartimages.com/asr/690bc591-8395-4ec7-840d-5b1d549b1e8e_1.0374757e278b513237dea4ef65154de2.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 106 | "price": 10.82 107 | }, 108 | { 109 | "name": "Neutrogena Oil Free Acne Wash Cleanser / CREAM", 110 | "img": "https://i5.walmartimages.com/asr/99f73868-412e-412e-96d6-f45b8ee6b9c8_1.7c9ea077f0081f2a239d9c9a871f05d2.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 111 | "price": 6.47 112 | }, 113 | { 114 | "name": "Neutrogena Pink Grapefruit Acne Cream-to-Foam Acne Facial Cleanser - 3.5oz", 115 | "img": "https://i5.walmartimages.com/asr/ddfd3473-271b-44d4-a5ff-0026b23e2d79_1.4ca00300bc9344f2df8d3376c7c5cfca.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 116 | "price": 5.97 117 | }, 118 | { 119 | "name": "Neutrogena Oil Free Acne Wash / Salicylic Acid / GEL", 120 | "img": "https://i5.walmartimages.com/asr/c6a802e8-787c-43bf-8a4a-24b990f585c3_1.fd61b2ff5ff62b19c8ccdba6295ad6e8.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 121 | "price": 6.47 122 | }, 123 | { 124 | "name": "Neutrogena Body Clear Body Wash / Salicylic Acid / SOLUTION", 125 | "img": "https://i5.walmartimages.com/asr/535077f2-3714-4680-81fe-2ea8e183833c.4f811d26a39f417bd64459f469c152d2.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 126 | "price": 13.58 127 | }, 128 | { 129 | "name": "Neutrogena Body Clear Body Scrub / Salicylic Acid / SUSPENSION", 130 | "img": "https://i5.walmartimages.com/asr/0683f149-21c6-4f67-99ab-e927719c5a7f_1.b1f9a38fb9ff037190f794a817edfabc.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 131 | "price": 13.95 132 | }, 133 | { 134 | "name": "Neutrogena On-the-Spot Acne Treatment, Vanishing Formula, 0.75 oz", 135 | "img": "https://i5.walmartimages.com/asr/c5cff6c3-da61-430d-8ce6-8e31088a325f_1.81a20a766c1c65cb96b80034e4e34daf.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 136 | "price": 6.47 137 | }, 138 | { 139 | "name": "Neutrogena Rapid Clear Acne Defense Face / LOTION", 140 | "img": "https://i5.walmartimages.com/asr/5de5daec-7e5b-4e63-a33d-fa63b8d16eb8_1.18501e96b6e0cf697900d1a1e737100a.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 141 | "price": 7.78 142 | }, 143 | { 144 | "name": "Neutrogena Rapid Clear Oil-Eliminating Foaming Cleanser, 6 fl. oz", 145 | "img": "https://i5.walmartimages.com/asr/2a29fb07-a148-4c14-bd9e-5c69c23c70e5_1.de6c801abd030a709d1e3fa666a78019.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 146 | "price": 16.56 147 | }, 148 | { 149 | "name": "Neutrogena Rapid Clear Foaming Scrub / GEL", 150 | "img": "https://i5.walmartimages.com/asr/5e646ff6-5863-4be5-97e8-b080fbf55115_1.853664eb2e5b4f3b3717b7944b43cbe1.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 151 | "price": 7.47 152 | }, 153 | { 154 | "name": "Neutrogena Rapid Clear 2 in 1 Fight and Fade Toner / SOLUTION", 155 | "img": "https://i5.walmartimages.com/asr/1ae27e29-c99f-4507-a271-3590364cf2b4_1.11642626cb6cd16d33169f14252b6b46.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 156 | "price": 7.47 157 | }, 158 | { 159 | "name": "Neutrogena Rapid Clear Stubborn Acne Medicine Spot Treatment Gel - 1oz", 160 | "img": "https://i5.walmartimages.com/asr/62d01634-34ba-4e07-87e3-b07efca91dec_1.cd151403db8feaaa87245947e32ae9f3.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 161 | "price": 11.49 162 | }, 163 | { 164 | "name": "Neutrogena Rapid Clear Stubborn Acne Cleanser / LOTION", 165 | "img": "https://i5.walmartimages.com/asr/862dfb19-7bdb-49df-a9e7-acd03f124d4a_1.200e8098eaef5f8a7e2311bcd819ed2f.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 166 | "price": 15.78 167 | }, 168 | { 169 | "name": "Neutrogena 2 floz Cream Oil Control Acne Treatment", 170 | "img": "https://i5.walmartimages.com/asr/62048f02-f70b-46bd-9c3a-85ae2b9b9f8c_1.262eaf27f855ceb579aa1ebef5c121ce.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 171 | "price": 8.22 172 | }, 173 | { 174 | "name": "Neutrogena Turmeric Collection", 175 | "img": "https://i5.walmartimages.com/asr/5a510c09-76c7-4871-803f-59194a6450bf_1.31f2af41313d3b620d73bf4c9fbbc9bd.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 176 | "price": 6.97 177 | }, 178 | { 179 | "name": "Neutrogena Soothing Clear Calming Turmeric Gel Moisturizer for Acne-Prone Skin, 3.0", 180 | "img": "https://i5.walmartimages.com/asr/5323b9cc-b8c0-4fe2-a5d3-f1056b5d8df2_1.531be6acb1857c5505bcbed2d8413799.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 181 | "price": 6.97 182 | }, 183 | { 184 | "name": "Neutrogena Soothing Clear Turmeric Mist for Acne-Prone Skin, 4.2 Fl. Oz", 185 | "img": "https://i5.walmartimages.com/asr/25865666-b68a-4c3e-b1b1-99be86def54a_1.872277f79c168bdc87af47f48eca25d2.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 186 | "price": 6.97 187 | }, 188 | { 189 | "name": "Neutrogena Soothing Clear Turmeric Mousse Cleanser for Acne-Prone Skin, 5 Fl. Oz", 190 | "img": "https://i5.walmartimages.com/asr/3e979ca8-7981-40cb-8602-0e122b077160_1.7f02ce47ed0d349085a8bd1744714368.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 191 | "price": 6.97 192 | }, 193 | { 194 | "name": "Neutrogena Oil Free Acne Stress Control Power Clear Scrub / GEL", 195 | "img": "https://i5.walmartimages.com/asr/4800adec-49c2-44c0-8d7c-72d1492b4760_1.7f801e64a747f59571a2e1717643a3d8.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 196 | "price": 6.97 197 | }, 198 | { 199 | "name": "Neutrogena Oil-Free Acne Stress Control Power-Cream Face Wash 6 fl. oz", 200 | "img": "https://i5.walmartimages.com/asr/44827448-fed7-42c3-a639-064594fa98c9_1.c0f521a898b4b737f866c1fcd932eb6e.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 201 | "price": 7.47 202 | }, 203 | { 204 | "name": "Neutrogena Oil Free Acne Stress Control Triple Action Toner / LIQUID", 205 | "img": "https://i5.walmartimages.com/asr/19576a7d-4f68-4a44-b989-6a0ac6af221f_1.32b78ce56c898c6ed1483b671cd20806.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 206 | "price": 24.76 207 | }, 208 | { 209 | "name": "Neutrogena Exfoliating Blackhead Salicylic Acid Face Scrub, 4.2 oz", 210 | "img": "https://i5.walmartimages.com/asr/53cace53-5456-471a-8aba-674e2a8ff245_1.3d0ceff1c2098d552d8a75b00c64754f.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 211 | "price": 6.97 212 | }, 213 | { 214 | "name": "Neutrogena Clear Pore Facial Cleanser / Face Mask, 4.2 fl. oz", 215 | "img": "https://i5.walmartimages.com/asr/4f596bd7-e90f-4aeb-a4b6-f089a1bd18dc_1.803a79946db396f21f44ffddfb029d15.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 216 | "price": 10.91 217 | }, 218 | { 219 | "name": "Neutrogena Clear Pore Oil-Eliminating Astringent / LIQUID", 220 | "img": "https://i5.walmartimages.com/asr/46cb825a-69cd-4a72-9d9e-0d00eb6ae983.14687771399a9d6b5e4d69e2d209d503.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 221 | "price": 10.7 222 | }, 223 | { 224 | "name": "Neutrogena All-In-1 Acne Control Daily Scrub - Acne Treatment 4.2 fl oz", 225 | "img": "https://i5.walmartimages.com/asr/595c17a0-4595-4585-a1f0-25e9aff23697.26e829c719900efc8073ccd747487f3e.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 226 | "price": 14.26 227 | }, 228 | { 229 | "name": "Neutrogena Oil-Free Acne Wash Pink Grapefruit Foaming Scrub, 6.7 fl. oz./ 2 pk.", 230 | "img": "https://i5.walmartimages.com/asr/58e4d1e9-9ac6-4781-9fb1-b2e708d42a14_1.5c6e4e1083fba6fe21e8a92dc4ce49be.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 231 | "price": 29.94 232 | }, 233 | { 234 | "name": "Neutrogena Oil-Free Acne Face Wash with Salicylic Acid, 2 pk./9.1 oz.", 235 | "img": "https://i5.walmartimages.com/asr/f9adc0ea-43ab-4de4-b379-1f6313704542_1.9b2d24640b6ceba9bd36cf2e50978256.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 236 | "price": 24.95 237 | }, 238 | { 239 | "name": "Neutrogena Hydro Boost Hydrating Body Gel Cream with Hyaluronic Acid - 16oz", 240 | "img": "https://i5.walmartimages.com/asr/6c6c54dc-1043-4eed-a481-d919edce2586_1.f6b2a18b9c99969471fb09ac0f9233ca.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 241 | "price": 18.93 242 | }, 243 | { 244 | "name": "Neutrogena Hydro Boost Fragrance Free Body Gel Cream - 16oz", 245 | "img": "https://i5.walmartimages.com/asr/c931eb33-9d57-4579-a09e-c07b87853e1c_1.095fa7dbee499b6706d12f56428cd048.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 246 | "price": 8.93 247 | }, 248 | { 249 | "name": "Neutrogena Hydro Boost Hydrating Hand Gel Cream with Hyaluronic Acid - 3oz", 250 | "img": "https://i5.walmartimages.com/asr/8d00c11c-048c-46b2-8740-89f29ee67c40_1.430c2d00b3cd9d45dfc60cbbb62cc0f8.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 251 | "price": 9.01 252 | }, 253 | { 254 | "name": "Neutrogena Hydro Boost Hydrating Hyaluronic Acid Whipped Body Balm - 6.7oz", 255 | "img": "https://i5.walmartimages.com/asr/54ec2152-f3c7-4ee5-8a65-3ddca7479b06_1.cabf37310130bf319ff6da53e228a062.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 256 | "price": 5.93 257 | }, 258 | { 259 | "name": "Neutrogena Rain Bath Shower & Bath Gel Original - 32oz", 260 | "img": "https://i5.walmartimages.com/asr/b5192bb3-4ad3-4fa5-a2d4-acb0cd35ebb0_1.fd3567df0771a49306d706f123977a09.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 261 | "price": 17.39 262 | }, 263 | { 264 | "name": "Neutrogena Rainbath Rejuvenating Shower And Bath Gel Pomegranate - 16 fl oz", 265 | "img": "https://i5.walmartimages.com/asr/fbaef98f-8f18-48b0-9878-dc3366e4b8ce_1.60404de6806e1f4e9ebc9303d69de09e.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 266 | "price": 13.8 267 | }, 268 | { 269 | "name": "Neutrogena Rainbath Replenishing Shower/Bath Gel, Ocean Mist, 16 oz", 270 | "img": "https://i5.walmartimages.com/asr/2c1d6e48-5d9f-4768-a9c4-c92016a94227_1.3bb05c1b6e7d76a879854471a1111b8a.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 271 | "price": 18.4 272 | }, 273 | { 274 | "name": "Neutrogena Rainbath Shower and Bath Gel, Pear and Green Tea, 8.5 fl. oz", 275 | "img": "https://i5.walmartimages.com/asr/a2bcb683-f13e-49c9-9e74-227db7401b52_1.426e7f3b3b1a3d40b2ad5832b6078d7e.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 276 | "price": 13.08 277 | }, 278 | { 279 | "name": "Neutrogena Rain Bath Shower & Bath Gel Ocean Mist - 32oz", 280 | "img": "https://i5.walmartimages.com/asr/03a6ca1e-1818-4281-b28f-fa3988f6235e_1.6229c504d1272c8ddcde4f417a90534a.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 281 | "price": 17.39 282 | }, 283 | { 284 | "name": "Neutrogena Rainbath Restoring Shower And Bath Gel Fresh Plum - 32 fl oz", 285 | "img": "https://i5.walmartimages.com/asr/65a77a1f-34ec-4e1d-a4e6-0f294ed582b7_1.2fcd9b68b900a1cf2bad0db4ce3668e7.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 286 | "price": 26.51 287 | }, 288 | { 289 | "name": "Neutrogena Rainbath Restoring Shower And Bath Gel Fresh Plum - 16 fl oz", 290 | "img": "https://i5.walmartimages.com/asr/058610c7-a710-44e1-a75f-d2cacd95768b_1.f669ed364b7948e61a0de07cd5b15b26.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 291 | "price": 16.22 292 | }, 293 | { 294 | "name": "Neutrogena Rainbath Refreshing Shower Gel, Pear & Green Tea (40 Ounce)", 295 | "img": "https://i5.walmartimages.com/asr/8fab669a-9a9d-4b48-85b9-4541b5170af5_1.266a52e48c8c7df7618423212b01bf9b.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 296 | "price": 36.42 297 | }, 298 | { 299 | "name": "Neutrogena Rainbath Shower Gel, 40 fl. oz.", 300 | "img": "https://i5.walmartimages.com/asr/6504a0e1-bcfb-4387-b3de-0a8ae01165d3_1.621929cb1d1892806564ab50c0376a4d.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 301 | "price": 57.21 302 | }, 303 | { 304 | "name": "Neutrogena Gift Set Rainbath Variety 3-pack, 16 fl. oz. each", 305 | "img": "https://i5.walmartimages.com/asr/be8db234-9ead-4494-8b2a-21448bc1a0d5_1.c05a042dfd09cc3d1292fb4907a8f7c7.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 306 | "price": 33.71 307 | }, 308 | { 309 | "name": "Neutrogena Rainbath Refreshing Shower And Bath Gel Original - 8.5 fl oz", 310 | "img": "https://i5.walmartimages.com/asr/a015c297-0c7b-42cf-a700-0222d52d00f6_1.8aa2e0b86a5347133cd2a865fe42c79d.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 311 | "price": 11.25 312 | }, 313 | { 314 | "name": "Neutrogena Rainbath Shower and Bath Gel, Pear and Green Tea, 16 fl. oz", 315 | "img": "https://i5.walmartimages.com/asr/a386a71c-ed56-4939-b635-3edbf95182e1_1.876f039691c6051fe9708302180e387f.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 316 | "price": 18.6 317 | }, 318 | { 319 | "name": "Neutrogena Rainbath Refreshing and Cleansing Shower and Bath Gel, Moisturizing Body Wash and Shaving Gel with Clean Rinsing Lather, Original Scent, 16 fl. oz", 320 | "img": "https://i5.walmartimages.com/asr/9df648f3-c7fe-4c3c-9b67-937a3ff707bd_1.21545d73c2442e8986c711a68e151986.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 321 | "price": 18.45 322 | }, 323 | { 324 | "name": "Neutrogena Rainbath Refreshing Shower Gel, Ocean Mist, 40 Oz", 325 | "img": "https://i5.walmartimages.com/asr/07c839e3-5666-4acb-8756-749ed33cfedd_1.101243014c58de314b67a1519babac2c.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 326 | "price": 30.74 327 | }, 328 | { 329 | "name": "Neutrogena Rainbath Original Shower Gel, 40 Oz", 330 | "img": "https://i5.walmartimages.com/asr/291bcaf6-92ef-4140-9fb6-812391d80432_1.f472d3e4c1c2b90d162035837305ca2c.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 331 | "price": 30.99 332 | }, 333 | { 334 | "name": "Neutrogena Body Oil Light Sesame Formula Sesame Oil, 2 pk./16 fl. oz. with Bonus 1 fl. oz. Bottle", 335 | "img": "https://i5.walmartimages.com/asr/b165bdcd-aa4e-49fe-b7d8-e041eab17b04_1.bd9344837c87b21f5c7d295edc683dee.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 336 | "price": 38.99 337 | }, 338 | { 339 | "name": "Neutrogena Moisturizing Body Oil, Light Sesame Formula - 16 fl oz", 340 | "img": "https://i5.walmartimages.com/asr/d8058eb7-9c2c-48c0-97fc-661244441d82_1.2b448803cfb6f06ca895cf638ccea28c.jpeg?odnHeight=450&odnWidth=450&odnBg=ffffff", 341 | "price": 14.97 342 | } 343 | ] 344 | } -------------------------------------------------------------------------------- /fontend/Bot.js: -------------------------------------------------------------------------------- 1 | const { token, prefix, devToken, webhook, admins } = require('./config.js'); 2 | const fs = require('fs'); 3 | const Discord = require('discord.js'); 4 | const client = new Discord.Client(); 5 | const axios = require('axios'); 6 | const request = require('request-promise-native'); 7 | 8 | function returnMessage(message, user) { 9 | let rawdata = fs.readFileSync(`./messages/${message}.json`); 10 | let messageJson = JSON.parse(rawdata); 11 | if (user) { 12 | messageJson.title += ` ${user}`; 13 | } 14 | messageJson.timestamp = new Date(); 15 | return messageJson; 16 | } 17 | 18 | function returnCurrentRebates() { 19 | let rawdata = fs.readFileSync('./rebatesList.json'); 20 | let rebatesJson = JSON.parse(rawdata); 21 | return rebatesJson.allRebates; 22 | } 23 | 24 | async function returnBalance(key) { 25 | var response = await axios.get(`http://localhost:8000/credits?key=${key}`, { 26 | timeout: 1000, 27 | }); 28 | return response.data; 29 | } 30 | 31 | function returnPages() { 32 | let pages = []; 33 | let currentRebates = returnCurrentRebates(); 34 | let selectionIndex = 1; 35 | 36 | currentRebates.map((page) => { 37 | let rebates = ''; 38 | let path = {}; 39 | 40 | for (let index = 0; index < page.rebates.length; index++) { 41 | rebates += `\n[${selectionIndex}] - ${page.rebates[index]}`; 42 | path[selectionIndex.toString()] = page.paths[index]; 43 | selectionIndex++; 44 | } 45 | pages.push({ 46 | title: page.price, 47 | rebates: rebates.trim(), 48 | path: path, 49 | }); 50 | }); 51 | 52 | finalPages = []; 53 | 54 | for (let index = 0; index < pages.length; index = index + 2) { 55 | finalPages.push(pages.slice(index, index + 2)); 56 | } 57 | return finalPages; 58 | } 59 | 60 | function editMessage(botMessage, pageIndex, user) { 61 | let pages = returnPages(); 62 | let editedMessage = returnMessage('rebates', user); 63 | 64 | for (let index = 0; index < pages[pageIndex].length; index++) { 65 | editedMessage.fields[index].name = pages[pageIndex][index].title; 66 | editedMessage.fields[index].value = pages[pageIndex][index].rebates; 67 | } 68 | 69 | botMessage.edit({ embed: editedMessage }); 70 | } 71 | 72 | function parseRebates(selection) { 73 | let pages = returnPages(); 74 | for (let index = 0; index < pages.length; index++) { 75 | for (let index2 = 0; index2 < pages[index].length; index2++) { 76 | if (pages[index][index2].rebates.includes(`[${selection}]`)) { 77 | console.log(pages[index][index2].title); 78 | var options = pages[index][index2].rebates.split('\n'); 79 | for (let index3 = 0; index3 < options.length; index3++) { 80 | if (options[index3].includes(`[${selection}]`)) { 81 | return { 82 | price: pages[index][index2].title, 83 | selection: options[index3], 84 | path: pages[index][index2].path[selection.toString()], 85 | }; 86 | } 87 | } 88 | } 89 | } 90 | } 91 | } 92 | 93 | async function sendRequest(data, message, path) { 94 | finalMessage = returnMessage('finalMessage', message.author.tag); 95 | let response = await axios.post('http://localhost:8000/' + path, data, { 96 | 'Content-Type': 'application/json', 97 | timeout: 350000, 98 | }); 99 | 100 | finalMessage.fields[0].value = response.data.message; 101 | finalMessage.fields[1].value = response.data.info; 102 | finalMessage.fields[2].value = response.data.image; 103 | 104 | if (response.data.message == 'error') { 105 | finalMessage.fields[1].value = 'Error - Resubmit'; 106 | 107 | finalMessage.color = 16711731; 108 | await message.reply({ 109 | embed: finalMessage, 110 | }); 111 | await sendBackendLog({ 112 | person: `Full Name: ${data.fullName}\nPhone: ${data.phone}`, 113 | status: 'Failure', 114 | rebate: path, 115 | key: data.key, 116 | info: response.data.info, 117 | image: 'NA', 118 | address: `${data.address}, ${data.address2}\n ${data.city}, ${data.stateAbbr}, ${data.zip}`, 119 | user: message.author.tag, 120 | }); 121 | } else { 122 | await message.reply({ 123 | embed: finalMessage, 124 | }); 125 | await sendBackendLog({ 126 | person: `Full Name: ${data.fullName}\nPhone: ${data.phone}`, 127 | status: 'Success', 128 | rebate: path, 129 | key: data.key, 130 | info: response.data.info, 131 | image: response.data.image, 132 | address: `${data.address}, ${data.address2}\n ${data.city}, ${data.stateAbbr}, ${data.zip}`, 133 | user: message.author.tag, 134 | }); 135 | } 136 | } 137 | 138 | async function submitRebateRequest(promptData, message, token, path) { 139 | console.log('path: ' + path); 140 | var data = { 141 | email: promptData[0], 142 | fullName: promptData[1], 143 | address1: promptData[2], 144 | address: promptData[2], 145 | address2: promptData[3].toLowerCase() == 'na' ? '' : promptData[3], 146 | city: promptData[4], 147 | stateAbbr: promptData[5], 148 | zip: promptData[6], 149 | phone: promptData[7], 150 | key: token, 151 | }; 152 | console.log(data); 153 | 154 | if (Array.isArray(path)) { 155 | path.forEach( 156 | async (path) => await sendRequest(data, message, path.toLowerCase()) 157 | ); 158 | } else { 159 | await sendRequest(data, message, path.toLowerCase()); 160 | } 161 | } 162 | 163 | async function submitAddress(promptData, message) { 164 | var data = { 165 | address1: promptData[0], 166 | address: promptData[0], 167 | address2: promptData[1].toLowerCase() == 'na' ? '' : promptData[1], 168 | city: promptData[2], 169 | stateAbbr: promptData[3], 170 | zip: promptData[4], 171 | }; 172 | let response = await axios.post( 173 | 'http://localhost:8000/addressVerification', 174 | data, 175 | { 'Content-Type': 'application/json' } 176 | ); 177 | finalMessage = returnMessage('finalMessage', message.author.tag); 178 | finalMessage.fields[0].value = response.data.message; 179 | finalMessage.fields[1].value = response.data.info; 180 | finalMessage.fields.splice(2, 1); 181 | 182 | if (response.data.message == 'error') { 183 | finalMessage.color = 16711731; 184 | await message.reply({ 185 | embed: finalMessage, 186 | }); 187 | } else { 188 | await message.reply({ 189 | embed: finalMessage, 190 | }); 191 | } 192 | } 193 | 194 | async function adminSubmit(path, message) { 195 | var data = { 196 | email: 'jakepaul381@gmail.com', 197 | fullName: 'jasper smith', 198 | address: '2145 armstrong dr', 199 | address1: '2145 armstrong dr', 200 | stateAbbr: 'CA', 201 | city: 'Pleasanton', 202 | zip: '94588', 203 | phone: '9253716231', 204 | key: '9UUKPTS3C3CCE5MET1WFAMNVQ9RZ5UXQNFQ3TWR1G4BXGG1HCG', 205 | }; 206 | await sendRequest(data, message, path.toLowerCase()); 207 | } 208 | 209 | async function sendBackendLog(data) { 210 | var backendMessage = returnMessage('backendLog', false); 211 | backendMessage.content = data.person; 212 | backendMessage.embeds[0].color = 213 | data.status.toLowerCase() == 'success' ? 1953362 : 16711731; 214 | backendMessage.embeds[0].fields[0].value = data.status; 215 | backendMessage.embeds[0].fields[1].value = data.rebate; 216 | backendMessage.embeds[0].fields[2].value = data.key; 217 | backendMessage.embeds[0].fields[3].value = data.info; 218 | backendMessage.embeds[0].fields[4].value = data.image; 219 | backendMessage.embeds[0].fields[5].value = data.address; 220 | backendMessage.embeds[0].fields[6].value = data.user; 221 | await axios.post(webhook, backendMessage, { 222 | 'Content-Type': 'application/json', 223 | }); 224 | } 225 | 226 | client.on('ready', () => { 227 | console.log(`Logged in as ${client.user.tag}`); 228 | client.user.setActivity('for rebates', { 229 | type: 'WATCHING', 230 | }); 231 | }); 232 | 233 | client.on('message', async (message) => { 234 | if (message.author.bot) return; 235 | if (!message.content.startsWith(prefix)) return; 236 | 237 | const args = message.content.slice(prefix.length).trim().split(/ +/g); 238 | const argsByComma = message.content.slice(prefix.length).trim().split(','); 239 | const cmd = args.shift().toLowerCase(); 240 | 241 | //We use cmd^ to remove the command from args split by comma 242 | argsByComma[0] = argsByComma[0].replace(cmd, '').trim(); 243 | argsByComma.forEach((arg, i) => (argsByComma[i] = arg.trim())); 244 | 245 | let filter = (reaction, user) => { 246 | return ( 247 | ['⬅️', '➡️'].includes(reaction.emoji.name) && 248 | user.id === message.author.id 249 | ); 250 | }; 251 | 252 | let filter2 = (m) => m.author.id === message.author.id; 253 | 254 | if (cmd == 'admin' && admins.includes(message.author.id)) { 255 | await message.reply('Submitting'); 256 | await adminSubmit(args[0], message); 257 | } 258 | 259 | if (cmd == 'stack') { 260 | if (args.length < 1) { 261 | // Key not given 262 | let errorMessage = returnMessage('error', message.author.tag); 263 | errorMessage.description = 264 | '😰 Uh oh, look likes somethings missing! I think you meant to type ``!stack [key1,key2,key3]``'; 265 | await message.channel.send({ 266 | embed: errorMessage, 267 | }); 268 | } else { 269 | let balanceMessage = returnMessage('stack', message.author.tag); 270 | 271 | var keys = args[0].toString().split(','); 272 | if (keys.length < 2) { 273 | balanceMessage.fields[0].value = 'ERROR 2+ keys needed to Stack'; 274 | balanceMessage.color = 16711731; 275 | await message.channel.send({ 276 | embed: balanceMessage, 277 | }); 278 | } else { 279 | var total = 0.0; 280 | var curr; 281 | var invalid = true; 282 | var x; 283 | for (x = 0; x < keys.length; x++) { 284 | curr = await fetchCredits(keys[x].replace(/\s/g, '')); 285 | if (curr == 0 || curr == null) { 286 | invalid = false; 287 | } 288 | } 289 | if (invalid == true) { 290 | for (x = 0; x < keys.length; x++) { 291 | curr = await fetchCredits(keys[x].replace(/\s/g, '')); 292 | 293 | total += await fetchCredits(keys[x].replace(/\s/g, '')); 294 | 295 | await delCredits(keys[x].replace(/\s/g, '')); 296 | } 297 | 298 | console.log(total); 299 | var balance = await newCredit(total); 300 | 301 | balanceMessage.fields[0].value = balance; 302 | await message.channel.send({ 303 | embed: balanceMessage, 304 | }); 305 | } else { 306 | balanceMessage.fields[0].value = 'ERROR invalid key in stack command'; 307 | balanceMessage.color = 16711731; 308 | await message.channel.send({ 309 | embed: balanceMessage, 310 | }); 311 | } 312 | } 313 | } 314 | } 315 | 316 | if (cmd == 'balance') { 317 | if (args.length < 1) { 318 | // Key not given 319 | let errorMessage = returnMessage('error', message.author.tag); 320 | errorMessage.description = 321 | '😰 Uh oh, look likes somethings missing! I think you meant to type ``!balance [key]``'; 322 | await message.channel.send({ 323 | embed: errorMessage, 324 | }); 325 | } else { 326 | let balanceMessage = returnMessage('balance', message.author.tag); 327 | let balance = await returnBalance(args[0]); 328 | 329 | if (balance) { 330 | balanceMessage.fields[0].value = balance; 331 | await message.channel.send({ 332 | embed: balanceMessage, 333 | }); 334 | } else { 335 | balanceMessage.fields[0].value = 'ERROR'; 336 | balanceMessage.color = 16711731; 337 | await message.channel.send({ 338 | embed: balanceMessage, 339 | }); 340 | } 341 | } 342 | } 343 | 344 | if (cmd == 'submit') { 345 | if (args.length < 2) { 346 | // Key not given 347 | let errorMessage = returnMessage('error', message.author.tag); 348 | errorMessage.description = 349 | '😰 Uh oh, look likes somethings missing! I think you meant to type ``!submit [selection] [token]`` Use ``!rebates`` to see the current selection of rebates'; 350 | await message.channel.send({ 351 | embed: errorMessage, 352 | }); 353 | } else { 354 | var selection = args[0]; 355 | var token = args[1]; 356 | var parsedRebate = parseRebates(selection); 357 | 358 | var initialMessage = returnMessage('infoInitial', message.author.tag); 359 | initialMessage.description = initialMessage.description 360 | .replace('#', selection) 361 | .replace( 362 | 'optiondescription', 363 | parsedRebate.selection.replace(`[${selection}] - `, '').trim() 364 | ) 365 | .replace('ticketprice', parsedRebate.price); 366 | 367 | var promptmessage = returnMessage('infoPrompt', message.author.tag); 368 | 369 | await message.reply({ embed: initialMessage }); 370 | var responses = []; 371 | var collector = message.channel.createMessageCollector(filter2, { 372 | time: 10000000, 373 | }); 374 | collector.on('collect', async (m) => { 375 | if (m.content.toLowerCase() !== 'cancel') { 376 | switch (responses.length) { 377 | case 0: 378 | responses.push(m.content); 379 | promptmessage.title = ''; 380 | promptmessage.fields[0].name = 'Full Name'; 381 | promptmessage.fields[0].value = 382 | "Please reply with your full name. Dont worry you can enter a fake name if you'd prefer."; 383 | m.reply({ embed: promptmessage }); 384 | break; 385 | case 1: 386 | responses.push(m.content); 387 | promptmessage.title = ''; 388 | promptmessage.fields[0].name = 'Street Address'; 389 | promptmessage.fields[0].value = 390 | 'Please reply with your street address. If the rebate provides a physical reward this information must be accurate.\n Example: 7707 West Hartford Drive'; 391 | m.reply({ embed: promptmessage }); 392 | break; 393 | case 2: 394 | responses.push(m.content); 395 | promptmessage.title = ''; 396 | promptmessage.fields[0].name = 'Address Line 2'; 397 | promptmessage.fields[0].value = 398 | 'Please reply with your Apt, Suite, etc. or type NA if not needed'; 399 | m.reply({ embed: promptmessage }); 400 | break; 401 | case 3: 402 | responses.push(m.content); 403 | promptmessage.title = ''; 404 | promptmessage.fields[0].name = 'City'; 405 | promptmessage.fields[0].value = 'Please reply with your city'; 406 | m.reply({ embed: promptmessage }); 407 | break; 408 | case 4: 409 | responses.push(m.content); 410 | promptmessage.title = ''; 411 | promptmessage.fields[0].name = 'State Abbreviation'; 412 | promptmessage.fields[0].value = 413 | 'Please reply with State Abbreviation (CA,NY,TX,etc.)'; 414 | m.reply({ embed: promptmessage }); 415 | break; 416 | case 5: 417 | responses.push(m.content); 418 | promptmessage.title = ''; 419 | promptmessage.fields[0].name = 'Zip'; 420 | promptmessage.fields[0].value = 'Please enter US Zip code'; 421 | m.reply({ embed: promptmessage }); 422 | break; 423 | case 6: 424 | responses.push(m.content); 425 | promptmessage.title = ''; 426 | promptmessage.fields[0].name = 'Phone'; 427 | promptmessage.fields[0].value = 'Please enter your phone number'; 428 | m.reply({ embed: promptmessage }); 429 | break; 430 | case 7: 431 | // finished 432 | responses.push(m.content); 433 | m.reply({ embed: returnMessage('submitConfirm', m.author.tag) }); 434 | await submitRebateRequest(responses, m, token, parsedRebate.path); 435 | break; 436 | default: 437 | collector.stop(); 438 | } 439 | } else { 440 | collector.stop(); 441 | } 442 | }); 443 | } 444 | } 445 | 446 | if (cmd == 'rebates') { 447 | let pageIndex = 0; 448 | let pages = returnPages(); 449 | let rebatesMessage = returnMessage('rebates', message.author.tag); 450 | 451 | for (let index = 0; index < pages[0].length; index++) { 452 | rebatesMessage.fields[index].name = pages[0][index].title; 453 | rebatesMessage.fields[index].value = pages[0][index].rebates; 454 | } 455 | 456 | message.channel 457 | .send({ 458 | embed: rebatesMessage, 459 | }) 460 | .then((botMessage) => { 461 | botMessage.react('⬅️'); 462 | botMessage.react('➡️'); 463 | botMessage 464 | .createReactionCollector(filter, { 465 | time: 10000000, 466 | }) 467 | .on('collect', (reaction) => { 468 | if (reaction.emoji.name === '⬅️') { 469 | // Go back 470 | pageIndex == 0 ? (pageIndex = pages.length - 1) : --pageIndex; 471 | editMessage(botMessage, pageIndex, message.author.tag); 472 | } else { 473 | // Go forward 474 | pageIndex == pages.length - 1 ? (pageIndex = 0) : ++pageIndex; 475 | editMessage(botMessage, pageIndex, message.author.tag); 476 | } 477 | 478 | // https://discordjs.guide/popular-topics/reactions.html#removing-reactions-by-user 479 | const userReactions = botMessage.reactions.cache.filter( 480 | (reaction) => reaction.users.cache.has(message.author.id) 481 | ); 482 | try { 483 | for (const reaction of userReactions.values()) { 484 | reaction.users.remove(message.author.id); 485 | } 486 | } catch (error) { 487 | console.error('Failed to remove reactions.'); 488 | } 489 | }); 490 | }); 491 | } 492 | 493 | if (cmd == 'rebateslist') { 494 | let pages = returnPages(); 495 | let rebatesMessage = returnMessage('rebates', message.author.tag); 496 | rebatesMessage.description = rebatesMessage.description.split('.')[0]; 497 | rebatesMessage.fields = []; 498 | for (let index = 0; index < pages.length; index++) { 499 | for (let index2 = 0; index2 < pages[index].length; index2++) { 500 | rebatesMessage.fields.push({ 501 | name: pages[index][index2].title, 502 | value: pages[index][index2].rebates, 503 | inline: false, 504 | }); 505 | } 506 | } 507 | message.channel.send({ 508 | embed: rebatesMessage, 509 | }); 510 | } 511 | 512 | if (cmd == 'rebatelist') { 513 | let pages = returnPages(); 514 | let rebatesMessage = returnMessage('rebates', message.author.tag); 515 | rebatesMessage.description = rebatesMessage.description.split('.')[0]; 516 | rebatesMessage.fields = []; 517 | for (let index = 0; index < pages.length; index++) { 518 | for (let index2 = 0; index2 < pages[index].length; index2++) { 519 | rebatesMessage.fields.push({ 520 | name: pages[index][index2].title, 521 | value: pages[index][index2].rebates, 522 | inline: false, 523 | }); 524 | } 525 | } 526 | message.channel.send({ 527 | embed: rebatesMessage, 528 | }); 529 | } 530 | 531 | if (cmd == 'address') { 532 | var addressInitial = returnMessage('addressInitial', message.author.tag); 533 | var promptmessage = returnMessage('infoPrompt', message.author.tag); 534 | await message.reply({ embed: addressInitial }); 535 | var responses = []; 536 | var collector = message.channel.createMessageCollector(filter2, { 537 | time: 10000000, 538 | }); 539 | collector.on('collect', async (m) => { 540 | if (m.content.toLowerCase() !== 'cancel') { 541 | switch (responses.length) { 542 | case 0: 543 | responses.push(m.content); 544 | promptmessage.title = ''; 545 | promptmessage.fields[0].name = 'Address Line 2'; 546 | promptmessage.fields[0].value = 547 | 'Please reply with your Apt, Suite, etc. or type NA if not needed'; 548 | m.reply({ embed: promptmessage }); 549 | break; 550 | case 1: 551 | responses.push(m.content); 552 | promptmessage.title = ''; 553 | promptmessage.fields[0].name = 'City'; 554 | promptmessage.fields[0].value = 'Please reply with your city'; 555 | m.reply({ embed: promptmessage }); 556 | break; 557 | case 2: 558 | responses.push(m.content); 559 | promptmessage.title = ''; 560 | promptmessage.fields[0].name = 'State Abbreviation'; 561 | promptmessage.fields[0].value = 562 | 'Please reply with State Abbreviation (CA,NY,TX,etc.)'; 563 | m.reply({ embed: promptmessage }); 564 | break; 565 | case 3: 566 | responses.push(m.content); 567 | promptmessage.title = ''; 568 | promptmessage.fields[0].name = 'Zip'; 569 | promptmessage.fields[0].value = 'Please enter US Zip code'; 570 | m.reply({ embed: promptmessage }); 571 | break; 572 | case 4: 573 | responses.push(m.content); 574 | await submitAddress(responses, message); 575 | default: 576 | collector.stop(); 577 | } 578 | } else { 579 | collector.stop(); 580 | } 581 | }); 582 | } 583 | 584 | 585 | 586 | if (cmd == 'help') { 587 | let helpMessage = returnMessage('help', message.author.tag); 588 | message.channel.send({ embed: helpMessage }); 589 | } 590 | }); 591 | 592 | client.on("message", message => { 593 | 594 | 595 | 596 | const args = message.content.trim().split(","); 597 | const command = args[0].substr(1).toLowerCase(); 598 | args.shift() 599 | if(command === 'rebatefast') { 600 | var argsByComma=args; 601 | 602 | if (argsByComma.length < 1) { 603 | let errorMessage = returnMessage('error', message.author.tag); 604 | errorMessage.description = '😰 Uh oh, look likes somethings missing!'; 605 | (async () => { 606 | await message.channel.send({ 607 | embed: errorMessage, 608 | }); 609 | })(); 610 | 611 | } else { 612 | //Simple reorder 613 | console.log(argsByComma) 614 | var selection = argsByComma[0]; 615 | var token = argsByComma[1]; 616 | var responses = [ 617 | argsByComma[7], 618 | argsByComma[9], 619 | argsByComma[2], 620 | argsByComma[3], 621 | argsByComma[4], 622 | argsByComma[5], 623 | argsByComma[6], 624 | argsByComma[8], 625 | ]; 626 | 627 | console.log(responses) 628 | 629 | var parsedRebate = parseRebates(selection); 630 | (async () => { 631 | 632 | await message.reply({ 633 | embed: returnMessage('submitConfirm', message.author.tag), 634 | }); 635 | await submitRebateRequest(responses, message, token, parsedRebate.path); 636 | })(); 637 | 638 | } 639 | 640 | } 641 | 642 | }); 643 | async function fetchCredits(key) { 644 | var messages = null; 645 | messages = await request.get(`http://localhost:8000/credits?key=${key}`); 646 | 647 | return parseFloat(messages); 648 | } 649 | async function delCredits(key) { 650 | var messages = null; 651 | messages = await request.get(`http://localhost:8000/delcredits?key=${key}`); 652 | return messages; 653 | } 654 | async function newCredit(key) { 655 | var messages = await request.get( 656 | `http://localhost:8000/addkey?admin=5a5b6df3-8020-4147-8499-1e4feffc1a7b&uses=${key}` 657 | ); 658 | return messages; 659 | } 660 | 661 | client.login(token); 662 | --------------------------------------------------------------------------------