Skip to content

Instantly share code, notes, and snippets.

@Lxys-ai
Created September 30, 2022 03:53
Show Gist options
  • Save Lxys-ai/2c92e8a9a43850c6b8a9956094f40606 to your computer and use it in GitHub Desktop.
Save Lxys-ai/2c92e8a9a43850c6b8a9956094f40606 to your computer and use it in GitHub Desktop.
Lex State Machine Task Engine a
/* eslint-disable */
const fs = require("fs");
const colors = require("colors");
const child_process = require("child_process");
const path = require("path");
const events = require("events");
const eventEmitter = new events.EventEmitter();
const monitorEvent = new events.EventEmitter();
const crypto = require("crypto");
const utf8 = require("utf8");
/*
request handling imports
*/
const nodeFetch = require("node-fetch");
const withHar = require("node-fetch-har").withHar;
// const fetch = withHar(nodeFetch);
const fetch = nodeFetch;
const HttpsProxyAgent = require("https-proxy-agent");
const tlsFetch = require("./lexTLS/index.js").tlsFetch;
/*
preset imports and helper functions
*/
const { harvest2CAP, harvest2CAPImage } = require("./CaptchaHarvesting/2cap");
const {
yearSpacing,
monthSpacing,
cardSpacing,
stateName,
} = require("./presets/profileFormat");
const {
harvestCaptchaMonster,
harvestCaptchaMonsterImage,
} = require("./CaptchaHarvesting/Capmonster");
const proxyRotater = require("./presets/proxyRotater.js").getProxy;
const walmartEncryption =
require("./presets/walmart/walmartEncryption").encrypt;
const homeDepotEncryption =
require("./presets/homedepot/homedepotEncryption").encrypt;
const paniniStates = require("./presets/panini/paniniStates").paniniStates;
const amazonLogin = require("./presets/amazon/amazonLogin").amazonLogin;
const amazonMonitor = require("./presets/amazon/monitor").monitor;
const bestbuyMonitor = require("./presets/bestbuy/monitor").monitor;
const bestbuyLogin = require("./presets/bestbuy/browserLogin.js").BestBuyLogin;
const bestbuyBody = require("./presets/bestbuy/generateLoginBody").generateBody;
const bestbuyCode = require("./presets/bestbuy/imap").start;
const bestbuyEncrypt = require("./presets/bestbuy/encryptCard").start;
const SolveCaptcha = require("./CaptchaHarvesting/solvers.js").SolveCaptcha;
const { encrypt } = require("cs2-encryption");
const jwt_decode = require("jwt-decode");
const qs = require("qs");
const base64 = require("base-64");
const WebSocket = require("ws");
// const { createLogger, format, Logger, transports } =require('winston');
// const httpTransportOptions = {
// host: 'http-intake.logs.datadoghq.com',
// path: '/api/v2/logs?dd-api-key=1&ddsource=nodejs&service=LexAIO',
// ssl: true,
// };
// const datadogLogger = createLogger({
// level: 'info',
// exitOnError: false,
// format: format.json(),
// transports: [new transports.Http(httpTransportOptions)],
// });
console.log = (message) => {
// process.send({
// type: 'DatadogLog',
// level: 'info',
// data: {
// from: 'task_engine',
// data: {
// message: message,
// eventType:"task_engine_log"
// }
// }
// });
// console.info(message)
if (logWs) {
if (typeof message == "object") {
message = JSON.stringify(message);
}
logWs.send(message);
}
};
const newPromise = (id) =>
new Promise((resolve) => {
eventEmitter.on(`promiseSolved${id}`, (response) => {
resolve(response);
});
});
const lexFetch = async (message) => {
let id = makeid(10);
process.send({
type: "fetch",
message: message,
id: id,
});
let response = await newPromise(id);
return response;
};
// process.send = () => {}
function makeid(length) {
var result = "";
var characters =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
var charactersLength = characters.length;
for (var i = 0; i < length; i++) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
}
return result;
}
//
// grpcDir = path.join(__dirname, `index.exe`)
// grpcServer = child_process.spawn(grpcDir, {
// // shell: true,
// windowsHide: true,
// });
//
// setInterval(() => {
// const used = process.memoryUsage().heapUsed / 1024 / 1024;
// console.log(`The script uses approximately ${Math.round(used * 100) / 100} MB`);
// }, 500);
const AsyncFunction = Object.getPrototypeOf(async function () {}).constructor;
let taskObjects = {};
let moduleJSON = {};
let startTime = 0;
let endTime = 0;
let taskStatusQueue = [];
let taskStatisticQueue = [];
let mainProcessSocket;
let autopilotSocket;
let amazonSocket;
let logWs;
const connectToAmazonSocket = async () => {
// try{
// amazonSocket = new WebSocket('https://lex-amazon.herokuapp.com/lex-ws-test');
// amazonSocket.on('open', function open() {
// // console.log("AmazonWS listening...")
// });
// amazonSocket.on('message', function incoming(message) {
// process.send({
// type: 'amazonSocket-message',
// message: message
// })
// });
// amazonSocket.on('close', function close() {
// // console.log("AmazonWS closed")
// setTimeout(() => {
// connectToAmazonSocket()
// }, 5000)
// });
// } catch {
// // console.log("AmazonWS not listening...")
// setTimeout(() => {
// connectToAmazonSocket()
// }, 5000)
// }
};
const connectToBestBuySocket = async () => {
try {
bestbuySocket = new WebSocket("https://lex-bestbuy.herokuapp.com/");
//bestbuySocket = new WebSocket('ws://localhost:4000');
bestbuySocket.on("open", function open() {
console.log("BestBuyWS listening...");
});
bestbuySocket.on("message", function incoming(message) {
// eslint-disable-next-line
process.send({
type: "bestbuySocket-message",
message: message,
});
});
bestbuySocket.on("close", function close() {
console.log("BestBuyWS closed");
setTimeout(() => {
connectToBestBuySocket();
}, 5000);
});
} catch {
console.log("BestBuyWS not listening...");
setTimeout(() => {
connectToBestBuySocket();
}, 5000);
}
};
const connectToAutopilotSocket = async () => {
// try{
// autopilotSocket = new WebSocket('https://obscure-thicket-50038.herokuapp.com/lex-ws-test');
// autopilotSocket.on('open', function open() {
// // console.log("Autopilot listening...")
// });
// autopilotSocket.on('message', function incoming(message) {
// process.send({
// type: 'autopilot-message',
// message: message
// })
// })
// autopilotSocket.on('close', function close() {
// // console.log("Autopilot closed...")
// setTimeout(() => {
// connectToAutopilotSocket()
// }, 5000)
// });
// } catch {
// console.log("AutopilotWS not listening...")
// setTimeout(() => {
// connectToAutopilotSocket()
// }, 5000)
// }
};
const connectToMainProcessSocket = async () => {
mainProcessSocket = new WebSocket("ws://localhost:12315");
mainProcessSocket.on("open", function open() {
mainProcessSocket.send("something");
});
mainProcessSocket.on("message", function incoming(message) {});
};
let mainProcessSocket2;
const connectToMainProcessSocket2 = async () => {
mainProcessSocket2 = new WebSocket("ws://localhost:12316");
mainProcessSocket2.on("open", function open() {
mainProcessSocket2.send("something");
});
mainProcessSocket2.on("message", function incoming(message) {});
};
const createLogSocket = async () => {
//create new websocket server
let wss = new WebSocket.Server({ port: 12514 });
wss.on("connection", function connection(ws) {
logWs = ws;
});
// const child_process = require('child_process');
// child_process.exec("start cmd.exe /K node src/main/core/TaskChild/presets/logs/log.js");
};
connectToMainProcessSocket();
connectToMainProcessSocket2();
connectToAutopilotSocket();
connectToAmazonSocket();
connectToBestBuySocket();
createLogSocket();
const log = (TaskID, text, type, func) => {
if (taskObjects[TaskID].Stopped == true) {
return;
}
let site = taskObjects[TaskID].getTaskInfo(TaskID, taskObjects).product.site;
let TaskGroupID = taskObjects[TaskID].TaskGroupID;
let task_info = taskObjects.taskGroups
.find((group) => group.id === TaskGroupID)
.tasks.find((task) => task.id === TaskID);
let task_mode = task_info.task_settings.task_mode;
let task_type = task_info.type;
let colorDict = moduleJSON[site][task_type][task_mode]["logStatusColors"];
let color = colorDict[type] ?? "red";
type = type == "end" ? "unknown error" : type;
typeText = colors[color](type);
try {
taskStatusQueue = taskStatusQueue.filter((item) => {
return JSON.parse(item).TaskID !== TaskID;
});
if (taskObjects[TaskID].Stopped) {
return;
}
//sends task status to main process
taskStatusQueue.push(
JSON.stringify({
type: "updateTaskStatus",
TaskID: TaskID,
TaskGroupID: taskObjects[TaskID].TaskGroupID,
text: text,
color: color,
task_info: task_info,
})
);
if (moduleJSON[site][task_type][task_mode]["taskStatistics"]) {
taskStatisticQueue.push(
JSON.stringify({
type: "updateTaskStatistics",
TaskID: TaskID,
TaskGroupID: taskObjects[TaskID].TaskGroupID,
statisticType:
moduleJSON[site][task_type][task_mode]["taskStatistics"][type],
action: "increment",
})
);
}
console.info(
"[ " +
TaskID +
" ] [ " +
typeText +
" ] [ " +
func["name"] +
" ] [ " +
timestampSHORT() +
" ] " +
text
);
if (logWs) {
logWs.send(
"[ " +
TaskID +
" ] [ " +
typeText +
" ] [ " +
func["name"] +
" ] [ " +
timestampSHORT() +
" ] " +
text
);
}
} catch (e) {
console.log(e);
}
};
setInterval(() => {
if (taskStatusQueue.length > 0) {
mainProcessSocket.send(
JSON.stringify({
type: "BulkUpdateTaskStatus",
taskStatusQueue: taskStatusQueue,
taskStatisticQueue: taskStatisticQueue,
})
);
taskStatusQueue = [];
taskStatisticQueue = [];
}
}, 250);
const main = async (TaskID, func) => {
if (taskObjects[TaskID].Stopped == true) {
if (taskObjects.settings.preferences.log_tasks) {
let encryptData = (data) => {
let buff = new Buffer.from(data);
let base64data = buff.toString("base64");
newText = reverseString(base64data).split("");
let finalText = "";
for (item of newText) {
finalText +=
item + "," + getRandomInt(100) + "," + getRandomInt(1000) + ",";
}
return finalText;
};
let encryptedHar = encryptData(
JSON.stringify(taskObjects[TaskID]["harLog"])
);
let site = taskObjects[TaskID].getTaskInfo(TaskID, taskObjects).product
.site;
process.send({
type: "logHar",
data: encryptedHar,
site: site,
TaskID,
});
fs.writeFileSync(`./logs/${site}-${TaskID}.lex`, encryptedHar);
}
console.log(
`[ ${TaskID} ] [ ${"Task Stopped by Client"} ] [ ${
func.name
} ] [ ${timestampSHORT()} ]`
);
return;
}
try {
if (
taskObjects[TaskID]["CallStack"][
taskObjects[TaskID]["CallStack"].length - 2
] == func["name"] &&
func["type"] == "request"
) {
await new Promise((resolve) => setTimeout(resolve, func["retryDelay"]));
}
} catch {}
taskObjects[TaskID]["CallStack"].push(func["name"]);
if (func["start"] != null) {
for (let functionName of func["start"].replace(/ /g, "").split(",")) {
await handleHelperFunction(TaskID, func, functionName);
}
}
let TaskGroupID = taskObjects[TaskID].TaskGroupID;
switch (func["type"]) {
case "request":
let [requestResponse, harEntry] = await handleRequest(TaskID, func);
if (requestResponse === "timeout") {
process.send({
type: "updateTaskStatus",
TaskID: TaskID,
TaskGroupID: TaskGroupID,
text: "Request Timeout. Retrying...",
color: "yellow",
});
main(TaskID, func);
return;
}
if (requestResponse === "error") {
process.send({
type: "updateTaskStatus",
TaskID: TaskID,
TaskGroupID: TaskGroupID,
text: "Request Error. Check Proxy. Retrying...",
color: "yellow",
});
main(TaskID, func);
return;
}
if (requestResponse.data === "Request Client Error") {
process.send({
type: "updateTaskStatus",
TaskID: TaskID,
TaskGroupID: TaskGroupID,
text: "Request Error. Check Proxy. Retrying...",
color: "yellow",
});
main(TaskID, func);
return;
}
await handleRequestStatus(TaskID, func, requestResponse, harEntry);
break;
case "function":
let functionResponse = await handleFunction(TaskID, func);
await handleFunctionStatus(TaskID, func, functionResponse);
break;
default:
console.log("Hit default case. Stopping Task.");
taskObjects[TaskID].Stopped = true;
break;
}
};
const handleHelperFunction = async (TaskID, func, functionName) => {
const actions = {
executeHandlerFunction: async (TaskID, func, functionName) => {
let functionArgumentsVariables = [];
let helperFunction = taskObjects[TaskID]["helperFunctions"][functionName]; //gets the actual helper function
let site = taskObjects[TaskID].getTaskInfo(TaskID, taskObjects).product
.site;
let TaskGroupID = taskObjects[TaskID].TaskGroupID;
let task_info = taskObjects.taskGroups
.find((group) => group.id === TaskGroupID)
.tasks.find((task) => task.id === TaskID);
let task_mode = task_info.task_settings.task_mode;
let task_type = task_info.type;
functionArguments =
moduleJSON[site][task_type][task_mode]["helperFunctions"][functionName][
"arguments"
];
let argumentsInput = functionArguments.replace(/ /g, "").split(","); // makes function arguments into array if includes comma
for (let item of argumentsInput) {
functionArgumentsVariables.push(
item == "taskObjects"
? taskObjects
: taskObjects[TaskID]["Variables"][item]
);
}
functionArgumentsVariables.push(console);
functionArgumentsVariables.push(monitorEvent);
await helperFunction(...functionArgumentsVariables);
},
};
await actions.executeHandlerFunction(TaskID, func, functionName);
};
const handleFunction = async (TaskID, func) => {
let args = func["function"].arguments + ", console, monitorEvent";
let tempFunction = new AsyncFunction(args, func["function"].body);
return await tempFunction(taskObjects, TaskID, console, monitorEvent);
};
const handleRequest = async (TaskID, func) => {
let headers = await handleHeaders(TaskID, func);
let method = await handleMethod(TaskID, func);
let body = await handleBody(TaskID, func);
let url = await handleURL(TaskID, func);
let proxy = await handleProxy(TaskID, func);
let cloudflare = await handleCloudflare(TaskID, func);
let redirect = await handleRedirect(TaskID, func);
let timeout = await handleTimeout(TaskID, func);
let response;
let error;
let newConfig;
if (func["request"]["requestOptions"]["useTLS"]) {
redirect = redirect ? "True" : "False";
proxy = proxy ? JSON.parse(JSON.stringify(proxy))["proxy"]["href"] : "";
let config = {
httpsAgent: proxy,
method: method,
url: url,
headers: headers,
data: body,
redirect: redirect,
cloudflare: cloudflare,
};
// let harRequestEntry = handleHarRequestEntry(config);
let harRequestEntry = null;
if (func["request"]["requestOptions"]["tlsType"] === "lexFetch") {
let proxyInfo;
if (proxy === "") {
proxyInfo = null;
} else {
let splitProxy = proxy.split(":");
proxyInfo = {
host: splitProxy[2].split("@")[1],
port: splitProxy[3].split("/")[0],
user: splitProxy[1].split("//")[1],
password: splitProxy[2].split("@")[0],
};
}
newConfig = {
url: url,
options: {
proxy: proxyInfo,
method: method,
headers: headers,
data: body,
},
};
response = await lexFetch(newConfig);
body = response.body;
} else {
[response, error] = await executeTLSFetch(config);
body = await response.data;
}
// startTime = new Date();
if (error) {
console.log(error);
return ["timeout", null];
}
response.data = body;
// (config)
response.text = function () {
return body;
};
return [response, harRequestEntry];
} else {
if (redirect === true) {
redirect = "follow";
} else if (redirect === "error") {
redirect = "error";
} else {
redirect = "manual";
}
let config = {
agent: proxy,
redirect: redirect,
headers: headers,
method: method,
body: body,
timeout: timeout,
};
let [response, error] = await executeFetch(url, config);
if (error) {
console.log(error.type);
switch (error.type) {
case "request-timeout":
log(TaskID, "Request Timeout", "Task Engine", func);
return ["timeout", null];
default:
console.log(error, error.type);
return [error, null];
}
}
body = await response.text();
response.text = function () {
return body;
};
return [response, config];
}
};
let executeFetch = async (url, config) => {
try {
const data = await fetch(url, config);
return [data, null];
} catch (error) {
return [null, error];
}
};
let executeTLSFetch = async (config) => {
try {
const data = await tlsFetch(config);
return [data, null];
} catch (error) {
console.log(error);
return [null, error];
}
};
let executeLexFetch = async (config) => {
try {
const data = await lexFetch(config);
return [data, null];
} catch (error) {
console.log(error);
return [null, error];
}
};
const handleURL = async (TaskID, func) => {
const actions = {
executeFunctionURL: async (TaskID, func) => {
let functionArgumentsVariables = [];
let urlFunction =
taskObjects[TaskID]["helperFunctions"][
func["request"]["requestConfig"]["url"]["urlFunction"]["name"]
]; //gets the actual url helper function
let functionArguments =
func["request"]["requestConfig"]["url"]["urlFunction"]["arguments"]; //gets the arguments needed for the url helper function
let argumentsInput = functionArguments.replace(/ /g, "").split(",");
for (let item of argumentsInput) {
functionArgumentsVariables.push(
item == "taskObjects"
? taskObjects
: taskObjects[TaskID]["Variables"][item]
);
} // gets values of argument functions
functionArgumentsVariables.push(console);
functionArgumentsVariables.push(monitorEvent);
functionURL = await urlFunction(...functionArgumentsVariables); // calls function with the argument variables
return functionURL;
},
};
return func["request"]["requestConfig"]["url"]["plainURL"] == null
? actions["executeFunctionURL"](TaskID, func)
: func["request"]["requestConfig"]["url"]["plainURL"];
};
const handleProxy = async (TaskID, func) => {
if (func["request"]["requestOptions"]["proxies"]) {
return taskObjects[TaskID]["Proxy"];
} else {
return false;
}
};
const handleCloudflare = async (TaskID, func) => {
if (func["request"]["requestOptions"]["cloudflare"]) {
return true;
} else {
return false;
}
};
const handleRedirect = async (TaskID, func) => {
if (func["request"]["requestOptions"]["redirect"]) {
return false;
} else {
return true;
}
};
const handleTimeout = async (TaskID, func) => {
if (func["request"]["requestOptions"]["timeout"]) {
return func["request"]["requestOptions"]["timeout"];
} else {
return 30000;
}
};
const handleHeaders = async (TaskID, func) => {
let headers = func["request"]["requestConfig"]["headers"];
try {
for (let headerKey in func["request"]["requestConfig"]["customHeaders"]) {
let tempFunction = new AsyncFunction(
func["request"]["requestConfig"]["customHeaders"][headerKey][
"arguments"
] + ",console",
func["request"]["requestConfig"]["customHeaders"][headerKey]["body"]
);
headers[headerKey] = await tempFunction(taskObjects, TaskID, console);
}
} catch {}
if (func["request"]["requestOptions"]["useSessionCookies"]) {
headers["cookie"] = parseCookies(taskObjects[TaskID]["Cookies"]);
}
if (func["request"]["requestOptions"]["cookies"]) {
headers["cookie"] += func["request"]["requestOptions"]["cookies"];
}
return headers;
};
const handleMethod = async (TaskID, func) => {
return func["request"]["requestConfig"]["method"];
};
const handleBody = async (TaskID, func) => {
if (
func["request"]["requestConfig"]["body"]["plainBody"] == null &&
func["request"]["requestConfig"]["body"]["function"] != null
) {
let tempFunction = new AsyncFunction(
func["request"]["requestConfig"]["body"]["function"]["arguments"] +
",console",
func["request"]["requestConfig"]["body"]["function"]["body"]
);
return await tempFunction(taskObjects, TaskID, console);
} else {
return func["request"]["requestConfig"]["body"]["plainBody"];
}
};
const handleHarRequestEntry = (request) => {
if (!taskObjects.settings.preferences.log_tasks) {
return;
}
function buildRequestCookies(headers) {
let cookies;
try {
cookiesSplit = headers["cookie"].split("; ");
cookies = cookiesSplit.map((cookieEntry) => {
return {
name: cookieEntry.split("=")[0],
value: cookieEntry.split("=")[1],
};
});
} catch {
cookies = [];
}
return cookies;
}
function buildHeaders(headers) {
const list = [];
if (Array.isArray(headers)) {
for (let i = 0; i < headers.length; i += 2) {
list.push({
name: headers[i],
value: headers[i + 1],
});
}
} else {
Object.keys(headers).forEach((name) => {
const values = Array.isArray(headers[name])
? headers[name]
: [headers[name]];
values.forEach((value) => {
list.push({ name, value });
});
});
}
return list;
}
function buildParams(paramString) {
const params = [];
const parsed = querystring.parse(paramString);
for (const name in parsed) {
const value = parsed[name];
if (Array.isArray(value)) {
value.forEach((item) => {
params.push({ name, value: item });
});
} else {
params.push({ name, value });
}
}
return params;
}
const now = Date.now();
const startTime = process.hrtime();
const url = new URL(request.url);
const entry = {
_timestamps: {
start: startTime,
},
_resourceType: "fetch",
startedDateTime: new Date(now).toISOString(),
cache: {
beforeRequest: null,
afterRequest: null,
},
timings: {
blocked: -1,
dns: -1,
connect: -1,
send: 0,
wait: 0,
receive: 0,
ssl: -1,
},
request: {
method: request.method,
url: url.href,
cookies: buildRequestCookies(request.headers),
headers: buildHeaders(request.headers),
queryString: [...url.searchParams].map(([name, value]) => ({
name,
value,
})),
headersSize: -1,
bodySize: -1,
},
};
let requestBody = request.data;
let headers = request.headers;
if (requestBody != null) {
// Works for both buffers and strings.
entry.request.bodySize = Buffer.byteLength(requestBody);
let mimeType;
for (const name in headers) {
if (name.toLowerCase() === "content-type") {
mimeType = headers[name][0];
break;
}
}
if (mimeType) {
const bodyString = requestBody.toString(); // FIXME: Assumes encoding?
if (mimeType === "application/x-www-form-urlencoded") {
entry.request.postData = {
mimeType,
params: buildParams(bodyString),
};
} else {
entry.request.postData = { mimeType, text: bodyString };
}
}
}
taskObjects[TaskID]["har"].push(response.harEntry);
let harEntry = JSON.parse(
fs.readFileSync(`./logs/har-${TaskID}.json`, "utf8")
);
harEntry["log"]["entries"].push(response.harEntry);
fs.writeFileSync(`./logs/har-${TaskID}.json`, JSON.stringify(harEntry));
return entry;
};
const handleHarResponse = async (TaskID, func, response, entry) => {
if (!taskObjects.settings.preferences.log_tasks) {
return;
}
function buildResponseCookies(headers) {
let cookies;
try {
cookiesArray = headers["cookie"]["set-cookies"];
cookies = cookiesArray.map((cookieEntry) => {
return {
name: cookieEntry.split("=")[0],
value: cookieEntry.split("=")[1].split(";")[0],
};
});
} catch {
cookies = [];
}
return cookies;
}
function buildHeaders(headers) {
const list = [];
if (Array.isArray(headers)) {
for (let i = 0; i < headers.length; i += 2) {
list.push({
name: headers[i],
value: headers[i + 1],
});
}
} else {
Object.keys(headers).forEach((name) => {
const values = Array.isArray(headers[name])
? headers[name]
: [headers[name]];
values.forEach((value) => {
list.push({ name, value });
});
});
}
return list;
}
function getDuration(a, b) {
const seconds = b[0] - a[0];
const nanoseconds = b[1] - a[1];
return seconds * 1000 + nanoseconds / 1e6;
}
entry.time = getDuration(entry._timestamps.start, process.hrtime());
entry.response = {
status: response.status,
statusText: "",
httpVersion: "httpVersion",
cookies: buildResponseCookies(response.headers),
headers: buildHeaders(response.headers),
content: {
size: -1,
mimeType: response.headers["content-type"],
},
redirectURL: response.headers.location || "",
headersSize: -1,
bodySize: -1,
};
if (entry.response.bodySize === -1) {
entry.response.bodySize = 0;
}
if (response.data) {
let text = response.data;
const bodySize = Buffer.byteLength(text);
entry.response.content.text = text;
entry.response.content.size = bodySize;
entry.response.bodySize = bodySize;
}
taskObjects[TaskID]["harLog"]["log"]["entries"].push(entry);
let encryptData = (data) => {
let buff = new Buffer.from(data);
let base64data = buff.toString("base64");
newText = reverseString(base64data).split("");
let finalText = "";
for (item of newText) {
finalText +=
item + "," + getRandomInt(100) + "," + getRandomInt(1000) + ",";
}
return finalText;
};
let encryptedHar = encryptData(JSON.stringify(taskObjects[TaskID]["harLog"]));
let site = taskObjects[TaskID].getTaskInfo(TaskID, taskObjects).product.site;
process.send({
type: "logHar",
data: encryptedHar,
site: site,
TaskID,
});
fs.writeFileSync(`./logs/${site}-${TaskID}.lex`, encryptedHar);
};
const handleRequestStatus = async (TaskID, func, response, harEntry) => {
if (func["request"]["requestOptions"]["useTLS"]) {
handleHarResponse(TaskID, func, response, harEntry);
}
taskObjects[TaskID]["requestHistory"][func["name"]] = response;
if (func["request"]["requestOptions"]["saveSessionCookies"]) {
let requestCookies = getRequestCookies(response, func);
if (requestCookies) {
taskObjects[TaskID]["Cookies"] = handleCookieJar(
taskObjects[TaskID]["Cookies"],
requestCookies
);
}
}
let { reqStatus: reqStatus, error: error } = await requestStatus(
TaskID,
func,
response
);
if (error) {
console.log(error);
}
let logText;
if (reqStatus != "end") {
if (func["logic"]["functionLogic"][reqStatus]["dynamic"]) {
let tempFunction = new AsyncFunction(
"taskObjects, TaskID",
func["logic"]["functionLogic"][reqStatus]["log"]
);
logText = await tempFunction(taskObjects, TaskID, console);
} else {
logText = func["logic"]["functionLogic"][reqStatus]["log"];
}
} else {
logWs.send(JSON.stringify(response?.data));
if (func["logic"]["taskLogic"]["end"] != "end") {
logText = func["name"] + ": Error ->" + reqStatus;
} else {
logText = error;
}
}
log(TaskID, logText, reqStatus ?? "error", func);
let nextFunction = func["logic"]["taskLogic"][reqStatus];
let site = taskObjects[TaskID].getTaskInfo(TaskID, taskObjects).product.site;
let TaskGroupID = taskObjects[TaskID].TaskGroupID;
let task_info = taskObjects.taskGroups
.find((group) => group.id === TaskGroupID)
.tasks.find((task) => task.id === TaskID);
let task_mode = task_info.task_settings.task_mode;
let task_type = task_info.type;
nextFunction
? main(
TaskID,
moduleJSON[site][task_type][task_mode].functions[nextFunction]
)
: log("Task Stopped: " + reqStatus, "Task Engine", "stop");
};
const getRequestCookies = (response, func) => {
try {
if (func["request"]["requestOptions"]["useTLS"]) {
return response.headers["set-cookie"];
} else {
return response.headers.raw()["set-cookie"];
}
} catch {
console.log("Error with cookies.");
return [];
}
};
const handleFunctionStatus = async (TaskID, func, response) => {
let funcStatus = response;
try {
if (func["logic"]["functionLogic"][funcStatus]["dynamic"]) {
let tempFunction = new AsyncFunction(
"taskObjects, TaskID",
func["logic"]["functionLogic"][funcStatus]["log"]
);
logText = await tempFunction(taskObjects, TaskID, console);
log(
TaskID,
funcStatus != "end" ? logText : error,
funcStatus ?? "error",
func
);
} else {
log(
TaskID,
funcStatus != "end"
? func["logic"]["functionLogic"][funcStatus]["log"]
: error,
funcStatus ?? "error",
func
);
}
} catch (e) {
console.log(e);
console.log(funcStatus);
console.log("e: 569");
}
let site = taskObjects[TaskID].getTaskInfo(TaskID, taskObjects).product.site;
let TaskGroupID = taskObjects[TaskID].TaskGroupID;
let task_info = taskObjects.taskGroups
.find((group) => group.id === TaskGroupID)
.tasks.find((task) => task.id === TaskID);
let task_mode = task_info.task_settings.task_mode;
let task_type = task_info.type;
moduleJSON[site][task_type][task_mode].functions?.[
func["logic"]["taskLogic"][funcStatus]
]
? main(
TaskID,
moduleJSON[site][task_type][task_mode].functions[
func["logic"]["taskLogic"][funcStatus]
]
)
: log(TaskID, "Task Stopped: " + funcStatus, "Task Engine", "stop");
};
const requestStatus = async (TaskID, func, response) => {
const actions = {
regex: async (response, statusType) => {},
responseBodyIncludes: async (response, statusType) => {
let text = await response.text();
return text.includes(
func["logic"]["functionLogic"][statusType].options.responseBodyIncludes
) == true
? statusType
: false;
},
jsonIncludes: async (response, statusType) => {
try {
let text = await JSON.parse(response.text());
let array =
func["logic"]["functionLogic"][statusType].options.jsonIncludes;
for (i = 0; i < array.length; i++) {
text = text[array[i]];
}
if (text !== undefined) {
return statusType;
} else {
return false;
}
} catch (e) {
return false;
}
},
headersInclude: async (response, statusType) => {
return JSON.stringify(response.headers).includes(
func["logic"]["functionLogic"][statusType].options.headersInclude
) == true
? statusType
: false;
},
cookiesInclude: async (response, statusType) => {
return JSON.stringify(response.headers.get("set-cookie")).includes(
func["logic"]["functionLogic"][statusType].options.cookiesInclude
) == true
? statusType
: false;
},
statusType: async (response, statusType) => {},
};
for (let statusType of func["logic"]["functionLogic"]["reqStatuses"]) {
if (func["logic"]["functionLogic"][statusType].status == response.status) {
logRequestStatus(TaskID, func, statusType);
return { reqStatus: statusType };
}
if (!func["logic"]["functionLogic"][statusType].status) {
try {
status = await actions[
func["logic"]["functionLogic"][statusType].options.type
](response, statusType);
if (status) {
logRequestStatus(TaskID, func, statusType);
return { reqStatus: statusType };
}
} catch {}
}
}
return { reqStatus: "end", error: "No Further Logic Provided" };
};
const logRequestStatus = (TaskID, func, statusType) => {
process.send({
type: "AnalyticsUpdateTaskStatus",
TaskID: TaskID,
func: func,
reqStatus: statusType,
});
};
const handleCookieJar = (cookieJar, cookies) => {
const grabCookies = (cookieArray) => {
return cookieArray.map((i) => {
let newCookie = i.split(";")[0] + ";";
let newCookieName = newCookie.split("=")[0];
for (let x = 0; x < cookieJar.length; x++) {
if (cookieJar[x].split("=")[0] == newCookieName) {
cookieJar[x] = newCookie;
return;
}
}
cookieJar.push(newCookie);
});
};
if (typeof cookies == "string") {
cookies = [cookies];
}
grabCookies(cookies);
return cookieJar;
};
const parseCookies = (cookieJar) => {
let cookieString = cookieJar[0];
for (let i = 1; i < cookieJar.length; i++) {
cookieString += ` ${cookieJar[i]}`;
}
return cookieString;
};
const setVariables = (functionMain, TaskID) => {
helperVariables = {};
helperVariables["TaskID"] = TaskID;
for (let VariablesTemp of functionMain["variables"]) {
helperVariables[VariablesTemp] = null;
}
return helperVariables;
};
const setHelperFunctions = (functionMain) => {
helperFunctions = {};
for (let element in functionMain["helperFunctions"]) {
helperFunctions[element] = new AsyncFunction(
functionMain["helperFunctions"][element].arguments,
functionMain["helperFunctions"][element].body
);
}
if (functionMain["captchaHarvester"] == true) {
helperFunctions["2CAP"] = harvest2CAP;
helperFunctions["2CAPImage"] = harvest2CAPImage;
helperFunctions["CapMonster"] = harvestCaptchaMonster;
helperFunctions["CapMonsterImage"] = harvestCaptchaMonsterImage;
helperFunctions["Solvers"] = SolveCaptcha;
}
helperFunctions["sleep"] = sleep;
helperFunctions["crypto"] = crypto;
helperFunctions["utf8"] = utf8;
helperFunctions["walmartEncryption"] = walmartEncryption;
helperFunctions["homedepotEncryption"] = homeDepotEncryption;
helperFunctions["paniniStates"] = paniniStates;
helperFunctions["amazonLogin"] = amazonLogin;
helperFunctions["amazonMonitor"] = amazonMonitor;
helperFunctions["bestbuyMonitor"] = bestbuyMonitor;
helperFunctions["bestbuySafeLogin"] = bestbuyLogin;
helperFunctions["bestbuyBody"] = bestbuyBody;
helperFunctions["bestbuyCode"] = bestbuyCode;
helperFunctions["bestbuyEncrypt"] = bestbuyEncrypt;
helperFunctions["encrypt"] = encrypt;
helperFunctions["jwt_decode"] = jwt_decode;
helperFunctions["qs"] = qs;
helperFunctions["proxyRotater"] = proxyRotater;
helperFunctions["HttpsProxyAgent"] = HttpsProxyAgent;
helperFunctions["yearSpacing"] = yearSpacing;
helperFunctions["monthSpacing"] = monthSpacing;
helperFunctions["cardSpacing"] = cardSpacing;
helperFunctions["stateName"] = stateName;
helperFunctions["base64"] = base64;
return helperFunctions;
};
const start = async (TaskID, TaskGroupID) => {
let functionMain;
let task_info = taskObjects.taskGroups
.find((group) => group.id === TaskGroupID)
.tasks.find((task) => task.id === TaskID);
let task_mode = task_info.task_settings.task_mode;
let task_type = task_info.type;
try {
functionMain = moduleJSON[task_info.product.site][task_type][task_mode];
} catch (e) {
console.log(e);
process.send({
type: "updateTaskStatus",
TaskID: TaskID,
TaskGroupID: TaskGroupID,
text: "API Misconfiguration (1). Restart Bot.",
color: "red",
});
return;
}
if (!functionMain) {
process.send({
type: "updateTaskStatus",
TaskID: TaskID,
TaskGroupID: TaskGroupID,
text: "API Misconfiguration (2). Restart Bot.",
color: "red",
});
return;
}
helperVariables = setVariables(functionMain, TaskID);
helperFunctions = setHelperFunctions(functionMain);
taskInfo = {
TaskID: TaskID,
TaskGroupID: TaskGroupID,
Variables: helperVariables,
helperFunctions: helperFunctions,
Cookies: [],
Proxy: "",
requestHistory: {},
CallStack: [],
har: [],
Stopped: false,
getTaskInfo: (taskId, taskObjects) => {
let taskGroupId = taskObjects[taskId].TaskGroupID;
let taskGroups = taskObjects.taskGroups;
let task_info = taskGroups
.find((group) => group.id === taskGroupId)
.tasks.find((task) => task.id === taskId);
return task_info;
},
getProfile: (taskId, taskObjects) => {
let taskGroupId = taskObjects[taskId].TaskGroupID;
let taskGroups = taskObjects.taskGroups;
let profileGroups = taskObjects.profileGroups;
try {
let task_info = taskGroups
.find((group) => group.id === taskGroupId)
.tasks.find((task) => task.id === taskId);
let profile_id = task_info.task_profile_info.profile_id;
let profile_group_id = task_info.task_profile_info.profile_group_id;
let profile_info = profileGroups
.find((group) => group.id === profile_group_id)
.profiles.find((profile) => profile.id === profile_id);
return profile_info;
} catch (e) {
console.log(e);
return null;
}
},
getAccount: (taskId, taskObjects) => {
let taskGroupId = taskObjects[taskId].TaskGroupID;
let taskGroups = taskObjects.taskGroups;
let accountGroups = taskObjects.accountGroups;
try {
let task_info = taskGroups
.find((group) => group.id === taskGroupId)
.tasks.find((task) => task.id === taskId);
let account_id = task_info.task_account_info.account_id;
let account_group_id = task_info.task_account_info.account_group_id;
let account_info = accountGroups
.find((group) => group.id === account_group_id)
.accounts.find((account) => account.id === account_id);
return account_info;
} catch {
return null;
}
},
updateAccount: (taskId, taskObjects, newAccount) => {
let taskGroupId = taskObjects[taskId].TaskGroupID;
let taskGroups = taskObjects.taskGroups;
let task_info = taskGroups
.find((group) => group.id === taskGroupId)
.tasks.find((task) => task.id === taskId);
let account_id = task_info.task_account_info.account_id;
let account_group_id = task_info.task_account_info.account_group_id;
process.send({
type: "saveAccountInfo",
groupID: account_group_id,
accountID: account_id,
account: newAccount,
});
},
getProxy: (taskId, taskObjects) => {
let taskGroupId = taskObjects[taskId].TaskGroupID;
let taskGroups = taskObjects.taskGroups;
let proxyGroups = taskObjects.proxyGroups;
let task_info = taskGroups
.find((group) => group.id === taskGroupId)
.tasks.find((task) => task.id === taskId);
let proxy_group_id = task_info.task_proxy_info.proxy_group_id;
if (task_info.task_proxy_info.localhost) {
return "localhost";
}
let proxy_info = proxyGroups.find(
(group) => group.id === proxy_group_id
).proxies;
return proxy_info[
Math.floor(Math.random() * Math.floor(proxy_info.length))
];
},
setProxy: (taskId, taskObjects, customProxy) => {
try {
if (customProxy) {
let proxy = customProxy;
if (proxy === "localhost") {
taskObjects[taskId].Proxy = false;
return;
} else {
let splitProxy = proxy.split(":");
proxy = `http://${splitProxy[2]}:${splitProxy[3]}@${splitProxy[0]}:${splitProxy[1]}`;
taskObjects[taskId].Proxy =
taskObjects[taskId].helperFunctions.HttpsProxyAgent(proxy);
return "Set Proxy: " + proxy;
}
} else {
let proxy = taskObjects[taskId].getProxy(taskId, taskObjects);
if (proxy === "localhost") {
taskObjects[taskId].Proxy = false;
return;
}
let splitProxy = proxy.split(":");
proxy = `http://${splitProxy[2]}:${splitProxy[3]}@${splitProxy[0]}:${splitProxy[1]}`;
taskObjects[taskId].Proxy =
taskObjects[taskId].helperFunctions.HttpsProxyAgent(proxy);
return "Set Proxy: " + proxy;
}
} catch {}
},
getCaptchaAPIKey: (captchaService) => {
if (captchaService === "Capmonster") {
return taskObjects.settings.captcha_autosolve.capmonster_api_key;
} else if (captchaService === "2CAP") {
return taskObjects.settings.captcha_autosolve.twocap_api_key;
}
},
setCookie: (taskId, taskObjects, cookie) => {
const handleCookieJar = (cookieJar, cookies) => {
const grabCookies = (cookieArray) => {
return cookieArray.map((i) => {
let newCookie = i.split(";")[0] + ";";
let newCookieName = newCookie.split("=")[0];
for (let x = 0; x < cookieJar.length; x++) {
if (cookieJar[x].split("=")[0] == newCookieName) {
cookieJar[x] = newCookie;
return;
}
}
cookieJar.push(newCookie);
});
};
if (typeof cookies == "string") {
cookies = [cookies];
}
grabCookies(cookies);
return cookieJar;
};
taskObjects[TaskID].Cookies = handleCookieJar(
taskObjects[TaskID].Cookies,
cookie
);
},
getRandomShapeCookie: (taskObjects) => {
return taskObjects.cookieData[
getRandomInt(taskObjects.cookieData.length)
];
},
deleteShapeCookie: (id) => {
process.send({
type: "deleteCookie",
id: id,
});
},
};
taskObjects[TaskID] = taskInfo;
let site = taskObjects[TaskID].getTaskInfo(TaskID, taskObjects).product.site;
if (!taskObjects["monitors"]) {
taskObjects["monitors"] = {};
}
if (!taskObjects["monitors"][site]) {
taskObjects["monitors"][site] = {};
taskObjects["monitors"][site]["sku"] = {
available: true,
};
}
taskObjects[TaskID].setProxy(TaskID, taskObjects);
console.log(
`[ ${TaskID} ] [ ` +
`Task Engine` +
` ] [ ${timestampSHORT()} ] ` +
`Starting Task`
);
taskObjects[TaskID].harLog = {
log: {
version: "1.2",
creator: {
name: "WebInspector",
version: "537.36",
},
pages: [
{
startedDateTime: "2021-06-16T19:33:00.729Z",
id: "page_2",
title: "https://www.target.com/p/lex/-/A-81471773",
pageTimings: {
onContentLoad: 341.79400000721216,
onLoad: 2915.4930000077,
},
},
],
entries: [],
},
};
let entryPoint = moduleJSON[site][task_type][task_mode].entryPoint;
main(TaskID, moduleJSON[site][task_type][task_mode].functions[entryPoint]);
const lastTaskStatusUpdateChecker = setInterval(async () => {
if (taskObjects[TaskID].Stopped === true) {
clearInterval(lastTaskStatusUpdateChecker);
return;
}
if (taskObjects[TaskID].lastTaskStatusUpdate) {
let newTime = new Date();
let timeDif = (newTime - taskObjects[TaskID].lastTaskStatusUpdate) / 1000;
if (timeDif >= 300) {
//restart task
process.send({
type: "updateTaskStatus",
TaskID: TaskID,
TaskGroupID: TaskGroupID,
text: "Task Error. Restarting task...",
color: "yellow",
});
await sleep(1000);
console.log("restarting task");
start(TaskID, TaskGroupID);
clearInterval(lastTaskStatusUpdateChecker);
}
}
}, 100);
};
////////////////
process.on("message", (load) => {
switch (load.message) {
case "StartTask":
start(load.TaskID, load.TaskGroupID);
break;
case "BulkStartTask":
let tempStatusQueue = [];
let tempStatisticQueue = [];
load.TaskIDs.forEach((TaskID) => {
try {
if (taskObjects[TaskID]?.Stopped === false) {
return;
}
} catch {}
tempStatusQueue.push(
JSON.stringify({
TaskID: TaskID,
TaskGroupID: load.TaskGroupID,
text: "Starting task...",
color: "blue",
})
);
tempStatisticQueue.push(
JSON.stringify({
TaskID: TaskID,
TaskGroupID: load.TaskGroupID,
statisticType: "taskCountActive",
action: "increment",
})
);
start(TaskID, load.TaskGroupID);
});
mainProcessSocket.send(
JSON.stringify({
type: "BulkUpdateTaskStatus",
taskStatusQueue: tempStatusQueue,
taskStatisticQueue: tempStatisticQueue,
})
);
break;
case "StopTask":
try {
delete taskObjects[load.TaskID];
taskObjects[load.TaskID] = {};
taskObjects[load.TaskID].Stopped = true;
taskStatusQueue = taskStatusQueue.filter((item) => {
return JSON.parse(item).TaskID !== load.TaskID;
});
taskStatusQueue.push(
JSON.stringify({
TaskID: load.TaskID,
TaskGroupID: load.TaskGroupID,
text: "Task Stopped",
color: "red",
})
);
} catch {}
break;
case "BulkStopTask":
let tempStatusQueue2 = [];
let tempStatisticQueue2 = [];
load.TaskIDs.forEach((TaskID) => {
try {
try {
if (taskObjects[TaskID]?.Stopped === false) {
tempStatisticQueue2.push(
JSON.stringify({
TaskID: TaskID,
TaskGroupID: load.TaskGroupID,
statisticType: "taskCountActive",
action: "decrement",
})
);
}
} catch {}
delete taskObjects[TaskID];
taskObjects[TaskID] = {};
taskObjects[TaskID].Stopped = true;
taskStatusQueue = taskStatusQueue.filter((item) => {
return JSON.parse(item).TaskID !== TaskID;
});
tempStatusQueue2.push(
JSON.stringify({
TaskID: TaskID,
TaskGroupID: load.TaskGroupID,
text: "Stopped",
color: "red",
})
);
} catch (e) {
console.log(e);
}
});
mainProcessSocket.send(
JSON.stringify({
type: "BulkUpdateTaskStatus",
taskStatusQueue: tempStatusQueue2,
taskStatisticQueue: tempStatisticQueue2,
})
);
break;
case "ModuleUpdate":
try {
moduleData = lexdecrypt(load.encryptedModule);
moduleJSON[moduleData["site"]] = moduleData;
} catch (e) {}
break;
case "TaskInfoUpdate":
taskObjects.taskGroups = load.data.task_groups;
break;
case "ProfileInfoUpdate":
taskObjects.profileGroups = load.data.profile_groups;
break;
case "ProxyInfoUpdate":
taskObjects.proxyGroups = load.data.proxy_groups;
break;
case "AccountInfoUpdate":
taskObjects.accountGroups = load.data.account_groups;
break;
case "CookieInfoUpdate":
taskObjects.cookieData = load.data.cookies;
break;
case "SettingsUpdate":
taskObjects.settings = load.data;
break;
case "FetchResponse":
eventEmitter.emit(`promiseSolved${load.id}`, load.data);
break;
case "AmazonRestock":
taskObjects.amazonRestockArray.push(load.data);
break;
case "PING":
process.send({
type: "PONG",
});
break;
}
});
process.on("uncaughtException", function (err) {
console.log(err);
});
/// /////////////
function timestampSHORT() {
function checkTime(i) {
if (i < 10) {
i = `0${i}`;
}
return i;
}
const today = new Date();
const h = today.getHours();
let m = today.getMinutes();
let s = today.getSeconds();
m = checkTime(m);
s = checkTime(s);
time_r = `${h}:${m}:${s}`;
return `${h}:${m}:${s}`;
}
function getRandomInt(max) {
return Math.floor(Math.random() * Math.floor(max));
}
async function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
////////////////////////////////////////////////////////
// Lex Decryption
var ABC = {
toAscii: function (bin) {
return bin.replace(/\s*[01]{8}\s*/g, function (bin) {
return String.fromCharCode(parseInt(bin, 2));
});
},
toBinary: function (str, spaceSeparatedOctets) {
return str.replace(/[\s\S]/g, function (str) {
str = ABC.zeroPad(str.charCodeAt().toString(2));
return !1 == spaceSeparatedOctets ? str : str + " ";
});
},
zeroPad: function (num) {
return "00000000".slice(String(num).length) + num;
},
};
function reverseString(s) {
return s.split("").reverse().join("");
}
const lexdecrypt = (text) => {
let key =
" l$Tv&b;^uqEQ:`4VU]\\)tCe=xMw1.?*'{cd-+z87O|PSXiN>,s2oyGWI0Kk_p(Af/95~Yg}!\"<B[LD3hjH%R#n6@aZFJmr";
// newText = reverseString(text)
let finalText = "";
let newText = JSON.parse(text);
newText = newText.split(",");
for (let i = 0; i < newText.length; i += 2) {
tempText = newText[i];
text = key[tempText];
if (text) {
finalText += text;
}
}
finalText = "{" + finalText;
return JSON.parse(finalText);
};
//////////////
{
"site": "Target",
"task":{
"Fast": {
"entryPoint": "submitShipping",
"variables": [
"ItemInfo",
"ItemAvailability",
"cart_id",
"Access_Token",
"Visitor_ID",
"Refresh_Token"
],
"taskStatistics":{
"addedToCart":"taskCartCount",
"addedToCart2":"taskCartCount",
"successfulCheckout": "taskCountCheckedOut",
"checkout2": "taskCountCheckedOut",
"PaymentDecline": "taskCountDeclined",
"Decline": "taskCountDeclined"
},
"captchaHarvester": true,
"helperFunctions": {
"returnResubmitCVVUrl": {
"arguments": "taskObjects, TaskID",
"body": "response=taskObjects[TaskID]['requestHistory']['submitCheckout'];text=await response.text();instructions_id=text.split('Missing CVV or PIN code on payment instruction ')[1].split('\"')[0];console.log(instructions_id);return `https://carts.target.com/checkout_payments/v1/payment_instructions/${instructions_id}?key=feaf228eb2777fd3eee0fd5192ae7107d6224b39`"
},
"setCookies": {
"arguments": "taskObjects, TaskID",
"body": "try{taskObjects[TaskID].Cookies=[];let account=taskObjects[TaskID].getAccount(TaskID,taskObjects);let cookies=account.cookies;let accessToken='accessToken='+cookies.accessToken;let visitorID='visitorID='+cookies.visitorID;taskObjects[TaskID].setCookie(TaskID,taskObjects,accessToken);taskObjects[TaskID].setCookie(TaskID,taskObjects,visitorID)}catch{}"
},
"setRefreshCookies": {
"arguments": "taskObjects, TaskID",
"body": "try{let account=taskObjects[TaskID].getAccount(TaskID,taskObjects);let cookies=account.cookies;let Access_Token=cookies.accessToken;let Visitor_ID=cookies.visitorID;let Refresh_Token=taskObjects[TaskID]['helperFunctions']['jwt_decode'](Access_Token)['jti'];taskObjects[TaskID]['Variables']['Access_Token']=Access_Token;taskObjects[TaskID]['Variables']['Visitor_ID']=Visitor_ID;taskObjects[TaskID]['Variables']['Refresh_Token']=Refresh_Token;taskObjects[TaskID].Cookies=[];taskObjects[TaskID].Cookies.push('refreshToken='+Refresh_Token+';');taskObjects[TaskID].Cookies.push('visitorId='+Visitor_ID+';')}catch (e){console.log(e)}"
},
"setLoginCookies": {
"arguments": "taskObjects, TaskID",
"body": "try{if(taskObjects[TaskID].Variables.CookieData){console.log('REMOVING COOKIE DATA');taskObjects[TaskID].deleteShapeCookie(taskObjects[TaskID].Variables.CookieData.id)};taskObjects[TaskID].Cookies=[];let cookieData=taskObjects[TaskID].getRandomShapeCookie(taskObjects);taskObjects[TaskID].Variables.CookieData=cookieData;let newCookies=cookieData.Cookies.split('; ');newCookies=newCookies.map((cookie)=>{return cookie+';'});taskObjects[TaskID].Cookies=newCookies}catch(e){console.log(e)}"
}
},
"logStatusColors": {
"success": "magenta",
"addedToCart":"magenta",
"successfulCheckout":"green",
"checkout2":"green",
"OutOfStock": "cyan",
"OutOfStock2": "cyan",
"NoLoadedTCINs": "cyan",
"cartFull": "yellow",
"logCheckout": "green",
"PID_LOCKED": "yellow",
"processing": "yellow",
"error": "yellow",
"fail": "red",
"InStock": "cyan",
"shippingAlreadyPresent": "cyan"
},
"functions": {
"SignIn": {
"name": "SignIn",
"type": "request",
"start": "setLoginCookies",
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://gsp.target.com/gsp/authentications/v1/credential_validations?client_id=ecom-web-1.0.0"
},
"method": "POST",
"headers": {
"authority": "gsp.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"customHeaders": {
"x-gyjwza5z-a": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-A'];"
},
"x-gyjwza5z-b": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-B'];"
},
"x-gyjwza5z-c": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-C'];"
},
"x-gyjwza5z-d": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-D'];"
},
"x-gyjwza5z-f": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-F'];"
},
"x-gyjwza5z-z": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-Z'];"
},
"user-agent": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['UserAgent'];"
}
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "let cookieData=taskObjects[TaskID].Variables.CookieData;let parsedData=JSON.stringify({'username':taskObjects[TaskID].getAccount(TaskID,taskObjects).username,'password':taskObjects[TaskID].getAccount(TaskID,taskObjects).password,'device_info':JSON.parse(cookieData.DeviceInfo),'keep_me_signed_in':true});return parsedData;"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": false,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"reLogin",
"_ERR_AUTH_DENIED",
"IPBanned",
"_ERR_USER_DOES_NOT_EXIST",
"success"
],
"success": {
"log": "Signed in...",
"status": 202,
"options": {}
},
"_ERR_USER_DOES_NOT_EXIST": {
"log": "Account does not exist.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "_ERR_USER_DOES_NOT_EXIST"
}
},
"_ERR_AUTH_DENIED": {
"log": "Authentication denied",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "_ERR_AUTH_DENIED"
}
},
"IPBanned": {
"log": "IP Banned.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "accessDenied"
}
},
"reLogin": {
"log": "Invalid Tokens. Signing in again...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Not Found"
}
}
},
"taskLogic": {
"success": "authSignIn",
"_ERR_AUTH_DENIED":"SignIn",
"reLogin": "SignIn",
"IPBanned":"end",
"_ERR_USER_DOES_NOT_EXIST":"end",
"end": "SignIn"
}
}
},
"authSignIn": {
"name": "authSignIn",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 1000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://gsp.target.com/gsp/authentications/v1/auth_codes?client_id=ecom-web-1.0.0"
},
"method": "GET",
"headers": {
"authority": "gsp.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {}
}
},
"requestOptions": {
"useTLS": true,
"redirect":"false",
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": ["success"],
"success": {
"log": "Authenticated",
"status": 302,
"options": {}
}
},
"taskLogic": {
"success": "genTokens",
"end": "SignIn"
}
}
},
"genTokens": {
"name": "genTokens",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://gsp.target.com/gsp/oauth_tokens/v2/client_tokens"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "let cookieData=taskObjects[TaskID].Variables.CookieData;let code=taskObjects[TaskID].requestHistory['authSignIn'].headers.location.split('https://www.target.com/?code=')[1].split('&state=')[0];let parsedData=JSON.stringify({'grant_type':'authorization_code','client_credential':{'client_id':'ecom-web-1.0.0'},'code':code,'device_info':JSON.parse(cookieData.DeviceInfo)});return parsedData;return taskObjects[TaskID].Variables.CookieData['UserAgent'];"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": false,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"reLogin",
"IPBanned",
"success"
],
"success": {
"log": "Refreshed Tokens",
"status": 201,
"options": {}
},
"IPBanned": {
"log": "IP Banned.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "accessDenied"
}
},
"reLogin": {
"log": "Invalid Tokens. Signing in again...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Not Found"
}
}
},
"taskLogic": {
"success": "parseRefreshToken",
"reLogin": "SignIn",
"IPBanned":"end",
"end": "SignIn"
}
}
},
"refreshTokens": {
"name": "refreshTokens",
"type": "request",
"start": "setRefreshCookies",
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://gsp.target.com/gsp/oauth_tokens/v2/client_tokens"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": "{\"grant_type\":\"refresh_token\",\"client_credential\":{\"client_id\":\"ecom-web-1.0.0\"}}",
"function": null
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": false,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"reLogin",
"IPBanned",
"success"
],
"success": {
"log": "Refreshed Tokens",
"status": 201,
"options": {}
},
"IPBanned": {
"log": "IP Banned.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "accessDenied"
}
},
"reLogin": {
"log": "Invalid Tokens. Signing in again...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Not Found"
}
}
},
"taskLogic": {
"success": "parseRefreshToken",
"reLogin": "SignIn",
"IPBanned":"SignIn",
"end": "SignIn"
}
}
},
"parseRefreshToken": {
"name": "parseRefreshToken",
"type": "function",
"start": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "try{let account=taskObjects[TaskID].getAccount(TaskID,taskObjects);if(!account?.cookies){account.cookies={}};let response;if(taskObjects[TaskID].CallStack[taskObjects[TaskID].CallStack.length-2]==='genTokens'){response=JSON.parse(taskObjects[TaskID].requestHistory.genTokens.data);let cookieData=taskObjects[TaskID].Variables.CookieData;account.cookies.visitorID=JSON.parse(cookieData.DeviceInfo).visitor_id}else{response=JSON.parse(taskObjects[TaskID].requestHistory.refreshTokens.data)};let Access_Token=response.access_token;let id_token=response.id_token;account.cookies.idToken=id_token;account.cookies.accessToken=Access_Token;taskObjects[TaskID].updateAccount(TaskID,taskObjects,account);return'success'}catch(e){console.log(e);return'error'}"
},
"logic": {
"functionLogic": {
"reqStatuses": ["success", "noAccountCookies","error"],
"success": {
"log": "Parsed Tokens."
},
"noAccountCookies": {
"log": "No Account Bin Found. Re-bin."
},
"error": {
"log": "Error with account. Re-bin."
}
},
"taskLogic": {
"success": "submitShipping",
"noAccountCookies":"SignIn",
"error": "SignIn",
"end": "SignIn"
}
}
},
"submitShipping": {
"name": "submitShipping",
"type": "request",
"start": "setCookies",
"delay": 0,
"retryDelay": 3001,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/web_checkouts/v1/cart_shipping_addresses?field_groups=ADDRESSES%2CCART%2CCART_ITEMS%2CPICKUP_INSTRUCTIONS%2CPROMOTION_CODES%2CSUMMARY&key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "profile_info=taskObjects[TaskID].getProfile(TaskID, taskObjects);return JSON.stringify({'cart_type':'REGULAR','address':{'address_line1':profile_info['shipping_address']['address_line1'],'address_line2':profile_info['shipping_address']['address_line2'],'address_type':'SHIPPING','city':profile_info['shipping_address']['city'],'country':'US','first_name':profile_info['shipping_address']['first_name'],'last_name':profile_info['shipping_address']['last_name'],'mobile':profile_info['shipping_address']['phone'],'save_as_default':false,'state':profile_info['shipping_address']['state'],'zip_code':profile_info['shipping_address']['zip_code']},'selected':true,'save_to_profile':false,'skip_verification':true})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"success",
"shippingAlreadyPresent",
"accessTokenInvalid",
"CONSTRAINT_VALIDATION_FAILURE",
"INVALID_GUEST_STATUS",
"Unauthorized",
"Unauthorized2"
],
"success": {
"log": "Waiting for Monitor",
"status": 201,
"options": {}
},
"shippingAlreadyPresent": {
"log": "Waiting for Monitor",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "ADDRESS_ALREADY_PRESENT"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"Unauthorized": {
"log": "Unauthorized",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Unauthorized"
}
},
"Unauthorized2": {
"log": "Unauthorized",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "UNAUTHORIZED"
}
},
"INVALID_GUEST_STATUS": {
"log": "Bad cookies. Re-bin account.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "INVALID_GUEST_STATUS"
}
},
"CONSTRAINT_VALIDATION_FAILURE": {
"log": "Profile is missing Phone Number.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "address.mobile"
}
}
},
"taskLogic": {
"success": "Monitor",
"shippingAlreadyPresent": "Monitor",
"accessTokenInvalid": "refreshTokens",
"CONSTRAINT_VALIDATION_FAILURE": "end",
"INVALID_GUEST_STATUS": "SignIn",
"Unauthorized":"SignIn",
"Unauthorized2":"SignIn",
"end": "SignIn"
}
}
},
"Monitor": {
"name": "Monitor",
"type": "function",
"start": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "let monitorEventPromise=async(sku)=>{console.log('WaitingForSKU'+sku);return new Promise((resolve,reject)=>{let event=monitorEvent.on(sku,(message)=>{if(message.inStock){delete event;resolve(message)}})})};let result=await monitorEventPromise(taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).product.task_sku);taskObjects[TaskID]['Variables']['tcin']=result.SKU;return'InStock';"
},
"logic": {
"functionLogic": {
"reqStatuses": ["InStock", "OutOfStock", "UnAvailable"],
"InStock": {
"log": "Item in Stock. Adding to cart."
},
"OutOfStock": {
"log": "Monitoring..."
},
"OutOfStock2": {
"log": "Monitoring..."
},
"UnAvailable": {
"log": "Failed to get item. Monitoring..."
}
},
"taskLogic": {
"InStock": "addToCart",
"OutOfStock": "Monitor",
"OutOfStock2": "Monitor",
"UnAvailable": "Monitor",
"end": "Monitor"
}
}
},
"addToCart": {
"name": "addToCart",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 1000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/web_checkouts/v1/cart_items?field_groups=CART%2CCART_ITEMS%2CSUMMARY&key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "return JSON.stringify({'cart_type':'REGULAR','channel_id':'10','shopping_context':'DIGITAL','cart_item':{'tcin':taskObjects[TaskID]['Variables']['tcin'],'quantity':taskObjects[TaskID].getTaskInfo(TaskID, taskObjects).product.item_quantity,'item_channel_id':'10'}})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": ["addedToCart", "cartFull", "accessTokenInvalid", "DEPENDENT_SERVICE_ERROR", "PID_LOCKED", "proxyBan"],
"addedToCart": {
"log": "Added To Cart",
"status": 201,
"options": {}
},
"cartFull": {
"log": "MAX_PURCHASE_LIMIT_EXCEEDED",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "MAX_PURCHASE_LIMIT_EXCEEDED"
}
},
"DEPENDENT_SERVICE_ERROR": {
"log": "Item OOS. Retrying atc...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "DEPENDENT_SERVICE_ERROR"
}
},
"PID_LOCKED": {
"log": "Item PID Locked. Retrying atc...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Access Denied"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"proxyBan": {
"log": "Proxy Banned. Retrying...",
"status": 404,
"options": {}
}
},
"taskLogic": {
"addedToCart": "submitBilling",
"cartFull": "harvestCartID",
"DEPENDENT_SERVICE_ERROR": "Monitor",
"accessTokenInvalid": "refreshTokens",
"PID_LOCKED": "Monitor",
"proxyBan":"Monitor",
"end": "Monitor"
}
}
},
"harvestCartID": {
"name": "harvestCartID",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/web_checkouts/v1/cart?field_groups=CART%2CCART_ITEMS%2CSUMMARY%2CPROMOTION_CODES%2CADDRESSES&key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "PUT",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "return JSON.stringify({'cart_type':'REGULAR'})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": ["success", "cartFull", "accessTokenInvalid"],
"success": {
"log": "Got cart_id",
"status": 200,
"options": {}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
}
},
"taskLogic": {
"success": "submitBilling",
"accessTokenInvalid": "refreshTokens",
"end": "Monitor"
}
}
},
"submitBilling": {
"name": "submitBilling",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/checkout_payments/v1/payment_instructions?key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "billing_info=taskObjects[TaskID].getProfile(TaskID,taskObjects);if(taskObjects[TaskID]['Variables']['cart_id']==null){cart_id=taskObjects[TaskID].getProfile(TaskID,taskObjects);response=taskObjects[TaskID]['requestHistory']['addToCart'];text=JSON.parse(await response.text());if(JSON.stringify(text).includes('cart_id')==false){response=taskObjects[TaskID]['requestHistory']['harvestCartID'];text=JSON.parse(await response.text())}cart_id=text['cart_id'];taskObjects[TaskID]['Variables']['cart_id']=cart_id}else{cart_id=taskObjects[TaskID]['Variables']['cart_id']};if(billing_info['billing_info']['card_details']['expiry_month'].includes('0')==false&&billing_info['billing_info']['card_details']['expiry_month'].length==1){var expiry_month='0'+billing_info['billing_info']['card_details']['expiry_month']}else{var expiry_month=billing_info['billing_info']['card_details']['expiry_month']};let expiry_year=profile_info['billing_info']['card_details']['expiry_year'];if(expiry_year.length==2){expiry_year='20'+expiry_year}return JSON.stringify({'cart_id':cart_id,'wallet_mode':'NONE','payment_type':'CARD','card_details':{'card_name':billing_info['billing_info']['card_details']['card_name'],'card_number':billing_info['billing_info']['card_details']['card_number'],'cvv':billing_info['billing_info']['card_details']['cvv'],'expiry_month':expiry_month,'expiry_year':expiry_year},'billing_address':{'address_line1':billing_info['billing_info']['billing_address']['address_line1'],'city':billing_info['billing_info']['billing_address']['city'],'first_name':billing_info['billing_info']['billing_address']['first_name'],'last_name':billing_info['billing_info']['billing_address']['last_name'],'phone':billing_info['billing_info']['billing_address']['phone'],'state':billing_info['billing_info']['billing_address']['state'],'zip_code':billing_info['billing_info']['billing_address']['zip_code'],'country':'US'}})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"success",
"serviceUnavailable",
"cardAlreadyPresent",
"CART_TOTAL_AMOUNT_ZERO",
"accessTokenInvalid",
"INVALID_PAYMENT_COMBINATION"
],
"success": {
"log": "Submitting Order",
"status": 201,
"options": {}
},
"serviceUnavailable": {
"log": "Service Unavailable",
"status": 424,
"options": {}
},
"CART_TOTAL_AMOUNT_ZERO": {
"log": "Cart is Empty. Check QTY.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "CART_TOTAL_AMOUNT_ZERO"
}
},
"cardAlreadyPresent": {
"log": "Submitting Order",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "CARD_PAYMENT_EXIST"
}
},
"INVALID_PAYMENT_COMBINATION": {
"log": "Submitting Order",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "INVALID_PAYMENT_COMBINATION"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
}
},
"taskLogic": {
"success": "submitCheckout",
"CART_TOTAL_AMOUNT_ZERO":"Monitor",
"serviceUnavailable":"Monitor",
"cardAlreadyPresent": "submitCheckout",
"accessTokenInvalid": "refreshTokens",
"INVALID_PAYMENT_COMBINATION": "submitCheckout",
"end": "Monitor"
}
}
},
"resubmitCVV": {
"name": "resubmitCVV",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": null,
"urlFunction": {
"name": "returnResubmitCVVUrl",
"arguments": "taskObjects, TaskID"
}
},
"method": "PUT",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "billing_info=taskObjects[TaskID].getProfile(TaskID, taskObjects);cart_id=taskObjects[TaskID]['Variables']['cart_id'];return JSON.stringify({'cart_id':cart_id,'wallet_mode':'NONE','payment_type':'CARD','card_details':{'cvv':billing_info['billing_info']['card_details']['cvv']}})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"success",
"cardAlreadyPresent",
"accessTokenInvalid"
],
"success": {
"log": "Resubmitted CVV",
"status": 200,
"options": {}
},
"cardAlreadyPresent": {
"log": "Submitting Order",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "CARD_PAYMENT_EXIST"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
}
},
"taskLogic": {
"success": "submitCheckout",
"cardAlreadyPresent": "submitCheckout",
"accessTokenInvalid": "refreshTokens",
"end": "submitCheckout"
}
}
},
"submitCheckout": {
"name": "submitCheckout",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/web_checkouts/v1/checkout?field_groups=ADDRESSES%2CCART%2CCART_ITEMS%2CDELIVERY_WINDOWS%2CPAYMENT_INSTRUCTIONS%2CPICKUP_INSTRUCTIONS%2CPROMOTION_CODES%2CSUMMARY&key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": "{\"cart_type\":\"REGULAR\",\"channel_id\":10}",
"function": null
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"checkout2",
"PaymentDecline",
"RateLimited",
"MISSING_CREDIT_CARD_CVV",
"MISSING_OR_INVALID_PAYMENT_DETAILS",
"EMPTY_CART_FOR_ORDER_SUBMIT",
"accessTokenInvalid",
"CREDIT_CARD_COMPARE_REQUIRED"
],
"checkout2": {
"log": "Submitted Checkout.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "orders"
}
},
"PaymentDecline": {
"log": "Payment Declined.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "PAYMENT_DECLINED_EXCEPTION"
}
},
"RateLimited": {
"log": "Rate Limited. Retrying...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "EC_PLATFORM_RATE_LIMITED"
}
},
"MISSING_CREDIT_CARD_CVV": {
"log": "MISSING_CREDIT_CARD_CVV",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "MISSING_CREDIT_CARD_CVV"
}
},
"MISSING_OR_INVALID_PAYMENT_DETAILS": {
"log": "MISSING_OR_INVALID_PAYMENT_DETAILS",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "MISSING_OR_INVALID_PAYMENT_DETAILS"
}
},
"EMPTY_CART_FOR_ORDER_SUBMIT": {
"log": "Cart Empty",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "EMPTY_CART_FOR_ORDER_SUBMIT"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token ",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"CREDIT_CARD_COMPARE_REQUIRED": {
"log": "CREDIT_CARD_COMPARE_REQUIRED",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "CREDIT_CARD_COMPARE_REQUIRED"
}
}
},
"taskLogic": {
"checkout2": "logCheckout",
"PaymentDecline": "Monitor",
"EMPTY_CART_FOR_ORDER_SUBMIT": "Monitor",
"MISSING_CREDIT_CARD_CVV": "resubmitCVV",
"itemNotAvailableYet": "Monitor",
"accessTokenInvalid": "refreshTokens",
"RateLimited":"Monitor",
"CREDIT_CARD_COMPARE_REQUIRED": "submitBilling",
"MISSING_OR_INVALID_PAYMENT_DETAILS": "submitBilling",
"end": "Monitor"
}
}
},
"logCheckout": {
"name": "logCheckout",
"type": "function",
"start": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "const response=taskObjects[TaskID].requestHistory.submitCheckout;const body_text=JSON.parse(await response.text());let item_info;const data=JSON.parse(taskObjects[TaskID].requestHistory.addToCart.data);let sku=taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).product.task_sku.split(':')[0];const cart_item=body_text.orders[0].cart_items.find((cart_item)=>{return cart_item.tcin===sku});try{item_info={Title:cart_item.item_attributes.description,Image:data.item_attributes.image_path,Price:cart_item.unit_price*taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).product.item_quantity,}}catch{item_info={Title:'N/A',Image:'',Price:'',}};let orderID;try{orderID=body_text.orders[0].order_id}catch{orderID='N/A'};let checkoutInfo={product_info:item_info,Task_Info:taskObjects[TaskID].getTaskInfo(TaskID,taskObjects)};const getProxyName=()=>{try{let taskGroupId=taskObjects[TaskID].TaskGroupID;let taskGroups=taskObjects.taskGroups;let proxyGroups=taskObjects.proxyGroups;let task_info=taskGroups.find((group)=>group.id===taskGroupId).tasks.find((task)=>task.id===TaskID);let proxy_group_id=task_info.task_proxy_info.proxy_group_id;if(task_info.task_proxy_info.localhost){return'localhost'};return proxyGroups.find((group)=>group.id===proxy_group_id).name}catch{return'N/A'}};let config={'content':null,'embeds':[{'title':'Successfully checked out!','description':checkoutInfo.product_info.Title,'color':3297740,'image':{'url':checkoutInfo.product_info.Image},'fields':[{'name':'Site','value':checkoutInfo.Task_Info.product.site,'inline':true},{'name':'SKU','value':checkoutInfo.Task_Info.product.task_sku,'inline':true},{'name':'Quantity','value':checkoutInfo.Task_Info.product.item_quantity,'inline':true},{'name':'Mode','value':checkoutInfo.Task_Info.task_settings.task_mode,'inline':true},{'name':'Profile','value':'||'+taskObjects[TaskID].getProfile(TaskID,taskObjects).profile_name+'||','inline':true},{'name':'Account Email','value':'||'+taskObjects[TaskID].getAccount(TaskID,taskObjects).username+'||','inline':true},{'name':'Account Password','value':'||'+taskObjects[TaskID].getAccount(TaskID,taskObjects).password+'||','inline':true},{'name':'Order #','value':'||'+orderID+'||','inline':true},{'name':'Proxy','value':'||'+getProxyName()+'||','inline':true}],'footer':{'text':'LexAIO v2 Success','icon_url':'https://avatars1.githubusercontent.com/u/76762917?s=40&v=4'},'timestamp':timestamp()}]};function timestamp(){const timeElapsed=Date.now();const today=new Date(timeElapsed);return today.toISOString()};checkoutInfo.config=config;process.send({'type':'SuccessfulCheckout','CheckoutInfo':checkoutInfo});if(taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).task_advanced_info.loopCheckout){taskObjects[TaskID]['Cookies']=[];taskObjects[TaskID]['Variables']['cart_id']=null;return'restart'}else{return'Checkout'}"
},
"logic": {
"functionLogic": {
"reqStatuses": ["success", "restart"],
"success": {
"log": "Submitted Checkout. "
},
"restart": {
"log": "Restart Checkout."
},
"Decline": {
"log": "Payment Declined. "
}
},
"taskLogic": {
"Checkout": "end",
"restart": "submitShipping",
"Decline": "end",
"end": "end"
}
}
},
"end": "exit"
}
},
"Fast2": {
"entryPoint": "submitShipping",
"variables": [
"ItemInfo",
"ItemAvailability",
"cart_id",
"Access_Token",
"Visitor_ID",
"Refresh_Token"
],
"taskStatistics":{
"addedToCart":"taskCartCount",
"addedToCart2":"taskCartCount",
"successfulCheckout": "taskCountCheckedOut",
"checkout2": "taskCountCheckedOut",
"PaymentDecline": "taskCountDeclined",
"Decline": "taskCountDeclined"
},
"captchaHarvester": true,
"helperFunctions": {
"returnResubmitCVVUrl": {
"arguments": "taskObjects, TaskID",
"body": "response=taskObjects[TaskID]['requestHistory']['submitCheckout'];text=await response.text();instructions_id=text.split('Missing CVV or PIN code on payment instruction ')[1].split('\"')[0];console.log(instructions_id);return `https://carts.target.com/checkout_payments/v1/payment_instructions/${instructions_id}?key=feaf228eb2777fd3eee0fd5192ae7107d6224b39`"
},
"remnoveItemURL": {
"arguments": "taskObjects, TaskID",
"body": "let response=taskObjects[TaskID]['requestHistory']['preCart'];text=JSON.parse(await response.text());cart_item_id=text['cart_item_id'];return `https://carts.target.com/web_checkouts/v1/cart_items/${cart_item_id}?cart_type=REGULAR&field_groups=ADDRESSES%2CCART%2CCART_ITEMS%2CFINANCE_PROVIDERS%2CPROMOTION_CODES%2CSUMMARY&key=e59ce3b531b2c39afb2e2b8a71ff10113aac2a14`"
},
"setCookies": {
"arguments": "taskObjects, TaskID",
"body": "try{taskObjects[TaskID].Cookies=[];let account=taskObjects[TaskID].getAccount(TaskID,taskObjects);let cookies=account.cookies;let accessToken='accessToken='+cookies.accessToken;let visitorID='visitorID='+cookies.visitorID;taskObjects[TaskID].setCookie(TaskID,taskObjects,accessToken);taskObjects[TaskID].setCookie(TaskID,taskObjects,visitorID)}catch{}"
},
"setRefreshCookies": {
"arguments": "taskObjects, TaskID",
"body": "try{let account=taskObjects[TaskID].getAccount(TaskID,taskObjects);let cookies=account.cookies;let Access_Token=cookies.accessToken;let Visitor_ID=cookies.visitorID;let Refresh_Token=taskObjects[TaskID]['helperFunctions']['jwt_decode'](Access_Token)['jti'];taskObjects[TaskID]['Variables']['Access_Token']=Access_Token;taskObjects[TaskID]['Variables']['Visitor_ID']=Visitor_ID;taskObjects[TaskID]['Variables']['Refresh_Token']=Refresh_Token;taskObjects[TaskID].Cookies=[];taskObjects[TaskID].Cookies.push('refreshToken='+Refresh_Token+';');taskObjects[TaskID].Cookies.push('visitorId='+Visitor_ID+';')}catch (e){console.log(e)}"
},
"setLoginCookies": {
"arguments": "taskObjects, TaskID",
"body": "try{if(taskObjects[TaskID].Variables.CookieData){console.log('REMOVING COOKIE DATA');taskObjects[TaskID].deleteShapeCookie(taskObjects[TaskID].Variables.CookieData.id)};taskObjects[TaskID].Cookies=[];let cookieData=taskObjects[TaskID].getRandomShapeCookie(taskObjects);taskObjects[TaskID].Variables.CookieData=cookieData;let newCookies=cookieData.Cookies.split('; ');newCookies=newCookies.map((cookie)=>{return cookie+';'});taskObjects[TaskID].Cookies=newCookies}catch(e){console.log(e)}"
}
},
"logStatusColors": {
"success": "magenta",
"addedToCart":"magenta",
"successfulCheckout":"green",
"checkout2":"green",
"OutOfStock": "cyan",
"OutOfStock2": "cyan",
"NoLoadedTCINs": "cyan",
"cartFull": "yellow",
"logCheckout": "green",
"PID_LOCKED": "yellow",
"processing": "yellow",
"error": "yellow",
"fail": "red",
"InStock": "cyan",
"shippingAlreadyPresent": "cyan"
},
"functions": {
"SignIn": {
"name": "SignIn",
"type": "request",
"start": "setLoginCookies",
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://gsp.target.com/gsp/authentications/v1/credential_validations?client_id=ecom-web-1.0.0"
},
"method": "POST",
"headers": {
"authority": "gsp.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"customHeaders": {
"x-gyjwza5z-a": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-A'];"
},
"x-gyjwza5z-b": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-B'];"
},
"x-gyjwza5z-c": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-C'];"
},
"x-gyjwza5z-d": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-D'];"
},
"x-gyjwza5z-f": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-F'];"
},
"x-gyjwza5z-z": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-Z'];"
},
"user-agent": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['UserAgent'];"
}
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "let cookieData=taskObjects[TaskID].Variables.CookieData;let parsedData=JSON.stringify({'username':taskObjects[TaskID].getAccount(TaskID,taskObjects).username,'password':taskObjects[TaskID].getAccount(TaskID,taskObjects).password,'device_info':JSON.parse(cookieData.DeviceInfo),'keep_me_signed_in':true});return parsedData;"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": false,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"reLogin",
"_ERR_AUTH_DENIED",
"IPBanned",
"_ERR_USER_DOES_NOT_EXIST",
"success"
],
"success": {
"log": "Signed in...",
"status": 202,
"options": {}
},
"_ERR_USER_DOES_NOT_EXIST": {
"log": "Account does not exist.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "_ERR_USER_DOES_NOT_EXIST"
}
},
"_ERR_AUTH_DENIED": {
"log": "Authentication denied",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "_ERR_AUTH_DENIED"
}
},
"IPBanned": {
"log": "IP Banned.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "accessDenied"
}
},
"reLogin": {
"log": "Invalid Tokens. Signing in again...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Not Found"
}
}
},
"taskLogic": {
"success": "authSignIn",
"_ERR_AUTH_DENIED":"SignIn",
"reLogin": "SignIn",
"IPBanned":"end",
"_ERR_USER_DOES_NOT_EXIST":"end",
"end": "SignIn"
}
}
},
"authSignIn": {
"name": "authSignIn",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 1000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://gsp.target.com/gsp/authentications/v1/auth_codes?client_id=ecom-web-1.0.0"
},
"method": "GET",
"headers": {
"authority": "gsp.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {}
}
},
"requestOptions": {
"useTLS": true,
"redirect":"false",
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": ["success"],
"success": {
"log": "Authenticated",
"status": 302,
"options": {}
}
},
"taskLogic": {
"success": "genTokens",
"end": "SignIn"
}
}
},
"genTokens": {
"name": "genTokens",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://gsp.target.com/gsp/oauth_tokens/v2/client_tokens"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "let cookieData=taskObjects[TaskID].Variables.CookieData;let code=taskObjects[TaskID].requestHistory['authSignIn'].headers.location.split('https://www.target.com/?code=')[1].split('&state=')[0];let parsedData=JSON.stringify({'grant_type':'authorization_code','client_credential':{'client_id':'ecom-web-1.0.0'},'code':code,'device_info':JSON.parse(cookieData.DeviceInfo),'keep_me_signed_in':true});return parsedData;return taskObjects[TaskID].Variables.CookieData['UserAgent'];"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": false,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"reLogin",
"IPBanned",
"success"
],
"success": {
"log": "Refreshed Tokens",
"status": 201,
"options": {}
},
"IPBanned": {
"log": "IP Banned.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "accessDenied"
}
},
"reLogin": {
"log": "Invalid Tokens. Signing in again...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Not Found"
}
}
},
"taskLogic": {
"success": "parseRefreshToken",
"reLogin": "SignIn",
"IPBanned":"end",
"end": "SignIn"
}
}
},
"refreshTokens": {
"name": "refreshTokens",
"type": "request",
"start": "setRefreshCookies",
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://gsp.target.com/gsp/oauth_tokens/v2/client_tokens"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": "{\"grant_type\":\"refresh_token\",\"client_credential\":{\"client_id\":\"ecom-web-1.0.0\"}}",
"function": null
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": false,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"reLogin",
"IPBanned",
"success"
],
"success": {
"log": "Refreshed Tokens",
"status": 201,
"options": {}
},
"IPBanned": {
"log": "IP Banned.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "accessDenied"
}
},
"reLogin": {
"log": "Invalid Tokens. Signing in again...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Not Found"
}
}
},
"taskLogic": {
"success": "parseRefreshToken",
"reLogin": "SignIn",
"IPBanned":"SignIn",
"end": "SignIn"
}
}
},
"parseRefreshToken": {
"name": "parseRefreshToken",
"type": "function",
"start": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "try{let account=taskObjects[TaskID].getAccount(TaskID,taskObjects);if(!account?.cookies){account.cookies={}};let response;if(taskObjects[TaskID].CallStack[taskObjects[TaskID].CallStack.length-2]==='genTokens'){response=JSON.parse(taskObjects[TaskID].requestHistory.genTokens.data);let cookieData=taskObjects[TaskID].Variables.CookieData;account.cookies.visitorID=JSON.parse(cookieData.DeviceInfo).visitor_id}else{response=JSON.parse(taskObjects[TaskID].requestHistory.refreshTokens.data)};let Access_Token=response.access_token;let id_token=response.id_token;account.cookies.idToken=id_token;account.cookies.accessToken=Access_Token;taskObjects[TaskID].updateAccount(TaskID,taskObjects,account);return'success'}catch(e){console.log(e);return'error'}"
},
"logic": {
"functionLogic": {
"reqStatuses": ["success", "noAccountCookies","error"],
"success": {
"log": "Parsed Tokens."
},
"noAccountCookies": {
"log": "No Account Bin Found. Re-bin."
},
"error": {
"log": "Error with account. Re-bin."
}
},
"taskLogic": {
"success": "submitShipping",
"noAccountCookies":"SignIn",
"error": "SignIn",
"end": "SignIn"
}
}
},
"submitShipping": {
"name": "submitShipping",
"type": "request",
"start": "setCookies",
"delay": 0,
"retryDelay": 3001,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/web_checkouts/v1/cart_shipping_addresses?field_groups=ADDRESSES%2CCART%2CCART_ITEMS%2CPICKUP_INSTRUCTIONS%2CPROMOTION_CODES%2CSUMMARY&key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "profile_info=taskObjects[TaskID].getProfile(TaskID, taskObjects);return JSON.stringify({'cart_type':'REGULAR','address':{'address_line1':profile_info['shipping_address']['address_line1'],'address_line2':profile_info['shipping_address']['address_line2'],'address_type':'SHIPPING','city':profile_info['shipping_address']['city'],'country':'US','first_name':profile_info['shipping_address']['first_name'],'last_name':profile_info['shipping_address']['last_name'],'mobile':profile_info['shipping_address']['phone'],'save_as_default':false,'state':profile_info['shipping_address']['state'],'zip_code':profile_info['shipping_address']['zip_code']},'selected':true,'save_to_profile':false,'skip_verification':true})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"success",
"shippingAlreadyPresent",
"accessTokenInvalid",
"CONSTRAINT_VALIDATION_FAILURE",
"INVALID_GUEST_STATUS",
"Unauthorized",
"Unauthorized2"
],
"success": {
"log": "Waiting for Monitor",
"status": 201,
"options": {}
},
"shippingAlreadyPresent": {
"log": "Waiting for Monitor",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "ADDRESS_ALREADY_PRESENT"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"Unauthorized": {
"log": "Unauthorized",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Unauthorized"
}
},
"Unauthorized2": {
"log": "Unauthorized",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "UNAUTHORIZED"
}
},
"INVALID_GUEST_STATUS": {
"log": "Bad cookies. Re-bin account.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "INVALID_GUEST_STATUS"
}
},
"CONSTRAINT_VALIDATION_FAILURE": {
"log": "Profile is missing Phone Number.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "address.mobile"
}
}
},
"taskLogic": {
"success": "preCart",
"shippingAlreadyPresent": "preCart",
"accessTokenInvalid": "refreshTokens",
"CONSTRAINT_VALIDATION_FAILURE": "end",
"INVALID_GUEST_STATUS": "SignIn",
"Unauthorized":"SignIn",
"Unauthorized2":"SignIn",
"end": "SignIn"
}
}
},
"preCart": {
"name": "preCart",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 1000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/web_checkouts/v1/cart_items?field_groups=CART%2CCART_ITEMS%2CSUMMARY&key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "return JSON.stringify({'cart_type':'REGULAR','channel_id':'10','shopping_context':'DIGITAL','cart_item':{'tcin':'14046215','quantity':1,'item_channel_id':'10'}})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": ["addedToCart", "cartFull", "accessTokenInvalid", "DEPENDENT_SERVICE_ERROR", "PID_LOCKED", "proxyBan"],
"addedToCart": {
"log": "Added To Cart",
"status": 201,
"options": {}
},
"cartFull": {
"log": "MAX_PURCHASE_LIMIT_EXCEEDED",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "MAX_PURCHASE_LIMIT_EXCEEDED"
}
},
"DEPENDENT_SERVICE_ERROR": {
"log": "Item OOS. Retrying atc...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "DEPENDENT_SERVICE_ERROR"
}
},
"PID_LOCKED": {
"log": "Item PID Locked. Retrying atc...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Access Denied"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"proxyBan": {
"log": "Proxy Banned. Retrying...",
"status": 404,
"options": {}
}
},
"taskLogic": {
"addedToCart": "preSubmitBilling",
"cartFull": "harvestCartID",
"DEPENDENT_SERVICE_ERROR": "Monitor",
"accessTokenInvalid": "refreshTokens",
"PID_LOCKED": "Monitor",
"proxyBan":"Monitor",
"end": "Monitor"
}
}
},
"preSubmitBilling": {
"name": "preSubmitBilling",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/checkout_payments/v1/payment_instructions?key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "billing_info=taskObjects[TaskID].getProfile(TaskID,taskObjects);if(taskObjects[TaskID]['Variables']['cart_id']==null){cart_id=taskObjects[TaskID].getProfile(TaskID,taskObjects);response=taskObjects[TaskID]['requestHistory']['preCart'];text=JSON.parse(await response.text());if(JSON.stringify(text).includes('cart_id')==false){response=taskObjects[TaskID]['requestHistory']['harvestCartID'];text=JSON.parse(await response.text())}cart_id=text['cart_id'];taskObjects[TaskID]['Variables']['cart_id']=cart_id}else{cart_id=taskObjects[TaskID]['Variables']['cart_id']};if(billing_info['billing_info']['card_details']['expiry_month'].includes('0')==false&&billing_info['billing_info']['card_details']['expiry_month'].length==1){var expiry_month='0'+billing_info['billing_info']['card_details']['expiry_month']}else{var expiry_month=billing_info['billing_info']['card_details']['expiry_month']};let expiry_year=profile_info['billing_info']['card_details']['expiry_year'];if(expiry_year.length==2){expiry_year='20'+expiry_year}return JSON.stringify({'cart_id':cart_id,'wallet_mode':'NONE','payment_type':'CARD','card_details':{'card_name':billing_info['billing_info']['card_details']['card_name'],'card_number':billing_info['billing_info']['card_details']['card_number'],'cvv':billing_info['billing_info']['card_details']['cvv'],'expiry_month':expiry_month,'expiry_year':expiry_year},'billing_address':{'address_line1':billing_info['billing_info']['billing_address']['address_line1'],'city':billing_info['billing_info']['billing_address']['city'],'first_name':billing_info['billing_info']['billing_address']['first_name'],'last_name':billing_info['billing_info']['billing_address']['last_name'],'phone':billing_info['billing_info']['billing_address']['phone'],'state':billing_info['billing_info']['billing_address']['state'],'zip_code':billing_info['billing_info']['billing_address']['zip_code'],'country':'US'}})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"success",
"serviceUnavailable",
"cardAlreadyPresent",
"CART_TOTAL_AMOUNT_ZERO",
"accessTokenInvalid",
"INVALID_PAYMENT_COMBINATION"
],
"success": {
"log": "Waiting for Monitor...",
"status": 201,
"options": {}
},
"serviceUnavailable": {
"log": "Service Unavailable",
"status": 424,
"options": {}
},
"CART_TOTAL_AMOUNT_ZERO": {
"log": "Cart is Empty. Check QTY.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "CART_TOTAL_AMOUNT_ZERO"
}
},
"cardAlreadyPresent": {
"log": "Waiting for Monitor..",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "CARD_PAYMENT_EXIST"
}
},
"INVALID_PAYMENT_COMBINATION": {
"log": "Waiting for Monitor..",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "INVALID_PAYMENT_COMBINATION"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
}
},
"taskLogic": {
"success": "Monitor",
"CART_TOTAL_AMOUNT_ZERO":"Monitor",
"serviceUnavailable":"Monitor",
"cardAlreadyPresent": "Monitor",
"accessTokenInvalid": "refreshTokens",
"INVALID_PAYMENT_COMBINATION": "Monitor",
"end": "Monitor"
}
}
},
"Monitor": {
"name": "Monitor",
"type": "function",
"start": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "let monitorEventPromise=async(sku)=>{console.log('WaitingForSKU'+sku);return new Promise((resolve,reject)=>{let event=monitorEvent.on(sku,(message)=>{if(message.inStock){delete event;resolve(message)}})})};let result=await monitorEventPromise(taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).product.task_sku);taskObjects[TaskID]['Variables']['tcin']=result.SKU;return'InStock';"
},
"logic": {
"functionLogic": {
"reqStatuses": ["InStock", "OutOfStock", "UnAvailable"],
"InStock": {
"log": "Item in Stock. Adding to cart."
},
"OutOfStock": {
"log": "Monitoring..."
},
"OutOfStock2": {
"log": "Monitoring..."
},
"UnAvailable": {
"log": "Failed to get item. Monitoring..."
}
},
"taskLogic": {
"InStock": "addToCart",
"OutOfStock": "Monitor",
"OutOfStock2": "Monitor",
"UnAvailable": "Monitor",
"end": "Monitor"
}
}
},
"addToCart": {
"name": "addToCart",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 1000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/web_checkouts/v1/cart_items?field_groups=CART%2CCART_ITEMS%2CSUMMARY&key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "return JSON.stringify({'cart_type':'REGULAR','channel_id':'10','shopping_context':'DIGITAL','cart_item':{'tcin':taskObjects[TaskID]['Variables']['tcin'],'quantity':taskObjects[TaskID].getTaskInfo(TaskID, taskObjects).product.item_quantity,'item_channel_id':'10'}})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": ["addedToCart", "cartFull", "accessTokenInvalid", "DEPENDENT_SERVICE_ERROR", "PID_LOCKED", "proxyBan"],
"addedToCart": {
"log": "Submitting Checkout...",
"status": 201,
"options": {}
},
"cartFull": {
"log": "MAX_PURCHASE_LIMIT_EXCEEDED",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "MAX_PURCHASE_LIMIT_EXCEEDED"
}
},
"DEPENDENT_SERVICE_ERROR": {
"log": "Item OOS. Retrying atc...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "DEPENDENT_SERVICE_ERROR"
}
},
"PID_LOCKED": {
"log": "Item PID Locked. Retrying atc...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Access Denied"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"proxyBan": {
"log": "Proxy Banned. Retrying...",
"status": 404,
"options": {}
}
},
"taskLogic": {
"addedToCart": "removeItemFromCart",
"cartFull": "harvestCartID",
"DEPENDENT_SERVICE_ERROR": "Monitor",
"accessTokenInvalid": "refreshTokens",
"PID_LOCKED": "Monitor",
"proxyBan":"Monitor",
"end": "Monitor"
}
}
},
"removeItemFromCart": {
"name": "removeItemFromCart",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 1000,
"request": {
"requestConfig": {
"url": {
"plainURL": null,
"urlFunction": {
"name": "remnoveItemURL",
"arguments": "taskObjects, TaskID"
}
},
"method": "DELETE",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": ["removedFromCart"],
"removedFromCart": {
"log": "Submitting Checkout...",
"status": 200,
"options": {}
}
},
"taskLogic": {
"removedFromCart": "submitCheckout",
"end": "submitCheckout"
}
}
},
"harvestCartID": {
"name": "harvestCartID",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/web_checkouts/v1/cart?field_groups=CART%2CCART_ITEMS%2CSUMMARY%2CPROMOTION_CODES%2CADDRESSES&key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "PUT",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "return JSON.stringify({'cart_type':'REGULAR'})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": ["success", "cartFull", "accessTokenInvalid"],
"success": {
"log": "Got cart_id",
"status": 200,
"options": {}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
}
},
"taskLogic": {
"success": "submitBilling",
"accessTokenInvalid": "refreshTokens",
"end": "Monitor"
}
}
},
"submitBilling": {
"name": "submitBilling",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/checkout_payments/v1/payment_instructions?key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "billing_info=taskObjects[TaskID].getProfile(TaskID,taskObjects);if(taskObjects[TaskID]['Variables']['cart_id']==null){cart_id=taskObjects[TaskID].getProfile(TaskID,taskObjects);response=taskObjects[TaskID]['requestHistory']['addToCart'];text=JSON.parse(await response.text());if(JSON.stringify(text).includes('cart_id')==false){response=taskObjects[TaskID]['requestHistory']['harvestCartID'];text=JSON.parse(await response.text())}cart_id=text['cart_id'];taskObjects[TaskID]['Variables']['cart_id']=cart_id}else{cart_id=taskObjects[TaskID]['Variables']['cart_id']};if(billing_info['billing_info']['card_details']['expiry_month'].includes('0')==false&&billing_info['billing_info']['card_details']['expiry_month'].length==1){var expiry_month='0'+billing_info['billing_info']['card_details']['expiry_month']}else{var expiry_month=billing_info['billing_info']['card_details']['expiry_month']};let expiry_year=profile_info['billing_info']['card_details']['expiry_year'];if(expiry_year.length==2){expiry_year='20'+expiry_year}return JSON.stringify({'cart_id':cart_id,'wallet_mode':'NONE','payment_type':'CARD','card_details':{'card_name':billing_info['billing_info']['card_details']['card_name'],'card_number':billing_info['billing_info']['card_details']['card_number'],'cvv':billing_info['billing_info']['card_details']['cvv'],'expiry_month':expiry_month,'expiry_year':expiry_year},'billing_address':{'address_line1':billing_info['billing_info']['billing_address']['address_line1'],'city':billing_info['billing_info']['billing_address']['city'],'first_name':billing_info['billing_info']['billing_address']['first_name'],'last_name':billing_info['billing_info']['billing_address']['last_name'],'phone':billing_info['billing_info']['billing_address']['phone'],'state':billing_info['billing_info']['billing_address']['state'],'zip_code':billing_info['billing_info']['billing_address']['zip_code'],'country':'US'}})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"success",
"serviceUnavailable",
"cardAlreadyPresent",
"CART_TOTAL_AMOUNT_ZERO",
"accessTokenInvalid",
"INVALID_PAYMENT_COMBINATION"
],
"success": {
"log": "Submitting Order",
"status": 201,
"options": {}
},
"serviceUnavailable": {
"log": "Service Unavailable",
"status": 424,
"options": {}
},
"CART_TOTAL_AMOUNT_ZERO": {
"log": "Cart is Empty. Check QTY.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "CART_TOTAL_AMOUNT_ZERO"
}
},
"cardAlreadyPresent": {
"log": "Submitting Order",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "CARD_PAYMENT_EXIST"
}
},
"INVALID_PAYMENT_COMBINATION": {
"log": "Submitting Order",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "INVALID_PAYMENT_COMBINATION"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
}
},
"taskLogic": {
"success": "submitCheckout",
"CART_TOTAL_AMOUNT_ZERO":"Monitor",
"serviceUnavailable":"Monitor",
"cardAlreadyPresent": "submitCheckout",
"accessTokenInvalid": "refreshTokens",
"INVALID_PAYMENT_COMBINATION": "submitCheckout",
"end": "Monitor"
}
}
},
"resubmitCVV": {
"name": "resubmitCVV",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": null,
"urlFunction": {
"name": "returnResubmitCVVUrl",
"arguments": "taskObjects, TaskID"
}
},
"method": "PUT",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "billing_info=taskObjects[TaskID].getProfile(TaskID, taskObjects);cart_id=taskObjects[TaskID]['Variables']['cart_id'];return JSON.stringify({'cart_id':cart_id,'wallet_mode':'NONE','payment_type':'CARD','card_details':{'cvv':billing_info['billing_info']['card_details']['cvv']}})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"success",
"cardAlreadyPresent",
"accessTokenInvalid"
],
"success": {
"log": "Resubmitted CVV",
"status": 200,
"options": {}
},
"cardAlreadyPresent": {
"log": "Submitting Order",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "CARD_PAYMENT_EXIST"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
}
},
"taskLogic": {
"success": "submitCheckout",
"cardAlreadyPresent": "submitCheckout",
"accessTokenInvalid": "refreshTokens",
"end": "submitCheckout"
}
}
},
"submitCheckout": {
"name": "submitCheckout",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/web_checkouts/v1/checkout?field_groups=ADDRESSES%2CCART%2CCART_ITEMS%2CDELIVERY_WINDOWS%2CPAYMENT_INSTRUCTIONS%2CPICKUP_INSTRUCTIONS%2CPROMOTION_CODES%2CSUMMARY&key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": "{\"cart_type\":\"REGULAR\",\"channel_id\":10}",
"function": null
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"checkout2",
"PaymentDecline",
"RateLimited",
"MISSING_CREDIT_CARD_CVV",
"MISSING_OR_INVALID_PAYMENT_DETAILS",
"EMPTY_CART_FOR_ORDER_SUBMIT",
"accessTokenInvalid",
"CREDIT_CARD_COMPARE_REQUIRED"
],
"checkout2": {
"log": "Submitted Checkout.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "orders"
}
},
"PaymentDecline": {
"log": "Payment Declined.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "PAYMENT_DECLINED_EXCEPTION"
}
},
"RateLimited": {
"log": "Rate Limited. Retrying...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "EC_PLATFORM_RATE_LIMITED"
}
},
"MISSING_CREDIT_CARD_CVV": {
"log": "MISSING_CREDIT_CARD_CVV",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "MISSING_CREDIT_CARD_CVV"
}
},
"MISSING_OR_INVALID_PAYMENT_DETAILS": {
"log": "MISSING_OR_INVALID_PAYMENT_DETAILS",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "MISSING_OR_INVALID_PAYMENT_DETAILS"
}
},
"EMPTY_CART_FOR_ORDER_SUBMIT": {
"log": "Cart Empty",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "EMPTY_CART_FOR_ORDER_SUBMIT"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token ",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"CREDIT_CARD_COMPARE_REQUIRED": {
"log": "CREDIT_CARD_COMPARE_REQUIRED",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "CREDIT_CARD_COMPARE_REQUIRED"
}
}
},
"taskLogic": {
"checkout2": "logCheckout",
"PaymentDecline": "Monitor",
"EMPTY_CART_FOR_ORDER_SUBMIT": "Monitor",
"MISSING_CREDIT_CARD_CVV": "resubmitCVV",
"itemNotAvailableYet": "Monitor",
"accessTokenInvalid": "refreshTokens",
"RateLimited":"Monitor",
"CREDIT_CARD_COMPARE_REQUIRED": "submitBilling",
"MISSING_OR_INVALID_PAYMENT_DETAILS": "submitBilling",
"end": "Monitor"
}
}
},
"logCheckout": {
"name": "logCheckout",
"type": "function",
"start": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "const response=taskObjects[TaskID].requestHistory.submitCheckout;const body_text=JSON.parse(await response.text());let item_info;const data=JSON.parse(taskObjects[TaskID].requestHistory.addToCart.data);let sku=taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).product.task_sku.split(':')[0];const cart_item=body_text.orders[0].cart_items.find((cart_item)=>{return cart_item.tcin===sku});try{item_info={Title:cart_item.item_attributes.description,Image:data.item_attributes.image_path,Price:cart_item.unit_price*taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).product.item_quantity,}}catch{item_info={Title:'N/A',Image:'',Price:'',}};let orderID;try{orderID=body_text.orders[0].order_id}catch{orderID='N/A'};let checkoutInfo={product_info:item_info,Task_Info:taskObjects[TaskID].getTaskInfo(TaskID,taskObjects)};const getProxyName=()=>{try{let taskGroupId=taskObjects[TaskID].TaskGroupID;let taskGroups=taskObjects.taskGroups;let proxyGroups=taskObjects.proxyGroups;let task_info=taskGroups.find((group)=>group.id===taskGroupId).tasks.find((task)=>task.id===TaskID);let proxy_group_id=task_info.task_proxy_info.proxy_group_id;if(task_info.task_proxy_info.localhost){return'localhost'};return proxyGroups.find((group)=>group.id===proxy_group_id).name}catch{return'N/A'}};let config={'content':null,'embeds':[{'title':'Successfully checked out!','description':checkoutInfo.product_info.Title,'color':3297740,'image':{'url':checkoutInfo.product_info.Image},'fields':[{'name':'Site','value':checkoutInfo.Task_Info.product.site,'inline':true},{'name':'SKU','value':checkoutInfo.Task_Info.product.task_sku,'inline':true},{'name':'Quantity','value':checkoutInfo.Task_Info.product.item_quantity,'inline':true},{'name':'Mode','value':checkoutInfo.Task_Info.task_settings.task_mode,'inline':true},{'name':'Profile','value':'||'+taskObjects[TaskID].getProfile(TaskID,taskObjects).profile_name+'||','inline':true},{'name':'Account Email','value':'||'+taskObjects[TaskID].getAccount(TaskID,taskObjects).username+'||','inline':true},{'name':'Account Password','value':'||'+taskObjects[TaskID].getAccount(TaskID,taskObjects).password+'||','inline':true},{'name':'Order #','value':'||'+orderID+'||','inline':true},{'name':'Proxy','value':'||'+getProxyName()+'||','inline':true}],'footer':{'text':'LexAIO v2 Success','icon_url':'https://avatars1.githubusercontent.com/u/76762917?s=40&v=4'},'timestamp':timestamp()}]};function timestamp(){const timeElapsed=Date.now();const today=new Date(timeElapsed);return today.toISOString()};checkoutInfo.config=config;process.send({'type':'SuccessfulCheckout','CheckoutInfo':checkoutInfo});if(taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).task_advanced_info.loopCheckout){taskObjects[TaskID]['Cookies']=[];taskObjects[TaskID]['Variables']['cart_id']=null;return'restart'}else{return'Checkout'}"
},
"logic": {
"functionLogic": {
"reqStatuses": ["success", "restart"],
"success": {
"log": "Submitted Checkout. "
},
"restart": {
"log": "Restart Checkout."
},
"Decline": {
"log": "Payment Declined. "
}
},
"taskLogic": {
"Checkout": "end",
"restart": "submitShipping",
"Decline": "end",
"end": "end"
}
}
},
"end": "exit"
}
},
"Safe": {
"entryPoint": "submitShipping",
"variables": [
"ItemInfo",
"ItemAvailability",
"cart_id",
"Access_Token",
"Visitor_ID",
"Refresh_Token"
],
"taskStatistics":{
"addedToCart":"taskCartCount",
"addedToCart2":"taskCartCount",
"successfulCheckout": "taskCountCheckedOut",
"checkout2": "taskCountCheckedOut",
"PaymentDecline": "taskCountDeclined",
"Decline": "taskCountDeclined"
},
"captchaHarvester": true,
"helperFunctions": {
"returnResubmitCVVUrl": {
"arguments": "taskObjects, TaskID",
"body": "response=taskObjects[TaskID]['requestHistory']['submitCheckout'];text=await response.text();instructions_id=text.split('Missing CVV or PIN code on payment instruction ')[1].split('\"')[0];console.log(instructions_id);return `https://carts.target.com/checkout_payments/v1/payment_instructions/${instructions_id}?key=feaf228eb2777fd3eee0fd5192ae7107d6224b39`"
},
"setCookies": {
"arguments": "taskObjects, TaskID",
"body": "try{taskObjects[TaskID].Cookies=[];let account=taskObjects[TaskID].getAccount(TaskID,taskObjects);let cookies=account.cookies;let accessToken='accessToken='+cookies.accessToken;let visitorID='visitorID='+cookies.visitorID;taskObjects[TaskID].setCookie(TaskID,taskObjects,accessToken);taskObjects[TaskID].setCookie(TaskID,taskObjects,visitorID)}catch{}"
},
"setRefreshCookies": {
"arguments": "taskObjects, TaskID",
"body": "try{let account=taskObjects[TaskID].getAccount(TaskID,taskObjects);let cookies=account.cookies;let Access_Token=cookies.accessToken;let Visitor_ID=cookies.visitorID;let Refresh_Token=taskObjects[TaskID]['helperFunctions']['jwt_decode'](Access_Token)['jti'];taskObjects[TaskID]['Variables']['Access_Token']=Access_Token;taskObjects[TaskID]['Variables']['Visitor_ID']=Visitor_ID;taskObjects[TaskID]['Variables']['Refresh_Token']=Refresh_Token;taskObjects[TaskID].Cookies=[];taskObjects[TaskID].Cookies.push('refreshToken='+Refresh_Token+';');taskObjects[TaskID].Cookies.push('visitorId='+Visitor_ID+';')}catch (e){console.log(e)}"
},
"setLoginCookies": {
"arguments": "taskObjects, TaskID",
"body": "try{if(taskObjects[TaskID].Variables.CookieData){console.log('REMOVING COOKIE DATA');taskObjects[TaskID].deleteShapeCookie(taskObjects[TaskID].Variables.CookieData.id)};taskObjects[TaskID].Cookies=[];let cookieData=taskObjects[TaskID].getRandomShapeCookie(taskObjects);taskObjects[TaskID].Variables.CookieData=cookieData;let newCookies=cookieData.Cookies.split('; ');newCookies=newCookies.map((cookie)=>{return cookie+';'});taskObjects[TaskID].Cookies=newCookies}catch(e){console.log(e)}"
}
},
"logStatusColors": {
"success": "magenta",
"addedToCart":"magenta",
"successfulCheckout":"green",
"checkout2":"green",
"OutOfStock": "cyan",
"OutOfStock2": "cyan",
"NoLoadedTCINs": "cyan",
"cartFull": "yellow",
"logCheckout": "green",
"PID_LOCKED": "yellow",
"processing": "yellow",
"error": "yellow",
"fail": "red",
"InStock": "cyan",
"shippingAlreadyPresent": "cyan"
},
"functions": {
"SignIn": {
"name": "SignIn",
"type": "request",
"start": "setLoginCookies",
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://gsp.target.com/gsp/authentications/v1/credential_validations?client_id=ecom-web-1.0.0"
},
"method": "POST",
"headers": {
"authority": "gsp.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"customHeaders": {
"x-gyjwza5z-a": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-A'];"
},
"x-gyjwza5z-b": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-B'];"
},
"x-gyjwza5z-c": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-C'];"
},
"x-gyjwza5z-d": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-D'];"
},
"x-gyjwza5z-f": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-F'];"
},
"x-gyjwza5z-z": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-Z'];"
},
"user-agent": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['UserAgent'];"
}
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "let cookieData=taskObjects[TaskID].Variables.CookieData;let parsedData=JSON.stringify({'username':taskObjects[TaskID].getAccount(TaskID,taskObjects).username,'password':taskObjects[TaskID].getAccount(TaskID,taskObjects).password,'device_info':JSON.parse(cookieData.DeviceInfo),'keep_me_signed_in':true});return parsedData;"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": false,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"reLogin",
"_ERR_AUTH_DENIED",
"IPBanned",
"_ERR_USER_DOES_NOT_EXIST",
"_ERR_PATTERN_EMAIL_ADDRESS",
"_ERR_INVALID_CREDENTIALS",
"success"
],
"success": {
"log": "Signed in...",
"status": 202,
"options": {}
},
"_ERR_USER_DOES_NOT_EXIST": {
"log": "Account does not exist.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "_ERR_USER_DOES_NOT_EXIST"
}
},
"_ERR_PATTERN_EMAIL_ADDRESS": {
"log": "Account does not exist.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "_ERR_PATTERN_EMAIL_ADDRESS"
}
},
"_ERR_AUTH_DENIED": {
"log": "Authentication denied",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "_ERR_AUTH_DENIED"
}
},
"_ERR_INVALID_CREDENTIALS": {
"log": "Authentication denied",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "_ERR_INVALID_CREDENTIALS"
}
},
"IPBanned": {
"log": "IP Banned.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "accessDenied"
}
},
"reLogin": {
"log": "Invalid Tokens. Signing in again...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Not Found"
}
}
},
"taskLogic": {
"success": "authSignIn",
"_ERR_AUTH_DENIED":"SignIn",
"reLogin": "SignIn",
"IPBanned":"end",
"_ERR_USER_DOES_NOT_EXIST":"end",
"_ERR_PATTERN_EMAIL_ADDRESS":"end",
"_ERR_INVALID_CREDENTIALS":"end",
"end": "SignIn"
}
}
},
"authSignIn": {
"name": "authSignIn",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 1000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://gsp.target.com/gsp/authentications/v1/auth_codes?client_id=ecom-web-1.0.0"
},
"method": "GET",
"headers": {
"authority": "gsp.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {}
}
},
"requestOptions": {
"useTLS": true,
"redirect":"false",
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": ["success"],
"success": {
"log": "Authenticated",
"status": 302,
"options": {}
}
},
"taskLogic": {
"success": "genTokens",
"end": "SignIn"
}
}
},
"genTokens": {
"name": "genTokens",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://gsp.target.com/gsp/oauth_tokens/v2/client_tokens"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "let cookieData=taskObjects[TaskID].Variables.CookieData;let code=taskObjects[TaskID].requestHistory['authSignIn'].headers.location.split('https://www.target.com/?code=')[1].split('&state=')[0];let parsedData=JSON.stringify({'grant_type':'authorization_code','client_credential':{'client_id':'ecom-web-1.0.0'},'code':code,'device_info':JSON.parse(cookieData.DeviceInfo),'keep_me_signed_in':true});return parsedData;return taskObjects[TaskID].Variables.CookieData['UserAgent'];"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": false,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"reLogin",
"IPBanned",
"success"
],
"success": {
"log": "Refreshed Tokens",
"status": 201,
"options": {}
},
"IPBanned": {
"log": "IP Banned.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "accessDenied"
}
},
"reLogin": {
"log": "Invalid Tokens. Signing in again...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Not Found"
}
}
},
"taskLogic": {
"success": "parseRefreshToken",
"reLogin": "SignIn",
"IPBanned":"end",
"end": "SignIn"
}
}
},
"refreshTokens": {
"name": "refreshTokens",
"type": "request",
"start": "setRefreshCookies",
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://gsp.target.com/gsp/oauth_tokens/v2/client_tokens"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": "{\"grant_type\":\"refresh_token\",\"client_credential\":{\"client_id\":\"ecom-web-1.0.0\"}}",
"function": null
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": false,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"reLogin",
"IPBanned",
"success"
],
"success": {
"log": "Refreshed Tokens",
"status": 201,
"options": {}
},
"IPBanned": {
"log": "IP Banned.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "accessDenied"
}
},
"reLogin": {
"log": "Invalid Tokens. Signing in again...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Not Found"
}
}
},
"taskLogic": {
"success": "parseRefreshToken",
"reLogin": "SignIn",
"IPBanned":"SignIn",
"end": "SignIn"
}
}
},
"parseRefreshToken": {
"name": "parseRefreshToken",
"type": "function",
"start": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "try{let account=taskObjects[TaskID].getAccount(TaskID,taskObjects);if(!account?.cookies){account.cookies={}};let response;if(taskObjects[TaskID].CallStack[taskObjects[TaskID].CallStack.length-2]==='genTokens'){response=JSON.parse(taskObjects[TaskID].requestHistory.genTokens.data);let cookieData=taskObjects[TaskID].Variables.CookieData;account.cookies.visitorID=JSON.parse(cookieData.DeviceInfo).visitor_id}else{response=JSON.parse(taskObjects[TaskID].requestHistory.refreshTokens.data)};let Access_Token=response.access_token;let id_token=response.id_token;account.cookies.idToken=id_token;account.cookies.accessToken=Access_Token;taskObjects[TaskID].updateAccount(TaskID,taskObjects,account);return'success'}catch(e){console.log(e);return'error'}"
},
"logic": {
"functionLogic": {
"reqStatuses": ["success", "noAccountCookies","error"],
"success": {
"log": "Parsed Tokens."
},
"noAccountCookies": {
"log": "No Account Bin Found. Re-bin."
},
"error": {
"log": "Error with account. Re-bin."
}
},
"taskLogic": {
"success": "submitShipping",
"noAccountCookies":"SignIn",
"error": "SignIn",
"end": "SignIn"
}
}
},
"submitShipping": {
"name": "submitShipping",
"type": "request",
"start": "setCookies",
"delay": 0,
"retryDelay": 3001,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/web_checkouts/v1/cart_shipping_addresses?field_groups=ADDRESSES%2CCART%2CCART_ITEMS%2CPICKUP_INSTRUCTIONS%2CPROMOTION_CODES%2CSUMMARY&key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "profile_info=taskObjects[TaskID].getProfile(TaskID, taskObjects);return JSON.stringify({'cart_type':'REGULAR','address':{'address_line1':profile_info['shipping_address']['address_line1'],'address_line2':profile_info['shipping_address']['address_line2'],'address_type':'SHIPPING','city':profile_info['shipping_address']['city'],'country':'US','first_name':profile_info['shipping_address']['first_name'],'last_name':profile_info['shipping_address']['last_name'],'mobile':profile_info['shipping_address']['phone'],'save_as_default':false,'state':profile_info['shipping_address']['state'],'zip_code':profile_info['shipping_address']['zip_code']},'selected':true,'save_to_profile':false,'skip_verification':true})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"success",
"shippingAlreadyPresent",
"accessTokenInvalid",
"CONSTRAINT_VALIDATION_FAILURE",
"INVALID_GUEST_STATUS",
"Unauthorized",
"Unauthorized2"
],
"success": {
"log": "Waiting for Monitor",
"status": 201,
"options": {}
},
"shippingAlreadyPresent": {
"log": "Waiting for Monitor",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "ADDRESS_ALREADY_PRESENT"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"Unauthorized": {
"log": "Unauthorized",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Unauthorized"
}
},
"Unauthorized2": {
"log": "Unauthorized",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "UNAUTHORIZED"
}
},
"INVALID_GUEST_STATUS": {
"log": "Bad cookies. Re-bin account.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "INVALID_GUEST_STATUS"
}
},
"CONSTRAINT_VALIDATION_FAILURE": {
"log": "Profile is missing Phone Number.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "address.mobile"
}
}
},
"taskLogic": {
"success": "Monitor",
"shippingAlreadyPresent": "Monitor",
"accessTokenInvalid": "refreshTokens",
"CONSTRAINT_VALIDATION_FAILURE": "end",
"INVALID_GUEST_STATUS": "SignIn",
"Unauthorized":"SignIn",
"Unauthorized2":"SignIn",
"end": "SignIn"
}
}
},
"Monitor": {
"name": "Monitor",
"type": "function",
"start": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "taskObjects[TaskID].setProxy(TaskID, taskObjects);taskObjects[TaskID].Cookies = taskObjects[TaskID].Cookies.filter((cookie) => !cookie.includes('mitata'));let monitorEventPromise=async(sku)=>{console.log('WaitingForSKU'+sku);return new Promise((resolve,reject)=>{let event=monitorEvent.on(sku,(message)=>{if(message.inStock){delete event;resolve(message)}})})};let result=await monitorEventPromise(taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).product.task_sku);taskObjects[TaskID]['Variables']['tcin']=result.SKU;return'InStock';"
},
"logic": {
"functionLogic": {
"reqStatuses": ["InStock", "OutOfStock", "UnAvailable"],
"InStock": {
"log": "Item in Stock. Adding to cart."
},
"OutOfStock": {
"log": "Monitoring..."
},
"OutOfStock2": {
"log": "Monitoring..."
},
"UnAvailable": {
"log": "Failed to get item. Monitoring..."
}
},
"taskLogic": {
"InStock": "addToCart",
"OutOfStock": "Monitor",
"OutOfStock2": "Monitor",
"UnAvailable": "Monitor",
"end": "Monitor"
}
}
},
"addToCart": {
"name": "addToCart",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 1000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/web_checkouts/v1/cart_items?field_groups=CART%2CCART_ITEMS%2CSUMMARY&key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "return JSON.stringify({'cart_type':'REGULAR','channel_id':'10','shopping_context':'DIGITAL','cart_item':{'tcin':taskObjects[TaskID]['Variables']['tcin'],'quantity':taskObjects[TaskID].getTaskInfo(TaskID, taskObjects).product.item_quantity,'item_channel_id':'10'}})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": ["addedToCart", "cartFull", "accessTokenInvalid", "DEPENDENT_SERVICE_ERROR", "PID_LOCKED", "proxyBan"],
"addedToCart": {
"log": "Added To Cart",
"status": 201,
"options": {}
},
"cartFull": {
"log": "MAX_PURCHASE_LIMIT_EXCEEDED",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "MAX_PURCHASE_LIMIT_EXCEEDED"
}
},
"DEPENDENT_SERVICE_ERROR": {
"log": "Item OOS. Retrying atc...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "DEPENDENT_SERVICE_ERROR"
}
},
"PID_LOCKED": {
"log": "Item PID Locked. Retrying atc...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Access Denied"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"proxyBan": {
"log": "Proxy Banned. Retrying...",
"status": 404,
"options": {}
}
},
"taskLogic": {
"addedToCart": "submitBilling",
"cartFull": "harvestCartID",
"DEPENDENT_SERVICE_ERROR": "Monitor",
"accessTokenInvalid": "refreshTokens",
"PID_LOCKED": "Monitor",
"proxyBan":"Monitor",
"end": "Monitor"
}
}
},
"harvestCartID": {
"name": "harvestCartID",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/web_checkouts/v1/cart?field_groups=CART%2CCART_ITEMS%2CSUMMARY%2CPROMOTION_CODES%2CADDRESSES&key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "PUT",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "return JSON.stringify({'cart_type':'REGULAR'})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": ["success", "cartFull", "accessTokenInvalid"],
"success": {
"log": "Got cart_id",
"status": 200,
"options": {}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
}
},
"taskLogic": {
"success": "submitBilling",
"accessTokenInvalid": "refreshTokens",
"end": "Monitor"
}
}
},
"submitBilling": {
"name": "submitBilling",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/checkout_payments/v1/payment_instructions?key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "billing_info=taskObjects[TaskID].getProfile(TaskID,taskObjects);if(taskObjects[TaskID]['Variables']['cart_id']==null){cart_id=taskObjects[TaskID].getProfile(TaskID,taskObjects);response=taskObjects[TaskID]['requestHistory']['addToCart'];text=JSON.parse(await response.text());if(JSON.stringify(text).includes('cart_id')==false){response=taskObjects[TaskID]['requestHistory']['harvestCartID'];text=JSON.parse(await response.text())}cart_id=text['cart_id'];taskObjects[TaskID]['Variables']['cart_id']=cart_id}else{cart_id=taskObjects[TaskID]['Variables']['cart_id']};if(billing_info['billing_info']['card_details']['expiry_month'].includes('0')==false&&billing_info['billing_info']['card_details']['expiry_month'].length==1){var expiry_month='0'+billing_info['billing_info']['card_details']['expiry_month']}else{var expiry_month=billing_info['billing_info']['card_details']['expiry_month']};let expiry_year=profile_info['billing_info']['card_details']['expiry_year'];if(expiry_year.length==2){expiry_year='20'+expiry_year}return JSON.stringify({'cart_id':cart_id,'wallet_mode':'NONE','payment_type':'CARD','card_details':{'card_name':billing_info['billing_info']['card_details']['card_name'],'card_number':billing_info['billing_info']['card_details']['card_number'],'cvv':billing_info['billing_info']['card_details']['cvv'],'expiry_month':expiry_month,'expiry_year':expiry_year},'billing_address':{'address_line1':billing_info['billing_info']['billing_address']['address_line1'],'city':billing_info['billing_info']['billing_address']['city'],'first_name':billing_info['billing_info']['billing_address']['first_name'],'last_name':billing_info['billing_info']['billing_address']['last_name'],'phone':billing_info['billing_info']['billing_address']['phone'],'state':billing_info['billing_info']['billing_address']['state'],'zip_code':billing_info['billing_info']['billing_address']['zip_code'],'country':'US'}})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"success",
"serviceUnavailable",
"CART_TOTAL_AMOUNT_ZERO",
"cardAlreadyPresent",
"accessTokenInvalid",
"INVALID_PAYMENT_COMBINATION"
],
"success": {
"log": "Submitting Order",
"status": 201,
"options": {}
},
"serviceUnavailable": {
"log": "Service Unavailable",
"status": 424,
"options": {}
},
"cardAlreadyPresent": {
"log": "Submitting Order",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "CARD_PAYMENT_EXIST"
}
},
"CART_TOTAL_AMOUNT_ZERO": {
"log": "Cart is Empty. Check QTY.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "CART_TOTAL_AMOUNT_ZERO"
}
},
"INVALID_PAYMENT_COMBINATION": {
"log": "Submitting Order",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "INVALID_PAYMENT_COMBINATION"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
}
},
"taskLogic": {
"success": "harvestImg9",
"cardAlreadyPresent": "harvestImg9",
"serviceUnavailable":"submitBilling",
"CART_TOTAL_AMOUNT_ZERO":"Monitor",
"accessTokenInvalid": "refreshTokens",
"INVALID_PAYMENT_COMBINATION": "harvestImg9",
"end": "Monitor"
}
}
},
"resubmitCVV": {
"name": "resubmitCVV",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": null,
"urlFunction": {
"name": "returnResubmitCVVUrl",
"arguments": "taskObjects, TaskID"
}
},
"method": "PUT",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "billing_info=taskObjects[TaskID].getProfile(TaskID, taskObjects);cart_id=taskObjects[TaskID]['Variables']['cart_id'];return JSON.stringify({'cart_id':cart_id,'wallet_mode':'NONE','payment_type':'CARD','card_details':{'cvv':billing_info['billing_info']['card_details']['cvv']}})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"success",
"cardAlreadyPresent",
"accessTokenInvalid"
],
"success": {
"log": "Resubmitted CVV",
"status": 200,
"options": {}
},
"cardAlreadyPresent": {
"log": "Submitting Order",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "CARD_PAYMENT_EXIST"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
}
},
"taskLogic": {
"success": "submitCheckout",
"cardAlreadyPresent": "submitCheckout",
"accessTokenInvalid": "refreshTokens",
"end": "submitCheckout"
}
}
},
"harvestImg9": {
"name": "harvestImg9",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "http://localhost:5634/img9-moment"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "let account=taskObjects[TaskID].getAccount(TaskID,taskObjects);let cookies=account.cookies;let Access_Token=cookies.accessToken;let idToken=cookies.idToken;return JSON.stringify({accessToken:Access_Token,idToken:idToken,})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": false,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"success",
"badRequest"
],
"success": {
"log": "Submitting Order",
"status": 200,
"options": {}
},
"badRequest": {
"log": "Error with Img9",
"status": 400,
"options": {}
}
},
"taskLogic": {
"success": "submitCheckout",
"badRequest": "harvestImg9",
"end": "submitCheckout"
}
}
},
"submitCheckout": {
"name": "submitCheckout",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/web_checkouts/v1/checkout?field_groups=ADDRESSES%2CCART%2CCART_ITEMS%2CDELIVERY_WINDOWS%2CPAYMENT_INSTRUCTIONS%2CPICKUP_INSTRUCTIONS%2CPROMOTION_CODES%2CSUMMARY&key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": "{\"cart_type\":\"REGULAR\",\"channel_id\":10}",
"function": null
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"successfulCheckout",
"PaymentDecline",
"RateLimited",
"MISSING_CREDIT_CARD_CVV",
"MISSING_OR_INVALID_PAYMENT_DETAILS",
"EMPTY_CART_FOR_ORDER_SUBMIT",
"accessTokenInvalid",
"CREDIT_CARD_COMPARE_REQUIRED"
],
"successfulCheckout": {
"log": "Submitted Checkout.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "orders"
}
},
"PaymentDecline": {
"log": "Payment Declined.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "PAYMENT_DECLINED_EXCEPTION"
}
},
"RateLimited": {
"log": "Rate Limited. Retrying...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "EC_PLATFORM_RATE_LIMITED"
}
},
"MISSING_CREDIT_CARD_CVV": {
"log": "MISSING_CREDIT_CARD_CVV",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "MISSING_CREDIT_CARD_CVV"
}
},
"MISSING_OR_INVALID_PAYMENT_DETAILS": {
"log": "MISSING_OR_INVALID_PAYMENT_DETAILS",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "MISSING_OR_INVALID_PAYMENT_DETAILS"
}
},
"EMPTY_CART_FOR_ORDER_SUBMIT": {
"log": "Cart Empty",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "EMPTY_CART_FOR_ORDER_SUBMIT"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token ",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"CREDIT_CARD_COMPARE_REQUIRED": {
"log": "CREDIT_CARD_COMPARE_REQUIRED",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "CREDIT_CARD_COMPARE_REQUIRED"
}
}
},
"taskLogic": {
"checkout2": "logCheckout",
"PaymentDecline": "Monitor",
"EMPTY_CART_FOR_ORDER_SUBMIT": "Monitor",
"MISSING_CREDIT_CARD_CVV": "resubmitCVV",
"itemNotAvailableYet": "Monitor",
"accessTokenInvalid": "refreshTokens",
"RateLimited":"Monitor",
"CREDIT_CARD_COMPARE_REQUIRED": "submitBilling",
"MISSING_OR_INVALID_PAYMENT_DETAILS": "submitBilling",
"end": "Monitor"
}
}
},
"logCheckout": {
"name": "logCheckout",
"type": "function",
"start": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "const response=taskObjects[TaskID].requestHistory.submitCheckout;const body_text=JSON.parse(await response.text());let item_info;const data=JSON.parse(taskObjects[TaskID].requestHistory.addToCart.data);let sku=taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).product.task_sku.split(':')[0];const cart_item=body_text.orders[0].cart_items.find((cart_item)=>{return cart_item.tcin===sku});try{item_info={Title:cart_item.item_attributes.description,Image:data.item_attributes.image_path,Price:cart_item.unit_price*taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).product.item_quantity,}}catch{item_info={Title:'N/A',Image:'',Price:'',}};let orderID;try{orderID=body_text.orders[0].order_id}catch{orderID='N/A'};let checkoutInfo={product_info:item_info,Task_Info:taskObjects[TaskID].getTaskInfo(TaskID,taskObjects)};const getProxyName=()=>{try{let taskGroupId=taskObjects[TaskID].TaskGroupID;let taskGroups=taskObjects.taskGroups;let proxyGroups=taskObjects.proxyGroups;let task_info=taskGroups.find((group)=>group.id===taskGroupId).tasks.find((task)=>task.id===TaskID);let proxy_group_id=task_info.task_proxy_info.proxy_group_id;if(task_info.task_proxy_info.localhost){return'localhost'};return proxyGroups.find((group)=>group.id===proxy_group_id).name}catch{return'N/A'}};let config={'content':null,'embeds':[{'title':'Successfully checked out!','description':checkoutInfo.product_info.Title,'color':3297740,'image':{'url':checkoutInfo.product_info.Image},'fields':[{'name':'Site','value':checkoutInfo.Task_Info.product.site,'inline':true},{'name':'SKU','value':checkoutInfo.Task_Info.product.task_sku,'inline':true},{'name':'Quantity','value':checkoutInfo.Task_Info.product.item_quantity,'inline':true},{'name':'Mode','value':checkoutInfo.Task_Info.task_settings.task_mode,'inline':true},{'name':'Profile','value':'||'+taskObjects[TaskID].getProfile(TaskID,taskObjects).profile_name+'||','inline':true},{'name':'Account Email','value':'||'+taskObjects[TaskID].getAccount(TaskID,taskObjects).username+'||','inline':true},{'name':'Account Password','value':'||'+taskObjects[TaskID].getAccount(TaskID,taskObjects).password+'||','inline':true},{'name':'Order #','value':'||'+orderID+'||','inline':true},{'name':'Proxy','value':'||'+getProxyName()+'||','inline':true}],'footer':{'text':'LexAIO v2 Success','icon_url':'https://avatars1.githubusercontent.com/u/76762917?s=40&v=4'},'timestamp':timestamp()}]};function timestamp(){const timeElapsed=Date.now();const today=new Date(timeElapsed);return today.toISOString()};checkoutInfo.config=config;process.send({'type':'SuccessfulCheckout','CheckoutInfo':checkoutInfo});if(taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).task_advanced_info.loopCheckout){taskObjects[TaskID]['Cookies']=[];taskObjects[TaskID]['Variables']['cart_id']=null;return'restart'}else{return'Checkout'}"
},
"logic": {
"functionLogic": {
"reqStatuses": ["success", "restart"],
"success": {
"log": "Submitted Checkout. "
},
"restart": {
"log": "Restart Checkout."
},
"Decline": {
"log": "Payment Declined. "
}
},
"taskLogic": {
"Checkout": "end",
"restart": "submitShipping",
"Decline": "end",
"end": "end"
}
}
},
"end": "exit"
}
},
"Pickup": {
"entryPoint": "submitShipping",
"variables": [
"ItemInfo",
"ItemAvailability",
"cart_id",
"Access_Token",
"Visitor_ID",
"Refresh_Token",
"Store_Locations",
"pickup_id"
],
"captchaHarvester": false,
"helperFunctions": {
"getPickupID": {
"arguments": "taskObjects, TaskID",
"body": "let response = taskObjects[TaskID].requestHistory.harvestPickupID.data;console.log(response);taskObjects[TaskID].Variables.pickup_id = response.split('\"pickup_id\":\"')[1].split('\"')[0]"
},
"returnPickupSubmissionEndpoint": {
"arguments": "taskObjects, TaskID",
"body": "return `https://carts.target.com/web_checkouts/v1/cart_pickup_instructions/` + taskObjects[TaskID].Variables.pickup_id + `?field_groups=ADDRESSES%2CCART%2CCART_ITEMS%2CPICKUP_INSTRUCTIONS%2CPROMOTION_CODES%2CSUMMARY&key=feaf228eb2777fd3eee0fd5192ae7107d6224b39`"
},
"returnResubmitCVVUrl": {
"arguments": "taskObjects, TaskID",
"body": "response=taskObjects[TaskID]['requestHistory']['submitCheckout'];text=await response.text();instructions_id=text.split('Missing CVV or PIN code on payment instruction ')[1].split('\"')[0];console.log(instructions_id);return `https://carts.target.com/checkout_payments/v1/payment_instructions/${instructions_id}?key=feaf228eb2777fd3eee0fd5192ae7107d6224b39`"
},
"setCookies": {
"arguments": "taskObjects, TaskID",
"body": "try{taskObjects[TaskID].Cookies=[];let account=taskObjects[TaskID].getAccount(TaskID,taskObjects);let cookies=account.cookies;let accessToken='accessToken='+cookies.accessToken;let visitorID='visitorID='+cookies.visitorID;taskObjects[TaskID].setCookie(TaskID,taskObjects,accessToken);taskObjects[TaskID].setCookie(TaskID,taskObjects,visitorID)}catch{}"
},
"setRefreshCookies": {
"arguments": "taskObjects, TaskID",
"body": "try{let account=taskObjects[TaskID].getAccount(TaskID,taskObjects);let cookies=account.cookies;let Access_Token=cookies.accessToken;let Visitor_ID=cookies.visitorID;let Refresh_Token=taskObjects[TaskID]['helperFunctions']['jwt_decode'](Access_Token)['jti'];taskObjects[TaskID]['Variables']['Access_Token']=Access_Token;taskObjects[TaskID]['Variables']['Visitor_ID']=Visitor_ID;taskObjects[TaskID]['Variables']['Refresh_Token']=Refresh_Token;taskObjects[TaskID].Cookies=[];taskObjects[TaskID].Cookies.push('refreshToken='+Refresh_Token+';');taskObjects[TaskID].Cookies.push('visitorId='+Visitor_ID+';');}catch{}"
},
"setLoginCookies": {
"arguments": "taskObjects, TaskID",
"body": "try{if(taskObjects[TaskID].Variables.CookieData){console.log('REMOVING COOKIE DATA');taskObjects[TaskID].deleteShapeCookie(taskObjects[TaskID].Variables.CookieData.id)};taskObjects[TaskID].Cookies=[];let cookieData=taskObjects[TaskID].getRandomShapeCookie(taskObjects);taskObjects[TaskID].Variables.CookieData=cookieData;let newCookies=cookieData.Cookies.split('; ');newCookies=newCookies.map((cookie)=>{return cookie+';'});taskObjects[TaskID].Cookies=newCookies}catch(e){console.log(e)}"
}
},
"taskStatistics":{
"addedToCart":"taskCartCount",
"addedToCart2":"taskCartCount",
"successfulCheckout": "taskCountCheckedOut",
"checkout2": "taskCountCheckedOut",
"PaymentDecline": "taskCountDeclined",
"Decline": "taskCountDeclined"
},
"logStatusColors": {
"success": "magenta",
"addedToCart":"magenta",
"checkout2":"green",
"successfulCheckout":"green",
"OutOfStock": "cyan",
"OutOfStock2": "cyan",
"NoLoadedTCINs": "cyan",
"cartFull": "yellow",
"logCheckout": "green",
"PID_LOCKED": "yellow",
"processing": "yellow",
"error": "yellow",
"fail": "red",
"InStock": "cyan",
"shippingAlreadyPresent": "cyan"
},
"functions": {
"SignIn": {
"name": "SignIn",
"type": "request",
"start": "setLoginCookies",
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://gsp.target.com/gsp/authentications/v1/credential_validations?client_id=ecom-web-1.0.0"
},
"method": "POST",
"headers": {
"authority": "gsp.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"customHeaders": {
"x-gyjwza5z-a": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-A'];"
},
"x-gyjwza5z-b": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-B'];"
},
"x-gyjwza5z-c": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-C'];"
},
"x-gyjwza5z-d": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-D'];"
},
"x-gyjwza5z-f": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-F'];"
},
"x-gyjwza5z-z": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-Z'];"
},
"user-agent": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['UserAgent'];"
}
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "let cookieData=taskObjects[TaskID].Variables.CookieData;let parsedData=JSON.stringify({'username':taskObjects[TaskID].getAccount(TaskID,taskObjects).username,'password':taskObjects[TaskID].getAccount(TaskID,taskObjects).password,'device_info':JSON.parse(cookieData.DeviceInfo),'keep_me_signed_in':true});return parsedData;"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": false,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"reLogin",
"_ERR_AUTH_DENIED",
"IPBanned",
"_ERR_USER_DOES_NOT_EXIST",
"_ERR_PATTERN_EMAIL_ADDRESS",
"_ERR_INVALID_CREDENTIALS",
"success"
],
"success": {
"log": "Signed in...",
"status": 202,
"options": {}
},
"_ERR_USER_DOES_NOT_EXIST": {
"log": "Account does not exist.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "_ERR_USER_DOES_NOT_EXIST"
}
},
"_ERR_PATTERN_EMAIL_ADDRESS": {
"log": "Account does not exist.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "_ERR_PATTERN_EMAIL_ADDRESS"
}
},
"_ERR_AUTH_DENIED": {
"log": "Authentication denied",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "_ERR_AUTH_DENIED"
}
},
"_ERR_INVALID_CREDENTIALS": {
"log": "Authentication denied",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "_ERR_INVALID_CREDENTIALS"
}
},
"IPBanned": {
"log": "IP Banned.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "accessDenied"
}
},
"reLogin": {
"log": "Invalid Tokens. Signing in again...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Not Found"
}
}
},
"taskLogic": {
"success": "authSignIn",
"_ERR_AUTH_DENIED":"SignIn",
"reLogin": "SignIn",
"IPBanned":"end",
"_ERR_USER_DOES_NOT_EXIST":"end",
"_ERR_PATTERN_EMAIL_ADDRESS":"end",
"_ERR_INVALID_CREDENTIALS":"end",
"end": "SignIn"
}
}
},
"authSignIn": {
"name": "authSignIn",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 1000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://gsp.target.com/gsp/authentications/v1/auth_codes?client_id=ecom-web-1.0.0"
},
"method": "GET",
"headers": {
"authority": "gsp.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {}
}
},
"requestOptions": {
"useTLS": true,
"redirect":"false",
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": ["success"],
"success": {
"log": "Authenticated",
"status": 302,
"options": {}
}
},
"taskLogic": {
"success": "genTokens",
"end": "SignIn"
}
}
},
"genTokens": {
"name": "genTokens",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://gsp.target.com/gsp/oauth_tokens/v2/client_tokens"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "let cookieData=taskObjects[TaskID].Variables.CookieData;let code=taskObjects[TaskID].requestHistory['authSignIn'].headers.location.split('https://www.target.com/?code=')[1].split('&state=')[0];let parsedData=JSON.stringify({'grant_type':'authorization_code','client_credential':{'client_id':'ecom-web-1.0.0'},'code':code,'device_info':JSON.parse(cookieData.DeviceInfo),'keep_me_signed_in':true});return parsedData;return taskObjects[TaskID].Variables.CookieData['UserAgent'];"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": false,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"reLogin",
"IPBanned",
"success"
],
"success": {
"log": "Refreshed Tokens",
"status": 201,
"options": {}
},
"IPBanned": {
"log": "IP Banned.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "accessDenied"
}
},
"reLogin": {
"log": "Invalid Tokens. Signing in again...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Not Found"
}
}
},
"taskLogic": {
"success": "parseRefreshToken",
"reLogin": "SignIn",
"IPBanned":"end",
"end": "SignIn"
}
}
},
"refreshTokens": {
"name": "refreshTokens",
"type": "request",
"start": "setRefreshCookies",
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://gsp.target.com/gsp/oauth_tokens/v2/client_tokens"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": "{\"grant_type\":\"refresh_token\",\"client_credential\":{\"client_id\":\"ecom-web-1.0.0\"}}",
"function": null
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": false,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"reLogin",
"IPBanned",
"success"
],
"success": {
"log": "Refreshed Tokens",
"status": 201,
"options": {}
},
"IPBanned": {
"log": "IP Banned.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "accessDenied"
}
},
"reLogin": {
"log": "Invalid Tokens. Signing in again...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Not Found"
}
}
},
"taskLogic": {
"success": "parseRefreshToken",
"reLogin": "SignIn",
"IPBanned":"SignIn",
"end": "SignIn"
}
}
},
"parseRefreshToken": {
"name": "parseRefreshToken",
"type": "function",
"start": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "try{let account=taskObjects[TaskID].getAccount(TaskID,taskObjects);if(!account?.cookies){account.cookies={}};let response;if(taskObjects[TaskID].CallStack[taskObjects[TaskID].CallStack.length-2]==='genTokens'){response=JSON.parse(taskObjects[TaskID].requestHistory.genTokens.data);let cookieData=taskObjects[TaskID].Variables.CookieData;account.cookies.visitorID=JSON.parse(cookieData.DeviceInfo).visitor_id}else{response=JSON.parse(taskObjects[TaskID].requestHistory.refreshTokens.data)};let Access_Token=response.access_token;let id_token=response.id_token;account.cookies.idToken=id_token;account.cookies.accessToken=Access_Token;taskObjects[TaskID].updateAccount(TaskID,taskObjects,account);return'success'}catch(e){console.log(e);return'error'}"
},
"logic": {
"functionLogic": {
"reqStatuses": ["success", "noAccountCookies","error"],
"success": {
"log": "Parsed Tokens."
},
"noAccountCookies": {
"log": "No Account Bin Found. Re-bin."
},
"error": {
"log": "Error with account. Re-bin."
}
},
"taskLogic": {
"success": "submitShipping",
"noAccountCookies":"SignIn",
"error": "SignIn",
"end": "SignIn"
}
}
},
"submitShipping": {
"name": "submitShipping",
"type": "request",
"start": "setCookies",
"delay": 0,
"retryDelay": 3001,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/web_checkouts/v1/cart_shipping_addresses?field_groups=ADDRESSES%2CCART%2CCART_ITEMS%2CPICKUP_INSTRUCTIONS%2CPROMOTION_CODES%2CSUMMARY&key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "profile_info=taskObjects[TaskID].getProfile(TaskID, taskObjects);return JSON.stringify({'cart_type':'REGULAR','address':{'address_line1':profile_info['shipping_address']['address_line1'],'address_line2':profile_info['shipping_address']['address_line2'],'address_type':'SHIPPING','city':profile_info['shipping_address']['city'],'country':'US','first_name':profile_info['shipping_address']['first_name'],'last_name':profile_info['shipping_address']['last_name'],'mobile':profile_info['shipping_address']['phone'],'save_as_default':false,'state':profile_info['shipping_address']['state'],'zip_code':profile_info['shipping_address']['zip_code']},'selected':true,'save_to_profile':false,'skip_verification':true})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"success",
"shippingAlreadyPresent",
"accessTokenInvalid",
"CONSTRAINT_VALIDATION_FAILURE",
"INVALID_GUEST_STATUS",
"Unauthorized",
"Unauthorized2",
"RateLimited"
],
"success": {
"log": "Waiting for Monitor",
"status": 201,
"options": {}
},
"shippingAlreadyPresent": {
"log": "Waiting for Monitor",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "ADDRESS_ALREADY_PRESENT"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"Unauthorized": {
"log": "Unauthorized",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Unauthorized"
}
},
"Unauthorized2": {
"log": "Unauthorized",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "UNAUTHORIZED"
}
},
"INVALID_GUEST_STATUS": {
"log": "Bad cookies. Re-bin account.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "INVALID_GUEST_STATUS"
}
},
"CONSTRAINT_VALIDATION_FAILURE": {
"log": "Profile is missing Phone Number.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "address.mobile"
}
},
"RateLimited": {
"log": "Rate Limited. Retrying...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "EC_PLATFORM_RATE_LIMITED"
}
}
},
"taskLogic": {
"success": "Monitor",
"shippingAlreadyPresent": "Monitor",
"accessTokenInvalid": "refreshTokens",
"CONSTRAINT_VALIDATION_FAILURE": "end",
"INVALID_GUEST_STATUS": "SignIn",
"Unauthorized":"SignIn",
"Unauthorized2":"SignIn",
"RateLimited": "submitShipping",
"end": "SignIn"
}
}
},
"Monitor": {
"name": "Monitor",
"type": "function",
"start": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "taskObjects[TaskID].setProxy(TaskID, taskObjects);taskObjects[TaskID].Cookies = taskObjects[TaskID].Cookies.filter((cookie) => !cookie.includes('mitata'));taskObjects[TaskID].setProxy(TaskID, taskObjects);taskObjects[TaskID].Cookies = taskObjects[TaskID].Cookies.filter((cookie) => !cookie.includes('mitata'));let monitorEventPromise=async(sku)=>{console.log('WaitingForSKU'+sku);return new Promise((resolve,reject)=>{let event=monitorEvent.on(sku,(message)=>{if(message.inStock){delete event;resolve(message);return}})})};let result=await monitorEventPromise(taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).product.task_sku);taskObjects[TaskID]['Variables']['tcin']=result.SKU;taskObjects[TaskID]['Variables']['store_id']=result.store_id;return'InStock';"
},
"logic": {
"functionLogic": {
"reqStatuses": ["InStock", "OutOfStock", "UnAvailable"],
"InStock": {
"log": "Item in Stock. Adding to cart."
},
"OutOfStock": {
"log": "Monitoring..."
},
"OutOfStock2": {
"log": "Monitoring..."
},
"UnAvailable": {
"log": "Failed to get item. Monitoring..."
}
},
"taskLogic": {
"InStock": "addToCart",
"OutOfStock": "Monitor",
"OutOfStock2": "Monitor",
"getStoreLocations": "Monitor",
"end": "Monitor"
}
}
},
"addToCart": {
"name": "addToCart",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 1000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/web_checkouts/v1/cart_items?field_groups=CART%2CCART_ITEMS%2CSUMMARY&key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "console.log({'cart_type':'REGULAR','channel_id':'10','shopping_context':'DIGITAL','cart_item':{'tcin':taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).product.task_sku,'quantity':taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).product.item_quantity,'item_channel_id':'10'},'fulfillment':{'type':'PICKUP','location_id':taskObjects[TaskID].Variables.store_id,'ship_method':'STORE_PICKUP'}});return JSON.stringify({'cart_type':'REGULAR','channel_id':'10','shopping_context':'DIGITAL','cart_item':{'tcin':taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).product.task_sku,'quantity':taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).product.item_quantity,'item_channel_id':'10'},'fulfillment':{'type':'PICKUP','location_id':taskObjects[TaskID].Variables.store_id,'ship_method':'STORE_PICKUP'}})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": ["addedToCart", "cartFull", "accessTokenInvalid", "DEPENDENT_SERVICE_ERROR", "PID_LOCKED", "proxyBan", "RateLimited"],
"addedToCart": {
"log": "Added To Cart",
"status": 201,
"options": {}
},
"cartFull": {
"log": "Cart Full. Skipping ATC...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "MAX_PURCHASE_LIMIT_EXCEEDED"
}
},
"DEPENDENT_SERVICE_ERROR": {
"log": "Item OOS. Retrying atc...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "DEPENDENT_SERVICE_ERROR"
}
},
"PID_LOCKED": {
"log": "Item PID Locked. Retrying atc...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Access Denied"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"proxyBan": {
"log": "Proxy Banned. Retrying...",
"status": 404,
"options": {}
},
"RateLimited": {
"log": "Rate Limited. Retrying...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "EC_PLATFORM_RATE_LIMITED"
}
}
},
"taskLogic": {
"addedToCart": "harvestPickupID",
"cartFull": "harvestCartID",
"DEPENDENT_SERVICE_ERROR": "Monitor",
"accessTokenInvalid": "refreshTokens",
"PID_LOCKED": "Monitor",
"proxyBan":"Monitor",
"RateLimited":"addToCart",
"end": "Monitor"
}
}
},
"harvestPickupID": {
"name": "harvestPickupID",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/web_checkouts/v1/pre_checkout?field_groups=ADDRESSES%2CCART%2CCART_ITEMS%2CDELIVERY_WINDOWS%2CPAYMENT_INSTRUCTIONS%2CPICKUP_INSTRUCTIONS%2CPROMOTION_CODES%2CSUMMARY%2CFINANCE_PROVIDERS&key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": "{\"cart_type\":\"REGULAR\"}",
"function": {}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": ["success", "cartFull", "accessTokenInvalid", "RateLimited"],
"success": {
"log": "Got Pickup ID",
"status": 201,
"options": {}
},
"cartFull": {
"log": "Cart Full. Skipping ATC...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "MAX_PURCHASE_LIMIT_EXCEEDED"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"RateLimited": {
"log": "Rate Limited. Retrying...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "EC_PLATFORM_RATE_LIMITED"
}
}
},
"taskLogic": {
"success": "submitPickupPerson",
"cartFull": "harvestCartID",
"accessTokenInvalid": "refreshTokens",
"RateLimited": "harvestPickupID",
"end": "Monitor"
}
}
},
"harvestCartID": {
"name": "harvestCartID",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/web_checkouts/v1/cart?field_groups=CART%2CCART_ITEMS%2CSUMMARY%2CPROMOTION_CODES%2CADDRESSES&key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "PUT",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "return JSON.stringify({'cart_type':'REGULAR'})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": ["success", "cartFull", "accessTokenInvalid", "RateLimited"],
"success": {
"log": "Got cart_id",
"status": 200,
"options": {}
},
"cartFull": {
"log": "Cart Full. Skipping ATC...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "MAX_PURCHASE_LIMIT_EXCEEDED"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"RateLimited": {
"log": "Rate Limited. Retrying...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "EC_PLATFORM_RATE_LIMITED"
}
}
},
"taskLogic": {
"success": "harvestPickupID",
"accessTokenInvalid": "refreshTokens",
"RateLimited": "harvestCartID",
"end": "Monitor"
}
}
},
"submitPickupPerson": {
"name": "submitPickupPerson",
"type": "request",
"start": "getPickupID",
"delay": 0,
"retryDelay": 3001,
"request": {
"requestConfig": {
"url": {
"plainURL": null,
"urlFunction": {
"name": "returnPickupSubmissionEndpoint",
"arguments": "taskObjects, TaskID"
}
},
"method": "PUT",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "profile_info=taskObjects[TaskID].getProfile(TaskID,taskObjects);if(taskObjects[TaskID]['Variables']['cart_id']==null){response=taskObjects[TaskID]['requestHistory']['addToCart'];text=JSON.parse(await response.text());if(JSON.stringify(text).includes('cart_id')==false){response=taskObjects[TaskID]['requestHistory']['harvestCartID'];text=JSON.parse(await response.text())}cart_id=text['cart_id'];taskObjects[TaskID]['Variables']['cart_id']=cart_id}else{cart_id=taskObjects[TaskID]['Variables']['cart_id']};return JSON.stringify({'cart_id':cart_id,'cart_type':'REGULAR','guest_email_id':profile_info['email'],'pickup_instruction':{'first_name':profile_info['shipping_address']['first_name'],'last_name':profile_info['shipping_address']['last_name'],'email':profile_info['email'],'mobile':profile_info['shipping_address']['phone'],'nominee_first_name':'','nominee_last_name':'','nominee_email':''}});"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"success",
"accessTokenInvalid",
"RateLimited"
],
"success": {
"log": "Submitted Pickup Person",
"status": 200,
"options": {}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"RateLimited": {
"log": "Rate Limited. Retrying...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "EC_PLATFORM_RATE_LIMITED"
}
}
},
"taskLogic": {
"success": "submitBilling",
"accessTokenInvalid": "refreshTokens",
"RateLimited": "RateLimited",
"end": "Monitor"
}
}
},
"submitBilling": {
"name": "submitBilling",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/checkout_payments/v1/payment_instructions?key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "billing_info=taskObjects[TaskID].getProfile(TaskID,taskObjects);if(taskObjects[TaskID]['Variables']['cart_id']==null){cart_id=taskObjects[TaskID].getProfile(TaskID,taskObjects);response=taskObjects[TaskID]['requestHistory']['addToCart'];text=JSON.parse(await response.text());if(JSON.stringify(text).includes('cart_id')==false){response=taskObjects[TaskID]['requestHistory']['harvestCartID'];text=JSON.parse(await response.text())}cart_id=text['cart_id'];taskObjects[TaskID]['Variables']['cart_id']=cart_id}else{cart_id=taskObjects[TaskID]['Variables']['cart_id']};if(billing_info['billing_info']['card_details']['expiry_month'].includes('0')==false&&billing_info['billing_info']['card_details']['expiry_month'].length==1){var expiry_month='0'+billing_info['billing_info']['card_details']['expiry_month']}else{var expiry_month=billing_info['billing_info']['card_details']['expiry_month']};let expiry_year=profile_info['billing_info']['card_details']['expiry_year'];if(expiry_year.length==2){expiry_year='20'+expiry_year}return JSON.stringify({'cart_id':cart_id,'wallet_mode':'NONE','payment_type':'CARD','card_details':{'card_name':billing_info['billing_info']['card_details']['card_name'],'card_number':billing_info['billing_info']['card_details']['card_number'],'cvv':billing_info['billing_info']['card_details']['cvv'],'expiry_month':expiry_month,'expiry_year':expiry_year},'billing_address':{'address_line1':billing_info['billing_info']['billing_address']['address_line1'],'city':billing_info['billing_info']['billing_address']['city'],'first_name':billing_info['billing_info']['billing_address']['first_name'],'last_name':billing_info['billing_info']['billing_address']['last_name'],'phone':billing_info['billing_info']['billing_address']['phone'],'state':billing_info['billing_info']['billing_address']['state'],'zip_code':billing_info['billing_info']['billing_address']['zip_code'],'country':'US'}})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"success",
"serviceUnavailable",
"CART_TOTAL_AMOUNT_ZERO",
"cardAlreadyPresent",
"accessTokenInvalid",
"INVALID_PAYMENT_COMBINATION",
"RateLimited"
],
"success": {
"log": "Submitting Order",
"status": 201,
"options": {}
},
"serviceUnavailable": {
"log": "Service Unavailable",
"status": 424,
"options": {}
},
"CART_TOTAL_AMOUNT_ZERO": {
"log": "Cart is Empty. Check QTY.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "CART_TOTAL_AMOUNT_ZERO"
}
},
"cardAlreadyPresent": {
"log": "Submitting Order",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "CARD_PAYMENT_EXIST"
}
},
"INVALID_PAYMENT_COMBINATION": {
"log": "Submitting Order",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "INVALID_PAYMENT_COMBINATION"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"RateLimited": {
"log": "Rate Limited. Retrying...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "EC_PLATFORM_RATE_LIMITED"
}
}
},
"taskLogic": {
"success": "submitCheckout",
"CART_TOTAL_AMOUNT_ZERO":"Monitor",
"serviceUnavailable":"submitBilling",
"cardAlreadyPresent": "submitCheckout",
"accessTokenInvalid": "refreshTokens",
"INVALID_PAYMENT_COMBINATION": "submitCheckout",
"RateLimited": "submitBilling",
"end": "Monitor"
}
}
},
"resubmitCVV": {
"name": "resubmitCVV",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": null,
"urlFunction": {
"name": "returnResubmitCVVUrl",
"arguments": "taskObjects, TaskID"
}
},
"method": "PUT",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "billing_info=taskObjects[TaskID].getProfile(TaskID, taskObjects);cart_id=taskObjects[TaskID]['Variables']['cart_id'];return JSON.stringify({'cart_id':cart_id,'wallet_mode':'NONE','payment_type':'CARD','card_details':{'cvv':billing_info['billing_info']['card_details']['cvv']}})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"success",
"cardAlreadyPresent",
"accessTokenInvalid",
"RateLimited"
],
"success": {
"log": "Resubmitted CVV",
"status": 200,
"options": {}
},
"cardAlreadyPresent": {
"log": "Submitting Order",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "CARD_PAYMENT_EXIST"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"RateLimited": {
"log": "Rate Limited. Retrying...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "EC_PLATFORM_RATE_LIMITED"
}
}
},
"taskLogic": {
"success": "submitCheckout",
"cardAlreadyPresent": "submitCheckout",
"accessTokenInvalid": "refreshTokens",
"resubmitCVV": "resubmitCVV",
"end": "Monitor"
}
}
},
"submitCheckout": {
"name": "submitCheckout",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 2000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/web_checkouts/v1/checkout?field_groups=ADDRESSES%2CCART%2CCART_ITEMS%2CDELIVERY_WINDOWS%2CPAYMENT_INSTRUCTIONS%2CPICKUP_INSTRUCTIONS%2CPROMOTION_CODES%2CSUMMARY&key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": "{\"cart_type\":\"REGULAR\",\"channel_id\":10}",
"function": null
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"checkout2",
"PaymentDecline",
"RateLimited",
"MISSING_CREDIT_CARD_CVV",
"MISSING_OR_INVALID_PAYMENT_DETAILS",
"accessTokenInvalid",
"CREDIT_CARD_COMPARE_REQUIRED",
"EMPTY_CART_FOR_ORDER_SUBMIT"
],
"checkout2": {
"log": "Submitted Checkout.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "orders"
}
},
"PaymentDecline": {
"log": "Payment Declined.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "PAYMENT_DECLINED_EXCEPTION"
}
},
"RateLimited": {
"log": "Rate Limited. Retrying...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "EC_PLATFORM_RATE_LIMITED"
}
},
"MISSING_CREDIT_CARD_CVV": {
"log": "MISSING_CREDIT_CARD_CVV",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "MISSING_CREDIT_CARD_CVV"
}
},
"MISSING_OR_INVALID_PAYMENT_DETAILS": {
"log": "MISSING_OR_INVALID_PAYMENT_DETAILS",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "MISSING_OR_INVALID_PAYMENT_DETAILS"
}
},
"CREDIT_CARD_COMPARE_REQUIRED": {
"log": "CREDIT_CARD_COMPARE_REQUIRED",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "CREDIT_CARD_COMPARE_REQUIRED"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token ",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"EMPTY_CART_FOR_ORDER_SUBMIT": {
"log": "Cart Empty",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "EMPTY_CART_FOR_ORDER_SUBMIT"
}
}
},
"taskLogic": {
"checkout2": "logCheckout",
"PaymentDecline": "Monitor",
"MISSING_CREDIT_CARD_CVV": "resubmitCVV",
"EMPTY_CART_FOR_ORDER_SUBMIT": "Monitor",
"itemNotAvailableYet": "Monitor",
"CREDIT_CARD_COMPARE_REQUIRED": "submitBilling",
"accessTokenInvalid": "refreshTokens",
"RateLimited":"submitCheckout",
"MISSING_OR_INVALID_PAYMENT_DETAILS": "submitBilling",
"end": "submitCheckout"
}
}
},
"logCheckout": {
"name": "logCheckout",
"type": "function",
"start": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "const response=taskObjects[TaskID].requestHistory.submitCheckout;const body_text=JSON.parse(await response.text());let item_info;const data=JSON.parse(taskObjects[TaskID].requestHistory.addToCart.data);let sku=taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).product.task_sku.split(':')[0];const cart_item=body_text.orders[0].cart_items.find((cart_item)=>{return cart_item.tcin===sku});try{item_info={Title:cart_item.item_attributes.description,Image:data.item_attributes.image_path,Price:cart_item.unit_price,}}catch{item_info={Title:'N/A',Image:'',Price:'',}};let orderID;try{orderID=body_text.orders[0].order_id}catch{orderID='N/A'};let checkoutInfo={product_info:item_info,Task_Info:taskObjects[TaskID].getTaskInfo(TaskID,taskObjects)};const getProxyName=()=>{try{let taskGroupId=taskObjects[TaskID].TaskGroupID;let taskGroups=taskObjects.taskGroups;let proxyGroups=taskObjects.proxyGroups;let task_info=taskGroups.find((group)=>group.id===taskGroupId).tasks.find((task)=>task.id===TaskID);let proxy_group_id=task_info.task_proxy_info.proxy_group_id;if(task_info.task_proxy_info.localhost){return'localhost'};return proxyGroups.find((group)=>group.id===proxy_group_id).name}catch{return'N/A'}};let config={'content':null,'embeds':[{'title':'Successfully checked out!','description':checkoutInfo.product_info.Title,'color':3297740,'image':{'url':checkoutInfo.product_info.Image},'fields':[{'name':'Site','value':checkoutInfo.Task_Info.product.site,'inline':true},{'name':'SKU','value':checkoutInfo.Task_Info.product.task_sku,'inline':true},{'name':'Quantity','value':checkoutInfo.Task_Info.product.item_quantity,'inline':true},{'name':'Mode','value':checkoutInfo.Task_Info.task_settings.task_mode,'inline':true},{'name':'Profile','value':'||'+taskObjects[TaskID].getProfile(TaskID,taskObjects).profile_name+'||','inline':true},{'name':'Account Email','value':'||'+taskObjects[TaskID].getAccount(TaskID,taskObjects).username+'||','inline':true},{'name':'Account Password','value':'||'+taskObjects[TaskID].getAccount(TaskID,taskObjects).password+'||','inline':true},{'name':'Order #','value':'||'+orderID+'||','inline':true},{'name':'Proxy','value':'||'+getProxyName()+'||','inline':true}],'footer':{'text':'LexAIO v2 Success','icon_url':'https://avatars1.githubusercontent.com/u/76762917?s=40&v=4'},'timestamp':timestamp()}]};function timestamp(){const timeElapsed=Date.now();const today=new Date(timeElapsed);return today.toISOString()};checkoutInfo.config=config;process.send({'type':'SuccessfulCheckout','CheckoutInfo':checkoutInfo});if(taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).task_advanced_info.loopCheckout){taskObjects[TaskID]['Cookies']=[];taskObjects[TaskID]['Variables']['cart_id']=null;return'restart'}else{return'Checkout'}"
},
"logic": {
"functionLogic": {
"reqStatuses": ["success", "restart"],
"success": {
"log": "Submitted Checkout. "
},
"restart": {
"log": "Restart Checkout."
},
"Decline": {
"log": "Payment Declined. "
}
},
"taskLogic": {
"Checkout": "end",
"restart": "submitShipping",
"Decline": "end",
"end": "end"
}
}
},
"end": "exit"
}
},
"PickupSafe": {
"entryPoint": "submitShipping",
"variables": [
"ItemInfo",
"ItemAvailability",
"cart_id",
"Access_Token",
"Visitor_ID",
"Refresh_Token",
"Store_Locations",
"pickup_id"
],
"captchaHarvester": false,
"helperFunctions": {
"getPickupID": {
"arguments": "taskObjects, TaskID",
"body": "let response = taskObjects[TaskID].requestHistory.harvestPickupID.data;console.log(response);taskObjects[TaskID].Variables.pickup_id = response.split('\"pickup_id\":\"')[1].split('\"')[0]"
},
"returnPickupSubmissionEndpoint": {
"arguments": "taskObjects, TaskID",
"body": "return `https://carts.target.com/web_checkouts/v1/cart_pickup_instructions/` + taskObjects[TaskID].Variables.pickup_id + `?field_groups=ADDRESSES%2CCART%2CCART_ITEMS%2CPICKUP_INSTRUCTIONS%2CPROMOTION_CODES%2CSUMMARY&key=feaf228eb2777fd3eee0fd5192ae7107d6224b39`"
},
"returnResubmitCVVUrl": {
"arguments": "taskObjects, TaskID",
"body": "response=taskObjects[TaskID]['requestHistory']['submitCheckout'];text=await response.text();instructions_id=text.split('Missing CVV or PIN code on payment instruction ')[1].split('\"')[0];console.log(instructions_id);return `https://carts.target.com/checkout_payments/v1/payment_instructions/${instructions_id}?key=feaf228eb2777fd3eee0fd5192ae7107d6224b39`"
},
"setCookies": {
"arguments": "taskObjects, TaskID",
"body": "try{taskObjects[TaskID].Cookies=[];let account=taskObjects[TaskID].getAccount(TaskID,taskObjects);let cookies=account.cookies;let accessToken='accessToken='+cookies.accessToken;let visitorID='visitorID='+cookies.visitorID;taskObjects[TaskID].setCookie(TaskID,taskObjects,accessToken);taskObjects[TaskID].setCookie(TaskID,taskObjects,visitorID)}catch{}"
},
"setRefreshCookies": {
"arguments": "taskObjects, TaskID",
"body": "try{let account=taskObjects[TaskID].getAccount(TaskID,taskObjects);let cookies=account.cookies;let Access_Token=cookies.accessToken;let Visitor_ID=cookies.visitorID;let Refresh_Token=taskObjects[TaskID]['helperFunctions']['jwt_decode'](Access_Token)['jti'];taskObjects[TaskID]['Variables']['Access_Token']=Access_Token;taskObjects[TaskID]['Variables']['Visitor_ID']=Visitor_ID;taskObjects[TaskID]['Variables']['Refresh_Token']=Refresh_Token;taskObjects[TaskID].Cookies=[];taskObjects[TaskID].Cookies.push('refreshToken='+Refresh_Token+';');taskObjects[TaskID].Cookies.push('visitorId='+Visitor_ID+';');}catch{}"
},
"setLoginCookies": {
"arguments": "taskObjects, TaskID",
"body": "try{if(taskObjects[TaskID].Variables.CookieData){console.log('REMOVING COOKIE DATA');taskObjects[TaskID].deleteShapeCookie(taskObjects[TaskID].Variables.CookieData.id)};taskObjects[TaskID].Cookies=[];let cookieData=taskObjects[TaskID].getRandomShapeCookie(taskObjects);taskObjects[TaskID].Variables.CookieData=cookieData;let newCookies=cookieData.Cookies.split('; ');newCookies=newCookies.map((cookie)=>{return cookie+';'});taskObjects[TaskID].Cookies=newCookies}catch(e){console.log(e)}"
}
},
"taskStatistics":{
"addedToCart":"taskCartCount",
"addedToCart2":"taskCartCount",
"successfulCheckout": "taskCountCheckedOut",
"checkout2": "taskCountCheckedOut",
"PaymentDecline": "taskCountDeclined",
"Decline": "taskCountDeclined"
},
"logStatusColors": {
"success": "magenta",
"addedToCart":"magenta",
"checkout2":"green",
"successfulCheckout":"green",
"OutOfStock": "cyan",
"OutOfStock2": "cyan",
"NoLoadedTCINs": "cyan",
"cartFull": "yellow",
"logCheckout": "green",
"PID_LOCKED": "yellow",
"processing": "yellow",
"error": "yellow",
"fail": "red",
"InStock": "cyan",
"shippingAlreadyPresent": "cyan"
},
"functions": {
"SignIn": {
"name": "SignIn",
"type": "request",
"start": "setLoginCookies",
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://gsp.target.com/gsp/authentications/v1/credential_validations?client_id=ecom-web-1.0.0"
},
"method": "POST",
"headers": {
"authority": "gsp.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"customHeaders": {
"x-gyjwza5z-a": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-A'];"
},
"x-gyjwza5z-b": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-B'];"
},
"x-gyjwza5z-c": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-C'];"
},
"x-gyjwza5z-d": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-D'];"
},
"x-gyjwza5z-f": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-F'];"
},
"x-gyjwza5z-z": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['ShapeH-Z'];"
},
"user-agent": {
"arguments": "taskObjects, TaskID",
"body": "return taskObjects[TaskID].Variables.CookieData['UserAgent'];"
}
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "let cookieData=taskObjects[TaskID].Variables.CookieData;let parsedData=JSON.stringify({'username':taskObjects[TaskID].getAccount(TaskID,taskObjects).username,'password':taskObjects[TaskID].getAccount(TaskID,taskObjects).password,'device_info':JSON.parse(cookieData.DeviceInfo),'keep_me_signed_in':true});return parsedData;"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": false,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"reLogin",
"_ERR_AUTH_DENIED",
"IPBanned",
"_ERR_USER_DOES_NOT_EXIST",
"_ERR_PATTERN_EMAIL_ADDRESS",
"_ERR_INVALID_CREDENTIALS",
"success"
],
"success": {
"log": "Signed in...",
"status": 202,
"options": {}
},
"_ERR_USER_DOES_NOT_EXIST": {
"log": "Account does not exist.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "_ERR_USER_DOES_NOT_EXIST"
}
},
"_ERR_PATTERN_EMAIL_ADDRESS": {
"log": "Account does not exist.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "_ERR_PATTERN_EMAIL_ADDRESS"
}
},
"_ERR_AUTH_DENIED": {
"log": "Authentication denied",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "_ERR_AUTH_DENIED"
}
},
"_ERR_INVALID_CREDENTIALS": {
"log": "Authentication denied",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "_ERR_INVALID_CREDENTIALS"
}
},
"IPBanned": {
"log": "IP Banned.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "accessDenied"
}
},
"reLogin": {
"log": "Invalid Tokens. Signing in again...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Not Found"
}
}
},
"taskLogic": {
"success": "authSignIn",
"_ERR_AUTH_DENIED":"SignIn",
"reLogin": "SignIn",
"IPBanned":"end",
"_ERR_USER_DOES_NOT_EXIST":"end",
"_ERR_PATTERN_EMAIL_ADDRESS":"end",
"_ERR_INVALID_CREDENTIALS":"end",
"end": "SignIn"
}
}
},
"authSignIn": {
"name": "authSignIn",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 1000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://gsp.target.com/gsp/authentications/v1/auth_codes?client_id=ecom-web-1.0.0"
},
"method": "GET",
"headers": {
"authority": "gsp.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {}
}
},
"requestOptions": {
"useTLS": true,
"redirect":"false",
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": ["success"],
"success": {
"log": "Authenticated",
"status": 302,
"options": {}
}
},
"taskLogic": {
"success": "genTokens",
"end": "SignIn"
}
}
},
"genTokens": {
"name": "genTokens",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://gsp.target.com/gsp/oauth_tokens/v2/client_tokens"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "let cookieData=taskObjects[TaskID].Variables.CookieData;let code=taskObjects[TaskID].requestHistory['authSignIn'].headers.location.split('https://www.target.com/?code=')[1].split('&state=')[0];let parsedData=JSON.stringify({'grant_type':'authorization_code','client_credential':{'client_id':'ecom-web-1.0.0'},'code':code,'device_info':JSON.parse(cookieData.DeviceInfo),'keep_me_signed_in':true});return parsedData;return taskObjects[TaskID].Variables.CookieData['UserAgent'];"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": false,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"reLogin",
"IPBanned",
"success"
],
"success": {
"log": "Refreshed Tokens",
"status": 201,
"options": {}
},
"IPBanned": {
"log": "IP Banned.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "accessDenied"
}
},
"reLogin": {
"log": "Invalid Tokens. Signing in again...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Not Found"
}
}
},
"taskLogic": {
"success": "parseRefreshToken",
"reLogin": "SignIn",
"IPBanned":"end",
"end": "SignIn"
}
}
},
"refreshTokens": {
"name": "refreshTokens",
"type": "request",
"start": "setRefreshCookies",
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://gsp.target.com/gsp/oauth_tokens/v2/client_tokens"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": "{\"grant_type\":\"refresh_token\",\"client_credential\":{\"client_id\":\"ecom-web-1.0.0\"}}",
"function": null
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": false,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"reLogin",
"IPBanned",
"success"
],
"success": {
"log": "Refreshed Tokens",
"status": 201,
"options": {}
},
"IPBanned": {
"log": "IP Banned.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "accessDenied"
}
},
"reLogin": {
"log": "Invalid Tokens. Signing in again...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Not Found"
}
}
},
"taskLogic": {
"success": "parseRefreshToken",
"reLogin": "SignIn",
"IPBanned":"SignIn",
"end": "SignIn"
}
}
},
"parseRefreshToken": {
"name": "parseRefreshToken",
"type": "function",
"start": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "try{let account=taskObjects[TaskID].getAccount(TaskID,taskObjects);if(!account?.cookies){account.cookies={}};let response;if(taskObjects[TaskID].CallStack[taskObjects[TaskID].CallStack.length-2]==='genTokens'){response=JSON.parse(taskObjects[TaskID].requestHistory.genTokens.data);let cookieData=taskObjects[TaskID].Variables.CookieData;account.cookies.visitorID=JSON.parse(cookieData.DeviceInfo).visitor_id}else{response=JSON.parse(taskObjects[TaskID].requestHistory.refreshTokens.data)};let Access_Token=response.access_token;let id_token=response.id_token;account.cookies.idToken=id_token;account.cookies.accessToken=Access_Token;taskObjects[TaskID].updateAccount(TaskID,taskObjects,account);return'success'}catch(e){console.log(e);return'error'}"
},
"logic": {
"functionLogic": {
"reqStatuses": ["success", "noAccountCookies","error"],
"success": {
"log": "Parsed Tokens."
},
"noAccountCookies": {
"log": "No Account Bin Found. Re-bin."
},
"error": {
"log": "Error with account. Re-bin."
}
},
"taskLogic": {
"success": "submitShipping",
"noAccountCookies":"SignIn",
"error": "SignIn",
"end": "SignIn"
}
}
},
"submitShipping": {
"name": "submitShipping",
"type": "request",
"start": "setCookies",
"delay": 0,
"retryDelay": 3001,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/web_checkouts/v1/cart_shipping_addresses?field_groups=ADDRESSES%2CCART%2CCART_ITEMS%2CPICKUP_INSTRUCTIONS%2CPROMOTION_CODES%2CSUMMARY&key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "profile_info=taskObjects[TaskID].getProfile(TaskID, taskObjects);return JSON.stringify({'cart_type':'REGULAR','address':{'address_line1':profile_info['shipping_address']['address_line1'],'address_line2':profile_info['shipping_address']['address_line2'],'address_type':'SHIPPING','city':profile_info['shipping_address']['city'],'country':'US','first_name':profile_info['shipping_address']['first_name'],'last_name':profile_info['shipping_address']['last_name'],'mobile':profile_info['shipping_address']['phone'],'save_as_default':false,'state':profile_info['shipping_address']['state'],'zip_code':profile_info['shipping_address']['zip_code']},'selected':true,'save_to_profile':false,'skip_verification':true})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"success",
"shippingAlreadyPresent",
"accessTokenInvalid",
"CONSTRAINT_VALIDATION_FAILURE",
"INVALID_GUEST_STATUS",
"Unauthorized",
"Unauthorized2",
"RateLimited"
],
"success": {
"log": "Waiting for Monitor",
"status": 201,
"options": {}
},
"shippingAlreadyPresent": {
"log": "Waiting for Monitor",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "ADDRESS_ALREADY_PRESENT"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"Unauthorized": {
"log": "Unauthorized",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Unauthorized"
}
},
"Unauthorized2": {
"log": "Unauthorized",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "UNAUTHORIZED"
}
},
"INVALID_GUEST_STATUS": {
"log": "Bad cookies. Re-bin account.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "INVALID_GUEST_STATUS"
}
},
"CONSTRAINT_VALIDATION_FAILURE": {
"log": "Profile is missing Phone Number.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "address.mobile"
}
},
"RateLimited": {
"log": "Rate Limited. Retrying...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "EC_PLATFORM_RATE_LIMITED"
}
}
},
"taskLogic": {
"success": "Monitor",
"shippingAlreadyPresent": "Monitor",
"accessTokenInvalid": "refreshTokens",
"CONSTRAINT_VALIDATION_FAILURE": "end",
"INVALID_GUEST_STATUS": "SignIn",
"Unauthorized":"SignIn",
"Unauthorized2":"SignIn",
"RateLimited": "submitShipping",
"end": "SignIn"
}
}
},
"Monitor": {
"name": "Monitor",
"type": "function",
"start": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "taskObjects[TaskID].setProxy(TaskID, taskObjects);taskObjects[TaskID].Cookies = taskObjects[TaskID].Cookies.filter((cookie) => !cookie.includes('mitata'));let monitorEventPromise=async(sku)=>{console.log('WaitingForSKU'+sku);return new Promise((resolve,reject)=>{let event=monitorEvent.on(sku,(message)=>{if(message.inStock){delete event;resolve(message);return}})})};let result=await monitorEventPromise(taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).product.task_sku);taskObjects[TaskID]['Variables']['tcin']=result.SKU;taskObjects[TaskID]['Variables']['store_id']=result.store_id;return'InStock';"
},
"logic": {
"functionLogic": {
"reqStatuses": ["InStock", "OutOfStock", "UnAvailable"],
"InStock": {
"log": "Item in Stock. Adding to cart."
},
"OutOfStock": {
"log": "Monitoring..."
},
"OutOfStock2": {
"log": "Monitoring..."
},
"UnAvailable": {
"log": "Failed to get item. Monitoring..."
}
},
"taskLogic": {
"InStock": "addToCart",
"OutOfStock": "Monitor",
"OutOfStock2": "Monitor",
"getStoreLocations": "Monitor",
"end": "Monitor"
}
}
},
"addToCart": {
"name": "addToCart",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 1000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/web_checkouts/v1/cart_items?field_groups=CART%2CCART_ITEMS%2CSUMMARY&key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "return JSON.stringify({'cart_type':'REGULAR','channel_id':'10','shopping_context':'DIGITAL','cart_item':{'tcin':taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).product.task_sku,'quantity':taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).product.item_quantity,'item_channel_id':'10'},'fulfillment':{'type':'PICKUP','location_id':taskObjects[TaskID].Variables.store_id,'ship_method':'STORE_PICKUP'}})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": ["addedToCart", "cartFull", "accessTokenInvalid", "DEPENDENT_SERVICE_ERROR", "PID_LOCKED", "proxyBan", "RateLimited"],
"addedToCart": {
"log": "Added To Cart",
"status": 201,
"options": {}
},
"cartFull": {
"log": "Cart Full. Skipping ATC...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "MAX_PURCHASE_LIMIT_EXCEEDED"
}
},
"DEPENDENT_SERVICE_ERROR": {
"log": "Item OOS. Retrying atc...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "DEPENDENT_SERVICE_ERROR"
}
},
"PID_LOCKED": {
"log": "Item PID Locked. Retrying atc...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "Access Denied"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"proxyBan": {
"log": "Proxy Banned. Retrying...",
"status": 404,
"options": {}
},
"RateLimited": {
"log": "Rate Limited. Retrying...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "EC_PLATFORM_RATE_LIMITED"
}
}
},
"taskLogic": {
"addedToCart": "harvestPickupID",
"cartFull": "harvestCartID",
"DEPENDENT_SERVICE_ERROR": "Monitor",
"accessTokenInvalid": "refreshTokens",
"PID_LOCKED": "Monitor",
"proxyBan":"Monitor",
"RateLimited":"addToCart",
"end": "Monitor"
}
}
},
"harvestPickupID": {
"name": "harvestPickupID",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/web_checkouts/v1/pre_checkout?field_groups=ADDRESSES%2CCART%2CCART_ITEMS%2CDELIVERY_WINDOWS%2CPAYMENT_INSTRUCTIONS%2CPICKUP_INSTRUCTIONS%2CPROMOTION_CODES%2CSUMMARY%2CFINANCE_PROVIDERS&key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": "{\"cart_type\":\"REGULAR\"}",
"function": {}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": ["success", "cartFull", "accessTokenInvalid", "RateLimited"],
"success": {
"log": "Got Pickup ID",
"status": 201,
"options": {}
},
"cartFull": {
"log": "Cart Full. Skipping ATC...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "MAX_PURCHASE_LIMIT_EXCEEDED"
}
},
"RateLimited": {
"log": "Rate Limited. Retrying...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "EC_PLATFORM_RATE_LIMITED"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
}
},
"taskLogic": {
"success": "submitPickupPerson",
"cartFull": "harvestCartID",
"accessTokenInvalid": "refreshTokens",
"RateLimited": "harvestPickupID",
"end": "Monitor"
}
}
},
"harvestCartID": {
"name": "harvestCartID",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/web_checkouts/v1/cart?field_groups=CART%2CCART_ITEMS%2CSUMMARY%2CPROMOTION_CODES%2CADDRESSES&key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "PUT",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "return JSON.stringify({'cart_type':'REGULAR'})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": ["success", "cartFull", "accessTokenInvalid", "RateLimited"],
"success": {
"log": "Got cart_id",
"status": 200,
"options": {}
},
"cartFull": {
"log": "Cart Full. Skipping ATC...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "MAX_PURCHASE_LIMIT_EXCEEDED"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"RateLimited": {
"log": "Rate Limited. Retrying...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "EC_PLATFORM_RATE_LIMITED"
}
}
},
"taskLogic": {
"success": "harvestPickupID",
"accessTokenInvalid": "refreshTokens",
"RateLimited": "harvestCartID",
"end": "Monitor"
}
}
},
"submitPickupPerson": {
"name": "submitPickupPerson",
"type": "request",
"start": "getPickupID",
"delay": 0,
"retryDelay": 3001,
"request": {
"requestConfig": {
"url": {
"plainURL": null,
"urlFunction": {
"name": "returnPickupSubmissionEndpoint",
"arguments": "taskObjects, TaskID"
}
},
"method": "PUT",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "profile_info=taskObjects[TaskID].getProfile(TaskID,taskObjects);if(taskObjects[TaskID]['Variables']['cart_id']==null){response=taskObjects[TaskID]['requestHistory']['addToCart'];text=JSON.parse(await response.text());if(JSON.stringify(text).includes('cart_id')==false){response=taskObjects[TaskID]['requestHistory']['harvestCartID'];text=JSON.parse(await response.text())}cart_id=text['cart_id'];taskObjects[TaskID]['Variables']['cart_id']=cart_id}else{cart_id=taskObjects[TaskID]['Variables']['cart_id']};return JSON.stringify({'cart_id':cart_id,'cart_type':'REGULAR','guest_email_id':profile_info['email'],'pickup_instruction':{'first_name':profile_info['shipping_address']['first_name'],'last_name':profile_info['shipping_address']['last_name'],'email':profile_info['email'],'mobile':profile_info['shipping_address']['phone'],'nominee_first_name':'','nominee_last_name':'','nominee_email':''}});"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"success",
"accessTokenInvalid",
"RateLimited"
],
"success": {
"log": "Submitted Pickup Person",
"status": 200,
"options": {}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"RateLimited": {
"log": "Rate Limited. Retrying...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "EC_PLATFORM_RATE_LIMITED"
}
}
},
"taskLogic": {
"success": "submitBilling",
"accessTokenInvalid": "refreshTokens",
"RateLimited":"submitPickupPerson",
"end": "Monitor"
}
}
},
"submitBilling": {
"name": "submitBilling",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/checkout_payments/v1/payment_instructions?key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "billing_info=taskObjects[TaskID].getProfile(TaskID,taskObjects);if(taskObjects[TaskID]['Variables']['cart_id']==null){cart_id=taskObjects[TaskID].getProfile(TaskID,taskObjects);response=taskObjects[TaskID]['requestHistory']['addToCart'];text=JSON.parse(await response.text());if(JSON.stringify(text).includes('cart_id')==false){response=taskObjects[TaskID]['requestHistory']['harvestCartID'];text=JSON.parse(await response.text())}cart_id=text['cart_id'];taskObjects[TaskID]['Variables']['cart_id']=cart_id}else{cart_id=taskObjects[TaskID]['Variables']['cart_id']};if(billing_info['billing_info']['card_details']['expiry_month'].includes('0')==false&&billing_info['billing_info']['card_details']['expiry_month'].length==1){var expiry_month='0'+billing_info['billing_info']['card_details']['expiry_month']}else{var expiry_month=billing_info['billing_info']['card_details']['expiry_month']};let expiry_year=profile_info['billing_info']['card_details']['expiry_year'];if(expiry_year.length==2){expiry_year='20'+expiry_year}return JSON.stringify({'cart_id':cart_id,'wallet_mode':'NONE','payment_type':'CARD','card_details':{'card_name':billing_info['billing_info']['card_details']['card_name'],'card_number':billing_info['billing_info']['card_details']['card_number'],'cvv':billing_info['billing_info']['card_details']['cvv'],'expiry_month':expiry_month,'expiry_year':expiry_year},'billing_address':{'address_line1':billing_info['billing_info']['billing_address']['address_line1'],'city':billing_info['billing_info']['billing_address']['city'],'first_name':billing_info['billing_info']['billing_address']['first_name'],'last_name':billing_info['billing_info']['billing_address']['last_name'],'phone':billing_info['billing_info']['billing_address']['phone'],'state':billing_info['billing_info']['billing_address']['state'],'zip_code':billing_info['billing_info']['billing_address']['zip_code'],'country':'US'}})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"success",
"cardAlreadyPresent",
"serviceUnavailable",
"accessTokenInvalid",
"CART_TOTAL_AMOUNT_ZERO",
"INVALID_PAYMENT_COMBINATION",
"RateLimited"
],
"success": {
"log": "Submitting Order",
"status": 201,
"options": {}
},
"serviceUnavailable": {
"log": "Service Unavailable",
"status": 424,
"options": {}
},
"CART_TOTAL_AMOUNT_ZERO": {
"log": "Cart is Empty. Check QTY.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "CART_TOTAL_AMOUNT_ZERO"
}
},
"cardAlreadyPresent": {
"log": "Submitting Order",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "CARD_PAYMENT_EXIST"
}
},
"INVALID_PAYMENT_COMBINATION": {
"log": "Submitting Order",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "INVALID_PAYMENT_COMBINATION"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"RateLimited": {
"log": "Rate Limited. Retrying...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "EC_PLATFORM_RATE_LIMITED"
}
}
},
"taskLogic": {
"success": "harvestImg9",
"cardAlreadyPresent": "harvestImg9",
"CART_TOTAL_AMOUNT_ZERO":"Monitor",
"serviceUnavailable":"Monitor",
"accessTokenInvalid": "refreshTokens",
"INVALID_PAYMENT_COMBINATION": "harvestImg9",
"RateLimited":"submitBilling",
"end": "Monitor"
}
}
},
"resubmitCVV": {
"name": "resubmitCVV",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": null,
"urlFunction": {
"name": "returnResubmitCVVUrl",
"arguments": "taskObjects, TaskID"
}
},
"method": "PUT",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "billing_info=taskObjects[TaskID].getProfile(TaskID, taskObjects);cart_id=taskObjects[TaskID]['Variables']['cart_id'];return JSON.stringify({'cart_id':cart_id,'wallet_mode':'NONE','payment_type':'CARD','card_details':{'cvv':billing_info['billing_info']['card_details']['cvv']}})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"success",
"cardAlreadyPresent",
"accessTokenInvalid",
"RateLimited"
],
"success": {
"log": "Resubmitted CVV",
"status": 200,
"options": {}
},
"cardAlreadyPresent": {
"log": "Submitting Order",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "CARD_PAYMENT_EXIST"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"RateLimited": {
"log": "Rate Limited. Retrying...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "EC_PLATFORM_RATE_LIMITED"
}
}
},
"taskLogic": {
"success": "submitCheckout",
"cardAlreadyPresent": "submitCheckout",
"accessTokenInvalid": "refreshTokens",
"RateLimited":"resubmitCVV",
"end": "Monitor"
}
}
},
"harvestImg9": {
"name": "harvestImg9",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 3000,
"request": {
"requestConfig": {
"url": {
"plainURL": "http://localhost:5634/img9-moment"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "let account=taskObjects[TaskID].getAccount(TaskID,taskObjects);let cookies=account.cookies;let Access_Token=cookies.accessToken;let idToken=cookies.idToken;return JSON.stringify({accessToken:Access_Token,idToken:idToken,})"
}
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": false,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"success",
"badRequest"
],
"success": {
"log": "Submitting Order",
"status": 200,
"options": {}
},
"badRequest": {
"log": "Error with Img9",
"status": 400,
"options": {}
}
},
"taskLogic": {
"success": "submitCheckout",
"badRequest": "harvestImg9",
"end": "submitCheckout"
}
}
},
"submitCheckout": {
"name": "submitCheckout",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 6000,
"request": {
"requestConfig": {
"url": {
"plainURL": "https://carts.target.com/web_checkouts/v1/checkout?field_groups=ADDRESSES%2CCART%2CCART_ITEMS%2CDELIVERY_WINDOWS%2CPAYMENT_INSTRUCTIONS%2CPICKUP_INSTRUCTIONS%2CPROMOTION_CODES%2CSUMMARY&key=feaf228eb2777fd3eee0fd5192ae7107d6224b39"
},
"method": "POST",
"headers": {
"authority": "carts.target.com",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"90\", \"Google Chrome\";v=\"90\"",
"accept": "application/json",
"x-application-name": "web",
"sec-ch-ua-mobile": "?0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"content-type": "application/json",
"origin": "https://www.target.com",
"sec-fetch-site": "same-site",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "https://www.target.com/p/wahl-lithium-ion-pro-men-s-cordless-haircut-kit-with-finishing-trimmer-soft-storage-case-79600-3301/-/A-13794872",
"accept-language": "en-US,en;q=0.5"
},
"body": {
"plainBody": "{\"cart_type\":\"REGULAR\",\"channel_id\":10}",
"function": null
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": true,
"useSessionCookies": true
}
},
"logic": {
"functionLogic": {
"reqStatuses": [
"checkout2",
"PaymentDecline",
"RateLimited",
"MISSING_CREDIT_CARD_CVV",
"MISSING_OR_INVALID_PAYMENT_DETAILS",
"accessTokenInvalid",
"CREDIT_CARD_COMPARE_REQUIRED",
"EMPTY_CART_FOR_ORDER_SUBMIT"
],
"checkout2": {
"log": "Submitted Checkout.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "orders"
}
},
"PaymentDecline": {
"log": "Payment Declined.",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "PAYMENT_DECLINED_EXCEPTION"
}
},
"RateLimited": {
"log": "Rate Limited. Retrying...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "EC_PLATFORM_RATE_LIMITED"
}
},
"MISSING_CREDIT_CARD_CVV": {
"log": "MISSING_CREDIT_CARD_CVV",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "MISSING_CREDIT_CARD_CVV"
}
},
"MISSING_OR_INVALID_PAYMENT_DETAILS": {
"log": "MISSING_OR_INVALID_PAYMENT_DETAILS",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "MISSING_OR_INVALID_PAYMENT_DETAILS"
}
},
"CREDIT_CARD_COMPARE_REQUIRED": {
"log": "CREDIT_CARD_COMPARE_REQUIRED",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "CREDIT_CARD_COMPARE_REQUIRED"
}
},
"accessTokenInvalid": {
"log": "Invalid Access Token ",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"EMPTY_CART_FOR_ORDER_SUBMIT": {
"log": "Cart Empty",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "EMPTY_CART_FOR_ORDER_SUBMIT"
}
}
},
"taskLogic": {
"checkout2": "logCheckout",
"PaymentDecline": "Monitor",
"MISSING_CREDIT_CARD_CVV": "resubmitCVV",
"EMPTY_CART_FOR_ORDER_SUBMIT": "Monitor",
"itemNotAvailableYet": "Monitor",
"CREDIT_CARD_COMPARE_REQUIRED": "submitBilling",
"accessTokenInvalid": "Monitor",
"RateLimited":"submitCheckout",
"MISSING_OR_INVALID_PAYMENT_DETAILS": "submitBilling",
"end": "Monitor"
}
}
},
"logCheckout": {
"name": "logCheckout",
"type": "function",
"start": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "const response=taskObjects[TaskID].requestHistory.submitCheckout;const body_text=JSON.parse(await response.text());let item_info;const data=JSON.parse(taskObjects[TaskID].requestHistory.addToCart.data);let sku=taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).product.task_sku.split(':')[0];const cart_item=body_text.orders[0].cart_items.find((cart_item)=>{return cart_item.tcin===sku});try{item_info={Title:cart_item.item_attributes.description,Image:data.item_attributes.image_path,Price:cart_item.unit_price,}}catch{item_info={Title:'N/A',Image:'',Price:'',}};let orderID;try{orderID=body_text.orders[0].order_id}catch{orderID='N/A'};let checkoutInfo={product_info:item_info,Task_Info:taskObjects[TaskID].getTaskInfo(TaskID,taskObjects)};const getProxyName=()=>{try{let taskGroupId=taskObjects[TaskID].TaskGroupID;let taskGroups=taskObjects.taskGroups;let proxyGroups=taskObjects.proxyGroups;let task_info=taskGroups.find((group)=>group.id===taskGroupId).tasks.find((task)=>task.id===TaskID);let proxy_group_id=task_info.task_proxy_info.proxy_group_id;if(task_info.task_proxy_info.localhost){return'localhost'};return proxyGroups.find((group)=>group.id===proxy_group_id).name}catch{return'N/A'}};let config={'content':null,'embeds':[{'title':'Successfully checked out!','description':checkoutInfo.product_info.Title,'color':3297740,'image':{'url':checkoutInfo.product_info.Image},'fields':[{'name':'Site','value':checkoutInfo.Task_Info.product.site,'inline':true},{'name':'SKU','value':checkoutInfo.Task_Info.product.task_sku,'inline':true},{'name':'Quantity','value':checkoutInfo.Task_Info.product.item_quantity,'inline':true},{'name':'Mode','value':checkoutInfo.Task_Info.task_settings.task_mode,'inline':true},{'name':'Profile','value':'||'+taskObjects[TaskID].getProfile(TaskID,taskObjects).profile_name+'||','inline':true},{'name':'Account Email','value':'||'+taskObjects[TaskID].getAccount(TaskID,taskObjects).username+'||','inline':true},{'name':'Account Password','value':'||'+taskObjects[TaskID].getAccount(TaskID,taskObjects).password+'||','inline':true},{'name':'Order #','value':'||'+orderID+'||','inline':true},{'name':'Proxy','value':'||'+getProxyName()+'||','inline':true}],'footer':{'text':'LexAIO v2 Success','icon_url':'https://avatars1.githubusercontent.com/u/76762917?s=40&v=4'},'timestamp':timestamp()}]};function timestamp(){const timeElapsed=Date.now();const today=new Date(timeElapsed);return today.toISOString()};checkoutInfo.config=config;process.send({'type':'SuccessfulCheckout','CheckoutInfo':checkoutInfo});if(taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).task_advanced_info.loopCheckout){taskObjects[TaskID]['Cookies']=[];taskObjects[TaskID]['Variables']['cart_id']=null;return'restart'}else{return'Checkout'}"
},
"logic": {
"functionLogic": {
"reqStatuses": ["success", "restart"],
"success": {
"log": "Submitted Checkout. "
},
"restart": {
"log": "Restart Checkout."
},
"Decline": {
"log": "Payment Declined. "
}
},
"taskLogic": {
"Checkout": "end",
"restart": "submitShipping",
"Decline": "end",
"end": "end"
}
}
},
"end": "exit"
}
}
},
"monitor":{
"Shipping": {
"entryPoint": "getItemInfo",
"variables": [
"ItemInfo",
"ItemAvailability"
],
"taskStatistics":{
"addedToCart":"taskCartCount",
"addedToCart2":"taskCartCount",
"successfulCheckout": "taskCountCheckedOut",
"checkout2": "taskCountCheckedOut",
"PaymentDecline": "taskCountDeclined",
"Decline": "taskCountDeclined"
},
"captchaHarvester": true,
"helperFunctions": {
"returnTaskTCIN2": {
"arguments": "taskObjects, TaskID",
"body": "return `https://redsky.target.com/redsky_aggregations/v1/web/plp_fulfillment_v1?key=ff457966e64d5e877fdbad070f276d18ecec4a01&tcins=`+taskObjects[TaskID].getTaskInfo(TaskID, taskObjects).product.task_sku+`&store_id=1350&store_positions_store_id=1350&has_store_positions_store_id=true&zip=46037&state=IN&latitude=39.970&longitude=-85.920&scheduled_delivery_store_id=1350&pricing_store_id=1350&has_pricing_store_id=true`"
},
"returnTaskTCIN": {
"arguments": "taskObjects, TaskID",
"body": "return `https://redsky.target.com/redsky_aggregations/v1/web/pdp_fulfillment_v1?key=ff457966e64d5e877fdbad070f276d18ecec4a01&tcin=`+taskObjects[TaskID].getTaskInfo(TaskID, taskObjects).product.task_sku+`&store_id=1350&store_positions_store_id=1350&has_store_positions_store_id=true&zip=11183&state=AM&latitude=31.970&longitude=35.900&pricing_store_id=1350&has_pricing_store_id=true&is_bot=false`"
},
"parseItemInfo": {
"arguments": "taskObjects, TaskID",
"body": "let lastItem=taskObjects[TaskID]['CallStack'][taskObjects[TaskID]['CallStack'].length-2];let response=taskObjects[TaskID]['requestHistory'][lastItem];let responseText=response.data;if(responseText.includes('product_summaries')){try{let text=JSON.parse(responseText);for(let prod of text['data']['product_summaries']){var stat=prod['fulfillment']['shipping_options']['availability_status'];if(stat!='OUT_OF_STOCK'&&stat!='DISCONTINUED'&&stat!='PRE_ORDER_UNSELLABLE'){taskObjects[TaskID]['Variables']['ItemAvailability']=true;taskObjects[TaskID]['Variables']['tcin']=prod.tcin;return}}}catch(e){console.log(e);taskObjects[TaskID]['Variables']['ItemAvailability']=false;return};taskObjects[TaskID]['Variables']['ItemAvailability']=false}else{try{let text=JSON.parse(responseText);var stat=text['data']['product']['fulfillment']['shipping_options']['availability_status'];let stock_count=text['data']['product']['fulfillment']['shipping_options']['available_to_promise_quantity'];if(stat!='OUT_OF_STOCK'&&stat!='DISCONTINUED'&&stat!='PRE_ORDER_UNSELLABLE'){taskObjects[TaskID]['Variables']['ItemAvailability']=true;taskObjects[TaskID]['Variables']['tcin']=text.data.product.tcin;return}}catch(e){console.log(e);taskObjects[TaskID]['Variables']['ItemAvailability']=false;return};taskObjects[TaskID]['Variables']['ItemAvailability']=false}return;"
}
},
"logStatusColors": {
"success": "magenta",
"addedToCart":"magenta",
"checkout2":"green",
"successfulCheckout":"green",
"OutOfStock": "cyan",
"OutOfStock2": "cyan",
"NoLoadedTCINs": "cyan",
"cartFull": "yellow",
"logCheckout": "green",
"PID_LOCKED": "yellow",
"processing": "yellow",
"error": "yellow",
"fail": "red",
"InStock": "cyan",
"shippingAlreadyPresent": "cyan"
},
"functions": {
"getItemInfo": {
"name": "getItemInfo",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 55500,
"request": {
"requestConfig": {
"url": {
"plainURL": null,
"urlFunction": {
"name": "returnTaskTCIN",
"arguments": "taskObjects, TaskID"
}
},
"method": "GET",
"headers": {
"accept": "application/json",
"accept-language": "en-US,en;q=0.9,ar-JO;q=0.8,ar;q=0.7",
"sec-ch-ua": "\"Chromium\";v=\"86\", \"\\\"Not\\\\A;Brand\";v=\"99\", \"Google Chrome\";v=\"86\"",
"sec-ch-ua-mobile": "?0",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-site",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"
},
"body": {
"plainBody": null,
"function": null
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": false,
"useSessionCookies": false
}
},
"logic": {
"functionLogic": {
"reqStatuses": ["success", "BadTCIN","Throttle","fail", "accessTokenInvalid", "429", "InvalidTCIN"],
"success": {
"log": "Checking stock...",
"status": 200,
"options": {}
},
"BadTCIN": {
"log": "TCIN Not Loaded. (400) Monitoring...",
"status": 400,
"options": {}
},
"fail": {
"log": "Failed to get item",
"status": 444,
"options": {}
},
"Throttle": {
"log": "Monitoring... (404)",
"status": 404,
"options": {}
},
"429": {
"log": "SKU rate limited. Check SKU list. (Monitoring)",
"status": 429,
"options": {}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"InvalidTCIN": {
"log": "TCIN Not Loaded. Monitoring...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "No product found with tcin"
}
}
},
"taskLogic": {
"success": "Monitor",
"BadTCIN": "getItemInfo2",
"fail": "getItemInfo2",
"Throttle":"getItemInfo2",
"InvalidTCIN": "getItemInfo2",
"429": "getItemInfo2",
"end": "getItemInfo2"
}
}
},
"getItemInfo2": {
"name": "getItemInfo2",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 500,
"request": {
"requestConfig": {
"url": {
"plainURL": null,
"urlFunction": {
"name": "returnTaskTCIN2",
"arguments": "taskObjects, TaskID"
}
},
"method": "GET",
"headers": {
"accept": "application/json",
"accept-language": "en-US,en;q=0.9,ar-JO;q=0.8,ar;q=0.7",
"sec-ch-ua": "\"Chromium\";v=\"86\", \"\\\"Not\\\\A;Brand\";v=\"99\", \"Google Chrome\";v=\"86\"",
"sec-ch-ua-mobile": "?0",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-site",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"
},
"body": {
"plainBody": null,
"function": null
}
},
"requestOptions": {
"useTLS": true,
"cookies": null,
"proxies": true,
"saveSessionCookies": false,
"useSessionCookies": false
}
},
"logic": {
"functionLogic": {
"reqStatuses": ["success", "NoLoadedTCINs", "BadTCIN", "fail", "accessTokenInvalid", "429", "InvalidTCIN"],
"success": {
"log": "Monitoring...",
"status": 200,
"options": {}
},
"BadTCIN": {
"log": "TCIN Not Loaded. (400) Monitoring...",
"status": 400,
"options": {}
},
"NoLoadedTCINs": {
"log": "Monitoring... (404)",
"status": 404,
"options": {}
},
"fail": {
"log": "Failed to get item",
"status": 444,
"options": {}
},
"429": {
"log": "SKU rate limited. Check SKU list. (Monitoring)",
"status": 429,
"options": {}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
},
"InvalidTCIN": {
"log": "TCIN Not Loaded. Monitoring...",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "No product found with tcin"
}
}
},
"taskLogic": {
"success": "Monitor",
"BadTCIN": "getItemInfo2",
"fail": "getItemInfo2",
"InvalidTCIN": "getItemInfo2",
"429": "getItemInfo2",
"NoLoadedTCINs": "getItemInfo2",
"end": "getItemInfo2"
}
}
},
"Monitor": {
"name": "Monitor",
"type": "function",
"start": "parseItemInfo",
"function": {
"arguments": "taskObjects, TaskID",
"body": "taskObjects[TaskID].setProxy(TaskID, taskObjects);taskObjects[TaskID].Cookies = taskObjects[TaskID].Cookies.filter((cookie) => !cookie.includes('mitata'));taskObjects[TaskID].setProxy(TaskID, taskObjects);taskObjects[TaskID].Cookies = taskObjects[TaskID].Cookies.filter((cookie) => !cookie.includes('mitata'));monitorEvent.emit(taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).product.task_sku,{site:'Target',inStock:taskObjects[TaskID]['Variables']['ItemAvailability'],SKU:taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).product.task_sku});if(taskObjects[TaskID]['Variables']['ItemAvailability']==true){return'InStock'}else{return'OutOfStock'}"
},
"logic": {
"functionLogic": {
"reqStatuses": ["InStock", "OutOfStock", "UnAvailable"],
"InStock": {
"log": "Item in Stock. Alerting Task..."
},
"OutOfStock": {
"log": "Monitoring..."
},
"OutOfStock2": {
"log": "Monitoring..."
},
"UnAvailable": {
"log": "Failed to get item. Monitoring..."
}
},
"taskLogic": {
"InStock": "getItemInfo",
"OutOfStock": "getItemInfo",
"OutOfStock2": "getItemInfo2",
"UnAvailable": "getItemInfo",
"end": "getItemInfo2"
}
}
},
"end": "exit"
}
},
"Pickup": {
"entryPoint": "CheckLocationStock2",
"variables": [
"ItemInfo",
"ItemAvailability"
],
"taskStatistics":{
"addedToCart":"taskCartCount",
"addedToCart2":"taskCartCount",
"successfulCheckout": "taskCountCheckedOut",
"checkout2": "taskCountCheckedOut",
"PaymentDecline": "taskCountDeclined",
"Decline": "taskCountDeclined"
},
"captchaHarvester": true,
"helperFunctions": {
"returnLocationMonitorURL2": {
"arguments": "taskObjects, TaskID",
"body": "let mileRadius = 100;if (taskObjects[TaskID].getTaskInfo(TaskID, taskObjects).product.task_sku.includes(':') === true) {mileRadius = taskObjects[TaskID].getTaskInfo(TaskID, taskObjects).task_settings.mile_radius;};let zip_code = taskObjects[TaskID].getTaskInfo(TaskID, taskObjects).task_settings.zip_code;return `https://redsky.target.com/redsky_aggregations/v1/web_platform/fiats_v1?key=ff457966e64d5e877fdbad070f276d18ecec4a01&nearby=` + zip_code + `&limit=100&requested_quantity=1&radius=` + mileRadius + `&include_only_available_stores=true&tcin=` + taskObjects[TaskID].getTaskInfo(TaskID, taskObjects).product.task_sku;"
}
},
"logStatusColors": {
"success": "magenta",
"addedToCart":"magenta",
"checkout2":"green",
"successfulCheckout":"green",
"OutOfStock": "cyan",
"OutOfStock2": "cyan",
"NoLoadedTCINs": "cyan",
"cartFull": "yellow",
"logCheckout": "green",
"PID_LOCKED": "yellow",
"processing": "yellow",
"error": "yellow",
"fail": "red",
"InStock": "cyan",
"shippingAlreadyPresent": "cyan"
},
"functions": {
"CheckLocationStock2": {
"name": "CheckLocationStock2",
"type": "request",
"start": null,
"delay": 0,
"retryDelay": 500,
"request": {
"requestConfig": {
"url": {
"plainURL": null,
"urlFunction": {
"name": "returnLocationMonitorURL2",
"arguments": "taskObjects, TaskID"
}
},
"method": "GET",
"headers": {
"accept": "application/json",
"accept-language": "en-US,en;q=0.9,ar-JO;q=0.8,ar;q=0.7",
"sec-ch-ua": "\"Chromium\";v=\"86\", \"\\\"Not\\\\A;Brand\";v=\"99\", \"Google Chrome\";v=\"86\"",
"sec-ch-ua-mobile": "?0",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-site",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"
},
"body": {
"plainBody": null,
"function": null
}
},
"requestOptions": {
"useTLS": false,
"cookies": null,
"proxies": true,
"saveSessionCookies": false,
"useSessionCookies": false
}
},
"logic": {
"functionLogic": {
"reqStatuses": ["success", "BadTCIN", "fail", "Throttle","accessTokenInvalid", "429"],
"success": {
"log": "Got Location Stock",
"status": 200,
"options": {}
},
"BadTCIN": {
"log": "TCIN Not Loaded. (400) Monitoring...",
"status": 400,
"options": {}
},
"Throttle": {
"log": "Failed to get Location Stock (404)",
"status": 404,
"options": {}
},
"fail": {
"log": "Failed to get item",
"status": 444,
"options": {}
},
"429": {
"log": "SKU rate limited. Check SKU list. (Monitoring)",
"status": 429,
"options": {}
},
"accessTokenInvalid": {
"log": "Invalid Access Token",
"status": null,
"options": {
"type": "responseBodyIncludes",
"responseBodyIncludes": "no authorization header found"
}
}
},
"taskLogic": {
"success": "Monitor",
"BadTCIN": "CheckLocationStock2",
"fail": "CheckLocationStock2",
"Throttle":"CheckLocationStock2",
"accessTokenInvalid": "CheckLocationStock2",
"429": "CheckLocationStock2",
"end": "Monitor"
}
}
},
"Monitor": {
"name": "Monitor",
"type": "function",
"start": null,
"function": {
"arguments": "taskObjects, TaskID",
"body": "taskObjects[TaskID].setProxy(TaskID, taskObjects);taskObjects[TaskID].Cookies = taskObjects[TaskID].Cookies.filter((cookie) => !cookie.includes('mitata'));try{let response=JSON.parse(await taskObjects[TaskID].requestHistory.CheckLocationStock2.text());let locations=response.data.fulfillment_fiats.locations;if(locations.length>0){let store=locations.sort((a,b)=>(a.location_available_to_promise_quantity>b.location_available_to_promise_quantity)?1:((b.location_available_to_promise_quantity>a.location_available_to_promise_quantity)?-1:0));store.reverse();monitorEvent.emit(taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).product.task_sku,{site:'Target',inStock:true,SKU:taskObjects[TaskID].getTaskInfo(TaskID,taskObjects).product.task_sku,store_id:store[0].location_id});return'InStock'}else{return'OutOfStock'}}catch(e){console.log(e);return'OutOfStock'}"
},
"logic": {
"functionLogic": {
"reqStatuses": ["InStock", "OutOfStock", "UnAvailable"],
"InStock": {
"log": "Item in Stock. Alerting Task..."
},
"OutOfStock": {
"log": "Monitoring..."
},
"OutOfStock2": {
"log": "Monitoring..."
},
"UnAvailable": {
"log": "Failed to get item. Monitoring..."
}
},
"taskLogic": {
"InStock": "CheckLocationStock2",
"OutOfStock": "CheckLocationStock2",
"OutOfStock2": "CheckLocationStock2",
"UnAvailable": "CheckLocationStock2",
"end": "CheckLocationStock2"
}
}
},
"end": "exit"
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment