Skip to content

Instantly share code, notes, and snippets.

@heape
Created December 8, 2019 19:23
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save heape/8c7ee2b3fa69c9c3c8d793bd420bd7d2 to your computer and use it in GitHub Desktop.
Save heape/8c7ee2b3fa69c9c3c8d793bd420bd7d2 to your computer and use it in GitHub Desktop.
Hentai Pooky for Supreme TEST #001
const util = require('./util.js'); // Download: https://gist.github.com/heape/f1327199405ad2f847ace1c3b07113ce
const url = require('url');
const path = require('path');
const puppeteer = require('puppeteer-extra');
const stealth = require('puppeteer-extra-plugin-stealth');
const sleep = ms => new Promise((r, j) => setTimeout(r, ms));
(async() => {
const userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36';
let browser, page;
const log = function (...args) {
const d = new Date();
const hh = d.getHours();
const mm = d.getMinutes();
const ss = d.getSeconds();
const dd = d.getMilliseconds();
const fmtd = ('00' + hh).slice(-2) + ':' + ('00' + mm).slice(-2) + ':' + ('00' + ss).slice(-2) + ':' + ('000' + dd).slice(-3);
args.push(fmtd);
console.log.apply(this, args);
};
const getPookyState = async() => {
let url, ck, cookie, getHeaders, postHeaders, params, postData, res, $ = null, host;
ck = util.createCookieStore();
cookie = '';
getHeaders = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'ja,en-US;q=0.9,en;q=0.8',
'Cookie': cookie,
};
url = 'https://www.supremenewyork.com/index';
getHeaders['Cookie'] = cookie;
res = await util.request({
method: 'GET',
url: url,
headers: getHeaders,
data: '',
});
if(res.body.includes('pooky')) {
return { enabled: true };
}
return { enabled: false };
};
const monitorItem = async(data) => {
var keyWord = data.keyword; //'+Spitfire,+Wheels'; // +box,+logo,-bear
var categories = ['Jackets', 'Coats', 'Shirts', 'Tops/Sweaters', 'Sweatshirts', 'Pants', 'Shorts', 'T-Shirts', 'Hats', 'Bags', 'Accessories', 'Shoes', 'Skate'];
// 0 -> 'Jackets', 1 -> 'Coats', 2-> 'Shirts', 3 -> 'Tops/Sweaters', 4 ->'Sweatshirts', 5->'Pants', 6->'Shorts', 7->'T-Shirts',
// 8-> 'Hats', 9->'Bags', 10->'Accessories', 11->'Shoes', 12->'Skate'
var category = categories[data.category_id]; //categories[10];
var preferredSize = data.size //'+53mm';
var preferredStyle = data.style //'+white';
var startTime = data.startTime;
var mb_category_url = 'https://www.supremenewyork.com/mobile/#categories/';
var mb_product_url = 'https://www.supremenewyork.com/mobile/#products/';
var pc_category_url = 'https://www.supremenewyork.com/shop/all/';
var mobile_stock_url = 'https://www.supremenewyork.com/mobile_stock.json';
var mobile_shop_url = 'https://www.supremenewyork.com/shop/';
function matchKeyWord(itemName, keyWords) {
        let name = itemName.toLowerCase().trim();
        let keyWordsList = keyWords.toLowerCase().split(',');
        for (let i = 0; i < keyWordsList.length; i ++) {
            let word = keyWordsList[i].trim();
            if ((word.includes('+') && !name.includes(word.substr(1))) ||
                (word.includes('-') && name.includes(word.substr(1)))) {
                return false;
            }
        }
        return true;
};
while (true) {
if ((startTime - new Date().getTime()) <= 0)
break;
await sleep(10);
}
let matched = null;
while (true) {
let headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko',
'Accept': 'application/json',
'X-Requested-With': 'XMLHttpRequest',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'ja;q=1, en-US;q=0.9',
'Cookie': '',
'Connection': 'close',
};
let r = await util.request({
method: 'GET',
headers: headers,
url: mobile_stock_url,
data: ''
});
let json = JSON.parse(r.body);
let jcate = json['products_and_categories'][category];
jcate.some((ele) => {
if (matchKeyWord(ele.name, keyWord)) {
matched = ele;
return true;
}
});
if (matched !== null)
break;
await sleep(data.delay); // you can set the sleep time as a option
}
if (matched !== null) {
product_name = matched['name'];
let mb_url = mb_product_url + matched['id']; var pc_url = '';
mb_item_url = mb_url;
//console.log('mobile_url: ' + mb_product_url + matched['id']);
let img_url = matched['image_url_hi'];
let pos, pos2;
pos = img_url.lastIndexOf('/') + 1;
img_url = img_url.substr(pos);
pos2 = img_url.indexOf('.');
img_url = img_url.substr(0, pos2);
let snippet = img_url;
console.log('finished finding: ');
}
{
let item_id = mb_item_url.substr(mb_item_url.lastIndexOf('/') + 1);
let item_url = mobile_shop_url + item_id + '.json';
let item_add_url = mobile_shop_url + item_id + '/add.json';
var pc_item_add_url = mobile_shop_url + item_id + '/add'
let headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko',
'Accept': 'application/json',
'X-Requested-With': 'XMLHttpRequest',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'ja;q=1, en-US;q=0.9',
'Cookie': '',
'Connection': 'close',
};
let r = await util.request({
method: 'GET',
url: item_url,
headers: headers,
data: '',
});
let j = JSON.parse(r.body);
var matched_style = null;
var matched_size = null;
let styles = j['styles'];
styles.forEach((ele) => {
if (matchKeyWord(ele.name, preferredStyle)) {
if (matched_style != null)
return;
matched_style = ele;
matched_style['sizes'].forEach((ele2) => {
if (matched_size != null)
return;
if (matchKeyWord(ele2.name, preferredSize)) {
matched_size = ele2;
return;
}
});
}
});
if (matched_style == null || matched_size == null)
return;
}
return { matched_style: matched_style, matched_size: matched_size, pc_item_add_url: pc_item_add_url };
};
const addToCart = async(data) => {
let url, ck, cookie, getHeaders, postHeaders, params, postData, res, $ = null, host;
ck = util.createCookieStore();
cookie = data.cookie;
postHeaders = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36',
'Content-Length': '',
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'ja,en-US;q=0.9,en;q=0.8',
'Origin': 'https://www.supremenewyork.com',
'X-CSRF-Token': 'd7miaiWJT35FoG0f7DJMUHhWxvETn65zLm8HOpUXzwYP4swjNgPcMeBTRXPeOIMYWkX/LzKQRAvpj3FHvgtr3Q==',
'X-Requested-With': 'XMLHttpRequest',
'Cookie': cookie,
};
postData = 'utf8=%E2%9C%93&style=_style&size=_size&commit=%E3%82%AB%E3%83%BC%E3%83%88%E3%81%AB%E5%85%A5%E3%82%8C%E3%82%8B';
postData = postData.replace('_style', data.matched_style.id);
postData = postData.replace('_size', data.matched_size.id);
url = data.pc_item_add_url;
postHeaders['Cookie'] = cookie;
postHeaders['Content-Length'] = postData.length;
res = await util.request({
method: 'POST',
url: url,
headers: postHeaders,
data: postData,
});
ck = util.updateCookieStore(ck, cookie, res);
cookie = ck.getAll();
return { body: res.body, cookie: cookie };
};
const cop = async(data) => {
let url, ck, cookie, getHeaders, postHeaders, params, postData, res, $ = null, host;
let resultData;
resultData = await monitorItem({
keyword: data.item.keyword,
category_id: data.item.category_id,
size: data.item.size,
style: data.item.style,
startTime: new Date().getTime(),
delay: 500
});
resultData['cookie'] = data.pookyCookies;
resultData = await addToCart(resultData);
cookie = resultData['cookie'];
// send a checkout request. チェックアウトのリクエストを送信
ck = util.createCookieStore();
postHeaders = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36',
'Content-Length': '',
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'ja,en-US;q=0.9,en;q=0.8',
'Origin': 'https://www.supremenewyork.com',
'X-CSRF-Token': 'd7miaiWJT35FoG0f7DJMUHhWxvETn65zLm8HOpUXzwYP4swjNgPcMeBTRXPeOIMYWkX/LzKQRAvpj3FHvgtr3Q==',
'X-Requested-With': 'XMLHttpRequest',
'Cookie': cookie,
};
const checkoutOptions = {
'g-recaptcha-response': data.checkout['g-recaptcha-response'],
'authenticity_token': 'd7miaiWJT35FoG0f7DJMUHhWxvETn65zLm8HOpUXzwYP4swjNgPcMeBTRXPeOIMYWkX%2FLzKQRAvpj3FHvgtr3Q%3D%3D',
'order[billing_name]': 'flyin3g AAAAAAAAAAAAAAA',
'order[email]': 'catman3323@chromium.org',
'order[tel]': '07014444110',
'order[billing_zip]': '1000000',
'order[billing_state]': '東京都',
'order[billing_city]': '千代田区',
'order[billing_address]': 'epic address',
'same_as_billing_address': '1',
'credit_card[type]': 'cod',
'credit_card[cnb]': '',
'credit_card[month]': '12',
'credit_card[year]': '2019',
'credit_card[vval]': '',
'order[terms]': '1',
};
// 購入に必要な情報を入れる
params = new URLSearchParams('utf8=%E2%9C%93&authenticity_token=d7miaiWJT35FoG0f7DJMUHhWxvETn65zLm8HOpUXzwYP4swjNgPcMeBTRXPeOIMYWkX%2FLzKQRAvpj3FHvgtr3Q%3D%3D&order%5Bbilling_name%5D=flyf+aaafffn&order%5Bemail%5D=abcdeffffa3faf%40gmail.com&order%5Btel%5D=06084831831&order%5Bbilling_zip%5D=1000000&order%5Bbilling_state%5D=+%E6%9D%B1%E4%BA%AC%E9%83%BD&order%5Bbilling_city%5D=%E5%8D%83%E4%BB%A3%E7%94%B0%E5%8C%BA&order%5Bbilling_address%5D=feffefaf%2C+3242&same_as_billing_address=1&credit_card%5Btype%5D=cod&credit_card%5Bcnb%5D=&credit_card%5Bmonth%5D=12&credit_card%5Byear%5D=2019&credit_card%5Bvval%5D=&order%5Bterms%5D=0&order%5Bterms%5D=1&g-recaptcha-response=03AOLTBLTGT3jmzRFAJcy9IxEBjqQtZ3vCSw2283f08I5TZeMJ_MHeYX69jp2o7H8F5ArXjFzohzwoDLintLhbCtPIobIB8QfjshHBjNgPTIFvErd0QFBkSV8kKJIoDLqXyo5K7KBBN8TkmwKKiwev0yIsZRn8TQRlkhJWhJIks2h5rmyAuxgOZwUBAwJHMgwlL5HkV3V1cUA5R8dmn1wL5q3wTy2B3zjCevwIixtw38xkwAIDRT8dx_K-q7UE05x201_b3OeBH9cIUhhzxM-MSJY6zHV9039opeZi4at7s8z8OQJY7u_2WwKfoMu3ei9jDB_UD_MRgPl6wRkg2OS6BHTQgORcOuOD0SGa74Rtse8bB_kIc6oyim4tvkB-KXpBM1jzxI3laFT7ECtM1ToR-DOvtC94SjezDmS0SzlUxriAeianu0vXBKRFpVg5oK9VcxfXFozFMqa31gjMHBijGAAD33aGcYop3TOe8HGm8dZsHYy_bs3v5lhjE5GANvjHua5MEYnayftic7sVrJb4Y75F4ZVannu-aoIH-wm0xiDfmayBrm_Nq0UilGXsEKWsMtKMCkWWgpMf&hpcvv=%E3%81%B8%E3%81%8A%E3%81%82');
for(let k in checkoutOptions) {
params.set(k, checkoutOptions[k]);
}
postData = params.toString();
url = 'https://www.supremenewyork.com/checkout.json';
postHeaders['Cookie'] = cookie;
postHeaders['Content-Length'] = postData.length;
res = await util.request({
method: 'POST',
url: url,
headers: postHeaders,
data: postData,
});
ck = util.updateCookieStore(ck, cookie, res);
cookie = ck.getAll();
console.log(res.body);
return { res };
};
const recaptchaTokens = [];
const pookyDataContainer = [];
const pookyCollector = async(options = { latest: false, }) => {
let result;
if(options['latest']) {
let pookyCookies;
await page.goto('https://www.supremenewyork.com/index', {waitUntil: 'domcontentloaded'});
result = await page.evaluate(() => {
return (async() => {
/*
https://www.supremenewyork.com/shop/skate/gqevjgf8b/n9k0gcp5e
Pookyのクッキーを取得するためにカートに在庫ありの商品を入れる
*/
const addCart = async (matched_size, matched_style) => {
return new Promise((resolve) => {
var hostUrl = 'https://www.supremenewyork.com/shop/6350/add';
var utf8 = '%E2%9C%93';
var style = '24509';
var size = '70768';
var commit = '%E3%82%AB%E3%83%BC%E3%83%88%E3%81%AB%E5%85%A5%E3%82%8C%E3%82%8B';
$.ajax({
url: hostUrl,
type: 'POST',
dataType: 'json',
data: { utf8: decodeURI(utf8), style: style, size: size, commit: decodeURI(commit) },
timeout: 3000,
}).done((data) => {
resolve({ body: data });
}).fail((XMLHttpRequest, textStatus, errorThrown) => {
resolve('error');
});
});
};
let result = (await addCart());
return result;
})();
});
// extract pooky cookies
for(let i = 0; i < 1; i++) {
await page.goto('https://www.supremenewyork.com/checkout', { waitUntil: 'domcontentloaded' });
log('checkout page loaded');
result = await page.evaluate(() => {
window.pookyCallback();
return document.cookie;
});
}
await browser.close();
pookyCookies = result;
pookyDataContainer.push(pookyCookies);
console.log(pookyCookies);
} else {
// use old pooky for testing.
let pookyCookies;
await page.goto('https://www.supremenewyork.com/index', {waitUntil: 'domcontentloaded'});
result = await page.evaluate(() => {
return (async() => {
/*
https://www.supremenewyork.com/shop/skate/gqevjgf8b/n9k0gcp5e
Pookyのクッキーを取得するためにカートに在庫ありの商品を入れる
*/
const addCart = async (matched_size, matched_style) => {
return new Promise((resolve) => {
var hostUrl = 'https://www.supremenewyork.com/shop/6350/add';
var utf8 = '%E2%9C%93';
var style = '24509';
var size = '70768';
var commit = '%E3%82%AB%E3%83%BC%E3%83%88%E3%81%AB%E5%85%A5%E3%82%8C%E3%82%8B';
$.ajax({
url: hostUrl,
type: 'POST',
dataType: 'json',
data: { utf8: decodeURI(utf8), style: style, size: size, commit: decodeURI(commit) },
timeout: 3000,
}).done((data) => {
resolve({ body: data });
}).fail((XMLHttpRequest, textStatus, errorThrown) => {
resolve('error');
});
});
};
// enable pooky
// pookyの有効にするのはチェックアウトページだけいいので、必要ない ※※!!! やっぱり、多分必要!
const sleep = ms => new Promise((r, j) => setTimeout(r, ms));
Date.now = function() { return 1572055192000; };
window.supremetohru = '1507343a92d163ea011ef7228b1f644de41dc0ec143b41cabc3b0aa2b7105283a9845e93268c6f6d5b9de156dcdf732bdce8516e295b0d8fb28933fa3348a273';
const script = document.createElement('script');
script.src = 'https://assets.supremenewyork.com/assets/pooky.min.de852e3e64fac9b6393d.js';
document.body.appendChild(script);
let pookyLoaded = false;
for(let i = 0; i < 3 * 10; i++){
if(window.pookyCallback) {
pookyLoaded = true;
break;
}
await sleep(100);
}
if(!pookyLoaded) {
return 'pooky is not loaded.';
}
let result = (await addCart());
return result;
})();
});
// extract pooky cookies
for(let i = 0; i < 1; i++) {
await page.goto('https://www.supremenewyork.com/checkout', { waitUntil: 'domcontentloaded' });
log('checkout page loaded');
result = await page.evaluate(() => {
return (async() => {
// enable pooky
const sleep = ms => new Promise((r, j) => setTimeout(r, ms));
Date.now = function() { return 1572055192000; };
window.supremetohru = '1507343a92d163ea011ef7228b1f644de41dc0ec143b41cabc3b0aa2b7105283a9845e93268c6f6d5b9de156dcdf732bdce8516e295b0d8fb28933fa3348a273';
const script = document.createElement('script');
script.src = 'https://assets.supremenewyork.com/assets/pooky.min.de852e3e64fac9b6393d.js';
document.body.appendChild(script);
let pookyLoaded = false;
for(let i = 0; i < 3 * 10; i++){
if(window.pookyCallback) {
pookyLoaded = true;
break;
}
await sleep(100);
}
if(!pookyLoaded) {
return 'pooky is not loaded.';
}
window.pookyCallback();
return document.cookie;
})();
});
}
await browser.close();
pookyCookies = result;
pookyDataContainer.push(pookyCookies);
console.log(pookyCookies);
//cookies = result + _supreme_sess; // this is eg. please code your logic
// send a purchasing request
/*
request(...)
*/
}
};
const main = async() => {
puppeteer.use(stealth());
const pookyOptions = { latest: false };
if(pookyOptions.latest) {
while(true) {
const pookyState = await getPookyState();
if(pookyState.enabled) {
log('pooky found.');
break;
}
await sleep(1000);
}
}
// store pooky cookies to pookyDataContainer
for(let i = 0; i < 1; i++) {
browser = await puppeteer.launch({headless: false});
page = await browser.newPage();
await page.setUserAgent(userAgent);
await page.setViewport({
width: 1920,
height: 1080,
deviceScaleFactor: 1,
});
// なるべくロードを早くさせる
await page.setRequestInterception(true);
page.on('request', interceptedRequest => {
const reqUrl = url.parse(interceptedRequest.url())
const reqExt = path.extname(reqUrl.pathname)
const reqHost = reqUrl.hostname
// Resources from 3rd party domains
if (reqHost === 'ignoreMe') {
interceptedRequest.abort();
// Exclude unnecessary resources
} else if (reqExt === '.png' || reqExt === '.gif' || reqExt === '.css') {
interceptedRequest.abort();
} else {
interceptedRequest.continue();
}
});
// なるべくロードを早くさせる
await page.evaluateOnNewDocument(() => {
const sleep = ms => new Promise((r, j) => setTimeout(r, ms));
window.setInterval = () => {};
(async() => {
while(true) {
if(document.documentElement !== null) {
document.documentElement.setAttribute('style', 'display: none');
break;
}
await sleep(1);
}
while(true) {
if(document.body !== null) {
break;
}
await sleep(1);
}
})();
});
await pookyCollector(pookyOptions);
}
// add a recaptcha token.
recaptchaTokens.push('03AOLTBLQnMCCWXhiy82AAQ1ohP68mrYfThrJS0IYftbVPxtkke2F7P_YWUlL5HcnFMdpeDL3qHzsqvKIBLSUoEnj3eY-NG5_LQ9N-QIDYkFgoalPKcixbEqaOIhDOVEUWHJfKbVRUyLQXLYWGiEjRS4UHlPjY_oTlKMCia5snP71Zl5tIJZ0v8MvnpaqYY5hO2_g_xuFn8-ZQei2VZS1YQhtXFYMgIySMT1YNe1FIn5G8765d6d_evR6s5OEEdSyR10vRk1lWT2pkqZkx-ACZX3Ho56lAx5bbpkVsWIFLZP-Xr95JbkxRtBKDkWMy1I_VsFMPGTTGtm-ndX6YpJUNev1ECe9JuVxbrgIldgyIFPoqlEBFvsrJBem3xckPpNhc9FOOVdY9kt-BfbjgGAOKN63Pb7d0Fj1ocNxGkRegu9lMtNUXKQATcBXkAenVYqDP6Aim0_pwrEPpfXq_PdonB4Mity-xj__nQ6Nm1NV2vv-sWjPpz0C_rSW99N6an5e826Vwep4K9Nw-OcjqtK9Sl_0H_eHsDfQdq9JAQ3FNkYWJvFYO68tdnCqcJajK2cu8plNhB25jdXvh');
// 購入作業開始
for(let i = 0; i < pookyDataContainer.length; i++) {
const v = pookyDataContainer[i];
const categories = {
'Jackets': 0, 'Coats': 1, 'Shirts': 2, 'Tops/Sweaters': 3, 'Sweatshirts': 4, 'Pants': 5, 'Shorts': 6,
'T-Shirts': 7, 'Hats': 8, 'Bags': 9, 'Accessories': 10, 'Shoes': 11, 'Skate': 12,
};
await cop({
item: {
keyword: '+Half,+Zip,+Hooded,+Sweatshirt',
category_id: categories['Sweatshirts'],
size: '+medium',
style: '+Black',
},
checkout: {
'g-recaptcha-response': recaptchaTokens[i],
},
pookyCookies: v
});
}
};
await main();
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment