如何获取用户输入的账号密码传入Puppeteer实现网站自动登录
核心问题说明
你当前代码无法正常传递凭证的原因有两个:
- 所用
prompt库为回调异步风格,登录填充逻辑写在了prompt.get回调外部,程序不会等待用户输入完成就执行后续填表操作,存在时序错误 - 填表时硬编码传入了字符串
'username'、'password',没有对接输入采集的返回结果,且重复定义了无用的密码采集字段passwordMasked
修复后可直接运行的命令行交互版本
将回调风格的输入逻辑封装为Promise适配async/await异步流程,调整执行顺序,先完成凭证采集再启动浏览器执行自动化操作,完整代码如下:
const fs = require("fs"); const puppeteer = require("puppeteer"); const prompt = require('prompt'); // 封装prompt为Promise写法,适配async/await function getInput(schema) { return new Promise((resolve, reject) => { prompt.start(); prompt.get(schema, (err, res) => err ? reject(err) : resolve(res)); }) } async function captureScreenshot() { // 初始化截图目录 if (!fs.existsSync("screenshots")) fs.mkdirSync("screenshots"); let browser = null; try { // 先采集账号密码,用户输入完成后再启动浏览器,避免资源浪费 const userInfo = await getInput([ { name: 'username', description: '请输入登录账号', required: true }, { name: 'password', description: '请输入登录密码', hidden: true, replace: '*', required: true } ]); console.log('凭证采集完成,开始执行自动化任务'); // 启动浏览器 browser = await puppeteer.launch({ headless: true }); const page = await browser.newPage(); await page.setViewport({ width: 1440, height: 1080 }); await page.goto("https://users.nexusmods.com/"); // 填充登录表单,直接传入采集到的凭证 await page.waitForSelector("input[name='user[login]']"); await page.type("input[name='user[login]']", userInfo.username); await page.waitForSelector("input[name='user[password]']"); await page.type("input[name='user[password]']", userInfo.password); await page.click("input[type='submit']"); // 登录后操作 await page.waitForSelector("input[name='real_name']"); await page.click('a.d-none.d-md-flex'); await page.waitForTimeout(3000); // 保存截图 await page.screenshot({ path: `screenshots/SEG_Report.jpeg` }); console.log('截图已保存至screenshots目录'); } catch (err) { console.log(`❌ 执行错误: ${err.message}`); } finally { if (browser) await browser.close(); console.log('任务执行结束'); } } captureScreenshot();
可视化弹窗交互实现方案
不需要额外开发前端页面,两种低成本实现路径可选:
- 原生系统弹窗方案:安装跨平台原生弹窗依赖,直接调用系统能力弹出输入框,不需要黑框命令行交互,包体积小、上手快。安装依赖后替换原有命令行采集逻辑即可,密码输入默认隐藏内容,适配Windows、Mac、Linux全平台。核心调用示例:
// 先执行 npm i dialog 安装依赖 const dialog = require('dialog'); const username = dialog.prompt('请输入登录账号', ''); if (!username) throw new Error('未输入账号,任务终止'); const password = dialog.prompt('请输入登录密码', '', {password: true}); if (!password) throw new Error('未输入密码,任务终止');
- 无额外GUI依赖方案:不需要安装其他弹窗库,利用已引入的Puppeteer开一个本地非无头页面,自己写简单的账号密码输入表单,用户填写提交后,通过Puppeteer的页面通信能力把凭证传给主进程,表单样式、交互都可以自定义,还可以扩展验证码输入、记住账号等功能。
注意:如果需要做更复杂的多用户配置,也可以支持读取本地同目录下的json配置文件,用户直接改配置文件不用输账号密码,适合固定设备重复运行的场景。
内容的提问来源于stack exchange,提问作者Tiddzy
相关产品推荐
相关产品推荐

