Skip to content

Instantly share code, notes, and snippets.

@RyanGarber
Last active October 28, 2025 03:02
Show Gist options
  • Save RyanGarber/967b7aef129194116829adf62abe66bb to your computer and use it in GitHub Desktop.
Save RyanGarber/967b7aef129194116829adf62abe66bb to your computer and use it in GitHub Desktop.
A-to-Z Shift Stealer
// ==UserScript==
// @name A-to-Z Shift Stealer
// @match *://*.amazon.work/*
// @version 1.0
// ==/UserScript==
// I created this in 2024 while working as a Flex-Time Amazon employee.
// The session keepalive and auto-login no longer works, I know that.
// The rest should still work.
// Config
const CREDENTIALS = ["username", "password"];
const EMPLOYEE_ID = 12345678;
const DESIRED_SHIFTS = ["12:30am-5:15am", "2:00am-5:15am", "7:45am-10:15am"];
const DESIRED_SPECIAL_ROLES = ["Associate TDR"];
const EXCLUDE_DATES = [];
const EXCLUDE_DAYS = [];
const DEBUG_LOGS = true;
const DEBUG_API_CALLS = false;
const POLLING_RATE = [500, 1000];
const RETRY_POLL_AFTER = 600000;
// Helpers
function log(...data) {
unsafeWindow.console.log("[SS]", ...data);
}
function debug(...data) {
if (DEBUG_LOGS) {
log(...data);
}
}
function getTime(date) {
const pm = date.getHours() >= 12;
const hours = (date.getHours() - (pm ? 12 : 0));
const minutes = (date.getMinutes() < 10 ? "0" : "") + date.getMinutes();
return (hours === 0 ? 12 : hours) + ":" + minutes + (pm ? "pm" : "am");
}
function getShiftInfo(shift) {
const added = ["DROP", "VOLUNTARY_TIME_OFF"].includes(shift.type);
const start = new Date(shift.shift.timeRange.start);
const end = new Date(shift.shift.timeRange.end);
return {
added: added,
eligible: (!added && shift.eligibility.isEligible) || DEBUG_API_CALLS,
day: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"][start.getDay()],
date: (start.getMonth() + 1) + "/" + start.getDate(),
time: getTime(start) + "-" + getTime(end)
};
}
function getRequest(string) {
const alphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";
let id = '';
for (let i = 0; i < 21; i++) {
id += alphabet[(Math.random() * 64) | 0];
}
return {
"credentials": "include",
"headers": {
"Accept": "*/*",
"Accept-Language": "en-US,en;q=0.5",
"content-type": "application/json",
"x-atoz-client-id": "SCHEDULE_MANAGEMENT_SERVICE",
"x-atoz-client-request-id": id,
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "same-site"
},
"referrer": "https://atoz.amazon.work/",
"body": string,
"method": "POST",
"mode": "cors"
};
}
function getSpecialRoleAvailable(shifts, baseShift) {
const { date: baseShiftDate, time: baseShiftTime } = getShiftInfo(baseShift);
for (const shift of shifts) {
const { eligible, date, time } = getShiftInfo(shift);
if (eligible && date === baseShiftDate && time === baseShiftTime && DESIRED_SPECIAL_ROLES.includes(shift.skill)) {
if (!DESIRED_SPECIAL_ROLES.includes(baseShift.skill)) {
return shift;
}
}
}
return null;
}
// Login
setInterval(function() {
if (unsafeWindow.location.href.indexOf('idp.amazon.work') !== -1) {
let loginForm = false;
try { if(document.getElementById('loginForm') !== null) { loginForm = true; } } catch { }
if (loginForm) {
log("Detected login page...");
document.getElementById('login').value = CREDENTIALS[0];
document.getElementById('password').value = CREDENTIALS[1];
document.getElementById('loginForm').submit();
}
else {
let buttons = document.getElementsByClassName("btn-primary");
if (buttons.length > 0) { buttons[0].click(); }
}
}
}, 10000);
// Shifts
const container = document.createElement('div');
container.style = "width: 100%; text-align: center; padding: 20px 0";
document.getElementById('main-content').prepend(container);
// State Display
const state = document.createElement('div');
container.prepend(state);
let lastUpdate = Date.now();
let ellipses = '';
const updateState = function(shifts) {
lastUpdate = Date.now();
state.innerHTML = "<strong>Added shifts: " + shifts.length + "<strong>";
if (shifts.length > 0) {
const { date, time } = getShiftInfo(shifts[0]);
state.innerHTML += "<br>Next shift: " + date + " " + time;
}
ellipses = (ellipses.length === 3 ? '' : ellipses + '.');
state.innerHTML += "<br><br><small>Running" + ellipses + "</small>";
};
// Notification Display
let notify = false;
const audio = document.createElement('audio');
audio.src = "https://cdn.pixabay.com/download/audio/2021/08/04/audio_bb630cc098.mp3";
audio.preload = "auto";
const notified = document.createElement('button');
notified.innerText = 'Got it!';
notified.onclick = function() { notify = false; };
container.prepend(notified);
setInterval(function() {
if (notify) { audio.play(); }
notified.style = "display: " + (notify ? "inline" : "none");
}, 500);
// Shift Stealer
const getShifts = async function() {
const startDate = new Date();
startDate.setHours(0, 0, 0, 0);
const endDate = new Date(startDate);
endDate.setDate(endDate.getDate() + 7);
endDate.setHours(23, 59, 59, 999);
const findResponse = await fetch(
"https://atoz-api-us-east-1.amazon.work/graphql?employeeId=" + EMPLOYEE_ID,
getRequest("{\"operationName\":\"FindShiftsPage\",\"variables\":{\"associateSiteId\":\"WCH2\",\"canFetchPayBreakdown\":false,\"canFetchSwapRequests\":false,\"scheduleTimeRange\":{\"start\":\"2024-02-21T05:00:00.000Z\",\"end\":\"2024-05-02T03:59:59.999Z\"},\"timeRange\":{\"start\":\"" + startDate.toISOString() + "\",\"end\":\"" + endDate.toISOString() + "\"},\"filter\":{\"includeIneligible\":true,\"unavailableReasonsToInclude\":[\"AssociateAccepted\",\"ShiftOpportunityCapacityMet\",\"ShiftOpportunityExpired\"]},\"opportunityTypes\":{\"types\":[\"DROP\",\"VOLUNTARY_TIME_OFF\",\"ADD\",\"VOLUNTARY_EXTRA_TIME\"]},\"swapRequestsInput\":{\"swapFromTimeRange\":{\"start\":\"2024-02-21T05:00:00.000Z\",\"end\":\"2024-05-02T03:59:59.999Z\"}}},\"query\":\"query FindShiftsPage($timeRange: DateTimeRangeInput!, $scheduleTimeRange: DateTimeRangeInput!, $swapRequestsInput: SwapRequestsInput!, $filter: ShiftOpportunitiesFilter, $opportunityTypes: TypeFilter!, $associateSiteId: ID = \\\"\\\", $canFetchPayBreakdown: Boolean = false, $canFetchSwapRequests: Boolean = false) {\\n shiftOpportunities(timeRange: $timeRange, filter: $filter) {\\n opportunities(opportunityTypes: $opportunityTypes) {\\n id\\n type\\n ...OpportunityCardList_ShiftOpportunity\\n ...FilteredShifts_ShiftOpportunity\\n ...ShiftsPerDay_ShiftOpportunities\\n ...ShiftFilters_ShiftOpportunity\\n __typename\\n }\\n __typename\\n }\\n schedule(timeRange: $scheduleTimeRange) {\\n scheduleShifts {\\n shift {\\n id\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n ...ShiftsPerDay_ScheduleShift\\n __typename\\n }\\n __typename\\n }\\n swapConfigurationForSite(siteId: $associateSiteId) {\\n ...ShiftsPerDay_SiteSwapConfiguration\\n __typename\\n }\\n swaps(siteId: $associateSiteId) @skip(if: $canFetchSwapRequests) {\\n ...ShiftsPerDay_Swaps\\n __typename\\n }\\n swapRequests(input: $swapRequestsInput) @include(if: $canFetchSwapRequests) {\\n ...ShiftsPerDay_SwapRequests\\n __typename\\n }\\n}\\n\\nfragment OpportunityCardList_ShiftOpportunity on ShiftOpportunity {\\n ...OpportunityFlowModal_ShiftOpportunity\\n ...OpportunityCard_ShiftOpportunity\\n __typename\\n}\\n\\nfragment OpportunityFlowModal_ShiftOpportunity on ShiftOpportunity {\\n ...UseAddOpportunityModalContentData_ShiftOpportunity\\n ...UseShiftDetailsModalContentData_ShiftOpportunity\\n __typename\\n}\\n\\nfragment UseAddOpportunityModalContentData_ShiftOpportunity on ShiftOpportunity {\\n id\\n type\\n dropDeadline\\n penaltyStartTime\\n shift {\\n id\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n incentivePay {\\n payModifiers {\\n applicableNetAmount {\\n amount\\n code\\n __typename\\n }\\n category\\n hourlyAdditionalCompensation {\\n amount\\n code\\n __typename\\n }\\n name\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalContentData_ShiftOpportunity on ShiftOpportunity {\\n shift {\\n ...UseShiftDetailsModalContentData_Shift\\n __typename\\n }\\n skill\\n skills {\\n translationKey\\n namespace\\n defaultText\\n __typename\\n }\\n ...UseShiftDetailsCardData_ShiftOpportunity\\n ...UseShiftPayLinkData_ShiftOpportunity\\n ...UseShiftPayBreakdownData_ShiftOpportunity\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalContentData_Shift on Shift {\\n site {\\n specialInstructions\\n __typename\\n }\\n ...UseShiftDetailsCardData_Shift\\n __typename\\n}\\n\\nfragment UseShiftDetailsCardData_Shift on Shift {\\n id\\n timeRange {\\n start\\n __typename\\n }\\n site {\\n address\\n __typename\\n }\\n ...UseShiftInfoData_Shift\\n __typename\\n}\\n\\nfragment UseShiftInfoData_Shift on Shift {\\n timeRange {\\n start\\n end\\n __typename\\n }\\n duration {\\n value\\n __typename\\n }\\n site {\\n id\\n address\\n lineOfBusiness\\n name\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftDetailsCardData_ShiftOpportunity on ShiftOpportunity {\\n shift {\\n ...UseShiftDetailsCardData_Shift\\n __typename\\n }\\n payBreakdown @include(if: $canFetchPayBreakdown) {\\n ...UseShiftDetailsCardData_PayBreakdown\\n __typename\\n }\\n ...UseShiftInfoData_ShiftOpportunity\\n ...UseVtoAvailableCardData_ShiftOpportunity\\n __typename\\n}\\n\\nfragment UseShiftDetailsCardData_PayBreakdown on PayBreakdown {\\n ...UseShiftInfoData_PayBreakdown\\n __typename\\n}\\n\\nfragment UseShiftInfoData_PayBreakdown on PayBreakdown {\\n summary {\\n duration {\\n value\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftInfoData_ShiftOpportunity on ShiftOpportunity {\\n skill\\n skills {\\n translationKey\\n namespace\\n defaultText\\n __typename\\n }\\n shift {\\n ...UseShiftInfoData_Shift\\n __typename\\n }\\n payBreakdown @include(if: $canFetchPayBreakdown) {\\n ...UseShiftInfoData_PayBreakdown\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseVtoAvailableCardData_ShiftOpportunity on ShiftOpportunity {\\n id\\n shift {\\n duration {\\n value\\n __typename\\n }\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n ...useAcceptVto_ShiftOpportunity\\n __typename\\n}\\n\\nfragment useAcceptVto_ShiftOpportunity on ShiftOpportunity {\\n id\\n ...UseAcceptVtoSuccessData_ShiftOpportunity\\n __typename\\n}\\n\\nfragment UseAcceptVtoSuccessData_ShiftOpportunity on ShiftOpportunity {\\n shift {\\n id\\n timeRange {\\n start\\n end\\n __typename\\n }\\n duration {\\n value\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftPayLinkData_ShiftOpportunity on ShiftOpportunity {\\n incentivePay {\\n ...UseShiftPayLinkData_IncentivePay\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftPayLinkData_IncentivePay on IncentivePay {\\n netPayModifier {\\n code\\n amount\\n __typename\\n }\\n payModifiers {\\n category\\n applicableNetAmount {\\n code\\n amount\\n __typename\\n }\\n hourlyAdditionalCompensation {\\n code\\n amount\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftPayBreakdownData_ShiftOpportunity on ShiftOpportunity {\\n payBreakdown @include(if: $canFetchPayBreakdown) {\\n ...UseShiftPayBreakdownData_PayBreakdown\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftPayBreakdownData_PayBreakdown on PayBreakdown {\\n base {\\n ...UseShiftPayBreakdownData_BreakdownRange\\n __typename\\n }\\n shiftDifferential {\\n ...UseShiftPayBreakdownData_BreakdownRange\\n __typename\\n }\\n premiums {\\n ...UseShiftPayBreakdownData_BreakdownRange\\n __typename\\n }\\n summary {\\n ...UseShiftPayBreakdownData_BreakdownSummary\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftPayBreakdownData_BreakdownRange on BreakdownRange {\\n category\\n hourlyCompensation {\\n ...UseShiftPayBreakdownData_Currency\\n __typename\\n }\\n durationRange {\\n min {\\n value\\n __typename\\n }\\n max {\\n value\\n __typename\\n }\\n __typename\\n }\\n totalCompensationRange {\\n min {\\n ...UseShiftPayBreakdownData_Currency\\n __typename\\n }\\n max {\\n ...UseShiftPayBreakdownData_Currency\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftPayBreakdownData_Currency on Currency {\\n amount\\n code\\n __typename\\n}\\n\\nfragment UseShiftPayBreakdownData_BreakdownSummary on BreakdownSummary {\\n totalShiftPayRange {\\n min {\\n ...UseShiftPayBreakdownData_Currency\\n __typename\\n }\\n max {\\n ...UseShiftPayBreakdownData_Currency\\n __typename\\n }\\n __typename\\n }\\n duration {\\n value\\n __typename\\n }\\n hourlyShiftRateRange {\\n min {\\n ...UseShiftPayBreakdownData_Currency\\n __typename\\n }\\n max {\\n ...UseShiftPayBreakdownData_Currency\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment OpportunityCard_ShiftOpportunity on ShiftOpportunity {\\n type\\n dropDeadline\\n penaltyStartTime\\n eligibility {\\n isEligible\\n unclaimableReasonCodes\\n __typename\\n }\\n shift {\\n id\\n ...UseShiftInfoData_Shift\\n __typename\\n }\\n incentivePay {\\n payModifiers {\\n applicableNetAmount {\\n amount\\n code\\n __typename\\n }\\n category\\n hourlyAdditionalCompensation {\\n amount\\n code\\n __typename\\n }\\n name\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n ...UsePayLabelData_ShiftOpportunity\\n ...UseShiftInfoData_ShiftOpportunity\\n __typename\\n}\\n\\nfragment UsePayLabelData_ShiftOpportunity on ShiftOpportunity {\\n shift {\\n ...UsePayLabelData_Shift\\n __typename\\n }\\n incentivePay {\\n ...UsePayLabelData_IncentivePay\\n __typename\\n }\\n payBreakdown @include(if: $canFetchPayBreakdown) {\\n ...UsePayLabelData_PayBreakdown\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UsePayLabelData_Shift on Shift {\\n timeRange {\\n start\\n end\\n __typename\\n }\\n duration {\\n value\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UsePayLabelData_IncentivePay on IncentivePay {\\n netPayModifier {\\n amount\\n code\\n __typename\\n }\\n payModifiers {\\n applicableNetAmount {\\n code\\n amount\\n __typename\\n }\\n category\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UsePayLabelData_PayBreakdown on PayBreakdown {\\n summary {\\n hourlyShiftRateRange {\\n min {\\n amount\\n code\\n __typename\\n }\\n max {\\n amount\\n code\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n premiums {\\n category\\n __typename\\n }\\n __typename\\n}\\n\\nfragment FilteredShifts_ShiftOpportunity on ShiftOpportunity {\\n type\\n shift {\\n site {\\n id\\n __typename\\n }\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n eligibility {\\n isEligible\\n unclaimableReasonCodes\\n __typename\\n }\\n incentivePay {\\n netPayModifier {\\n code\\n __typename\\n }\\n payModifiers {\\n name\\n __typename\\n }\\n __typename\\n }\\n payBreakdown @include(if: $canFetchPayBreakdown) {\\n premiums {\\n category\\n __typename\\n }\\n __typename\\n }\\n skill\\n skills {\\n translationKey\\n namespace\\n defaultText\\n __typename\\n }\\n __typename\\n}\\n\\nfragment ShiftsPerDay_ShiftOpportunities on ShiftOpportunity {\\n ...ShiftFlowModal_ShiftOpportunities\\n ...ShiftCard_ShiftOpportunities\\n __typename\\n}\\n\\nfragment ShiftFlowModal_ShiftOpportunities on ShiftOpportunity {\\n id\\n type\\n addDeadline\\n shift {\\n ...ShiftFlowModal_Shift\\n __typename\\n }\\n ...UseDropShiftModalContentData_ShiftOpportunity\\n ...UseShiftDetailsModalBannersData_ShiftOpportunity\\n ...UseShiftDetailsModalContentData_ShiftOpportunities\\n ...UseSelectVtoModalContentData_ShiftOpportunity\\n __typename\\n}\\n\\nfragment ShiftFlowModal_Shift on Shift {\\n id\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseDropShiftModalContentData_ShiftOpportunity on ShiftOpportunity {\\n id\\n type\\n penaltyStartTime\\n dropDeadline\\n shift {\\n id\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalBannersData_ShiftOpportunity on ShiftOpportunity {\\n ...UseShiftDetailsModalScheduledBannersData_ShiftOpportunity\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalScheduledBannersData_ShiftOpportunity on ShiftOpportunity {\\n id\\n type\\n shift {\\n ...UseShiftDetailsModalScheduledBannersData_Shift\\n __typename\\n }\\n ...UseScheduledShiftStatus_ShiftOpportunity\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalScheduledBannersData_Shift on Shift {\\n id\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseScheduledShiftStatus_ShiftOpportunity on ShiftOpportunity {\\n id\\n type\\n addDeadline\\n shift {\\n ...UseScheduledShiftStatus_Shift\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseScheduledShiftStatus_Shift on Shift {\\n id\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalContentData_ShiftOpportunities on ShiftOpportunity {\\n ...UseShiftDetailsModalContentData_ShiftOpportunity\\n ...UseShiftDetailsCardData_ShiftOpportunities\\n __typename\\n}\\n\\nfragment UseShiftDetailsCardData_ShiftOpportunities on ShiftOpportunity {\\n ...UseShiftDetailsCardData_ShiftOpportunity\\n ...UseVtoAvailableCardData_ShiftOpportunity\\n __typename\\n}\\n\\nfragment UseSelectVtoModalContentData_ShiftOpportunity on ShiftOpportunity {\\n id\\n shift {\\n duration {\\n value\\n __typename\\n }\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n type\\n ...useAcceptVto_ShiftOpportunity\\n __typename\\n}\\n\\nfragment ShiftCard_ShiftOpportunities on ShiftOpportunity {\\n id\\n type\\n penaltyStartTime\\n shift {\\n id\\n duration {\\n value\\n __typename\\n }\\n timeRange {\\n start\\n end\\n __typename\\n }\\n ...ShiftCard_Shift\\n __typename\\n }\\n eligibility {\\n isEligible\\n __typename\\n }\\n unavailability {\\n reasons\\n __typename\\n }\\n ...UseShiftCardStatusData_ShiftOpportunity\\n ...UseShiftInfoData_ShiftOpportunity\\n __typename\\n}\\n\\nfragment ShiftCard_Shift on Shift {\\n id\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftCardStatusData_ShiftOpportunity on ShiftOpportunity {\\n ...UseShiftCardScheduledStatusData_ShiftOpportunity\\n __typename\\n}\\n\\nfragment UseShiftCardScheduledStatusData_ShiftOpportunity on ShiftOpportunity {\\n shift {\\n ...UseShiftCardScheduledStatusData_Shift\\n __typename\\n }\\n ...UseScheduledShiftStatus_ShiftOpportunity\\n __typename\\n}\\n\\nfragment UseShiftCardScheduledStatusData_Shift on Shift {\\n id\\n duration {\\n value\\n __typename\\n }\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n}\\n\\nfragment ShiftFilters_ShiftOpportunity on ShiftOpportunity {\\n shift {\\n site {\\n id\\n name\\n __typename\\n }\\n __typename\\n }\\n skill\\n skills {\\n translationKey\\n namespace\\n defaultText\\n __typename\\n }\\n __typename\\n}\\n\\nfragment ShiftsPerDay_ScheduleShift on ScheduleShift {\\n ...ShiftCard_ScheduleShift\\n ...ShiftFlowModal_ScheduleShift\\n __typename\\n}\\n\\nfragment ShiftCard_ScheduleShift on ScheduleShift {\\n shift {\\n ...ShiftCard_Shift\\n __typename\\n }\\n incentivePay {\\n payModifiers {\\n category\\n __typename\\n }\\n __typename\\n }\\n shiftIntervals {\\n ...UseShiftIntervalListData_ShiftInterval\\n __typename\\n }\\n ...UseShiftInfoData_ScheduleShift\\n ...UseSwapButtons_ScheduleShift\\n ...UsePayLabelData_ScheduleShift\\n ...UseShiftCardStatusData_ScheduleShift\\n __typename\\n}\\n\\nfragment UseShiftIntervalListData_ShiftInterval on ShiftInterval {\\n ...UseShiftIntervalBlockData_ShiftInterval\\n __typename\\n}\\n\\nfragment UseShiftIntervalBlockData_ShiftInterval on ShiftInterval {\\n category\\n name {\\n defaultText\\n namespace\\n translationKey\\n __typename\\n }\\n skill {\\n defaultText\\n namespace\\n translationKey\\n __typename\\n }\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftInfoData_ScheduleShift on ScheduleShift {\\n skill\\n skills {\\n translationKey\\n namespace\\n defaultText\\n __typename\\n }\\n shift {\\n ...UseShiftInfoData_Shift\\n __typename\\n }\\n payBreakdown @include(if: $canFetchPayBreakdown) {\\n ...UseShiftInfoData_PayBreakdown\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseSwapButtons_ScheduleShift on ScheduleShift {\\n shift {\\n timeRange {\\n start\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UsePayLabelData_ScheduleShift on ScheduleShift {\\n shift {\\n ...UsePayLabelData_Shift\\n __typename\\n }\\n incentivePay {\\n ...UsePayLabelData_IncentivePay\\n __typename\\n }\\n payBreakdown @include(if: $canFetchPayBreakdown) {\\n ...UsePayLabelData_PayBreakdown\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftCardStatusData_ScheduleShift on ScheduleShift {\\n shift {\\n timeRange {\\n end\\n __typename\\n }\\n __typename\\n }\\n ...UseShiftCardScheduledStatusData_ScheduleShift\\n __typename\\n}\\n\\nfragment UseShiftCardScheduledStatusData_ScheduleShift on ScheduleShift {\\n acceptedVtoTimeRanges {\\n start\\n end\\n __typename\\n }\\n ...UseScheduledShiftStatus_ScheduleShift\\n __typename\\n}\\n\\nfragment UseScheduledShiftStatus_ScheduleShift on ScheduleShift {\\n shift {\\n ...UseScheduledShiftStatus_Shift\\n __typename\\n }\\n acceptedVtoTimeRanges {\\n start\\n end\\n __typename\\n }\\n __typename\\n}\\n\\nfragment ShiftFlowModal_ScheduleShift on ScheduleShift {\\n shift {\\n ...ShiftFlowModal_Shift\\n __typename\\n }\\n ...UseShiftDetailsModalContentData_ScheduleShift\\n ...UseDropShiftModalContentData_ScheduleShift\\n ...UseLegacyCancelSwapRequestModalContentData_ScheduleShift\\n ...UseCancelSwapRequestModalSuccessData_ScheduleShift\\n ...UseShiftDetailsModalBannersData_ScheduleShift\\n ...UseAcceptVtoSuccessData_ScheduleShift\\n ...UseSwapButtons_ScheduleShift\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalContentData_ScheduleShift on ScheduleShift {\\n shift {\\n ...UseShiftDetailsModalContentData_Shift\\n __typename\\n }\\n skill\\n skills {\\n translationKey\\n namespace\\n defaultText\\n __typename\\n }\\n shiftIntervals {\\n ...UseShiftIntervalListData_ShiftInterval\\n __typename\\n }\\n ...UseShiftDetailsCardData_ScheduleShift\\n ...UseShiftPayLinkData_ScheduleShift\\n ...UseShiftPayBreakdownData_ScheduleShift\\n __typename\\n}\\n\\nfragment UseShiftDetailsCardData_ScheduleShift on ScheduleShift {\\n shift {\\n ...UseShiftDetailsCardData_Shift\\n __typename\\n }\\n payBreakdown @include(if: $canFetchPayBreakdown) {\\n ...UseShiftDetailsCardData_PayBreakdown\\n __typename\\n }\\n ...UseShiftInfoData_ScheduleShift\\n ...UseVtoAccepted_ScheduleShift\\n __typename\\n}\\n\\nfragment UseVtoAccepted_ScheduleShift on ScheduleShift {\\n acceptedVtoTimeRanges {\\n start\\n end\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftPayLinkData_ScheduleShift on ScheduleShift {\\n incentivePay {\\n ...UseShiftPayLinkData_IncentivePay\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftPayBreakdownData_ScheduleShift on ScheduleShift {\\n payBreakdown @include(if: $canFetchPayBreakdown) {\\n ...UseShiftPayBreakdownData_PayBreakdown\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseDropShiftModalContentData_ScheduleShift on ScheduleShift {\\n skill\\n skills {\\n translationKey\\n namespace\\n defaultText\\n __typename\\n }\\n shift {\\n id\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseLegacyCancelSwapRequestModalContentData_ScheduleShift on ScheduleShift {\\n shift {\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseCancelSwapRequestModalSuccessData_ScheduleShift on ScheduleShift {\\n shift {\\n timeRange {\\n start\\n end\\n __typename\\n }\\n duration {\\n value\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalBannersData_ScheduleShift on ScheduleShift {\\n shift {\\n ...UseShiftDetailsModalBannersData_Shift\\n __typename\\n }\\n ...UseShiftDetailsModalScheduledBannersData_ScheduleShift\\n ...UseShiftDetailsModalWorkedBannersData_ScheduleShift\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalBannersData_Shift on Shift {\\n timeRange {\\n end\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalScheduledBannersData_ScheduleShift on ScheduleShift {\\n shift {\\n ...UseShiftDetailsModalScheduledBannersData_Shift\\n __typename\\n }\\n ...UseScheduledShiftStatus_ScheduleShift\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalWorkedBannersData_ScheduleShift on ScheduleShift {\\n ...UseWorkedShiftStatus_ScheduleShift\\n __typename\\n}\\n\\nfragment UseWorkedShiftStatus_ScheduleShift on ScheduleShift {\\n shift {\\n ...UseWorkedShiftStatus_Shift\\n __typename\\n }\\n acceptedVtoTimeRanges {\\n start\\n end\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseWorkedShiftStatus_Shift on Shift {\\n id\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseAcceptVtoSuccessData_ScheduleShift on ScheduleShift {\\n shift {\\n timeRange {\\n start\\n end\\n __typename\\n }\\n duration {\\n value\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment ShiftsPerDay_SiteSwapConfiguration on SiteSwapConfiguration {\\n ...ShiftFlowModal_SiteSwapConfiguration\\n ...ShiftCard_SiteSwapConfiguration\\n __typename\\n}\\n\\nfragment ShiftFlowModal_SiteSwapConfiguration on SiteSwapConfiguration {\\n ...UseLegacyCancelSwapRequestModalContentData_SiteSwapConfiguration\\n ...UseShiftDetailsModalScheduledBannersData_SiteSwapConfiguration\\n ...UseSwapButtons_SiteSwapConfiguration\\n __typename\\n}\\n\\nfragment UseLegacyCancelSwapRequestModalContentData_SiteSwapConfiguration on SiteSwapConfiguration {\\n siteId\\n swapEnabled\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalScheduledBannersData_SiteSwapConfiguration on SiteSwapConfiguration {\\n ...UseScheduledShiftStatus_SiteSwapConfiguration\\n __typename\\n}\\n\\nfragment UseScheduledShiftStatus_SiteSwapConfiguration on SiteSwapConfiguration {\\n swapEnabled\\n __typename\\n}\\n\\nfragment UseSwapButtons_SiteSwapConfiguration on SiteSwapConfiguration {\\n swapEnabled\\n swapRequestBoundaries {\\n start\\n end\\n __typename\\n }\\n blockedDates\\n swapOutRestriction {\\n restrictedDaysOfWeek\\n restrictionForNumberOfWeeks\\n __typename\\n }\\n __typename\\n}\\n\\nfragment ShiftCard_SiteSwapConfiguration on SiteSwapConfiguration {\\n ...UseSwapButtons_SiteSwapConfiguration\\n ...UseShiftCardStatusData_SiteSwapConfiguration\\n __typename\\n}\\n\\nfragment UseShiftCardStatusData_SiteSwapConfiguration on SiteSwapConfiguration {\\n ...UseShiftCardScheduledStatusData_SiteSwapConfiguration\\n __typename\\n}\\n\\nfragment UseShiftCardScheduledStatusData_SiteSwapConfiguration on SiteSwapConfiguration {\\n ...UseScheduledShiftStatus_SiteSwapConfiguration\\n __typename\\n}\\n\\nfragment ShiftsPerDay_Swaps on Swaps {\\n ...ShiftFlowModal_Swaps\\n ...ShiftCard_Swaps\\n __typename\\n}\\n\\nfragment ShiftFlowModal_Swaps on Swaps {\\n ...UseLegacyCancelSwapRequestModalContentData_Swaps\\n ...UseShiftDetailsModalBannersData_Swaps\\n ...UseSwapButtons_Swaps\\n __typename\\n}\\n\\nfragment UseLegacyCancelSwapRequestModalContentData_Swaps on Swaps {\\n swaps {\\n id\\n swapFrom\\n swapTo\\n status\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalBannersData_Swaps on Swaps {\\n ...UseShiftDetailsModalScheduledBannersData_Swaps\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalScheduledBannersData_Swaps on Swaps {\\n swaps {\\n id\\n swapFrom\\n swapTo\\n status\\n __typename\\n }\\n ...UseScheduledShiftStatus_Swaps\\n __typename\\n}\\n\\nfragment UseScheduledShiftStatus_Swaps on Swaps {\\n swaps {\\n id\\n swapFrom\\n swapTo\\n status\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseSwapButtons_Swaps on Swaps {\\n swaps {\\n id\\n swapFrom\\n swapTo\\n status\\n __typename\\n }\\n __typename\\n}\\n\\nfragment ShiftCard_Swaps on Swaps {\\n ...UseSwapButtons_Swaps\\n ...UseShiftCardStatusData_Swaps\\n __typename\\n}\\n\\nfragment UseShiftCardStatusData_Swaps on Swaps {\\n ...UseShiftCardScheduledStatusData_Swaps\\n __typename\\n}\\n\\nfragment UseShiftCardScheduledStatusData_Swaps on Swaps {\\n ...UseScheduledShiftStatus_Swaps\\n __typename\\n}\\n\\nfragment ShiftsPerDay_SwapRequests on SwapRequests {\\n ...ShiftFlowModal_SwapRequests\\n ...ShiftCard_SwapRequests\\n __typename\\n}\\n\\nfragment ShiftFlowModal_SwapRequests on SwapRequests {\\n ...UseCancelSwapRequestModalContentData_SwapRequests\\n ...UseShiftDetailsModalBannersData_SwapRequests\\n ...UseSwapButtons_SwapRequests\\n __typename\\n}\\n\\nfragment UseCancelSwapRequestModalContentData_SwapRequests on SwapRequests {\\n swaps {\\n from {\\n shifts {\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n id\\n status\\n to {\\n shifts {\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalBannersData_SwapRequests on SwapRequests {\\n ...UseShiftDetailsModalScheduledBannersData_SwapRequests\\n __typename\\n}\\n\\nfragment UseShiftDetailsModalScheduledBannersData_SwapRequests on SwapRequests {\\n ...UseScheduledShiftStatus_SwapRequests\\n __typename\\n}\\n\\nfragment UseScheduledShiftStatus_SwapRequests on SwapRequests {\\n swaps {\\n from {\\n shifts {\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n id\\n status\\n to {\\n shifts {\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment UseSwapButtons_SwapRequests on SwapRequests {\\n swaps {\\n from {\\n shifts {\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n id\\n status\\n to {\\n shifts {\\n timeRange {\\n start\\n end\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n __typename\\n}\\n\\nfragment ShiftCard_SwapRequests on SwapRequests {\\n ...UseSwapButtons_SwapRequests\\n ...UseShiftCardStatusData_SwapRequests\\n __typename\\n}\\n\\nfragment UseShiftCardStatusData_SwapRequests on SwapRequests {\\n ...UseShiftCardScheduledStatusData_SwapRequests\\n __typename\\n}\\n\\nfragment UseShiftCardScheduledStatusData_SwapRequests on SwapRequests {\\n ...UseScheduledShiftStatus_SwapRequests\\n __typename\\n}\\n\"}")
);
if (!findResponse.ok) {
log("Error fetching shifts!", findResponse);
setTimeout(getShifts, RETRY_POLL_AFTER);
return;
}
const shifts = (await findResponse.json()).data.shiftOpportunities.opportunities;
const addShift = async (id) => {
debug("Attempting to add shift: '" + id + "'...");
if (!DEBUG_API_CALLS) {
const addResponse = await fetch(
"https://atoz-api-us-east-1.amazon.work/graphql?employeeId=" + EMPLOYEE_ID,
getRequest("{\"operationName\":\"AddShift\",\"variables\":{\"shiftOpportunityId\":{\"shiftOpportunityId\":\"" + id + "\"}},\"query\":\"mutation AddShift($shiftOpportunityId: AddShiftInput!) {\\n addShift(input: $shiftOpportunityId)\\n}\\n\"}")
);
if (!addResponse.ok) {
log("Error adding shift!", addResponse);
return false;
}
}
notify = true;
log("Shift added!");
return true;
};
const addedShifts = [];
for (const shift of shifts) {
const { added, eligible, day, date, time } = getShiftInfo(shift);
if (added) {
addedShifts.push(shift);
}
if (eligible) {
debug("Shift available: '" + shift.id + "'...");
if (!DESIRED_SHIFTS.includes(time)) {
debug("Shift is not desired; continuing.");
continue;
}
if (EXCLUDE_DATES.includes(date) || EXCLUDE_DAYS.includes(day)) {
debug("Date or day of the week is excluded; continuing.");
continue;
}
const specialRole = getSpecialRoleAvailable(shifts, shift);
if (specialRole !== null) {
debug("Special role is available; going for it.");
addShift(specialRole.id);
}
await addShift(shift.id);
}
}
updateState(addedShifts);
setTimeout(getShifts, POLLING_RATE[0] + Math.floor(Math.random() * (POLLING_RATE[1] - POLLING_RATE[0])));
};
setInterval(function() {
if (Date.now() - lastUpdate > 15000) {
log("No update in 15 seconds; reloading page...");
unsafeWindow.location.reload();
lastUpdate = Date.now();
}
});
// Init
log("Started!");
unsafeWindow.set_session_refresh_always();
getShifts();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment