[收藏] 传说中的12306买票插件-chrome专用
12306.cn买票,难死了,登录登录登录。。。
现在不用了。。。
js插件+chrome浏览器:
/*
* 12306 Auto Query => A javascript snippet to help you book tickets online.
* 12306 Booking Assistant
* Copyright (C) 2011 Hidden
*
* 12306 Auto Query => A javascript snippet to help you book tickets online.
* Copyright (C) 2011 Jingqin Lynn
*
* 12306 Auto Login => A javascript snippet to help you auto login 12306.com.
* Copyright (C) 2011 Kevintop
*
* Includes jQuery
* Copyright 2011, John Resig
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/ // ==UserScript==
// @name 12306 Booking Assistant
// @version 1.3.10
// @author zzdhidden@gmail.com
// @namespace https://github.com/zzdhidden
// @description 12306 订票助手之(自动登录,自动查票,自动订单)
// @include *://dynamic.12306.cn/otsweb/*
// @require https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js
// ==/UserScript== function withjQuery(callback, safe){
if(typeof(jQuery) == "undefined") {
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"; if(safe) {
var cb = document.createElement("script");
cb.type = "text/javascript";
cb.textContent = "jQuery.noConflict();(" + callback.toString() + ")(jQuery, window);";
script.addEventListener('load', function() {
document.head.appendChild(cb);
});
}
else {
var dollar = undefined;
if(typeof($) != "undefined") dollar = $;
script.addEventListener('load', function() {
jQuery.noConflict();
$ = dollar;
callback(jQuery, window);
});
}
document.head.appendChild(script);
} else {
setTimeout(function() {
//Firefox supports
callback(jQuery, typeof unsafeWindow === "undefined" ? window : unsafeWindow);
}, 30);
}
} withjQuery(function($, window){
$(document).click(function() {
if( window.webkitNotifications && window.webkitNotifications.checkPermission() != 0 ) {
window.webkitNotifications.requestPermission();
}
});
function notify(str, timeout, skipAlert) {
if( window.webkitNotifications && window.webkitNotifications.checkPermission() == 0 ) {
var notification = webkitNotifications.createNotification(
"http://www.12306.cn/mormhweb/images/favicon.ico", // icon url - can be relative
'订票', // notification title
str
);
notification.show();
if ( timeout ) {
setTimeout(function() {
notification.cancel();
}, timeout);
}
return true;
} else {
if( !skipAlert ) {
alert( str );
}
return false;
}
}
function route(match, fn) {
if( window.location.href.indexOf(match) != -1 ) {
fn();
};
} function query() { //query
var isTicketAvailable = false; var firstRemove = false; window.$ && window.$(".obj:first").ajaxComplete(function() {
$(this).find("tr").each(function(n, e) {
if(checkTickets(e)){
isTicketAvailable = true;
highLightRow(e);
}
});
if(firstRemove) {
firstRemove = false;
if (isTicketAvailable) {
if (isAutoQueryEnabled)
document.getElementById("refreshButton").click();
onticketAvailable(); //report
}
else {
//wait for the button to become valid
}
}
}).ajaxError(function() {
if(isAutoQueryEnabled) doQuery();
}); //hack into the validQueryButton function to detect query
var _delayButton = window.delayButton; window.delayButton = function() {
_delayButton();
if(isAutoQueryEnabled) doQuery();
} //Trigger the button
var doQuery = function() {
displayQueryTimes(queryTimes++);
firstRemove = true;
document.getElementById(isStudentTicket ? "stu_submitQuery" : "submitQuery").click();
} var $special = $("<input type='text' />")
var checkTickets = function(row) {
var hasTicket = false;
var v1 = $special.val();
if( v1 ) {
var v2 = $.trim( $(row).find(".base_txtdiv").text() );
if( v1.indexOf( v2 ) == -1 ) {
return false;
}
} if( $(row).find("td input.yuding_x[type=button]").length ) {
return false;
} $("td", row).each(function(i, e) {
if(ticketType[i-1]) {
var info = $.trim($(e).text());
if(info != "--" && info != "无") {
hasTicket = true;
highLightCell(e);
}
}
}); return hasTicket;
} var queryTimes = 0; //counter
var isAutoQueryEnabled = false; //enable flag //please DIY:
var audio = null; var onticketAvailable = function() {
if(window.Audio) {
if(!audio) {
audio = new Audio("http://www.w3school.com.cn/i/song.ogg");
audio.loop = true;
}
audio.play();
notify("可以订票了!", null, true);
} else {
notify("可以订票了!");
}
}
var highLightRow = function(row) {
$(row).css("background-color", "#D1E1F1");
}
var highLightCell = function(cell) {
$(cell).css("background-color", "#2CC03E");
}
var displayQueryTimes = function(n) {
document.getElementById("refreshTimes").innerHTML = n;
}; var isStudentTicket = false; //Control panel UI
var ui = $("<div>请先选择好出发地,目的地,和出发时间。 </div>")
.append(
$("<input id='isStudentTicket' type='checkbox' />").change(function(){
isStudentTicket = this.checked;
})
)
.append(
$("<label for='isStudentTicket'></label>").html("学生票 ")
)
.append(
$("<button style='padding: 5px 10px; background: #2CC03E;border-color: #259A33;border-right-color: #2CC03E;border-bottom-color:#2CC03E;color: white;border-radius: 5px;text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.2);'/>").attr("id", "refreshButton").html("开始刷票").click(function() {
if(!isAutoQueryEnabled) {
isTicketAvailable = false;
if(audio && !audio.paused) audio.pause();
isAutoQueryEnabled = true;
doQuery();
this.innerHTML="停止刷票";
}
else {
isAutoQueryEnabled = false;
this.innerHTML="开始刷票";
}
})
)
.append(
$("<span>").html(" 尝试次数:").append(
$("<span/>").attr("id", "refreshTimes").text("0")
)
)
.append(
//Custom ticket type
$("<div>如果只需要刷特定的票种,请在余票信息下面勾选。</div>")
.append($("<a href='#' style='color: blue;'>只勾选坐票 </a>").click(function() {
$(".hdr tr:eq(2) td").each(function(i,e) {
var val = this.innerHTML.indexOf("座") != -1;
var el = $(this).find("input").attr("checked", val);
el && el[0] && ( ticketType[el[0].ticketTypeId] = val );
});
return false;
}))
.append($("<a href='#' style='color: blue;'>只勾选卧铺 </a>").click(function() {
$(".hdr tr:eq(2) td").each(function(i,e) {
var val = this.innerHTML.indexOf("卧") != -1;
var el = $(this).find("input").attr("checked", val);
el && el[0] && ( ticketType[el[0].ticketTypeId] = val );
});
return false;
}))
)
.append(
$("<div>限定出发车次:</div>")
.append( $special )
.append( "不限制不填写,限定多次用逗号分割,例如: G32,G34" )
);
var container = $(".cx_title_w:first");
container.length ?
ui.insertBefore(container) : ui.appendTo(document.body); //Ticket type selector & UI
var ticketType = new Array();
$(".hdr tr:eq(2) td").each(function(i,e) {
ticketType.push(false);
if(i<3) return;
ticketType[i] = true; var c = $("<input/>").attr("type", "checkBox").attr("checked", true);
c[0].ticketTypeId = i;
c.change(function() {
ticketType[this.ticketTypeId] = this.checked;
}).appendTo(e);
});
} route("querySingleAction.do", query);
route("myOrderAction.do?method=resign", query);
route("confirmPassengerResignAction.do?method=cancelOrderToQuery", query); route("loginAction.do?method=init", function() {
if( !window.location.href.match( /init$/i ) ) {
return;
}
//login
var url = "https://dynamic.12306.cn/otsweb/loginAction.do?method=login";
var queryurl = "https://dynamic.12306.cn/otsweb/order/querySingleAction.do?method=init";
//Check had login, redirect to query url
if( window.parent && window.parent.$ ) {
var str = window.parent.$("#username_ a").attr("href");
if( str && str.indexOf("sysuser/user_info") != -1 ){
window.location.href = queryurl;
return;
}
} function submitForm(){
var submitUrl = url;
$.ajax({
type: "POST",
url: submitUrl,
data: {
"loginUser.user_name": $("#UserName").val()
, "user.password": $("#password").val()
, "randCode": $("#randCode").val()
},
beforeSend: function( xhr ) {
try{
xhr.setRequestHeader('X-Requested-With', {toString: function(){ return ''; }});
xhr.setRequestHeader('Cache-Control', 'max-age=0');
xhr.setRequestHeader('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');
}catch(e){};
},
timeout: 30000,
//cache: false,
//async: false,
success: function(msg){
//密码输入错误
//您的用户已经被锁定
if ( msg.indexOf('请输入正确的验证码') > -1 ) {
alert('请输入正确的验证码!');
} else if ( msg.indexOf('当前访问用户过多') > -1 ){
reLogin();
} else if( msg.match(/var\s+isLogin\s*=\s*true/i) ) {
notify('登录成功,开始查询车票吧!');
window.location.replace( queryurl );
} else {
msg = msg.match(/var\s+message\s*=\s*"([^"]*)/);
if( msg && msg[1] ) {
alert( msg && msg[1] );
} else {
reLogin();
}
}
},
error: function(msg){
reLogin();
}
});
} var count = 1;
function reLogin(){
count ++;
$('#refreshButton').html("("+count+")次登录中...");
setTimeout(submitForm, 2000);
}
//初始化
$("#subLink").after($("<a href='#' style='padding: 5px 10px; background: #2CC03E;border-color: #259A33;border-right-color: #2CC03E;border-bottom-color:#2CC03E;color: white;border-radius: 5px;text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.2);'/>").attr("id", "refreshButton").html("自动登录").click(function() {
count = 1;
$(this).html("(1)次登录中...");
//notify('开始尝试登录,请耐心等待!', 4000);
submitForm();
return false;
})); alert('如果使用自动登录功能,请输入用户名、密码及验证码后,点击自动登录,系统会尝试登录,直至成功!');
});
route("confirmPassengerAction.do", submit);
route("confirmPassengerResignAction.do", submit);
function submit() {
/**
* Auto Submit Order
* From: https://gist.github.com/1577671
* Author: kevintop@gmail.com
*/
//Auto select the first user when not selected
if( !$("input._checkbox_class:checked").length ) {
try{
//Will failed in IE
$("input._checkbox_class:first").click();
}catch(e){};
}
//passengerTickets var userInfoUrl = 'https://dynamic.12306.cn/otsweb/order/myOrderAction.do?method=queryMyOrderNotComplete&leftmenu=Y'; var count = 1, freq = 1000, doing = false, timer, $msg = $("<div style='padding-left:470px;'></div>"); function submitForm(){
timer = null;
//更改提交列车日期参数
//var wantDate = $("#startdatepicker").val();
//$("#start_date").val(wantDate);
//$("#_train_date_str").val(wantDate); jQuery.ajax({
url: $("#confirmPassenger").attr('action'),
data: $('#confirmPassenger').serialize(),
beforeSend: function( xhr ) {
try{
xhr.setRequestHeader('X-Requested-With', {toString: function(){ return ''; }});
xhr.setRequestHeader('Cache-Control', 'max-age=0');
xhr.setRequestHeader('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');
}catch(e){};
},
type: "POST",
timeout: 30000,
success: function( msg )
{
//Refresh token
var match = msg && msg.match(/org\.apache\.struts\.taglib\.html\.TOKEN['"]?\s*value=['"]?([^'">]+)/i);
var newToken = match && match[1];
if(newToken) {
$("input[name='org.apache.struts.taglib.html.TOKEN']").val(newToken);
} if( msg.indexOf('payButton') > -1 ) {
//Success!
var audio;
if( window.Audio ) {
audio = new Audio("http://www.w3school.com.cn/i/song.ogg");
audio.loop = true;
audio.play();
}
notify("恭喜,车票预订成!", null, true);
setTimeout(function() {
if( confirm("车票预订成,去付款?") ){
window.location.replace(userInfoUrl);
} else {
if(audio && !audio.paused) audio.pause();
}
}, 100);
return;
}else if(msg.indexOf('未处理的订单') > -1){
notify("有未处理的订单!");
window.location.replace(userInfoUrl);
return;
}
var reTryMessage = [
'用户过多'
, '确认客票的状态后再尝试后续操作'
, '请不要重复提交'
, '没有足够的票!'
, '车次不开行'
];
for (var i = reTryMessage.length - 1; i >= 0; i--) {
if( msg.indexOf( reTryMessage[i] ) > -1 ) {
reSubmitForm( reTryMessage[i] );
return;
}
};
//Parse error message
msg = msg.match(/var\s+message\s*=\s*"([^"]*)/);
stop(msg && msg[1] || '出错了。。。。 啥错? 我也不知道。。。。。');
},
error: function(msg){
reSubmitForm("网络错误");
}
});
};
function reSubmitForm(msg){
if( !doing )return;
count ++;
$msg.html("("+count+")次自动提交中... " + (msg || ""));
timer = setTimeout( submitForm, freq || 50 );
}
function stop ( msg ) {
doing = false;
$msg.html("("+count+")次 已停止");
$('#refreshButton').html("自动提交订单");
timer && clearTimeout( timer );
msg && alert( msg );
}
function reloadSeat(){
$("select[name$='_seat']").html('<option value="M" selected="">一等座</option><option value="O" selected="">二等座</option><option value="1">硬座</option><option value="3">硬卧</option><option value="4">软卧</option>');
}
//初始化 if($("#refreshButton").size()<1){ // //重置后加载所有席别
// $("select[name$='_seat']").each(function(){this.blur(function(){
// alert(this.attr("id") + "blur");
// })});
初始化所有席别
//$(".qr_box :checkbox[name^='checkbox']").each(function(){$(this).click(reloadSeat)});
//reloadSeat(); //日期可选 //$("td.bluetext:first").html('<input type="text" name="orderRequest.train_date" value="' +$("td.bluetext:first").html()+'" id="startdatepicker" style="width: 150px;" class="input_20txt" οnfοcus="WdatePicker({firstDayOfWeek:1})" />'); $(".tj_btn").append($("<a style='padding: 5px 10px; background: #2CC03E;border-color: #259A33;border-right-color: #2CC03E;border-bottom-color:#2CC03E;color: white;border-radius: 5px;text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.2);'></a>").attr("id", "refreshButton").html("自动提交订单").click(function() {
//alert('开始自动提交订单,请点确定后耐心等待!');
if( this.innerHTML.indexOf("自动提交订单") == -1 ){
//doing
stop();
} else {
if( window.submit_form_check && !window.submit_form_check("confirmPassenger") ) {
return;
}
count = 0;
doing = true;
this.innerHTML = "停止自动提交";
reSubmitForm();
}
return false;
}));
$(".tj_btn").append("自动提交频率:")
.append($("<select id='freq'><option value='50' >频繁</option><option value='500' selected='' >正常</option><option value='2000' >缓慢</option></select>").change(function() {
freq = parseInt( $(this).val() );
}))
.append($msg);
//alert('如果使用自动提交订单功能,请在确认订单正确无误后,再点击自动提交按钮!');
}
};
}, true);
这就是源代码,有时间咱也学习学习这份文件。
[收藏] 传说中的12306买票插件-chrome专用的更多相关文章
- python3.7之12306抢票脚本实现
悲催的12306,彻底沦为各路抢票软件的服务提供方.元旦伊始,纯粹12306官网及APP抢票,愈一周的时间,仅到手一张凌晨3:55回家的站票.为远离脑残,无奈选择抢票软件,预购年后返沪车票.BTW,研 ...
- 12306 抢票系列之只要搞定RAIL_DEVICEID的来源,从此抢票不再掉线(上)
郑重声明: 本文仅供学习使用,禁止用于非法用途,否则后果自负,如有侵权,烦请告知删除,谢谢合作! 开篇明义 本文针对自主开发的抢票脚本在抢票过程中常常遇到的请求无效等问题,简单分析了 12306 网站 ...
- 实测两款 GitHub 开源抢票插件,所有坑都帮你踩过了
如果你对自己手速和市面上的各种 “加速包” 都没什么信心的话,不妨试试用程序员的手段抢票? 况且,[12306 官方宣布屏蔽了一大批付费抢票软件],这也意味着你即使给这些软件付了会员费,也依旧抢不到票 ...
- python写12306抢票
#!/usr/bin/env python # -*- coding: utf-8 -*- ''' 利用splinter写的一个手动过验证及自动抢票的例子, 大家可以自己扩展或者弄错窗体.web端. ...
- Python 实现的 12306抢票脚本
Python12306抢票脚本 本脚本使用一个类来实现所有代码,大体上分为以下几个模块及其步骤:- 初始化对象属性(在抢票前进行的属性初始化,包括初始化浏览器模拟对象,个人信息等).- 建立模拟浏览器 ...
- 12306 抢票项目霸榜 GitHub,标星即将破万
十一将至,你买到回家的火车票了吗?如果没有,你可以试着打开 GitHub,在搜索栏键入 12306 的关键词,我相信你会发现一个新大陆.没错,这里有 1572 个抢票项目.它们大多用 Python.J ...
- 12306抢票算法居然被曝光了!!!居然是redis实现的
导读 相信大家应该都有抢火车票的经验,每年年底,这都是一场盛宴.然而你有没有想过抢火车票这个算法是怎么实现的呢? 应该没有吧,咱们今天就来一一探讨.其实并没有你想的那么难 bitmap与位运算 red ...
- 12306订票助手.net版如何抢指定过路某一地点的火车票
12306订票助手.net版如何抢指定路过某一地点的火车票? 直接举例: 广州到武汉,很多高铁,经过清远,衡阳,郴州,长沙等地.需要从清远上车.操作步骤如下: 1.先查询清远-武汉,打开右下角的自动预 ...
- FZU 2029 买票问题 树状数组+STL
题目链接:买票问题 思路:优先队列维护忍耐度最低的人在队首,leave操作ok. vis数组记录从1到n的编号的人们是不是在队列中,top维护队首的人的编号.pop操作搞定. 然后,check操作就是 ...
随机推荐
- PHP的学习(提前学习了,业余爱好) (一)
一个函数一个函数地堆 strstr()函数 在本地测试的时候,代码与显示如下 1.代码: <?php echo strstr("I love Shanghai!123",&q ...
- h2database在springboot中的使用
h2为轻量级数据库,使用特别方便,它可以不使用数据库服务器,直接嵌入到java程序中.可以配置持久化,同样也可以不持久化(数据在内存中)进程结束后,数据就释放,用做测试和演示特别方便.自带后台管理,非 ...
- 试用 Azure Sql 数据库
我们的12月试用账号的免费服务里有一个Azure Sql服务,最近正好自己做一个小工具需要一个数据库,正好可以把它当测试库顺便体验一把Azure Sql. 概述 Azure SQL 数据库 Azure ...
- element中过滤器filters的使用(开发小记)
之前在开发过程中遇到这么一个问题,一串数据需要在el-table中展示,其中含有金额字段,需要将其转换成标准数据格式,即三位一个逗号间隔. 今年刚毕业就上手项目了,第一次接触的Vue,开发经验少,也忘 ...
- 程序3-6 WERTYU
把手放在键盘上时,稍不注意就会往右错一 位.这样,输入Q会变成输入W,输入J会变成输 入K等.键盘如图3-2所示. 输入一个错位后敲出的字符串(所有字母均 大写),输出打字员本来想打出的句子.输入保 ...
- 【UER #1】DZY Loves Graph
UOJ小清新题表 题目内容 UOJ链接 DZY开始有\(n\)个点,现在他对这\(n\)个点进行了\(m\)次操作,对于第\(i\)个操作(从\(1\)开始编号)有可能的三种情况: Add a b: ...
- spring boot:spring security用mysql数据库实现RBAC权限管理(spring boot 2.3.1)
一,用数据库实现权限管理要注意哪些环节? 1,需要生成spring security中user类的派生类,用来保存用户id和昵称等信息, 避免页面上显示用户昵称时需要查数据库 2,如果需要在页面上显示 ...
- linux wget指定下载目录和重命名
当我们在使用wget命令下载文件时,通常会需要将文件下载到指定的目录,这时就可以使用 -P 参数来指定目录,如果指定的目录不存在,则会自动创建. 示例: p.p1 { margin: 0; font: ...
- centos8平台用ffprobe获取视频文件信息(ffmpeg4.2.2)
一,ffprobe的作用 ffprobe是强大的视频分析工具, 用于从多媒体流中获取相关信息或查看文件格式信息, 并以可读的方式打印 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https:// ...
- C++学习---队列的构建及操作
一.循环队列 #include <iostream> using namespace std; #define MAXQSIZE 100 typedef struct { int* bas ...