V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
oklai
V2EX  ›  程序员

TCTicketScript - 火车票余票自动查询脚本

  •  
  •   oklai · 2013-09-13 09:33:26 +08:00 · 3568 次点击
    这是一个创建于 4182 天前的主题,其中的信息可能已经有所发展或是发生改变。
    国庆来了,小伙伴们又要开始抢票了。国庆前后的票估计早已抢空,小伙伴只得等有人退票,不停地刷着页面。
    人都是逼出来的,前几日抢票不成功,没能死心,后寻思着写个脚本自动刷票,果然管用,耗2小时写脚本,过2小时成功买到坐票。

    脚本功能:让浏览器自动帮你刷票,有票时将会弹出桌面提示;脚本在后台运行,不用时刻盯着,不影响工作。

    源码:gist.github.com/oklai/6533698/edit
    (吐槽:为什么完整地址时代码会直接放进来?)

    截图:
    第 1 条附言  ·  2013-09-13 13:10:33 +08:00
    不好意思,源码地址是这个:

    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!

    截图

    有票提示

    view raw README.md hosted with ❤ by GitHub
    (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);
    /
    5 条回复    1970-01-01 08:00:00 +08:00
    rove
        1
    rove  
       2013-09-13 09:43:48 +08:00
    没打开。。
    oklai
        2
    oklai  
    OP
       2013-09-13 13:11:17 +08:00
    @rove, 直接把代码放进来了。
    l0wkey
        3
    l0wkey  
       2013-09-13 13:16:10 +08:00
    LZ写个插件吧~
    hsinglin
        4
    hsinglin  
       2013-09-13 13:24:18 +08:00
    赞,支持包裹插件放出来。自己动手丰衣足食。
    ffts
        5
    ffts  
       2013-09-14 21:05:04 +08:00
    简单易用,赞!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1058 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:18 · PVG 03:18 · LAX 11:18 · JFK 14:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.