├── LICENSE
├── icon.png
├── getTicket.html
├── manifest.json
├── README.md
├── css
├── _notes
│ └── dwsync.xml
├── bootstrap-responsive.min.css
├── bootstrap-responsive.css
└── jquery-ui.css
├── js
├── get_data.js
├── popup.js
├── serialize-0.2.js
├── ticket.js
├── irctc.js
├── captcha.js
├── input.js
├── bootstrap.min.js
├── data.js
└── trainNo.js
├── ticket.html
├── popup.html
└── index.html
/LICENSE:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devendrachaplot/TicketMaster/HEAD/icon.png
--------------------------------------------------------------------------------
/getTicket.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
19 |
20 |
--------------------------------------------------------------------------------
/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "manifest_version": 2,
3 |
4 | "name": "TicketMaster",
5 | "description": "Quick Easy Automatic Ticket Booking on IRCTC (Including tatkal)",
6 | "version": "1.31",
7 | "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'",
8 | "content_scripts": [
9 | {
10 | "matches": ["https://www.irctc.co.in/*"],
11 | "js": ["js/jquery.js", "js/irctc.js", "js/data.js", "js/captcha.js"]
12 | }
13 | ],
14 |
15 | "browser_action": {
16 | "default_popup": "popup.html",
17 | "default_icon": "icon.png"
18 | },
19 | "permissions": [
20 | "tabs", "https://www.irctc.co.in/*","storage"
21 | ]
22 | }
23 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | TicketMaster
2 | ============
3 | Quick Easy Automatic Ticket Booking on IRCTC (Including tatkal)
4 | Tired of failed bookings, try our new Chrome extension to book tickets. This extension takes in user ticket details for booking on the site IRCTC and does automated ticket booking. When your session expires, we loop it up unless you book your ticket successfully.
5 | Includes automatic captcha filling! ;)
6 |
7 | Download extension from: https://chrome.google.com/webstore/detail/ticketmaster/dcmkppkofblmhjmodckjhbmpamhnlgac
8 |
9 | Demo Video: http://www.youtube.com/watch?v=r4B78jQkq8I
10 |
11 | EDIT: The extension has been discontinued after IRCTC changed their website.
12 |
13 | Credits: Devendra Chaplot, Nishanth Dikkala, Priyank Chhipa, Rahul Gupta
14 |
--------------------------------------------------------------------------------
/css/_notes/dwsync.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/js/get_data.js:
--------------------------------------------------------------------------------
1 | function load_data(counter) {
2 | var loginStr = "ticket"+counter+"_login";
3 | var ticketStr = "ticket"+counter+"_ticket";
4 | var passStr = "ticket"+counter+"_pass";
5 | get_login();
6 |
7 | function get_login() {
8 | chrome.storage.sync.get(loginStr, function(login_data) {
9 | console.log("The login data is: ");
10 | console.log(login_data);
11 | get_ticket();
12 | });
13 | }
14 | function get_ticket() {
15 | chrome.storage.sync.get(ticketStr, function(ticket_data) {
16 | console.log("The ticket data is: ");
17 | console.log(ticket_data);
18 | get_passengers();
19 | });
20 | }
21 | function get_passengers() {
22 | chrome.storage.sync.get(passStr, function(pass_data) {
23 | console.log("The passenger data is: ");
24 | console.log(pass_data);
25 | });
26 | }
27 | }
28 |
29 | $(document).ready(function() {
30 | $("#submit").click(function() {
31 | var number = $("#ticketNumber").val();
32 | load_data(number);
33 | });
34 | });
--------------------------------------------------------------------------------
/ticket.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
Ticket Master
5 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/popup.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
Ticket Master
5 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 | | No. | Source | Destination | Date | Train No | Class |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/js/popup.js:
--------------------------------------------------------------------------------
1 | var _gaq = _gaq || [];
2 | _gaq.push(['_setAccount', 'UA-43841023-1']);
3 | _gaq.push(['_trackPageview']);
4 |
5 | (function() {
6 | var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
7 | ga.src = 'https://ssl.google-analytics.com/ga.js';
8 | var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
9 | })();
10 |
11 | function addTickets() {
12 | chrome.storage.sync.get('tickets', function(data){
13 | data['tickets'].forEach(function(counter) {
14 | var ticketStr = "ticket"+counter+"_ticket";
15 | var keys = [ticketStr];
16 | chrome.storage.sync.get(keys, function(login_data) {
17 | detail = login_data[ticketStr];
18 | addHtml(detail, counter);
19 | });
20 | });
21 | });
22 | function addHtml(detail, counter) {
23 | currHtml = "
";
24 | currHtml += "| "+counter+" | "+detail['source']+" | "+detail['destination']+" | "+detail['date']+" | "+detail['trainNo']+" | "+detail['class'].substring(0,2)+" | "
25 | currHtml += "
";
26 | document.getElementById('tickets').innerHTML += currHtml;
27 | }
28 | }
29 |
30 | $(document).ready(function() {
31 | addTickets();
32 | $("#clearTicket").click(function(){
33 | chrome.storage.local.remove('bookticket', function() {
34 | });
35 | });
36 | $(".ticket").on('click',function(){
37 | alert("dsgdfg");
38 | //window.location = "ticket.html?ticket="+$(this).attr('counter');
39 | });
40 | });
41 |
--------------------------------------------------------------------------------
/js/serialize-0.2.js:
--------------------------------------------------------------------------------
1 | function serialize(form) {
2 | if (!form || form.nodeName !== "FORM") {
3 | return;
4 | }
5 | var i, j, q = [];
6 | for (i = form.elements.length - 1; i >= 0; i = i - 1) {
7 | if (form.elements[i].name === "") {
8 | continue;
9 | }
10 | switch (form.elements[i].nodeName) {
11 | case 'INPUT':
12 | switch (form.elements[i].type) {
13 | case 'text':
14 | case 'hidden':
15 | case 'password':
16 | case 'button':
17 | case 'reset':
18 | case 'submit':
19 | q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
20 | break;
21 | case 'checkbox':
22 | case 'radio':
23 | if (form.elements[i].checked) {
24 | q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
25 | }
26 | break;
27 | case 'file':
28 | break;
29 | }
30 | break;
31 | case 'TEXTAREA':
32 | q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
33 | break;
34 | case 'SELECT':
35 | switch (form.elements[i].type) {
36 | case 'select-one':
37 | q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
38 | break;
39 | case 'select-multiple':
40 | for (j = form.elements[i].options.length - 1; j >= 0; j = j - 1) {
41 | if (form.elements[i].options[j].selected) {
42 | q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].options[j].value));
43 | }
44 | }
45 | break;
46 | }
47 | break;
48 | case 'BUTTON':
49 | switch (form.elements[i].type) {
50 | case 'reset':
51 | case 'submit':
52 | case 'button':
53 | q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
54 | break;
55 | }
56 | break;
57 | }
58 | }
59 | return q.join("&");
60 | }
--------------------------------------------------------------------------------
/js/ticket.js:
--------------------------------------------------------------------------------
1 | //var counter = jQuery.url.param("ticket");
2 | var _gaq = _gaq || [];
3 | _gaq.push(['_setAccount', 'UA-43841023-1']);
4 | _gaq.push(['_trackPageview']);
5 |
6 | (function() {
7 | var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
8 | ga.src = 'https://ssl.google-analytics.com/ga.js';
9 | var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
10 | })();
11 |
12 | var counter;
13 | var user = new Array();
14 | var detail = new Array();
15 | var ticketDetails = new Array();
16 |
17 | function getURLParameter(name) {
18 | return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null
19 | }
20 |
21 | function updateHtml() {
22 | var html1 = "
| Username: | "+user['username']+" |
";
23 | html1 += "| Soruce: | "+detail['source']+" |
";
24 | html1 += "| Destination: | "+detail['destination']+" |
";
25 | html1 += "| Date: | "+detail['date']+" |
";
26 | html1 += "| Train No: | "+detail['trainNo']+" |
";
27 | html1 += "| Class: | "+detail['class']+" |
";
28 | for(var i in ticketDetails){
29 | if($.isNumeric(i))
30 | html1 += "| Passenger "+i+": | "+ticketDetails[i]['name']+" -- "+ticketDetails[i]['sex']+" -- "+ticketDetails[i]['age']+" -- "+ticketDetails[i]['berth_preference']+" |
";
31 | }
32 | html1 += "
";
33 | $("#displayArea").html(html1);
34 | }
35 |
36 | $(document).ready(function() {
37 | counter = getURLParameter("ticket");
38 | console.log(counter);
39 |
40 | var loginStr = 'ticket'+counter+'_login';
41 | var ticketStr = "ticket"+counter+"_ticket";
42 | var passStr = "ticket"+counter+"_pass";
43 | var keys = [loginStr,ticketStr,passStr];
44 | chrome.storage.sync.get(keys, function(login_data) {
45 | user = login_data[loginStr];
46 | detail = login_data[ticketStr];
47 | ticketDetails = login_data[passStr];
48 | ticketDetails['boardPoint'] = detail['boarding_point'];
49 | updateHtml();
50 | });
51 |
52 | $("#editTicket").click(function(){
53 | var win = window.open("/index.html?edit="+counter,'_blank');
54 |
55 | });
56 |
57 | $("#book").click(function(){
58 | chrome.storage.local.set({'bookticket': counter}, function() {
59 | window.open("https://www.irctc.co.in",'_blank');
60 | });
61 | //localStorage.setItem('bookticket',counter);
62 | });
63 |
64 | $("#removeTicket").click(function(){
65 | var loginStr = 'ticket'+counter+'_login';
66 | var ticketStr = "ticket"+counter+"_ticket";
67 | var passStr = "ticket"+counter+"_pass";
68 | var keys = [loginStr,ticketStr,passStr];
69 | chrome.storage.sync.remove(keys, function() {
70 | chrome.storage.sync.get('tickets',function(data){
71 | var index = data['tickets'].indexOf(counter);
72 | data['tickets'].splice(index, 1);
73 | chrome.storage.sync.set({'tickets': data['ticekts']}, function() {
74 | window.location = "popup.html";
75 | });
76 | });
77 | });
78 | });
79 | });
80 |
--------------------------------------------------------------------------------
/js/irctc.js:
--------------------------------------------------------------------------------
1 | javascript:void(document.oncontextmenu=null);
2 |
3 | var user = new Array();
4 | var detail = new Array();
5 | var ticketDetails = new Array();
6 |
7 | chrome.storage.local.get('bookticket',function(data){
8 | if(data['bookticket'] > 0){
9 | var counter = data['bookticket'];
10 | var loginStr = 'ticket'+counter+'_login';
11 | var ticketStr = "ticket"+counter+"_ticket";
12 | var passStr = "ticket"+counter+"_pass";
13 | var keys = [loginStr,ticketStr,passStr];
14 | chrome.storage.sync.get(keys, function(login_data) {
15 | //console.log(login_data);
16 | user = login_data[loginStr];
17 | detail = login_data[ticketStr];
18 | ticketDetails = login_data[passStr];
19 | ticketDetails['boardPoint'] = detail['boarding_point'];
20 | bookTicket();
21 | });
22 | }
23 | })
24 |
25 | function login(detail){
26 | $("input[name='userName']").val(detail['username']);
27 | $("input[name='password']").val(detail['password']);
28 | $("input#button").click();
29 | }
30 |
31 | function planMyTravel(detail){
32 | $("input[name='stationFrom']").val(detail['source']);
33 | $("input[name='stationTo']").val(detail['destination']);
34 | $("input[name='JDatee1']").val(detail['date']);
35 | var Date = detail['date'].split("/");
36 | $("select[name='day']").val(Date[0]);
37 | $("select[name='month']").val(Date[1]);
38 | $("select[name='year']").val(Date[2]);
39 | $("select[name='ticketType']").val('eticket');
40 | $("select[name='quota']").val(detail['quota']);
41 | $("#findTrain input").click();
42 | }
43 |
44 | function listOfTrains(detail){
45 | $('#plannerTrainListResult').parent().find('table > tbody > tr').each(function() {
46 | // alert("check!");
47 | if($(this).find('td:first-child').html().search(detail['trainNo']) >= 0){
48 | $(this).find('td input[value="'+detail['class']+'"]').click();
49 | // alert("found!");
50 | }
51 | });
52 | }
53 | //listOfTrains(trainDetails);
54 |
55 |
56 | function ticketConfirmation(detail){
57 | $("input[name='boardPoint1']").val(detail['boardPoint']);
58 | $("input[name='mobileNumber']").val(detail['mobileNumber']);
59 | for(var i in detail){
60 | if($.isNumeric(i)){
61 | var j = i-1;
62 | $("input[name='passengers["+j+"].passengerName']").val(detail[i]['name']);
63 | $("input[name='passengers["+j+"].passengerAge']").val(detail[i]['age']);
64 | $("select[name='passengers["+j+"].passengerSex']").val(detail[i]['sex']);
65 | $("select[name='passengers["+j+"].berthPreffer']").val(detail[i]['berth_preference']);
66 | $("select[name='passengers["+j+"].foodPreffer']").val(detail[i]['food_preference']);
67 | $("input[name='passengers["+j+"].seniorCitizen']").prop('checked', (detail[i]['senior_citizen'] == "off")?false:true);
68 | $("select[name='passengers["+j+"].idCardType']").val(detail[i]['idCardType']);
69 | $("input[name='passengers["+j+"].idCardNo']").val(detail[i]['idCardNo']);
70 | }
71 | }
72 | }
73 |
74 | function clickBook(){
75 | var timerbook = setInterval(function(){
76 | if(document.getElementById('submitButton0')){
77 | document.getElementById('submitButton0').click();
78 | clearInterval(timerbook);
79 | }
80 | if(document.documentElement.outerHTML.search("Session has Expired") >= 0)
81 | window.location.href="/";
82 | },1000);
83 | }
84 | //ticketConfirmation(ticketDetails);
85 |
86 | // planMyTravel(detail);
87 | function bookTicket(){
88 | if(document.documentElement.outerHTML.search("Session has Expired") >= 0 || document.documentElement.outerHTML.search("Online Reservation Error") >= 0 ){
89 | window.location.href="/";
90 | }
91 | else if(window.location.pathname.search('cgi-bin') < 0){
92 | login(user);
93 | }
94 | else if(window.location.pathname.search('planner.do') >= 0){
95 | var str = document.documentElement.outerHTML;
96 | if(str.search("
Train Route
") >= 0){
97 | alert("TicketMaster : Please select correct station codes and click on Book");
98 | }
99 | // else if($(".ErrorMsg").length > 0 && $(".welcomealert").length <= 0){
100 | // alert("Some error occurred, please check ticket details again");
101 | // }
102 | else if(str.search("
List of Trains
") < 0){
103 | planMyTravel(detail);
104 | }
105 | else{
106 | listOfTrains(detail);
107 | var str = document.documentElement.outerHTML;
108 | if(str.search(">Availability
") >= 0){
109 | //alert("asdasd");
110 | clickBook();
111 | }
112 | }
113 | }
114 | else if(window.location.pathname.search('bookticket.do') >= 0){
115 | if($('input[value="Go"]').length > 0){
116 | ticketConfirmation(ticketDetails);
117 | var timercaptcha = setInterval(function(){
118 | var value = captcha();
119 | if(value != ""){
120 | $('input[name="captchaImage"]').val(value);
121 | $('input[value="Go"]').click();
122 | //clearInterval(timercaptcha);
123 | }
124 | },500);
125 | }
126 | else{
127 | if($('#payButton').css('display') != 'none')
128 | $('input[value="Make Payment"]').click();
129 | }
130 | }
131 | }
132 |
133 | //bookTicket();
--------------------------------------------------------------------------------
/js/captcha.js:
--------------------------------------------------------------------------------
1 | var flagcaptcha = true;
2 | function captcha(){
3 | if(flagcaptcha){
4 | document.getElementsByTagName('body')[0].insertAdjacentHTML('beforeend','