Created
September 27, 2014 19:10
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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 protected]'; | |
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