Skip to content

Instantly share code, notes, and snippets.

@robmaceachern
Created September 27, 2014 19:10
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save robmaceachern/278e1a6f9a89004f75f8 to your computer and use it in GitHub Desktop.
Save robmaceachern/278e1a6f9a89004f75f8 to your computer and use it in GitHub Desktop.
Polling the Apple Canada availability for the new iPhone and getting alerted via email
// Set the desiredStoreIds, desiredPhoneModels, and alertEmail below.
// Go to https://reserve.cdn-apple.com/CA/en_CA/reserve/iPhone/availability
// Open browser console
// Copy and paste everything in this file in to the console terminal and push Enter
// Get alerted via email when the device you want is available to reserve!
var desiredStoreIds = ['R280', 'R362', 'R460'];
var desiredPhoneModels = ['MG3H2CL/A', 'MG3E2CL/A', 'MG3K2CL/A', 'MG3F2CL/A'];
var alertEmail = 'email@example.com';
function doPoll() {
$.getJSON('https://reserve.cdn-apple.com/CA/en_CA/reserve/iPhone/availability.json', function(data) {
console.log('polling...');
for (var i = 0; i < desiredStoreIds.length; i++) {
var modelsAtStore = data[desiredStoreIds[i]];
for (var j = 0; j < desiredPhoneModels.length; j++) {
var desiredModel = desiredPhoneModels[j];
var available = modelsAtStore[desiredModel]
if (available) {
var alertSent = sendAlert(desiredModel, storeNameFromId(desiredStoreIds[i]), alertEmail);
if (alertSent) {
break;
}
}
};
};
console.log('no dice');
});
}
function storeNameFromId(id) {
var stores = getStores();
for (var i = 0; i < stores.length; i++) {
var store = stores[i];
if (store.storeNumber == id) {
return store.storeName;
}
};
}
function getStores() {
return [{
"storeNumber": "R490",
"storeName": "Bayshore Shopping Centre",
"storeEnabled": true
}, {
"storeNumber": "R207",
"storeName": "Carrefour Laval",
"storeEnabled": true
}, {
"storeNumber": "R209",
"storeName": "Chinook Centre",
"storeEnabled": true
}, {
"storeNumber": "R464",
"storeName": "Conestoga",
"storeEnabled": true
}, {
"storeNumber": "R488",
"storeName": "Coquitlam Centre",
"storeEnabled": true
}, {
"storeNumber": "R512",
"storeName": "DIX30",
"storeEnabled": true
}, {
"storeNumber": "R121",
"storeName": "Eaton Centre",
"storeEnabled": true
}, {
"storeNumber": "R333",
"storeName": "Fairview",
"storeEnabled": true
}, {
"storeNumber": "R392",
"storeName": "Fairview Pointe-Claire",
"storeEnabled": true
}, {
"storeNumber": "R601",
"storeName": "Guildford Town Centre",
"storeEnabled": true
}, {
"storeNumber": "R514",
"storeName": "Halifax Shopping Centre",
"storeEnabled": true
}, {
"storeNumber": "R447",
"storeName": "Mapleview Centre",
"storeEnabled": true
}, {
"storeNumber": "R301",
"storeName": "Market Mall",
"storeEnabled": true
}, {
"storeNumber": "R515",
"storeName": "Markville Shopping Centre",
"storeEnabled": true
}, {
"storeNumber": "R489",
"storeName": "Masonville",
"storeEnabled": true
}, {
"storeNumber": "R460",
"storeName": "Metrotown",
"storeEnabled": true
}, {
"storeNumber": "R362",
"storeName": "Oakridge Centre",
"storeEnabled": true
}, {
"storeNumber": "R280",
"storeName": "Pacific Centre",
"storeEnabled": true
}, {
"storeNumber": "R412",
"storeName": "Place Ste-Foy",
"storeEnabled": true
}, {
"storeNumber": "R369",
"storeName": "Polo Park",
"storeEnabled": true
}, {
"storeNumber": "R421",
"storeName": "Richmond Centre",
"storeEnabled": true
}, {
"storeNumber": "R332",
"storeName": "Rideau",
"storeEnabled": true
}, {
"storeNumber": "R248",
"storeName": "Sainte-Catherine",
"storeEnabled": true
}, {
"storeNumber": "R208",
"storeName": "Sherway Gardens",
"storeEnabled": true
}, {
"storeNumber": "R411",
"storeName": "Southgate Centre",
"storeEnabled": true
}, {
"storeNumber": "R350",
"storeName": "Square One",
"storeEnabled": true
}, {
"storeNumber": "R429",
"storeName": "Upper Canada Mall",
"storeEnabled": true
}, {
"storeNumber": "R273",
"storeName": "West Edmonton",
"storeEnabled": true
}, {
"storeNumber": "R120",
"storeName": "Yorkdale",
"storeEnabled": true
}]
}
function getStoreIds() {
var stores = getStores();
var ids = [];
for (var i = 0; i < stores.length; i++) {
ids.push(stores[i].storeNumber);
}
console.log(ids);
return ids;
}
// Canada iPhone 6 16GB Space Grey Unlocked MG3A2CL/A
// Canada iPhone 6 64GB Space Grey Unlocked MG3H2CL/A
// Canada iPhone 6 128GB Space Grey Unlocked MG3E2CL/A
// Canada iPhone 6 16GB Gold Unlocked MG3D2CL/A
// Canada iPhone 6 64GB Gold Unlocked MG3L2CL/A
// Canada iPhone 6 128GB Gold Unlocked MG3G2CL/A
// Canada iPhone 6 16GB Silver Unlocked MG3C2CL/A
// Canada iPhone 6 64GB Silver Unlocked MG3K2CL/A
// Canada iPhone 6 128GB Silver Unlocked MG3F2CL/A
function getDevices() {
return {
"MG3A2CL/A": 'Canada iPhone 6 16GB Space Grey Unlocked',
"MG3H2CL/A": 'Canada iPhone 6 64GB Space Grey Unlocked',
"MG3E2CL/A": 'Canada iPhone 6 128GB Space Grey Unlocked',
'MG3D2CL/A': 'Canada iPhone 6 16GB Gold Unlocked',
'MG3L2CL/A': 'Canada iPhone 6 64GB Gold Unlocked',
'MG3G2CL/A': 'Canada iPhone 6 128GB Gold Unlocked',
'MG3C2CL/A': 'Canada iPhone 6 16GB Silver Unlocked',
'MG3K2CL/A': 'Canada iPhone 6 64GB Silver Unlocked',
'MG3F2CL/A': 'Canada iPhone 6 128GB Silver Unlocked'
}
}
function getDeviceIds() {
var deviceIds = [];
var devices = getDevices();
for (var name in devices) {
if (devices.hasOwnProperty(name)) {
deviceIds.push(name);
}
}
return deviceIds;
}
var emailsSent = {};
function sendAlert(deviceModel, storeName, destinationEmail) {
if (emailsSent[deviceModel+storeName]) {
return false;
}
emailsSent[deviceModel+storeName] = true;
console.log('sending alert email');
$.post('//forms.brace.io/' + destinationEmail, {
"model": getDevices()[deviceModel],
"store": storeName
}, function() {
console.log('sent email');
});
return true;
}
doPoll();
window.setInterval(doPoll, 10000);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment