const Puppeteer = require('puppeteer'); const sleep = (ms) => { return new Promise((resolve) => { setTimeout(resolve, ms) }) }; const log4js = require("log4js"); // 日志配置 log4js.configure({ appenders: { logs: { type: "file", filename: "./logs.log" } }, categories: { default: { appenders: ["logs"], level: "debug" } } }); const logger = log4js.getLogger('logs'); const ID = process.argv[2] const PWD = process.argv[3] const TIME = process.argv[4] // 获取数据 const getData = 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, '') }))); logger.debug(`${new Date().toLocaleDateString()}清单:${JSON.stringify(list)}`); 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 }) await newPage.$$eval('.content>.segment button', async (divs) => { const sleepd = (ms) => { return new Promise((resolve) => { setTimeout(resolve, ms) }) } for (let j = 0; j < divs.length; j++) { const es = divs[j]; if (es.textContent.includes('合并请求')) { es.click() await sleepd(1000) } } }) await sleep(1000) newPage.close() } // reload await sleep(1000) page.reload() console.log('清单', list); await sleep(time) getData(browser, page, time) } (async () => { // init const browser = await Puppeteer.launch({ headless: true, timeout: 0, defaultViewport: { width: 1920, height: 1080 } }); // login const page = await browser.newPage(); const tab = await page.goto('http://git.jdjinsui.com/pulls'); const isLogin = tab.url().includes('/user/login'); if (isLogin) { await page.type('input', ID, { delay: 150 }); await page.type('input[type="password"]', PWD, { delay: 100 }); await page.click('button'); } await getData(browser, page, Number(TIME)) })()