commit 00ba019cdc449119c73da2bf1310d22f103a4731 Author: I Luk Kim Date: Thu Mar 30 22:25:49 2023 +0900 initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ce71fcf --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +chrome_cache* +node_modules +.idea \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100755 index 0000000..06d0ce6 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,12 @@ +FROM ubuntu + +RUN apt update + +apt install -y gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget libgbm-dev cron curl + +curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - +apt-get install -y nodejs + + + +npm i puppeteer node-fetch@2.6.1 \ No newline at end of file diff --git a/bingauto2.js b/bingauto2.js new file mode 100755 index 0000000..91fb068 --- /dev/null +++ b/bingauto2.js @@ -0,0 +1,511 @@ +const puppeteer = require('puppeteer'); +const fs = require("fs") +const iPhonex = puppeteer.devices['iPhone X']; +const fetch = require('node-fetch'); + +// const RND_SLEEP_PAD_MAX = 10; +const RND_SLEEP_PAD_MAX = 1; +const MAIN_URL = 'https://rewards.bing.com/?lang=en-US'; + +let sleep = (sec) => { + return new Promise(resolve => setTimeout(resolve, sec * 1000)); +} + +async function rndSleep(sec, pad = null) { + if (!pad) + pad = Math.random() * RND_SLEEP_PAD_MAX; + await sleep(sec + pad); +} + +let rndSample = (arr, n) => { + const shuffled = arr.sort(() => 0.5 - Math.random()); + return shuffled.slice(0, n); +} + +let shuffleArray = (array) => { + for (let i = array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [array[i], array[j]] = [array[j], array[i]]; + } +} + +module.exports = class BingAuto2 { + constructor(id, pw, headless) { + this.id = id; + this.pw = pw; + this.headless = headless; + this.browser = null; + this.mainPage = null; + this.keywords = null; + } + + async startBrowser() { + let id = this.id.split('@')[0]; + let tmp_dir = './chrome_cache_' + id; + if (!fs.existsSync(tmp_dir)) + fs.mkdirSync(tmp_dir); + + // await page.setUserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'); + + let option = { + headless: this.headless, + userDataDir: tmp_dir, + args: ["--proxy-server='direct://'", '--proxy-bypass-list=*', '--disable-site-isolation-trials'] + }; + + this.browser = await puppeteer.launch(option); + + // await browser.close(); + } + + async close() { + this.browser.close(); + } + + async newPage(agent = 'chrome') { + let browser = this.browser; + + const page = await browser.newPage(); + await page.setUserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'); + // await page.setCacheEnabled(false); + // await page.setDefaultNavigationTimeout(0); + if (agent === 'mobile') + await page.emulate(iPhonex); + else + await page.setViewport({height: 900, width: 1200}); + + if (agent === 'edge') { + await page.setUserAgent('"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML like Gecko) Chrome/83.0.2704.79 Safari/537.36 Edge/14.14931"') + } + + await page.goto(MAIN_URL); + return page; + } + + async newMainPage(login = true) { + this.mainPage = await this.newPage(); + if (login) + await sleep(1); + await this.login(); + } + + async login() { + let page = this.mainPage; + let elem, elems; + await page.waitForSelector('body'); + elem = await page.$('div.info-columns mee-rewards-counter-animation span'); + if (elem) + return; + + console.log('> Logging In...'); + + // elem = await page.$('#raf-signin-link-id'); + // console.log('> Logging In...0'); + // if (elem == null) + // return; + // + // await elem.click(); + // await page.waitForNavigation({waitUntil: 'networkidle0'}); + + elem = await page.$('[name="loginfmt"]'); + + await elem.type(this.id); + await elem.press('Enter'); + + await sleep(2); + + elem = await page.$('[name="KMSI"]'); + if (elem) + elem.click(); + + await sleep(1); + elem = await page.$('[name="passwd"]'); + await elem.type(this.pw); + await elem.press('Enter'); + + await sleep(3); + + elem = await page.$('#iLooksGood'); + if (elem) { + await elem.click(); + await sleep(1); + await page.waitForNavigation(); + } + + elem = await page.$('#KmsiCheckboxField'); + if (elem) { + elem.click(); + elem = await page.$('#idSIButton9'); + elem.click(); + await sleep(4); + } + + + // check language error + elem = await page.$('#error-links > li > a'); + if (elem) + elem.click(); + + console.log('> Logged In'); + } + + async getRewardPoint() { + if (this.mainPage.url() !== MAIN_URL) { + await this.mainPage.goto(MAIN_URL); + } + + await sleep(5); + let point = await this.getText(this.mainPage, 'div.info-columns mee-rewards-counter-animation span'); + console.log('> Current point :', point); + + return parseInt(point.replace(',', '')); + } + + async doDailyReward() { + console.log('> Daily Reward'); + if (this.mainPage.url() !== MAIN_URL) + await this.mainPage.goto(MAIN_URL); + + let cards = await this.mainPage.$$('#daily-sets mee-card'); + cards.splice(3); + cards = cards.concat(await this.mainPage.$$('#more-activities mee-card')); + // console.log(cards.length + ' cards'); + + for (let card of cards) { + let newPage = null; + try { + if (!await card.$('.mee-icon-AddMedium') && !await card.$('.mee-icon-HourGlass')) + continue; + + let title = await this.getText(this.mainPage, '.contentContainer > h3', card); + console.log('Card: [' + title + ']'); + + let elem = await card.$('div.actionLink'); + await this.click(this.mainPage, elem); + await sleep(3); + + let pages = await this.browser.pages(); + if (pages.length === 2) // no new page + continue + newPage = pages[pages.length - 1]; + await newPage.setViewport({height: 900, width: 1200}); + + await sleep(2); + await newPage.waitForSelector('body'); + + if (await newPage.$('.wk_paddingBtm')) + await this.doABCQuiz(newPage); + else if (await newPage.$('#rqStartQuiz')) + await this.doSelectQuiz(newPage); + else if (await newPage.$('.rqOption,.b_slidebar')) + await this.doSelectQuiz(newPage); + else { + console.log('Unknown card type'); + } + + } catch (e) { + console.log(e); + } finally { + if (newPage && !newPage.isClosed()) + await newPage.close(); + } + + await rndSleep(2); + console.log(''); + } + + } + + async getText(page, selector, elem = null) { + if (elem) { + return await page.evaluate((selector, elem) => elem.querySelector(selector).textContent, selector, elem); + } else { + return await page.evaluate((selector) => document.querySelector(selector).textContent, selector); + } + + + } + + async checkRemainDailyReward() { + let elems = await this.mainPage.$$('#daily-sets mee-rewards-points .mee-icon-AddMedium'); + let daily_remains = elems.length; + console.log(`Daily set : ${daily_remains} remains`); + elems = await this.mainPage.$$('#more-activities mee-card .mee-icon-AddMedium'); + let more_remains = elems.length; + console.log(`More activities : ${more_remains} remains`); + return [daily_remains, more_remains]; + } + + async doABCQuiz(page) { + console.log('> ABC Quiz'); + while (true) { + let answers = await page.$$('.wk_paddingBtm'); + if (answers.length === 0) { + console.log('ERROR: Failed to get ABC quiz answer elements'); + return; + } + + let rnd_answer = Math.floor(Math.random() * answers.length); + await answers[rnd_answer].click(); + + await rndSleep(2); + + let elem = await page.$('input[value="Next question"]'); + if (elem) { + await this.click(page, elem); + } else { + elem = await page.$('input[value="Get your score"]'); + if (elem) await this.click(page, elem); + break; + } + await rndSleep(2); + } + + } + + async doSelectQuiz(page) { + console.log('> Select Quiz'); + await sleep(5); + let elem = await page.$('#rqStartQuiz'); + if (elem) await this.click(page, elem); + + await rndSleep(4); + elem = await page.$('.rqDragOption'); + if (elem) { // order type quiz + console.log('Order-type quiz'); + while (true) { + await rndSleep(5); + await this.insertDragDropFunc(page); + await rndSleep(1); + elem = await page.$('#quizCompleteContainer > div:nth-child(1) > div.headerMessage'); + if (elem) { + console.log('Done'); + break; + } + + let all_answers = await page.$$('.rqDragOption'); + let correct_ans = await page.$$('.rqDragOption.correctAnswer'); + let answers = []; + for (let an of all_answers) { + if (!correct_ans.includes(an)) + answers.push(an); + } + let switchAns = rndSample(answers, 2); + let ans1 = await switchAns[0].getProperty('id'); + let ans2 = await switchAns[1].getProperty('id'); + let js = 'triggerDragAndDrop("#","#")' + await page.evaluate((id1, id2) => { + triggerDragAndDrop('#' + id1, '#' + id2); + }, ans1, ans2); + } + } else { // select quiz + // poll + if (await page.$('#btPollOverlay')) { + console.log('Daily Poll'); + let opt = await page.$('#btPollOverlay .btOption'); + if (opt) { + opt.click(); + await rndSleep(3); + } + return; + } + + //else + + const quizTypeData = [{ + 'type': 0, + 'name': 'basic', + 'tester': '#QuizContainerWrapper .rqOption', + 'title': '.rqQuestion', + 'btn': '#QuizContainerWrapper .rqOption' + }, + { + 'type': 1, + 'name': 'many', + 'tester': '#QuizContainerWrapper .b_slidebar', + 'title': '.rqQuestion > .bt_queText', + 'btn': '#QuizContainerWrapper .bt_lstcl_card' + }, + { + 'type': 2, + 'name': 'thisthat', + 'tester': '#QuizContainerWrapper .btOptionCard', + 'title': '#QuizContainerWrapper .bt_Quefooter', + 'btn': '#QuizContainerWrapper .btOptionCard' + }]; + let elem, elems; + let quizType = -1; + for (let item of quizTypeData) { + elems = await page.$$(item['tester']); + if (elems.length !== 0) { + quizType = item['type']; + break; + } + } + + if (quizType === -1) { + console.log('ERROR: Can\'t get select quiz type'); + return; + } + + let quizData = quizTypeData[quizType]; + console.log('Quiz Type:', quizData['name']); + let btns = await page.$$(quizData['btn']); + let answerCnt = btns.length; + let intervalTime = 5; + + if (quizType === 1) + answerCnt = 8; + else if (quizType === 2) + intervalTime = 10; + + + console.log('# of answers:', answerCnt); + + while (true) { + await rndSleep(intervalTime); + elem = await page.$('#quizCompleteContainer > div:nth-child(1) > div.headerMessage'); + if (elem) break; + + elem = await page.$('.headerMessage_Refresh'); + if (elem) break; + + let answerIds = [...Array(answerCnt).keys()]; + shuffleArray(answerIds); + let i = 0; + let oldTitle = await this.getText(page, quizData['title']); + while (i < answerCnt && i < 10) { + elems = await page.$$(quizData['btn']); + console.log('- Selecting answer#', answerIds[i]); + await this.elemCoordinateClick(page, elems[answerIds[i]]); + await rndSleep(intervalTime); + + let newTitle = await this.getText(page, quizData['title']); + if (oldTitle !== newTitle) { + break; + } + i += 1; + } + + } + } + + } + + async click(page, elem) { + await page.evaluate((elem) => elem.click(), elem); + } + + async insertDragDropFunc(page) { + let js = 'window.triggerDragAndDrop=function(e,o){var t=function(e,o,t,r){var n=document.createEvent("MouseEvents");n.initMouseEvent(e,!0,!0,window,1,1,1,t,r,!1,!1,!1,!1,0,o),o.dispatchEvent(n)},r=document.querySelector(e),n=document.querySelector(o);if(!r||!n)return!1;var u=r.getBoundingClientRect(),a=Math.floor((u.left+u.right)/2),d=Math.floor((u.top+u.bottom)/2);u=n.getBoundingClientRect();var m=Math.floor((u.left+u.right)/2),g=Math.floor((u.top+u.bottom)/2);return t("mousemove",r,a,d),t("mouseenter",r,a,d),t("mouseover",r,a,d),t("mousedown",r,a,d),t("dragstart",r,a,d),t("drag",r,a,d),t("mousemove",r,a,d),t("drag",r,m,g),t("mousemove",n,m,g),t("mouseenter",n,m,g),t("dragenter",n,m,g),t("mouseover",n,m,g),t("dragover",n,m,g),t("drop",n,m,g),t("dragend",r,m,g),t("mouseup",r,m,g),!0};'; + await page.addScriptTag({content: js}); + } + + async elemCoordinateClick(page, elem) { + await page.evaluate((elem) => { + let rect = elem.getBoundingClientRect(); + let obj = document.elementFromPoint(rect.x + 10, rect.y + 10); + obj.click(); + }, elem); + } + + async getSearchKeywords() { + let getKeyword = (url, regex) => { + return new Promise(resolve => { + let args = {headers: {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36'}}; + fetch(url, args) + .then(res => res.text()) + .then(html => { + let matches = html.matchAll(regex); + let keywords = []; + for (let item of matches) + keywords.push(item[1]); + resolve(keywords); + }); + }); + } + + if (this.keywords !== null) + return this.keywords; + + let key1 = await getKeyword('https://datalab.naver.com/keyword/realtimeList.naver', '(.*?)'); + let key2 = await getKeyword('https://trends.google.com/trends/trendingsearches/daily/rss?geo=US', '(.*?)'); + + let keywords = key1.concat(key2); + + if (keywords.length < 80) { + let mixes = []; + for (let i = keywords.length; i < 80; i++) { + let joins = rndSample(keywords, 2); + mixes.push(joins.join(' ')); + } + keywords = keywords.concat(mixes); + } + this.keywords = keywords; + return keywords; + } + + async doSearch(searchCnt = 30, page = null) { + let keywords = await this.getSearchKeywords(); + if (!page) + page = this.mainPage; + + await page.goto('https://www.bing.com/'); + + shuffleArray(keywords); + searchCnt += Math.floor(Math.random() * 10); + for (let i = 0; i < searchCnt; i++) { + try { + console.log(`Search ${i + 1}/${searchCnt} : ${keywords[i]}`); + let searchBar = await page.$('#sb_form_q'); + // clear + await searchBar.click({clickCount: 3}); + await searchBar.press('Backspace'); + + await searchBar.type(keywords[i], {delay: 200}); + await searchBar.press('Enter'); + + await rndSleep(2); + // await rndSleep(5, 10); + } catch (e) { + console.log(e); + } + } + } + + async checkSearchStatus() { + // await this.mainPage.waitForNavigation({waitUntil: "networkidle2"} ); + await this.mainPage.goto('https://rewards.bing.com/pointsbreakdown'); + await sleep(2); + let elems = await this.mainPage.$$('div.cardContainer p.pointsDetail'); + let status = {}; + let statusOrder = ['chrome', 'mobile', 'edge']; + // if(elems.length === 2) + // statusOrder = statusOrder.splice(1); + // TODO: check for level 1 status + + for (let i = 0; i < elems.length; i++) { + let elem = elems[i]; + let text = await this.mainPage.evaluate((elem) => elem.textContent, elem); + text = text.split('/'); + status[statusOrder[i]] = [parseInt(text[0]), parseInt(text[1])]; + } + + return status; + } + + async doAllSearch() { + let searchStatus = await this.checkSearchStatus(); + console.log('> Search status:', searchStatus); + + for (let searchType in searchStatus) { + let searchCnt = Math.floor((searchStatus[searchType][1] - searchStatus[searchType][0]) / 5); + if (searchCnt !== 0) { + console.log('>', searchType, 'search'); + let page = await this.newPage(searchType); + await this.doSearch(searchCnt, page); + await page.close(); + } + } + } +} \ No newline at end of file diff --git a/deploy.sh b/deploy.sh new file mode 100755 index 0000000..3d90cfb --- /dev/null +++ b/deploy.sh @@ -0,0 +1,3 @@ +#!/bin/zsh + +scp ./*.js hs:~/workspace/bingauto2/. diff --git a/index.js b/index.js new file mode 100755 index 0000000..51d8d83 --- /dev/null +++ b/index.js @@ -0,0 +1,43 @@ +const BingAuto2 = require('./bingauto2') + +let sleep = (sec) => { + return new Promise(resolve => setTimeout(resolve, sec * 1000)); +} + +let main = async () => { + let accounts = [['nemobaki@hotmail.com', 'Rhlehvkd26'], ['yirugi@hotmail.com', 'Dlfnzl26'], ['rosemarymulti2@outlook.com', 'fhwmakfl2'], ['kim.iluk@hotmail.com', 'Dlfnzl26']]; + // accounts = accounts.splice(2); + for (let account of accounts) { + let ba = new BingAuto2(account[0], account[1], true); + console.log('Start collection (' + account[0] + ') -', new Date().toLocaleString()); + try { + await ba.startBrowser(); + await ba.newMainPage(); + let curPoint = await ba.getRewardPoint(); + + for (let i = 0; i < 2; i++) { + await ba.doDailyReward(); + await ba.doAllSearch(); + } + + let earned = await ba.getRewardPoint() - curPoint; + console.log('> Earned : ', earned); + console.log('End collection (' + account[0] + ') -', new Date().toLocaleString()); + console.log('\n\n'); + + } catch (e) { + console.log('Error: ', e); + } finally { + await ba.close(); + } + + await sleep(100); + } +} + + +main(); + + + + diff --git a/package-lock.json b/package-lock.json new file mode 100755 index 0000000..1700ea8 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,455 @@ +{ + "name": "bingauto2", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/node": { + "version": "14.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.10.tgz", + "integrity": "sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ==", + "dev": true, + "optional": true + }, + "@types/yauzl": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", + "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "bl": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", + "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "devtools-protocol": { + "version": "0.0.818844", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.818844.tgz", + "integrity": "sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + } + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "dev": true, + "requires": { + "agent-base": "5", + "debug": "4" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "puppeteer": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-5.5.0.tgz", + "integrity": "sha512-OM8ZvTXAhfgFA7wBIIGlPQzvyEETzDjeRa4mZRCRHxYL+GNH5WAuYUQdja3rpWZvkX/JKqmuVgbsxDNsDFjMEg==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "devtools-protocol": "0.0.818844", + "extract-zip": "^2.0.0", + "https-proxy-agent": "^4.0.0", + "node-fetch": "^2.6.1", + "pkg-dir": "^4.2.0", + "progress": "^2.0.1", + "proxy-from-env": "^1.0.0", + "rimraf": "^3.0.2", + "tar-fs": "^2.0.0", + "unbzip2-stream": "^1.3.3", + "ws": "^7.2.3" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "tar-stream": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.4.tgz", + "integrity": "sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.0.tgz", + "integrity": "sha512-kyFwXuV/5ymf+IXhS6f0+eAFvydbaBW3zjpT6hUdAh/hbVjTIB5EHBGi0bPoCLSK2wcuz3BrEkB9LrYv1Nm4NQ==", + "dev": true + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100755 index 0000000..8b7e021 --- /dev/null +++ b/package.json @@ -0,0 +1,18 @@ +{ + "name": "bingauto2", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "puppeteer": "^5.5.0" + }, + "dependencies": { + "node-fetch": "^2.6.1" + } +} diff --git a/test.js b/test.js new file mode 100755 index 0000000..8176582 --- /dev/null +++ b/test.js @@ -0,0 +1,41 @@ +const BingAuto2 = require('./bingauto2') + +let sleep = (sec) => { + return new Promise(resolve => setTimeout(resolve, sec * 1000)); +} + +let main = async () => { + let accounts = [['nemobaki@hotmail.com', 'Rhlehvkd26'], ['yirugi@hotmail.com', 'Dlfnzl26'], ['rosemarymulti2@outlook.com', 'fhwmakfl2'], ['kim.iluk@hotmail.com', 'Dlfnzl26']]; + // accounts = accounts.splice(3); + for (let account of accounts) { + let ba = new BingAuto2(account[0], account[1], true); + console.log('Start collection (' + account[0] + ') -', new Date().toLocaleString()); + + await ba.startBrowser(); + await ba.newMainPage(); + let curPoint = await ba.getRewardPoint(); + + for (let i = 0; i < 2; i++) { + await ba.doDailyReward(); + await ba.doAllSearch(); + } + + await ba.doAllSearch(); + + let earned = await ba.getRewardPoint() - curPoint; + console.log('> Earned : ', earned); + console.log('End collection (' + account[0] + ') -', new Date().toLocaleString()); + console.log('\n\n'); + + await ba.close(); + + // await sleep(100); + } +} + + +main(); + + + +