← 返回全部文章

抢票、秒杀、定时任务,把浏览器交给脚本

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 上手不难,长期跑起来会遇到几个现实问题:

  1. 选择器要稳。不要只依赖按钮位置,优先用 namearia-label、稳定文本或业务 ID 。
  2. 登录态要单独处理。能用官方 API 就不要硬爬页面;必须用网页登录时,要保护好 Cookie 和账号。
  3. 截图和日志要留。自动化失败时,截图比猜原因有用。
  4. 不要绕验证码。验证码出现就停,让人处理。
  5. 不要高频刷新。抢票和秒杀也要尊重平台限制,否则账号容易被风控。
  6. 关键动作人工确认。付款、下单、取消、删除这类动作,最好保留人工确认点。

Puppeteer 的价值是把网页里的重复劳动变成脚本,同时守住平台规则。它能让浏览器按时间表干活,也能让 AI Agent 有能力真实操作网页。抢票、秒杀、定时填表只是入口,更大的用途是把那些每天都要点开的页面,变成可复用、可记录、可检查的流程。

来源:https://github.com/puppeteer/puppeteer