import { assert } from 'chai'; import * as cheerio from 'cheerio'; import { SpecialAuctionListPageDTO } from '../data/dto/SpecialAuctionListPageDTO'; import { SpecialAuctionMetaDTO } from '../data/dto/SpecialAuctionMetaDTO'; import { request } from '../rpc/request'; import { printInfo } from '../utils/print'; import { configs } from './config'; // 场次 export class SpecialAuction { static gotoAnAuction(auctionCode: string) { const auction = new SpecialAuction(); auction.specialCode = auctionCode; return auction; } private _specialCode: string = null!; private set specialCode(value: string) { this._specialCode = value; } public get specialCode(): string { return this._specialCode; } private get pageUrl(): string { return configs.domain + '/special_detail/' + this._specialCode; } private _auctionUrl: string = `https://api.artron.net/v1/special/auctions/list`; private _auctionData: SpecialAuctionMetaDTO = null!; private getRequestParams(pageId: number = 1, pageCount: number = 10): any { return { specialCode: this._specialCode, showType: 0, pageId: pageId, keyword: '', limit: pageCount, ord: 2, isBigPic: 0, }; } private async getAuctionDetail( pageId: number = 0, limit: number = 10 ): Promise { const response = await request.doPost( this._auctionUrl, this.getRequestParams(pageId, limit) ); assert.isTrue(response.status === 200, '获取拍卖会场次数据失败'); return SpecialAuctionListPageDTO.fillWith(response.data.data); } private async loginAuction(): Promise { const web = await request.doGet(this.pageUrl); const $ = cheerio.load(web.data); const scripts = $('script'); assert.isTrue(scripts.length > 0, '获取拍卖会页面数据失败'); const html = $(scripts[0]).html(); const metaData = html?.split( ';(function(){var s;(s=document.currentScript||document.scripts[document.scripts.length-1]).parentNode.removeChild(s);}());' ); assert.isTrue(metaData && metaData.length > 0, '获取拍卖会页面meta数据失败'); const info = metaData![0]; const auctionData = info.split('window.__INITIAL_STATE__=')[1]; const data = JSON.parse(auctionData); const meta = SpecialAuctionMetaDTO.createWithMeta(data); return meta; } public async startAnalytics() { assert.isString(this._specialCode, '需要输入拍卖会场次'); this._auctionData = await this.loginAuction(); assert.isNotNull(this._auctionData, '获取拍卖会场次数据失败'); assert.isTrue(this._auctionData.totalCount > 0, '拍卖会场次数据为空'); this._auctionData.mkdir(); printInfo( `开始分析:${this._auctionData.session_name} ${this._auctionData.special_name}`, 'green' ); printInfo(`共有${this._auctionData.totalCount}件拍品`, 'green'); const auctionList = await this.getAuctionDetail(1, this._auctionData.totalCount); // auctionList.list.forEach((item, i) => { // printInfo(`分析第${i + 1}件拍品:${item.WorkName}`); // item.auctionDetail = this._auctionData; // item.analysis(); // }); for (let i = 0; i < auctionList.list.length; i++) { const item = auctionList.list[i]; printInfo(`分析第${i + 1}件拍品:${item.WorkName}`); item.auctionDetail = this._auctionData; await item.analysis(); } } }