抢票、秒杀、定时任务,把浏览器交给脚本
Puppeteer 能让程序控制 Chrome/Firefox,适合做抢票提醒、秒杀预约、定时填表、网页巡检和网页测试。重点是把重复操作变成可检查的脚本,同时保留规则边界。

Puppeteer 适合解决一种很常见的麻烦:浏览器里重复点、重复查、重复填,而且时间点还卡得很死。
抢票、秒杀、预约、定时签到、网页巡检、后台填表,都有类似的问题。人盯着页面容易错过,录屏宏又太脆弱,按钮位置一变就废。 Puppeteer 的思路更稳一点:直接用代码打开 Chrome 或 Firefox,等元素出现,输入内容,点击按钮,读取页面结果,最后截图或保存数据。
它是浏览器自动化领域很老牌的项目。 GitHub 上接近 10 万 Star,官方定位也很直接:用 JavaScript 提供一套高层 API,通过 DevTools Protocol 或 WebDriver BiDi 控制 Chrome / Firefox,默认可以无界面运行。

它能干什么
Puppeteer 不只服务程序员测试。只要任务发生在网页里,并且需要反复操作,它就有用。
几个更贴近日常的场景:
- 抢票:提前打开页面、登录、进入目标场次,等按钮可点时提醒或执行下一步。
- 秒杀:定时刷新库存,检测按钮状态,自动填写固定信息。
- 预约:每天固定时间检查号源、场地、活动名额。
- 填表:把 Excel 、 CSV 或数据库里的内容批量填进网页表单。
- 巡检:每天打开后台页面,截图、抓取指标、发现异常后通知。
- 测试:提交前自动跑一遍登录、搜索、下单、支付前检查等流程。
这里要分清边界。 Puppeteer 能模拟人的浏览器操作,但不该用来绕过验证码、风控、限流或平台规则。更稳妥的用法,是把合法的重复动作自动化,把关键步骤留给人确认。
最小上手
先准备一个 Node.js 项目:
mkdir pptr-demo
cd pptr-demo
npm init -y
npm i puppeteer
如果安装时浏览器没有自动下载,可以手动补一次:
npx puppeteer browsers install
新建 demo.js:
import puppeteer from 'puppeteer';
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://example.com', { waitUntil: 'networkidle2' });
const title = await page.title();
console.log(title);
await browser.close();
运行:
node demo.js
这段代码做的事很简单:打开浏览器,访问网页,读取标题,然后关闭。后面所有自动化流程,都是在这个骨架上加动作。
定时检查:适合抢票和预约提醒
抢票、挂号、场地预约这类任务,第一步通常是检查目标按钮是否可用,而非直接下单。可以先写成“发现变化就提醒”的脚本。
import puppeteer from 'puppeteer';
const url = 'https://example.com/tickets';
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto(url, { waitUntil: 'networkidle2' });
const available = await page.evaluate(() => {
const text = document.body.innerText;
return text.includes('立即购买') || text.includes('可预约');
});
if (available) {
console.log('有票或名额变化,马上处理');
} else {
console.log('暂时没有变化');
}
await browser.close();
本地定时可以用 cron:
*/2 * * * * cd /path/to/pptr-demo && node check.js >> check.log 2>&1
这个例子每 2 分钟跑一次。真实使用时不要把频率调得太高,网站有限流和风控,频繁刷新也容易影响别人正常访问。
自动填写:秒杀前最该省的时间
秒杀和预约最浪费时间的地方,常常是重复填固定信息。 Puppeteer 可以提前把表单填好,最后一步交给人确认。
await page.goto('https://example.com/form', { waitUntil: 'networkidle2' });
await page.locator('input[name="name"]').fill('张三');
await page.locator('input[name="phone"]').fill('13800000000');
await page.locator('select[name="city"]').select('shanghai');
await page.screenshot({ path: 'before-submit.png', fullPage: true });
console.log('表单已填好,请人工确认后再提交');
这样做的好处是风险更低:脚本负责机械操作,人负责判断页面是否正确、价格是否变化、条款是否能接受。
自动点击:只适合规则允许的流程
如果目标网站允许自动化,或者这是你自己的内部系统,可以继续让脚本点击按钮:
await page.locator('button[type="submit"]').click();
await page.waitForNavigation({ waitUntil: 'networkidle2' });
const resultText = await page.locator('body').map(el => el.innerText).wait();
console.log(resultText.slice(0, 300));
对外部平台,建议至少保留两条线:遇到验证码停下来,遇到价格、库存、订单信息变化停下来。自动化要能稳定跑、能追日志、能回放截图,才适合长期用。
网页巡检:比人肉打开后台靠谱
Puppeteer 也适合做后台巡检。比如每天早上打开几个页面,截一张图,抓几个数字,失败时把错误打印出来。
await page.goto('https://example.com/admin', { waitUntil: 'networkidle2' });
await page.screenshot({ path: `admin-${Date.now()}.png`, fullPage: true });
const metric = await page.locator('.today-orders').map(el => el.textContent).wait();
console.log('今日订单数:', metric);
如果配合 GitHub Actions 、服务器 cron 、飞书/Telegram 通知,就能做一个小型网页值班机器人。页面打不开、指标异常、库存变化,都可以自动提醒。
和 AI Agent 的关系
Puppeteer 现在还被接进了 MCP 生态。官方 README 提到 chrome-devtools-mcp,这是基于 Puppeteer 的 MCP server,可以让 AI Agent 通过协议操控浏览器、调试网页。
这件事挺实用。以前浏览器自动化主要靠人写脚本,现在 AI Agent 也可以把浏览器当成“手”:打开网页、看页面、点按钮、抓错误、读控制台日志。对开发者来说,它更像是把“网页操作”变成了 Agent 可以调用的工具。
要注意的坑
Puppeteer 上手不难,长期跑起来会遇到几个现实问题:
- 选择器要稳。不要只依赖按钮位置,优先用
name、aria-label、稳定文本或业务 ID 。 - 登录态要单独处理。能用官方 API 就不要硬爬页面;必须用网页登录时,要保护好 Cookie 和账号。
- 截图和日志要留。自动化失败时,截图比猜原因有用。
- 不要绕验证码。验证码出现就停,让人处理。
- 不要高频刷新。抢票和秒杀也要尊重平台限制,否则账号容易被风控。
- 关键动作人工确认。付款、下单、取消、删除这类动作,最好保留人工确认点。
Puppeteer 的价值是把网页里的重复劳动变成脚本,同时守住平台规则。它能让浏览器按时间表干活,也能让 AI Agent 有能力真实操作网页。抢票、秒杀、定时填表只是入口,更大的用途是把那些每天都要点开的页面,变成可复用、可记录、可检查的流程。