刷票必备:Nodejs刷火车票脚本分享

刷票必备:Nodejs刷火车票脚本分享

原文来自:http://levi.cg.am/?p=2330

今天传说中的刷票脚本不能用了,于是我自己花了一个小时左右简单写了个,代码很简单,没有参考传说中的刷票脚本。这个脚本适合刷那种零散的退票,对于抢票是无能为力了。最好在Chrome或Firefox下使用。

enter image description here

使用方法如下:

  • 修改你的出发地、目的地以及出发时间信息,并且配置对应的城市代码(这个自己抓包看,很简单,Chrome network面板或者Fiddler)

  • 登录并打开订票窗口

  • 在控制台输入这段脚本代码

  • 等待好了,每5秒刷一次,没票会在控制台输出信息,有票会弹出桌面通知,具体参考截图

    /**

    • author: jxq */

    var stationDict = { “广州” : “GZQ”, “吉安” : “VAG”, “北京” : “BJP”, “北京西” : “BXP”, “太原” : “TYV”, “深圳” : “SZQ”, “上海” : “SHH” };

    var queryUrlTemplate = “https://dynamic.12306.cn/otsweb/order/querySingleAction.do?method=queryLeftTicket&orderRequest.train_date={trainDate}&orderRequest.from_station_telecode={fromStationCode}&orderRequest.to_station_telecode={toStationCode}&orderRequest.train_no=&trainPassType=QB&trainClass=QB%23D%23Z%23T%23K%23QT%23&includeStudent=00&seatTypeAndNum=&orderRequest.start_time_str=00%3A00–24%3A00”;

    function queryTickets(fromStation, toStation, trainDate) {

    var fromStationCode = stationDict[fromStation];
    var toStationCode = stationDict[toStation];
    

    var queryUrl = queryUrlTemplate.replace("{trainDate}", trainDate).replace("{fromStationCode}", fromStationCode).replace("{toStationCode}", toStationCode);

    // 查询余票 $.get(queryUrl, function(data) { // 简单地检查是否有票,如果有票,则data中一定包含文本 btn130_2 if (data.indexOf(“btn130_2”) != -1) { // 有票 sendDesktopNotification(“有票了亲!”, fromStation + " - " + toStation + “有票了!\n快来抢票哈~~”); clearInterval(myInterval); // 清除轮询,以免烦人 } else { console.log(“不好意思,” + fromStation + “-” + toStation + “暂时无票!”); } });

    }

    // 桌面通知 function sendDesktopNotification(title, msg) { if (!window.webkitNotifications || (window.webkitNotifications.checkPermission() != 0)) {// 不支持桌面通知或未授权 alert(“不好意思,你的浏览器不支持桌面通知或者你未开启!”); return; // 不支持桌面通知 }

    var notificationMsgBox = window.webkitNotifications.createNotification( icon = "http://www.12306.cn/mormhweb/images/favicon.ico", title, msg);
    notificationMsgBox.show();
    

    }

    queryTickets(“北京”, “广州”, “2013-02-07”); // 每5秒刷一次票 var myInterval = setInterval(function() { queryTickets(“北京”, “广州”, “2013-02-07”); }, 5000);

缺陷

  • 不支持筛选硬座、硬卧等信息,但是要支持很简单,看我的代码就知道了 不支持自动提交订单
  • 只能帮你检查是否有票,有票了还需要你自己去点下查询按钮,然后订票(主要是因为这个按钮在iframe内部,不方便直接操纵)
  • 你的Chrome浏览器可能会遇到
Origin  xxx is not allowed by Access-Control-Allow-Origin 
异常,这个是Chrome安全策略限制,你自己想办法设置就好了

相关文章:


4 回复

刷票必备:Node.js刷火车票脚本分享

原文来自:http://levi.cg.am/?p=2330

今天传说中的刷票脚本不能用了,于是我自己花了一个小时左右简单写了个,代码很简单,没有参考传说中的刷票脚本。这个脚本适合刷那种零散的退票,对于抢票是无能为力了。最好在Chrome或Firefox下使用。

使用方法如下:

  1. 修改你的出发地、目的地以及出发时间信息,并且配置对应的城市代码(这个自己抓包看,很简单,Chrome network面板或者Fiddler)。
  2. 登录并打开订票窗口。
  3. 在控制台输入这段脚本代码。
  4. 等待好了,每5秒刷一次,没票会在控制台输出信息,有票会弹出桌面通知,具体参考截图。
/**
 * author: jxq
 */
var stationDict = {
    "广州": "GZQ",
    "吉安": "VAG",
    "北京": "BJP",
    "北京西": "BXP",
    "太原": "TYV",
    "深圳": "SZQ",
    "上海": "SHH"
};

var queryUrlTemplate = "https://dynamic.12306.cn/otsweb/order/querySingleAction.do?method=queryLeftTicket&orderRequest.train_date={trainDate}&orderRequest.from_station_telecode={fromStationCode}&orderRequest.to_station_telecode={toStationCode}&orderRequest.train_no=&trainPassType=QB&trainClass=QB%23D%23Z%23T%23K%23QT%23&includeStudent=00&seatTypeAndNum=&orderRequest.start_time_str=00%3A00--24%3A00";

