From 1d8ece24977b77ac0d3084674a09193d727b68d8 Mon Sep 17 00:00:00 2001 From: Mert Ercan Date: Sat, 20 May 2023 01:42:29 +0300 Subject: [PATCH] =?UTF-8?q?Server=20=C3=BCzerinden=20discord=20ile=20captc?= =?UTF-8?q?ha=20=C3=A7=C3=B6z=C3=BCm=C3=BC=20&=20ESM=20ge=C3=A7i=C5=9Fi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 13 ++--- src/app.ts | 19 ++++---- src/components/Client.ts | 38 +++++++++++++-- src/components/product/productParser.ts | 64 +++++++++++++++++-------- tsconfig.json | 9 ++-- 5 files changed, 99 insertions(+), 44 deletions(-) diff --git a/package.json b/package.json index d64bc2e..27f34b5 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "amazon-client", "version": "1.0.0", "description": "", - "main": "dist/app.js", + "type": "module", "scripts": { "dev": "cross-env ts-node ./src/app.ts", "postbuild": "cross-env mkdir dist -p && cp package.json dist/package.json && cp .env.example dist/.env.example && cd dist", @@ -15,18 +15,19 @@ "cheerio": "1.0.0-rc.12", "dayjs": "1.11.7", "dotenv": "16.0.3", + "log-update": "5.0.1", "puppeteer": "13.3.1", "ws": "8.13.0" }, "devDependencies": { - "@types/node": "18.14.6", + "@types/node": "20.2.1", "@types/ws": "8.5.4", - "@typescript-eslint/eslint-plugin": "5.54.1", - "@typescript-eslint/parser": "5.54.1", + "@typescript-eslint/eslint-plugin": "5.59.6", + "@typescript-eslint/parser": "5.59.6", "cross-env": "7.0.3", - "eslint": "8.35.0", + "eslint": "8.40.0", "ts-node": "10.9.1", - "typescript": "4.9.5" + "typescript": "5.0.4" }, "optionalDependencies": { "bufferutil": "^4.0.7" diff --git a/src/app.ts b/src/app.ts index 54acce5..db0b1b8 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,7 +1,6 @@ import 'dotenv/config'; -import Client from './components/Client'; -import { WebSocket } from 'ws'; -import { wait } from './helpers/common'; +import logUpdate from 'log-update'; +import Client from './components/Client.js'; export let client: Client; @@ -9,12 +8,14 @@ const main = async () => { client = new Client(); client.initialize(); - while (client.socket.readyState !== WebSocket.OPEN) { - console.log('Socket bağlantısı gerçekleştirilene kadar bekliyoruz!'); - await wait(5000); - } - - console.log('Socket bağlantısı başarılı bir şekilde gerçekleşti!', client.socket.readyState); + setInterval(() => { + logUpdate(` + Server: ${client.socket.url} + Status: ${client.socket.readyState} + Products: ${client.products.length} + Captcha: ${client.captcha.size} + `); + }, 500); }; main(); diff --git a/src/components/Client.ts b/src/components/Client.ts index b1f13e0..a472de6 100644 --- a/src/components/Client.ts +++ b/src/components/Client.ts @@ -1,11 +1,19 @@ +import { randomInt } from 'crypto'; import { CloseEvent, ErrorEvent, RawData, WebSocket } from 'ws'; -import webSocket from '../config/webSocket'; -import { wait } from '../helpers/common'; -import productParser from './product/productParser'; +import webSocket from '../config/webSocket.js'; +import { wait } from '../helpers/common.js'; +import productParser from './product/productParser.js'; class Client { socket: WebSocket; + captcha: Map = new Map(); + + products: { + productId: number, + url: string + }[] = []; + private heartbeatTimeout: NodeJS.Timeout; private heartbeat = () => { @@ -16,13 +24,14 @@ class Client { }, 15000 + 2000); }; - private handleServerMessage = async (data: RawData) => { + private handleServerMessage = async (serverMessage: RawData) => { try { const messageObject: { type: string; value: string; + data: string; channelId: string; - } = JSON.parse(data.toString()); + } = JSON.parse(serverMessage.toString()); if (messageObject.type === 'begin-tracking') { const beginTrackingObject: { @@ -30,12 +39,16 @@ class Client { url: string } = JSON.parse(messageObject.value); + this.products.push(beginTrackingObject); + this.socket.send(JSON.stringify({ type: 'begin-tracking-handshake', value: beginTrackingObject.productId }), async () => { const productParserResult = await productParser(beginTrackingObject.url); + this.products = this.products.filter(product => product.productId !== beginTrackingObject.productId); + if (!productParserResult) { return; } @@ -49,8 +62,20 @@ class Client { } if (messageObject.type === 'create-tracking') { + const beginTrackingObject: { + productId: number, + url: string + } = { + url: messageObject.value, + productId: randomInt(Number.MAX_SAFE_INTEGER - 1000, Number.MAX_SAFE_INTEGER) + }; + + this.products.push(beginTrackingObject); + const productParserResult = await productParser(messageObject.value); + this.products = this.products.filter(product => product.productId !== beginTrackingObject.productId); + if (!productParserResult) { return; } @@ -63,6 +88,9 @@ class Client { })); } + if (messageObject.type === 'captcha-answer') { + this.captcha.set(messageObject.data, messageObject.value); + } } catch (error) { console.error('Error parsing message from Server: ', error); } diff --git a/src/components/product/productParser.ts b/src/components/product/productParser.ts index 8372ed1..42c9edf 100644 --- a/src/components/product/productParser.ts +++ b/src/components/product/productParser.ts @@ -2,9 +2,10 @@ import { CheerioAPI, load } from 'cheerio'; import dayjs from 'dayjs'; import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'; import puppeteer from 'puppeteer'; -import { trimNewLines } from '../../helpers/common'; -import { getTldFromUrl } from '../../helpers/productUrlHelper'; -import { ProductParserInterface } from '../../interfaces/ProductParserInterface'; +import { client } from '../../app.js'; +import { trimNewLines, wait } from '../../helpers/common.js'; +import { getTldFromUrl } from '../../helpers/productUrlHelper.js'; +import { ProductParserInterface } from '../../interfaces/ProductParserInterface.js'; const getParsedProductData = ($: CheerioAPI): ProductParserInterface | undefined => { try { @@ -54,7 +55,6 @@ const getParsedProductData = ($: CheerioAPI): ProductParserInterface | undefined }; const productParser = async (url: string): Promise => { - console.log(dayjs().toString() + ' | Parsing product:', url); const browser = await puppeteer.launch({ headless: true }); @@ -93,34 +93,61 @@ const productParser = async (url: string): Promise