forked from spikeruk/TicketmasterBot
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ticketmasterbot.user.js
170 lines (141 loc) · 5.39 KB
/
ticketmasterbot.user.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
// ==UserScript==
// @name TicketMaster
// @namespace http://tampermonkey.net/
// @version 0.4
// @description Fast execution of reserving tickets in cart
// @match https://www1.ticketmaster.co.uk/*
// @match https://www1.ticketmaster.com/*
// @match https://www1.ticketmaster.ie/*
// @require https://code.jquery.com/jquery-2.1.3.min.js
// @grant none
// ==/UserScript==
var refreshIntervalSeconds=1; //Set this to how often you want to check for tickets (Note: Do this too fast and TicketMaster may block your ip address)
var numberOfTickets=1; //Set this to the number of tickets you want
function SkipPopup()
{
var popupPresent = getElementByXpath('//button[@class = "modal-dialog__button landing-modal-footer__skip-button"]');
if(popupPresent)
{
try{ popupPresent.click();}catch(ex){}
}
}
function CheckForFilterPanel(){
var filterBar = getElementByXpath('//div[@class = "filter-bar__content"]');
return filterBar;
}
function ProcessFilterPanel(filterBar){
//Click first ticket result in list
ClickElement('(//ul/li[@class = "quick-picks__list-item"])[1]/div/div');
//Change ticket quantity (if applicable)
waitForElement('.offer-card', function() {
//Change the number of tickets (if applicable);
ChangeTicketQuantity();
//Click the button to Buy the tickets (right hand panel)
var getTicketsElement = ClickElement('//button[@id = "offer-card-buy-button"]');
//Sometimes a dialog comes up if someone else beat us to the tickets.
//This dialog gives a recommendation for a new seat selection.
//If this occurs, we choose to accept the new seats.
waitForElement('.button-aux, .modal-dialog__button', function() {
var sectionChangeBuyButton = getElementByXpath('//button[@class = "button-aux modal-dialog__button"]');
sectionChangeBuyButton.click();
});
});
}
function ChangeTicketQuantity()
{
var rightPanelCurrentTicketCountElement = getElementByXpath('//div[@class = "qty-picker__number qty-picker__number--lg"]');
var currentTicketCount = rightPanelCurrentTicketCountElement.innerText;
var ticketQuantityDifference = numberOfTickets - currentTicketCount;
if (ticketQuantityDifference > 0)
{
var ticketIncrementElement = ClickElement('//button[@class = "qty-picker__button qty-picker__button--increment qty-picker__button--lg"]');
for (var i = 0; i < ticketQuantityDifference; i++)
{
try{ticketIncrementElement.click();}catch(ex){}
}
}
else if(ticketQuantityDifference < 0)
{
ticketQuantityDifference = Math.abs(ticketQuantityDifference);
var ticketDecrementElement = ClickElement('//button[@class = "qty-picker__button qty-picker__button--decrement qty-picker__button--lg"]');
for (var i = 0; i < ticketQuantityDifference; i++)
{
try{ticketDecrementElement.click();}catch(ex){}
}
}
}
function CheckForGeneralAdmission()
{
var BuyButton = getElementByXpath('//button[@id = "offer-card-buy-button"]');
return BuyButton;
}
function ProcessGeneralAdmission(generalAdmissionBuyButton)
{
ChangeTicketQuantity();
generalAdmissionBuyButton.click();
}
function reload() {
window.top.document.location.replace(window.top.document.location.href);
}
function ClickElement(path, time)
{
var element = getElementByXpath(path);
if(element !== null) {
if (typeof element.click != 'undefined')
{
element.click();
return element;
}
}
}
function getElementByXpath(path)
{
return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
}
var waitForElement = function(selector, callback)
{
if (jQuery(selector).length) {
callback();
} else {
setTimeout(function() {
waitForElement(selector, callback);
}, 100);
}
};
$(document).ready(function()
{
var success=false;
//This popup dialog seems to happen in the US ticketmaster website
//We just close it down and continue as normal
SkipPopup();
//Ticket type 1
//This occurs in the majority of ticket sales when there is a selection of ticket types
if(!success)
{
var filterBar = CheckForFilterPanel();
if(filterBar)
{
console.log('These tickets have a filter bar');
success=true;
ProcessFilterPanel(filterBar);
}
}
//Ticket type 2
//These tickets are General Admission and do not have assigned seating (i.e. no filter bar)
if(!success)
{
var generalAdmissionBuyButton = CheckForGeneralAdmission();
if(generalAdmissionBuyButton)
{
console.log('These tickets are General Admission');
success=true;
ProcessGeneralAdmission(generalAdmissionBuyButton);
}
}
//TODO: Add more ticket types if found
if(!success)
{
//refresh the page after an interval (Tickets weren't yet on sale)
setTimeout(function(){reload();}, refreshIntervalSeconds * 1000);
}
});