| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 | "use strict";Object.defineProperty(exports, "__esModule", { value: true });const fs_1 = require("fs");const axios_1 = require("axios");const CallableInstance = require("callable-instance");const html_entities_1 = require("html-entities");const temp = require("temp");const loggers_1 = require("./loggers");const koishi_1 = require("./koishi");const xmlEntities = new html_entities_1.XmlEntities();const ZHType = (type) => new class extends String {    constructor() {        super(...arguments);        this.type = super.toString();        this.toString = () => `[${super.toString()}]`;    }}(type);const typeInZH = {    photo: ZHType('图片'),    video: ZHType('视频'),};const logger = (0, loggers_1.getLogger)('webshot');class Webshot extends CallableInstance {    constructor(_wsUrl, _mode, onready) {        super('webshot');        this.fetchMedia = (url) => new Promise((resolve, reject) => {            logger.info(`fetching ${url}`);            (0, axios_1.default)({                method: 'get',                url,                responseType: 'arraybuffer',                timeout: 150000,            }).then(res => {                if (res.status === 200) {                    logger.info(`successfully fetched ${url}`);                    resolve(res.data);                }                else {                    logger.error(`failed to fetch ${url}: ${res.status}`);                    reject();                }            }).catch(err => {                logger.error(`failed to fetch ${url}: ${err instanceof Error ? err.message : err}`);                reject();            });        }).then(data => (ext => {            const mediaTempFilePath = temp.path({ suffix: `.${ext}` });            (0, fs_1.writeFileSync)(mediaTempFilePath, Buffer.from(data));            const path = `file://${mediaTempFilePath}`;            switch (ext) {                case 'jpg':                case 'png':                    return koishi_1.Message.Image(path);                case 'mp4':                    return koishi_1.Message.Video(path);            }            logger.warn('unable to find MIME type of fetched media, failing this fetch');            throw Error();        })(/\/.+\.(?:.*?(?<=[?&])stp=dst-(jpg)|(.+?)\?)/.exec(url).filter(g => g)[1]));        this.fetchBestCandidate = ({ image_versions2, video_versions }) => {            const candidates = video_versions || image_versions2.candidates;            const url = candidates                .sort((var1, var2) => var2.width + ((var2 === null || var2 === void 0 ? void 0 : var2.type) || 0) - var1.width - ((var1 === null || var1 === void 0 ? void 0 : var1.type) || 0))                .map(variant => variant.url)[0];            const altMessage = `\n[失败的${typeInZH[video_versions ? 'video' : 'photo'].type}:${url}]`;            return this.fetchMedia(url)                .catch(error => {                logger.warn('unable to fetch media, sending plain text instead...');                return altMessage;            });        };        onready();    }    webshot(mediaItems, callback, webshotDelay) {        const promises = mediaItems.map(item => {            let promise = Promise.resolve();            logger.info(`working on ${item.user.username}/${item.code}`);            let messageChain = '';            const author = `${item.user.full_name} (@${item.user.username}):\n`;            const date = `${new Date(item.taken_at * 1000)}\n`;            messageChain += author + date;            promise = promise.then(() => this.fetchBestCandidate(item))                .then(msg => { messageChain += msg; });            return promise.then(() => {                logger.info(`done working on ${item.user.username}/${item.code}, message chain:`);                logger.info(JSON.stringify(koishi_1.Message.ellipseBase64(messageChain)));                callback(messageChain, xmlEntities.decode(item.caption), author);            });        });        return Promise.all(promises).then();    }}exports.default = Webshot;
 |