Skip to content

Instantly share code, notes, and snippets.

@diyism
Last active September 17, 2026 06:02
Show Gist options
  • Select an option

  • Save diyism/100899d38aa187cdd1b5ac8258b54ef2 to your computer and use it in GitHub Desktop.

Select an option

Save diyism/100899d38aa187cdd1b5ac8258b54ef2 to your computer and use it in GitHub Desktop.
12306官网预填抢票
//预先填好购票车次和人, 打开预填页面看看是否填正确了并保持在该页面: https://kyfw.12306.cn/otn/view/prefill_order.html
//先同步电脑时间, 因为太早或晚一秒都会在发第2个请求POST的时候失败, debian系统下: sudo ntpdate -u ntp.aliyun.com 然后用https://time.is 可验证误差
//然后打开浏览器console, 在firefox里是F12
//在开抢前5分钟仍要自己刷新及登录12306, 因为即使脚本在跑登录仍会过期, 也可以采用在同一浏览器另一个tab页面自动刷新
//贴入下方脚本并回车开始运行
(function() {
console.log('12306 预填强票自动点击脚本已启动...');
let buyClicked = false; // 防止重复点击购票按钮
let okClicked = false; // 防止重复点击确认按钮
// 1. 高频监听「按预填信息购票」按钮
const buyInterval = setInterval(() => {
// 优先匹配可见的按钮(参考真实页面 style)
let buyBtn = document.querySelector('a.buy-ticket-button[style*="display: inline-block"]')
|| document.querySelector('a.buy-ticket-button');
if (buyBtn && !buyBtn.disabled && window.getComputedStyle(buyBtn).display !== 'none') {
buyBtn.click();
console.log('✅ 已自动点击「按预填信息购票」按钮');
buyClicked = true;
//clearInterval(buyInterval); // 点完后停止监听购票按钮
}
}, 3); // 每3毫秒检查一次
// 2. 高频监听弹窗确认按钮(btn-primary ok)
const okInterval = setInterval(() => {
let okBtn = document.querySelector('a.btn.btn-primary.ok')
|| document.querySelector('a[href="javascript:;"].btn.btn-primary.ok')
|| document.querySelector('.btn.btn-primary.ok');
if (okBtn && !okBtn.disabled) {
okBtn.click();
console.log('✅ 已自动点击弹窗确认按钮');
okClicked = true;
clearInterval(okInterval); // 点完后停止
}
}, 5); // 每5毫秒检查一次
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment