Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const rp = require("request-promise")
- const getPookyUrl = (region) => {
- let usPooky = "https://pooky.dev:1337/gen?token=h20-44a81-s28dn-8ad9s"
- let euPooky = "https://pooky.dev:1337/gen?token=h20-44a81-s28dn-8ad9s®ion=eu"
- return region === 'SupremeUS' ? usPooky : euPooky
- }
- const iPhone6 = {
- 'name': 'iPhone 6',
- 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
- 'viewport': {
- 'width': 375,
- 'height': 667,
- 'deviceScaleFactor': 2,
- 'isMobile': true,
- 'hasTouch': true,
- 'isLandscape': false
- }
- };
- function sleep(ms) {
- return new Promise(resolve => {
- setTimeout(resolve, ms)
- })
- }
- const encodeVariants = (variants) => {
- let varObj = {}
- variants.forEach(v => varObj[v] = 1)
- return encodeURIComponent(JSON.stringify(varObj).replace(/'/g, '"'))
- }
- const getCheckoutData = (region, variants) => {
- const usCheckoutData = {
- 'store_credit_id': '',
- 'from_mobile': '1',
- 'cookie-sub': encodeVariants(variants),
- 'same_as_billing_address': '1',
- 'scerkhaj': 'CKCRSUJHXH',
- 'order[bn]': "Daniel Young",
- 'order[billing_name]': "",
- 'order[email]': "[email protected]",
- 'order[tel]': "2155123271",
- 'order[billing_address]': "3561 Meadowlark Drive",
- 'order[billing_address_2]': "",
- 'order[billing_zip]': "19006",
- 'order[billing_city]': "Huntingdon Valley",
- 'order[billing_state]': "Pennsylvania",
- 'order[billing_country]': "United States",
- 'riearmxa': "4478874829206427",
- 'credit_card[month]': "02",
- 'credit_card[year]': "2020",
- 'rand': '',
- 'credit_card[meknk]': "717",
- 'order[terms]': 0,
- 'order[terms]': 1,
- 'g-recaptcha-response': "03AOLTBLRb_A0LF2utI5YYdYjkrIM2FZgxO4dLjQpwsGVSMuGAwdkK03VN-2Sq5r1G3BG6xFQeoxU-6ZWcwfsJaE-qrU4fFtlU2oyMb37_NtgPPUbsGE4rJxDRv3hKNZez1BTIQehk2taTXhFe9vtk0-9ro41486uTgk_9SxRSDMbpuU8ckeju1tXWzfNVetDOLEH66U7mROk3NpZYYUj8-A6wu7J9HAC1PGiVDlfDVAH8RmQQXEyYRQWSMfbsdeTN9OlypInmcRWHN59iXi9SieCdzH6Q1W35tOurTPzvU8LKHfjEUwN9b2wsMnato0zQlgui0sGTkCGPeXbQNTYcCiiZKwbjWuhckUGd_3OMfKPRpnctCrPAdxQ55aogYjjtHQCmj7-E4Y10dZIdZFQoEypqXWqwCC343w"
- }
- return region === 'SupremeUS' ? usCheckoutData : euCheckoutData
- }
- class SupremeClient {
- constructor(task) {
- this.task = task
- //keep track
- this.pookyString;
- //TODO: implement stop
- this.stopped = false;
- this.canStart = true;
- this.rp = rp.defaults({ jar: true, json: true });
- }
- async start() {
- console.log("Starting task")
- this.stopped = false;
- this.canStart = false;
- }
- async stop() {
- console.log(`Stopping task`)
- this.canStart = true;
- this.stopped = true;
- }
- async getItem() {
- if (!this.stopped) {
- const category = this.task.category;
- const keywords = this.task.keywords;
- console.log("keywords:", keywords)
- const time = (new Date()).getTime();
- let options = {
- url: `https://www.supremenewyork.com/shop.json?_=${time}`,
- method: 'get',
- headers: {
- 'User-Agent': iPhone6.userAgent
- }
- };
- console.log(options)
- try {
- let response = await this.rp(options)
- const parsedProducts = response['products_and_categories']
- var parsedNewProducts = []
- //TODO: modify depending on values in html.
- if (category === 'All') {
- for (let category of Object.values(parsedProducts)) {
- for (let product of category) {
- parsedNewProducts.push(product)
- }
- }
- } else {
- if (category === 'New')
- parsedNewProducts = parsedProducts['new'];
- else
- parsedNewProducts = parsedProducts[category];
- }
- const positiveKeywords = keywords.split(',').filter(keyword => keyword.includes('+')).map(keyword => keyword.replace('+', '').trim());
- const negativeKeywords = keywords.split(',').filter(keyword => keyword.includes('-')).map(keyword => keyword.replace('-', '').trim());
- console.log(positiveKeywords, negativeKeywords)
- for (let product of parsedNewProducts) {
- let productTitle = product.name.replace(/[\u{0080}-\u{FFFF}]/gu, "")
- let productId = product.id
- var posNum = 0
- var negNum = 0
- for (let posKw of positiveKeywords) {
- if (productTitle.toLowerCase().includes(posKw.toLowerCase().trim())) {
- posNum++
- }
- }
- for (let negKw of negativeKeywords) {
- if (productTitle.toLowerCase().includes(negKw.toLowerCase().trim())) {
- negNum++
- }
- }
- if (posNum === positiveKeywords.length && negNum === 0) {
- // productTitle , productId
- //TODO: add error handling if no product is found
- console.log("found product", productTitle, productId)
- return await this.getSizes(productId)
- }
- }
- } catch (err) {
- console.log(`Error getting item: ${err.message}`)
- await this.getItem()
- }
- }
- }
- async getSizes(productId) {
- if (!this.stopped) {
- console.log("Finding Size")
- let productColorPref = this.task.color;
- let productSizePref = this.task.size;
- let options = {
- url: `https://www.supremenewyork.com/shop/${productId}.json`,
- method: 'get',
- headers: {
- 'User-Agent': iPhone6.userAgent
- }
- };
- try {
- let response = await this.rp(options)
- const styles = response["styles"]
- console.log(styles)
- let colorId;
- let sizeId;
- for (let style of styles) {
- if (style["name"].toLowerCase() === productColorPref.toLowerCase()) {
- colorId = style["id"]
- for (let size of style["sizes"]) {
- if (productSizePref === "None") {
- sizeId = size['id']
- } else if (size["name"].toLowerCase() === productSizePref.toLowerCase()) {
- sizeId = size["id"];
- break;
- }
- }
- break;
- }
- }
- //TODO: change to status message, maybe add retry?
- if (!colorId || !sizeId) {
- console.log(colorId, sizeId)
- return undefined;
- } else {
- console.log("got colorid and sizeid", colorId, sizeId)
- return await this.atc(colorId, sizeId, productId)
- }
- } catch (err) {
- this.sendStatus("Error Getting Sizes")
- await getSizes(productId)
- console.log(`Error getting sizes: ${err}`)
- }
- }
- }
- async atc(colorId, sizeId, productId, formStyle, formSize) {
- if (!this.stopped) {
- console.log("Adding To Cart")
- let parsedPooky, msBefore
- if (this.task.pooky === "on") {
- msBefore = Date.now()
- parsedPooky = await this.getPooky(false)
- if (!parsedPooky) {
- console.log("Could not get pooky cookies... stopping.")
- return this.stopped = true;
- }
- }
- //TODO: check region, proxy support
- let options = {
- url: `https://www.supremenewyork.com/shop/${productId}/add.json`,
- method: 'POST',
- headers: {
- 'Host': 'www.supremenewyork.com',
- 'Accept': 'application/json',
- "Content-Type": "application/x-www-form-urlencoded",
- 'X-Requested-With': 'XMLHttpRequest',
- 'Pragma': 'no-cache',
- 'Cache-Control': 'no-cache',
- 'Accept-Language': 'en-us',
- 'Origin': 'https://www.supremenewyork.com',
- 'User-Agent': "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1",
- 'Referer': 'https://www.supremenewyork.com/mobile',
- 'Connection': 'keep-alive',
- },
- form: {
- "qty": "1"
- },
- proxy: this.task.proxy
- };
- if (this.task.site === "SupremeUS") {
- options["form"]["s"] = sizeId
- options["form"]["st"] = colorId
- } else {
- options["form"]["size"] = sizeId
- options["form"]["style"] = colorId
- }
- if (this.task.pooky === "on") {
- options["headers"]["cookie"] = `lastid=${msBefore}; ${parsedPooky}`
- }
- console.log(options["form"])
- try {
- let response = await this.rp(options)
- console.log("atc response:", response)
- //TODO: check
- if (response[0].in_stock === true) {
- console.log("Added to cart")
- return await this.checkout(sizeId)
- } else {
- console.log("Error")
- sleep(1000)
- return this.atc(colorId, sizeId, productId)
- }
- } catch (err) {
- console.log(`Error adding to cart: ${err.message}`)
- }
- }
- }
- async checkout(variant) {
- if (!this.stopped) {
- let parsedPooky, msBefore
- if (this.task.pooky === "on") {
- msBefore = Date.now()
- parsedPooky = await this.getPooky(true)
- if (!parsedPooky) {
- console.log("Could not get pooky cookies... stopping.")
- return this.stopped = true;
- }
- }
- //TODO: use promise.all or something to get captcha and pooky at same time..
- let options = {
- url: `https://www.supremenewyork.com/checkout.json`,
- method: 'post',
- headers: {
- 'Accept': 'application/json',
- 'accept-encoding': 'gzip, deflate, br',
- 'Accept-Language': 'en-US,en;q=0.9',
- 'Origin': 'https://www.supremenewyork.com',
- 'Referer': 'https://www.supremenewyork.com/mobile/',
- "Content-Type": "application/x-www-form-urlencoded",
- 'User-Agent': "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1",
- 'X-Requested-With': 'XMLHttpRequest',
- 'sec-fetch-mode': 'cors',
- 'sec-fetch-site': 'same-origin'
- },
- formData: getCheckoutData(this.task.site, [variant]),
- // proxy: this.task.proxy,
- resolveWithFullResponse: true
- };
- if (this.task.pooky === "on") {
- options["headers"]["cookie"] = `lastid=${msBefore}; ${parsedPooky}`
- }
- try {
- console.log("Checking Out")
- await sleep(3)
- let response = await this.rp(options)
- console.log(response.body)
- if (response.status === 'failed') {
- console.log('Failed to checkout')
- } else if (response.status === 'outOfStock') {
- console.log("Item OOS")
- } else if (response.status === 'queued') {
- console.log('Queued...')
- console.log(response.slug)
- }
- } catch (err) {
- console.log(`Error checking out: ${err.message}`)
- return this.stopped = true;
- }
- }
- }
- /*async checkSlug(slug) {
- try {
- const res = await this.rp(`https://www.supremenewyork.com/checkout/${slug}/status.json`)
- if (res.data.status === 'queued') {
- console.log('In queue.. Checking again in 1s')
- await sleep(1000)
- return this.checkStatus(slug)
- } else if (res.data.status === 'failed') {
- console.log(res.data)
- console.log('Failed to checkout')
- } else if (res.data.status === "success") {
- console.log("Checkout Success")
- }
- } catch (err) {
- console.log("Error checking slug", err.message)
- }
- }*/
- async getPooky(isCheckout) {
- let pookyUrl = (isCheckout) ? `${getPookyUrl(this.task.site)}&pookyuuid=${this.pookyString}` : getPookyUrl(this.task.site);
- let options = {
- url: pookyUrl,
- method: 'get'
- };
- console.log(options)
- try {
- let response = await this.rp(options)
- console.log("pooky response", response)
- if (response["status"] === "successful") {
- if (!isCheckout)
- this.pookyString = response["cookie"][0].split("=")[1]
- let pookyString = "";
- for (let cookie of response["cookie"]) {
- pookyString += `${cookie}; `
- }
- console.log("RETURNING POOKY STRING", pookyString)
- return pookyString;
- } else {
- return undefined;
- }
- } catch (err) {
- console.log("Error getting pooky ", err.message)
- }
- }
- }
- var array = {"category": "Accessories", "keywords": "+hanes,+socks", "color": "Red", "size": "N/A", "pooky": "on", "site": "SupremeUS", "timer": ""}
- var Supreme = new SupremeClient(array)
- Supreme.getItem()
Add Comment
Please, Sign In to add comment