function queryTickets(fromStation, toStation, trainDate) {
    var fromStationCode = stationDict[fromStation];
    var toStationCode = stationDict[toStation];

    var queryUrl = queryUrlTemplate.replace("{trainDate}", trainDate).replace("{fromStationCode}", fromStationCode).replace("{toStationCode}", toStationCode);

    // 查询余票
    $.get(queryUrl, function(data) {
        // 简单地检查是否有票,如果有票,则data中一定包含文本 btn130_2
        if (data.indexOf("btn130_2") != -1) {    // 有票
            sendDesktopNotification("有票了亲!", fromStation + " - " + toStation + "有票了!\n快来抢票哈~~");
            clearInterval(myInterval);    // 清除轮询,以免烦人
        } else {
            console.log("不好意思," + fromStation + "-" + toStation + "暂时无票!");
        }
    });
}

// 桌面通知
function sendDesktopNotification(title, msg) {
    if (!window.webkitNotifications || (window.webkitNotifications.checkPermission() != 0)) { // 不支持桌面通知或未授权
        alert("不好意思,你的浏览器不支持桌面通知或者你未开启!");
        return;
    }

    var notificationMsgBox = window.webkitNotifications.createNotification(icon = "http://www.12306.cn/mormhweb/images/favicon.ico", title, msg);
    notificationMsgBox.show();
}

queryTickets("北京", "广州", "2013-02-07");
// 每5秒刷一次票
var myInterval = setInterval(function() {
    queryTickets("北京", "广州", "2013-02-07");
}, 5000);

缺陷

  • 不支持筛选硬座、硬卧等信息,但是要支持很简单,看我的代码就知道了。
  • 不支持自动提交订单。
  • 只能帮你检查是否有票,有票了还需要你自己去点下查询按钮,然后订票(主要是因为这个按钮在iframe内部,不方便直接操纵)。
  • 你的Chrome浏览器可能会遇到Origin xxx is not allowed by Access-Control-Allow-Origin异常,这个是Chrome安全策略限制,你自己想办法设置就好了。

相关文章

希望这个脚本能帮到大家!


需要这个… :)

12306周边产品不断增多啊,哈哈

以下是一个基于Node.js的简单脚本,用于刷火车票。请注意,这个脚本仅适用于抓取零散退票信息,不适合抢票。同时,需要在支持JavaScript的浏览器中运行此脚本,如Chrome或Firefox。

示例代码

var stationDict = {
    "广州": "GZQ",
    "吉安": "VAG",
    "北京": "BJP",
    "北京西": "BXP",
    "太原": "TYV",
    "深圳": "SZQ",
    "上海": "SHH"
};

var queryUrlTemplate = "https://dynamic.12306.cn/otsweb/order/querySingleAction.do?method=queryLeftTicket&orderRequest.train_date={trainDate}&orderRequest.from_station_telecode={fromStationCode}&orderRequest.to_station_telecode={toStationCode}&orderRequest.train_no=&trainPassType=QB&trainClass=QB%23D%23Z%23T%23K%23QT%23&includeStudent=00&seatTypeAndNum=&orderRequest.start_time_str=00%3A00--24%3A00";

function queryTickets(fromStation, toStation, trainDate) {
    var fromStationCode = stationDict[fromStation];
    var toStationCode = stationDict[toStation];

    var queryUrl = queryUrlTemplate.replace("{trainDate}", trainDate)
                                    .replace("{fromStationCode}", fromStationCode)
                                    .replace("{toStationCode}", toStationCode);

    $.get(queryUrl, function(data) {
        if (data.indexOf("btn130_2") != -1) {
            sendDesktopNotification("有票了亲!", fromStation + " - " + toStation + "有票了!\n快来抢票哈~~");
            clearInterval(myInterval);
        } else {
            console.log("不好意思," + fromStation + "-" + toStation + "暂时无票!");
        }
    });
}

function sendDesktopNotification(title, msg) {
    if (!window.webkitNotifications || (window.webkitNotifications.checkPermission() != 0)) {
        alert("不好意思,你的浏览器不支持桌面通知或者你未开启!");
        return;
    }

    var notificationMsgBox = window.webkitNotifications.createNotification(
        icon = "http://www.12306.cn/mormhweb/images/favicon.ico",
        title,
        msg
    );
    notificationMsgBox.show();
}

queryTickets("北京", "广州", "2013-02-07");

var myInterval = setInterval(function() {
    queryTickets("北京", "广州", "2013-02-07");
}, 5000);

解释

  1. stationDict:定义了城市代码字典。
  2. queryUrlTemplate:定义了查询火车票的URL模板。
  3. queryTickets:查询指定日期和车站的火车票。
  4. sendDesktopNotification:发送桌面通知。
  5. main:初始化查询,并每5秒查询一次。

注意事项

  • 需要在浏览器控制台中运行该脚本。
  • 不支持自动提交订单,只提供票务信息。
  • Chrome用户可能需要调整安全策略以避免跨域问题。

请确保你已安装并配置好相关依赖,如jQuery等。

回到顶部