const Puppeteer = require('puppeteer'); const sleep = (ms) => { return new Promise((resolve) => { setTimeout(resolve, ms) }) }; // 参数 const ID = process.argv[2] const PWD = process.argv[3] const HOST = process.argv[4] || 'http://git.jdjinsui.com' const TIME = process.argv[5] || 10000 // 登录 const login = async (browser, ID, PWD, HOST) => { const page = await browser.newPage(); await page.goto(`${HOST}/user/login`); await page.type('input', ID, { delay: 150 }); await page.type('input[type="password"]', PWD, { delay: 100 }); await page.click('button'); await sleep(3000) const isLogin = page.url().includes('/user/login') if (isLogin) { page.close() console.error('账号密码错误:', ID); await login(browser, ID, PWD) } console.log(`${new Date().toLocaleString()}-${ID}:已登录`); } // 数据获取及同意 const contrlData = async (browser, page, time) => { // 获取列表 await sleep(1000) const list = await page.$$eval('.has-emoji', divs => divs.map(divs => ({ label: divs.textContent, href: divs.href, who: divs.parentNode.lastElementChild.textContent.replace(/[\'\"\\\/\b\f\n\r\t]/g, '') }))); await sleep(1000) // 循环同意变更 for (let k = 0; k < list.length; k++) { const el = list[k]; const newPage = await browser.newPage(); await newPage.goto(el.href, { timeout: 0 }) const state = await newPage.$$eval('.content>.segment button', async (divs, item) => { let who = '' for (let j = 0; j < divs.length; j++) { const es = divs[j]; if (es.textContent.includes('合并请求')) { es.click() who = `${new Date().toLocaleString()}-${item.who}: 已自动合并` } } return who }, el) console.log(state); await sleep(1000) await newPage.close() } // reload await sleep(1000) page.reload() await sleep(time) await contrlData(browser, page, time) } // main (async () => { try { // init const browser = await Puppeteer.launch({ headless: true, timeout: 0, defaultViewport: { width: 1920, height: 1080 }, executablePath: './chrome/chrome.exe' }); // login await login(browser, ID, PWD, HOST); // 获取数据 const page = await browser.newPage(); await page.goto(`${HOST}/pulls`, { timeout: 0 }); await sleep(1000); // 操作数据 await contrlData(browser, page, TIME) } catch (error) { console.error(error) process.exit(1) } })()