mirror of
https://github.com/opelly27/streetmerchant.git
synced 2026-05-20 13:27:38 +00:00
chore(misc): normalize logs (#242)
This commit is contained in:
+23
-22
@@ -1,8 +1,8 @@
|
||||
import {Browser, Page, Response} from 'puppeteer';
|
||||
import {Link, Store} from './model';
|
||||
import {Logger, Print} from '../logger';
|
||||
import {closePage, delay, getSleepTime} from '../util';
|
||||
import {Config} from '../config';
|
||||
import {Logger} from '../logger';
|
||||
import {includesLabels} from './includes-labels';
|
||||
import open from 'open';
|
||||
import {sendNotification} from '../notification';
|
||||
@@ -69,27 +69,12 @@ async function lookup(browser: Browser, store: Store) {
|
||||
}
|
||||
|
||||
async function lookupCard(browser: Browser, store: Store, page: Page, link: Link) {
|
||||
const givenWaitFor = store.customWaitFor ? store.customWaitFor : 'networkidle0';
|
||||
const givenWaitFor = store.waitUntil ? store.waitUntil : 'networkidle0';
|
||||
const response: Response | null = await page.goto(link.url, {waitUntil: givenWaitFor});
|
||||
const graphicsCard = `${link.brand} ${link.model}`;
|
||||
|
||||
if (await lookupCardInStock(store, page)) {
|
||||
Logger.info(`🚀🚀🚀 [${store.name}] ${graphicsCard} IN STOCK 🚀🚀🚀`);
|
||||
Logger.info(link.url);
|
||||
if (Config.page.inStockWaitTime) {
|
||||
inStock[store.name] = true;
|
||||
setTimeout(() => {
|
||||
inStock[store.name] = false;
|
||||
}, 1000 * Config.page.inStockWaitTime);
|
||||
}
|
||||
|
||||
if (Config.page.capture) {
|
||||
Logger.debug('ℹ saving screenshot');
|
||||
link.screenshot = `success-${Date.now()}.png`;
|
||||
await page.screenshot({path: link.screenshot});
|
||||
}
|
||||
|
||||
let givenUrl = link.cartUrl ? link.cartUrl : link.url;
|
||||
Logger.info(`${Print.inStock(link, store)}\n${givenUrl}`);
|
||||
|
||||
if (Config.browser.open) {
|
||||
if (link.openCartAction === undefined) {
|
||||
@@ -99,22 +84,38 @@ async function lookupCard(browser: Browser, store: Store, page: Page, link: Link
|
||||
}
|
||||
}
|
||||
|
||||
sendNotification(givenUrl, link);
|
||||
sendNotification(link, store);
|
||||
|
||||
if (Config.page.inStockWaitTime) {
|
||||
inStock[store.name] = true;
|
||||
|
||||
setTimeout(() => {
|
||||
inStock[store.name] = false;
|
||||
}, 1000 * Config.page.inStockWaitTime);
|
||||
}
|
||||
|
||||
if (Config.page.capture) {
|
||||
Logger.debug('ℹ saving screenshot');
|
||||
|
||||
link.screenshot = `success-${Date.now()}.png`;
|
||||
await page.screenshot({path: link.screenshot});
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (await lookupPageHasCaptcha(store, page)) {
|
||||
Logger.warn(`✖ [${store.name}] CAPTCHA from: ${graphicsCard}. Waiting for a bit with this store...`);
|
||||
Logger.warn(Print.captcha(link, store));
|
||||
await delay(getSleepTime());
|
||||
return;
|
||||
}
|
||||
|
||||
if (response && response.status() === 429) {
|
||||
Logger.warn(`✖ [${store.name}] Rate limit exceeded: ${graphicsCard}`);
|
||||
Logger.warn(Print.rateLimit(link, store));
|
||||
return;
|
||||
}
|
||||
|
||||
Logger.info(`✖ [${store.name}] still out of stock: ${graphicsCard}`);
|
||||
Logger.info(Print.outOfStock(link, store));
|
||||
}
|
||||
|
||||
async function lookupCardInStock(store: Store, page: Page) {
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const BestBuyCa: Store = {
|
||||
customWaitFor: 'domcontentloaded',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '#root',
|
||||
@@ -22,5 +21,6 @@ export const BestBuyCa: Store = {
|
||||
url: 'https://www.bestbuy.ca/en-ca/product/zotac-geforce-rtx-3080-trinity-10gb-gddr6x-video-card/14953249?intl=nosplash'
|
||||
}
|
||||
],
|
||||
name: 'bestbuy-ca'
|
||||
name: 'bestbuy-ca',
|
||||
waitUntil: 'domcontentloaded'
|
||||
};
|
||||
|
||||
@@ -55,26 +55,29 @@ export function generateSetupAction() {
|
||||
|
||||
const page = await browser.newPage();
|
||||
|
||||
Logger.info('[nvidia] creating cart/session token...');
|
||||
let response: Response | null;
|
||||
try {
|
||||
Logger.debug('creating cart/session token...');
|
||||
|
||||
response = await page.goto(nvidiaSessionUrl(nvidiaLocale), {waitUntil: 'networkidle0'});
|
||||
|
||||
if (response === null) {
|
||||
throw new Error('NvidiaAccessTokenUnavailable');
|
||||
}
|
||||
|
||||
const data = await response.json() as NvidiaSessionTokenJSON;
|
||||
const accessToken = data.access_token;
|
||||
|
||||
Logger.info('[nvidia] you can log into your cart now...');
|
||||
const cartUrl = checkoutUrl(drLocale, accessToken);
|
||||
Logger.info(cartUrl);
|
||||
|
||||
Logger.debug(cartUrl);
|
||||
|
||||
if (Config.browser.open) {
|
||||
Logger.info('ℹ opening browser for user to login');
|
||||
|
||||
await open(cartUrl);
|
||||
}
|
||||
} catch (error) {
|
||||
Logger.debug(error);
|
||||
Logger.error('✖ [nvidia] cannot generate cart/session token, continuing without, auto-"add to cart" may not work...');
|
||||
Logger.error('✖ [nvidia] cannot generate cart/session token, continuing without; auto "add to cart" may not work', error);
|
||||
}
|
||||
|
||||
await page.close();
|
||||
@@ -84,11 +87,14 @@ export function generateSetupAction() {
|
||||
export function generateOpenCartAction(id: number, nvidiaLocale: string, drLocale: string, cardName: string) {
|
||||
return async (browser: Browser) => {
|
||||
const page = await browser.newPage();
|
||||
Logger.info(`🚀🚀🚀 [nvidia] ${cardName}, starting auto add to cart... 🚀🚀🚀`);
|
||||
|
||||
Logger.info(`🚀🚀🚀 [nvidia] ${cardName}, starting auto add to cart 🚀🚀🚀`);
|
||||
|
||||
let response: Response | null;
|
||||
let cartUrl: string;
|
||||
try {
|
||||
Logger.info(`🚀🚀🚀 [nvidia] ${cardName}, getting access token... 🚀🚀🚀`);
|
||||
Logger.info(`🚀🚀🚀 [nvidia] ${cardName}, getting access token 🚀🚀🚀`);
|
||||
|
||||
response = await page.goto(nvidiaSessionUrl(nvidiaLocale), {waitUntil: 'networkidle0'});
|
||||
if (response === null) {
|
||||
throw new Error('NvidiaAccessTokenUnavailable');
|
||||
@@ -97,16 +103,21 @@ export function generateOpenCartAction(id: number, nvidiaLocale: string, drLocal
|
||||
const data = await response.json() as NvidiaSessionTokenJSON;
|
||||
const accessToken = data.access_token;
|
||||
|
||||
Logger.info(`🚀🚀🚀 [nvidia] ${cardName}, adding to cart... 🚀🚀🚀`);
|
||||
Logger.info(`🚀🚀🚀 [nvidia] ${cardName}, adding to cart 🚀🚀🚀`);
|
||||
|
||||
response = await page.goto(addToCartUrl(id, drLocale, accessToken), {waitUntil: 'networkidle0'});
|
||||
|
||||
Logger.info(`🚀🚀🚀 [nvidia] ${cardName}, opening checkout page... 🚀🚀🚀`);
|
||||
Logger.info(`🚀🚀🚀 [nvidia] ${cardName}, opening checkout page 🚀🚀🚀`);
|
||||
|
||||
cartUrl = checkoutUrl(drLocale, accessToken);
|
||||
|
||||
Logger.info(cartUrl);
|
||||
|
||||
await open(cartUrl);
|
||||
} catch (error) {
|
||||
Logger.debug(error);
|
||||
Logger.error(`✖ [nvidia] ${cardName} could not automatically add to cart, opening page`);
|
||||
Logger.error(`✖ [nvidia] ${cardName} could not automatically add to cart, opening page`, error);
|
||||
|
||||
cartUrl = fallbackCartUrl(nvidiaLocale);
|
||||
await open(cartUrl);
|
||||
}
|
||||
|
||||
@@ -47,8 +47,7 @@ for (const name of Config.store.stores) {
|
||||
}
|
||||
}
|
||||
|
||||
const logString = `Selected stores: ${Array.from(list.keys()).join(', ')}`;
|
||||
Logger.info(logString);
|
||||
Logger.info(`ℹ selected stores: ${Array.from(list.keys()).join(', ')}`);
|
||||
|
||||
export const Stores = Array.from(list.values()) as Store[];
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import {Browser, LoadEvent} from 'puppeteer';
|
||||
|
||||
export interface Element {
|
||||
export type Element = {
|
||||
container: string;
|
||||
text: string[];
|
||||
}
|
||||
};
|
||||
|
||||
export interface Link {
|
||||
export type Link = {
|
||||
series: string;
|
||||
brand: string;
|
||||
model: string;
|
||||
@@ -13,17 +13,17 @@ export interface Link {
|
||||
cartUrl?: string;
|
||||
openCartAction?: (browser: Browser) => Promise<string>;
|
||||
screenshot?: string;
|
||||
}
|
||||
};
|
||||
|
||||
export interface Labels {
|
||||
export type Labels = {
|
||||
captcha?: Element;
|
||||
inStock: Element;
|
||||
}
|
||||
};
|
||||
|
||||
export interface Store {
|
||||
export type Store = {
|
||||
links: Link[];
|
||||
labels: Labels;
|
||||
name: string;
|
||||
setupAction?: (browser: Browser) => void;
|
||||
customWaitFor?: LoadEvent;
|
||||
}
|
||||
waitUntil?: LoadEvent;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user