@xbibzlibrary/tiktokscrap
Version:
Powerful TikTok Scraper and Downloader Library
94 lines (78 loc) • 2.63 kB
text/typescript
import HttpClient from '../utils/http';
import Parser from '../utils/parser';
import Validator from '../utils/validator';
import Logger from '../utils/logger';
import { TikTokScrapOptions, TikTokScrapResult } from '../types';
import { TikTokScrapError } from '../errors';
export abstract class BaseScraper {
protected http: HttpClient;
protected parser: Parser;
protected validator: Validator;
protected logger = Logger;
constructor(options: TikTokScrapOptions = {}) {
this.http = new HttpClient(options);
this.parser = new Parser();
this.validator = new Validator();
}
protected async executeRequest<T>(
requestFn: () => Promise<T>,
errorMessage: string
): Promise<TikTokScrapResult<T>> {
try {
this.logger.info(`Starting request: ${errorMessage}`);
const data = await requestFn();
this.logger.success(`Request completed successfully: ${errorMessage}`);
return {
success: true,
data,
message: 'Success'
};
} catch (error) {
this.logger.error(`Request failed: ${errorMessage} - ${(error as Error).message}`);
if (error instanceof TikTokScrapError) {
return {
success: false,
error: (error as Error).message,
message: error.code
};
}
return {
success: false,
error: (error as Error).message,
message: 'UNKNOWN_ERROR'
};
}
}
protected buildUrl(baseUrl: string, path: string, params: Record<string, any> = {}): string {
const url = new URL(path, baseUrl);
Object.entries(params).forEach(([key, value]) => {
if (value !== undefined && value !== null) {
url.searchParams.append(key, String(value));
}
});
return url.toString();
}
protected extractVideoIdFromUrl(url: string): string | null {
const match = url.match(/\/video\/(\d+)/);
return match ? match[1] : null;
}
protected extractPhotoIdFromUrl(url: string): string | null {
const match = url.match(/\/photo\/(\d+)/);
return match ? match[1] : null;
}
protected extractUsernameFromUrl(url: string): string | null {
const match = url.match(/\/(@[\w.-]+)/);
return match ? match[1] : null;
}
protected extractHashtagFromUrl(url: string): string | null {
const match = url.match(/\/tag\/([\w]+)/);
return match ? match[1] : null;
}
public updateOptions(options: Partial<TikTokScrapOptions>): void {
this.http.updateOptions(options);
}
public getOptions(): TikTokScrapOptions {
return this.http.getOptions();
}
}
export default BaseScraper;