Skip to content

Instantly share code, notes, and snippets.

@oklai
Last active January 9, 2019 10:11
Show Gist options
  • Star 12 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save oklai/6533698 to your computer and use it in GitHub Desktop.
Save oklai/6533698 to your computer and use it in GitHub Desktop.
TCTicketScript - 火车票自动查询工具

TCTicketScript

TCTicketScript是一段浏览器脚本,帮你自动查询火车票余票。

如何使用

  1. 请使用Chrome浏览器;
  2. 拖拽这个链接到你的书签栏,抢票工具,拷贝下面的代码;
javascript:var QPscript=document.createElement('script');QPscript.src='https://gist.github.com/oklai/6533698/raw/4c29378caebcc0fe9c80f2592f0951846ece1e04/TCTicketScript.js';document.body.appendChild(QPscript);
  1. 右键修改刚刚保存的书签,网址清空,然后粘贴上面的代码;
  2. 进入新版火车票预订页面https://kyfw.12306.cn/otn/leftTicket/init,忽略警告信息;
  3. 在页面设定好你的查询信息,然后点击查询,并开启网站上的自动查询功能;
  4. 点击书签栏中刚刚保存链接,然后根据提示输入相关条件;
  5. Done! 最小化浏览器,专心上班吧,有余票时你将听到火车呜呜的叫声。

说明:在Firefox下执行此脚本效果更佳,有票时不仅可以听到声音,还将出现桌面提醒(第一次会询问是否开启桌面提示功能,需同意)。
Firefox下使用说明:

  1. 复制TCTicketScript.js中的代码;
  2. Shift + F4 打开脚本工具,粘贴TCTicketScript.js代码,然后单击右键-->运行,然后关闭这个脚本窗口;
  3. 根据提示输入相关条件,Done!

截图

有票提示

(function ($) {
var trains, seats;
// 席位ID对照表
// SWZ(商务座), TZ(特等座), ZY(一等座), ZE(二等座), GR(高级软座), RW(软卧), YW(硬卧), RZ(软座), YZ(硬座), WZ(无座)
var seatsMap = {
SWZ: "商务座",
TZ: "特等座",
ZY: "一等座",
ZE: "二等座",
GR: "高级软座",
RW: "软卧",
YW: "硬卧",
RZ: "软座",
YZ: "硬座",
WZ: "无座"
};
var tip_1 = '请输入欲购买的车次,多个车次用[英文逗号]分割, 如 T107,K25';
var tip_2 = '指定席位(输入席位代码,如 RW,YW):\nSWZ(商务座), TZ(特等座), ZY(一等座), ZE(二等座), GR(高级软座), RW(软卧), YW(硬卧), RZ(软座), YZ(硬座), WZ(无座)'
var ret_1 = window.prompt(tip_1);
ret_1 = $.trim(ret_1).toUpperCase();
var ret_2 = window.prompt(tip_2);
ret_2 = $.trim(ret_2).toUpperCase();
trains = ret_1 !== "" ? ret_1.split(',') : [];
seats = ret_2 !== "" ? ret_2.split(',') : Object.getOwnPropertyNames(seatsMap);
console.log(trains);
console.log(seats);
var num = 0,
timeId;
var playAudio = function () {
var audio = new Audio("/otn/resources/js/framework/audio/message.wav");
audio.play();
num = 0;
}
// 打开桌面提示
Notification.requestPermission();
// 弹出提示信息
function createNotification (ret) {
var msg = '';
ret.forEach(function (item) {
msg += item.checi + " " + seatsMap[item.xiwei] + " 有余票" + item.yupiao + "张\n";
});
var data = {
dir: "auto",
body: msg,
icon: "http://ww3.sinaimg.cn/mw690/6fb2c1e4gw1e8jp394fabj203k03kgli.jpg"
};
new Notification('赶紧抢票!!!', data);
}
var tmp_yupiao, tmp_checi, tmp_xiwei, tmp_ret;
function start () {
var ids = seats.map(function (item) {
return '[id^=' + item + ']';
});
ids = ids.join();
timeId = setInterval(function () {
var piao = $(ids);
tmp_ret = [];
//console.log(piao);
piao.each(function () {
var _this = $(this);
tmp_yupiao = false;
if (_this.text() === "有" || parseInt(_this.text(), 10) > 0) {
tmp_yupiao = true;
}
tmp_checi = _this.parent().find('.number').text();
tmp_xiwei = this.id.split("_")[0];
if (tmp_yupiao && (trains.indexOf(tmp_checi) > -1 || trains.length === 0)) {
tmp_ret.push({
checi: tmp_checi,
yupiao: _this.text(),
xiwei: tmp_xiwei
});
num++;
}
});
// 播放声音 & 桌面提示
if (num > 0) {
playAudio();
createNotification(tmp_ret);
}
}, 3000);
}
start();
// tips
var qpbox = '<div style="position:fixed;left:0;top:0;color:#FFF;font-size:16px;word-break:break-all;background-color:#0070FF;padding:5px;z-index:10000;width:150px;"><p class="text_1">抢票工具工作中</p><p class="text_2"></p><p class="text_3"></p><button>暂停</button></div>';
qpbox = $(qpbox);
qpbox.find('.text_2').text("车次:" + trains.join());
qpbox.find('.text_3').text("席位:" + seats.map(function (item) {
return seatsMap[item];
}).join());
qpbox.appendTo('body');
qpbox.find('button').data('start', true).click(function () {
var _this = $(this),
status = qpbox.find('.text_1');
if (_this.data('start')) {
window.QP_stop();
status.text('抢票工具已暂停');
_this.text("开始");
_this.data('start', false);
qpbox.css('background-color', 'red');
} else {
window.QP_start();
status.text('抢票工具工作中');
_this.text("暂停");
_this.data('start', true);
qpbox.css('background-color', '#0070FF');
}
return false;
});
window.QP_stop = function () {
clearInterval(timeId);
}
window.QP_start = function () {
start();
};
})(jQuery);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment