You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取用户输入的账号密码传入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 20:42:20