import { defer, Injector } from "@nger/core"; import { BROWSER } from "@nger/puppeteer"; import { Db } from "@nger/typeorm"; import { Page } from "puppeteer"; import { WbPlatform } from "../entities/platform"; export abstract class Spilder { get db() { return this.injector.get(Db) } get browser() { return this.injector.get(BROWSER) } private _cookies!: string; get cookies() { if (this._cookies) { return this._cookies; } this._cookies = this.platform.cookies ? this.platform.cookies.map(c => `${c.name}=${c.value}`).join(';') : ''; return this._cookies; } set cookies(cookies: string) { this._cookies = cookies; } delay(time: number) { const d = defer(); setTimeout(() => { d.resolve(); }, time) return d; } constructor(public injector: Injector, public platform: WbPlatform) { } page!: Page | undefined; async init() { if (!this.page) { this.page = await this.browser.newPage() as any; } } /** * 检查是否登录 */ abstract isLogin(): Promise; /** * 创建登录二维码 */ abstract createLoginQrCode(): Promise; /** * 检查二维码状态 */ abstract checkScanStatus(): Promise; /** * 检查登录成功 */ abstract loginSuccess(): Promise; /** * 设置cookie * @param cookies */ abstract setCookies(cookies: any[]): Promise; abstract createTopicPageLinks(keyword: string): Promise<{ links: string[]; keyword: string; count: number }>; abstract createTopicLinks(link: string): Promise<{ list: string, detail: string }[]>; abstract createTopicDetail(link: string): Promise; abstract createTopicArticlePageLinks(link: string): Promise; abstract createTopicArticleLinks(page: string): Promise; abstract createTopicArticleDetail(link: string): Promise; abstract loadComments(id: number, uid: number): Promise; abstract loadMoreComments(id: number, uid: number, max_id: number): Promise; abstract loadChildComments(id: number, uid: number): Promise; abstract loadMoreChildComments(id: number, uid: number, max_id: number): Promise; abstract createAccount(uid: number): Promise; abstract createTopicArticleLongTextDetail(id: string): Promise; } export class SpilderError extends Error { code: number; constructor(code: number, msg: string) { super(msg); this.code = code; } }