Greasy Fork is available in English.

ljyun-aiot

灵境云 AIoT 助手

// ==UserScript==
// @name                ljyun-aiot
// @namespace           http://tampermonkey.net/
// @version             0.6.2
// @description         灵境云 AIoT 助手
// @author              灵境云 AIoT
// @copyright           灵境云
// @license             MIT
// @match               https://aiot-hw-dev.portal.ljyun.cn/*
// @match               https://aiot.portal.ljyun.cn/*
// @match               https://inspection.portal.ljyun.cn/*
// @match               https://inspection.aiot.ljyun.cn/*
// @run-at              document-idle
// @supportURL          https://gitlab.i.ljyun.cn/shikang/aiot-helper-monkey/-/issues
// @homepage            https://gitlab.i.ljyun.cn/shikang/aiot-helper-monkey
// @require             https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js
// @grant               GM_getValue
// @grant               GM_setValue
// @grant               GM_notification
// @grant               GM_addValueChangeListener
// @grant               GM_xmlhttpRequest
// @grant               GM_download
// @grant               GM_addStyle
// @connect             hzdev.ddns.net
// @connect             aiot-images.obs.cn-east-3.myhuaweicloud.com
// @connect             aiot-images.ljyun.cn
// @icon                https://resources.ljyun.cn/common/favio.svg
// ==/UserScript==
/* eslint-disable */ /* spell-checker: disable */
// @[ You can find all source codes in GitHub repo ]
/******/ (() => { // webpackBootstrap
/******/ 	"use strict";
/******/ 	var __webpack_modules__ = ({

/***/ 859:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {


var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (g && (g = 0, op[0] && (_ = 0)), _) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
var jquery_1 = __importDefault(__webpack_require__(669));
var eventHandlers_1 = __webpack_require__(201);
var observer_1 = __webpack_require__(832);
var message_1 = __webpack_require__(603);
var styleUtils_1 = __webpack_require__(224);
var app = function () { return __awaiter(void 0, void 0, void 0, function () {
    return __generator(this, function (_a) {
        console.log("%c ljyun-aiot-helper is running", (0, styleUtils_1.logStyle)());
        message_1.MessageBox.generate();
        (0, jquery_1.default)(document).on('keydown', eventHandlers_1.triggerDownloadOnShortcut);
        observer_1.observer.observe(document.body, {
            childList: true,
            subtree: true,
            attributes: true,
        });
        return [2 /*return*/];
    });
}); };
exports["default"] = app;


/***/ }),

/***/ 551:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {


var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (g && (g = 0, op[0] && (_ = 0)), _) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.createHelperWrapper = exports.addButtonIfModalExists = void 0;
var ajax_1 = __webpack_require__(668);
var eventHandlers_1 = __webpack_require__(201);
function addButtonIfModalExists() {
    return __awaiter(this, void 0, void 0, function () {
        var $targetElement, dataRowObj, score;
        return __generator(this, function (_a) {
            $targetElement = $('#auditAlarmModalData');
            if ($targetElement.length && !$('#downloadImageButton').length) {
                createHelperWrapper($targetElement);
                dataRowObj = (0, eventHandlers_1.getRawAlarmData)();
                if (!dataRowObj)
                    return [2 /*return*/];
                console.log('alarmData :>> ', dataRowObj);
                score = dataRowObj.score || (dataRowObj.originalDataset ? dataRowObj.originalDataset.score : 0) || 0;
                $('#alarmScoreSpan')
                    .text("\u7F6E\u4FE1\u5EA6\uFF1A".concat(score))
                    .css({
                    color: score > 0.5 ? 'green' : 'red',
                    marginRight: 10,
                });
            }
            return [2 /*return*/];
        });
    });
}
exports.addButtonIfModalExists = addButtonIfModalExists;
function createHelperWrapper(targetElement) {
    var $wrapper = $('<div id="aiotHelperWrapper"></div>');
    var $downloadButton = $('<button>下载原图(alt+~)</button>')
        .attr('id', 'downloadImageButton')
        .css({
        color: '#fff',
        marginLeft: '10px',
        padding: '5px 10px',
        borderRadius: '5px',
        backgroundColor: '#0058ff',
    })
        .on('mouseenter', function () {
        $(this).css('opacity', '.8');
    })
        .on('mouseleave', function () {
        $(this).css('opacity', '1');
    })
        .on('click', eventHandlers_1.handleDownloadImageFn);
    var $messageSpan = $('<span></span>').attr('id', 'alarmScoreSpan').css({
        marginLeft: '10px',
        fontWeight: 'normal',
        color: '#000',
    });
    $wrapper.append($messageSpan, $downloadButton);
    $(targetElement).after($wrapper);
    // 创建下拉选项框
    (0, ajax_1.getData)('http://hzdev.ddns.net:8888/api/projects?page=1&page_size=1000', "json" /* XhrResponseType.JSON */).then(function (res) {
        var _a;
        if (!res || res.count === 0 || ((_a = res.results) === null || _a === void 0 ? void 0 : _a.length) == 0)
            return;
        addMarkSelectAction(res.results, $downloadButton);
    });
}
exports.createHelperWrapper = createHelperWrapper;
// 添加标注选项action
function addMarkSelectAction(results, $downloadButton) {
    var filterResults = results.filter(function (r) { return r.id >= 1; });
    var $select = $('<select>').attr('id', 'projectSelect').css({
        fontWeight: 'bold',
        color: '#0058ff',
        marginLeft: '10px',
        padding: '5px 10px',
        borderRadius: '5px',
        backgroundColor: '#bae7ff',
    });
    filterResults.forEach(function (project) {
        var $option = $('<option>').val(project.id).text(project.title);
        $select.append($option);
    });
    // 监听select 的选项事件,并缓存,用于下次初始赋值
    $select.on('change', function () {
        var selectedValue = $(this).val();
        GM_setValue('SELECTED_PROJECT', selectedValue);
    });
    var lastSelectedValue = GM_getValue('SELECTED_PROJECT');
    if (lastSelectedValue) {
        // 在列表中是否存在
        var isExited = filterResults.findIndex(function (o) { return o.id == lastSelectedValue; });
        if (isExited) {
            $select.val(+lastSelectedValue);
        }
        else {
            filterResults[0] && $select.val(+filterResults[0].id);
        }
    }
    $downloadButton.after($select);
    // 创建标注任务按钮
    var $markButton = $('<button>创建标注任务(alt+q)</button>')
        .attr('id', 'markTaskButton')
        .css({
        fontWeight: 'bold',
        color: '#fff',
        padding: '5px 10px',
        borderRadius: '5px',
        backgroundColor: '#0058ff',
    })
        .on('mouseenter', function () {
        $(this).css('opacity', '.8');
    })
        .on('mouseleave', function () {
        $(this).css('opacity', '1');
    })
        .on('click', eventHandlers_1.handleCreateTaskFn);
    $select.after($markButton);
    // 创建标注任务按钮
    var $markRoadTaskButton = $('<button>创建人工标注任务(alt+s)</button>')
        .attr('id', 'markRoadTaskButton')
        .css({
        fontWeight: 'bold',
        color: '#fff',
        padding: '5px 10px',
        borderRadius: '5px',
        backgroundColor: '#0058ff',
    })
        .on('mouseenter', function () {
        $(this).css('opacity', '.8');
    })
        .on('mouseleave', function () {
        $(this).css('opacity', '1');
    })
        .on('click', eventHandlers_1.handleCreateRoadTaskFn);
    $markButton.after($markRoadTaskButton);
}


/***/ }),

/***/ 201:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {


var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (g && (g = 0, op[0] && (_ = 0)), _) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.triggerDownloadOnShortcut = exports.updateModalInformation = exports.getRawAlarmData = exports.getRawImageAddrsValue = exports.uploadImage = exports.handleCreateRoadTaskFn = exports.handleCreateTaskFn = exports.handleDownloadImageFn = void 0;
var constants_1 = __webpack_require__(921);
var message_1 = __webpack_require__(603);
var utils_1 = __webpack_require__(833);
/**
 * 下载原图
 */
function handleDownloadImageFn() {
    var rawImageAddrsValue = getRawImageAddrsValue();
    var filename = (0, utils_1.getImageName)(rawImageAddrsValue);
    GM_download({
        url: rawImageAddrsValue,
        name: filename,
        onload: function () {
            console.log('download');
        },
        onerror: function (error) {
            GM_notification({
                title: 'ljyun-aiot-helper',
                text: "\u4E0B\u8F7D\u5931\u8D25: ".concat(error),
                timeout: 2000,
            });
        },
    });
}
exports.handleDownloadImageFn = handleDownloadImageFn;
/**
 * 创建标注任务
 */
function handleCreateTaskFn() {
    var rawImageAddrsValue = getRawImageAddrsValue();
    if (!rawImageAddrsValue) {
        GM_notification({
            title: 'ljyun-aiot-helper',
            text: "\u56FE\u7247\u5730\u5740\u65E0\u6548",
            timeout: 3000,
        });
        return;
    }
    var fileName = (0, utils_1.getImageName)(rawImageAddrsValue);
    var projectId = $('#projectSelect').val();
    if (!projectId) {
        return new message_1.MessageBox().show('请先选择项目');
    }
    GM_xmlhttpRequest({
        method: 'GET',
        url: rawImageAddrsValue,
        responseType: 'blob',
        onload: function (response) {
            if (response.status === 200) {
                var imageBlob = response.response;
                uploadImage("".concat(projectId), imageBlob, fileName);
            }
        },
    });
}
exports.handleCreateTaskFn = handleCreateTaskFn;
function handleCreateRoadTaskFn() {
    var _a;
    var rawImageAddrsValue = getRawImageAddrsValue();
    var rawImageS3Path = (_a = (0, utils_1.convertImageUrlToS3Path)(rawImageAddrsValue)) === null || _a === void 0 ? void 0 : _a.s3Path;
    var projectId = $('#projectSelect').val();
    if (!projectId) {
        return new message_1.MessageBox().show('请先选择项目');
    }
    var dataRowObj = getRawAlarmData();
    if (!dataRowObj)
        return;
    uploadRoadTask("".concat(projectId), rawImageS3Path, dataRowObj.originalDataset);
}
exports.handleCreateRoadTaskFn = handleCreateRoadTaskFn;
function uploadImage(projectId, imageBlob, fileName) {
    var formData = new FormData();
    formData.append('file', imageBlob, fileName);
    GM_xmlhttpRequest({
        method: 'POST',
        url: "http://hzdev.ddns.net:8888/api/projects/".concat(projectId, "/import?commit_to_project=true"),
        data: formData,
        responseType: 'json',
        headers: {
            Authorization: constants_1.AUTH_TOKEN,
        },
        onload: function (res) {
            // 判断状态码是否为 20x
            if ((res === null || res === void 0 ? void 0 : res.status) >= 200 && (res === null || res === void 0 ? void 0 : res.status) < 300) {
                new message_1.MessageBox().show('创建标注任务成功', 2000);
            }
            else {
                new message_1.MessageBox().show('创建标注任务失败', 2000);
                console.log('创建失败');
            }
        },
        onerror: function (error) {
            console.log(error);
        },
    });
}
exports.uploadImage = uploadImage;
function uploadRoadTask(projectId, imagePath, alertData) {
    var meta = {};
    if (alertData) {
        meta = {
            location: alertData.address,
            latitude: alertData.latitude,
            longitude: alertData.longitude,
            speed: alertData.speed,
            custom: '{"personId":"' + alertData.personId + '"}',
        };
    }
    var data = {
        data: {
            image: imagePath,
        },
        meta: meta,
    };
    var jsonString = JSON.stringify(data);
    GM_xmlhttpRequest({
        method: 'POST',
        url: "http://hzdev.ddns.net:8888/api/projects/".concat(projectId, "/import?commit_to_project=true"),
        data: jsonString,
        responseType: 'json',
        headers: {
            Authorization: constants_1.AUTH_TOKEN,
            'Content-Type': 'application/json',
        },
        onload: function (res) {
            // 判断状态码是否为 20x
            if ((res === null || res === void 0 ? void 0 : res.status) >= 200 && (res === null || res === void 0 ? void 0 : res.status) < 300) {
                new message_1.MessageBox().show('创建标注任务成功', 2000);
            }
            else {
                new message_1.MessageBox().show('创建标注任务失败', 2000);
                console.log('创建失败');
            }
        },
        onerror: function (error) {
            console.log(error);
        },
    });
}
function getRawImageAddrsValue() {
    var dataRow = getRawAlarmData();
    if (!dataRow)
        return '';
    if (Reflect.has(dataRow, 'raw_image_addrs')) {
        return dataRow.raw_image_addrs[0];
    }
    // 无 raw_image_addrs 字段,通过 image_addrs 中的图片地址进行转换得到原图
    var image = dataRow.image_addrs[0];
    return (0, utils_1.convertImageUrl)(image);
}
exports.getRawImageAddrsValue = getRawImageAddrsValue;
function getAlarmScore() {
    var dataRow = getRawAlarmData();
    if (!dataRow)
        return 0;
    // 道路巡检平台从 originalDataset 获取 score
    if (dataRow.originalDataset) {
        return dataRow.originalDataset.score;
    }
    else {
        return dataRow.score;
    }
}
function getRawAlarmData() {
    var $targetElement = $('#auditAlarmModalData');
    var dataRowValue = $targetElement.attr('data-row');
    if (!dataRowValue)
        return null;
    return JSON.parse(dataRowValue);
}
exports.getRawAlarmData = getRawAlarmData;
function updateModalInformation() {
    return __awaiter(this, void 0, void 0, function () {
        var score;
        return __generator(this, function (_a) {
            score = getAlarmScore();
            $('#alarmScoreSpan')
                .text("\u7F6E\u4FE1\u5EA6\uFF1A".concat(score))
                .css({
                color: score > 0.5 ? 'green' : 'red',
                marginRight: 10,
            });
            return [2 /*return*/];
        });
    });
}
exports.updateModalInformation = updateModalInformation;
function triggerDownloadOnShortcut(e) {
    if (e.altKey && e.key === '`') {
        $('#downloadImageButton').trigger('click');
    }
    else if (e.altKey && (e.key === 'q' || e.key === '1')) {
        $('#markTaskButton').trigger('click');
        console.log('qqq');
    }
    else if (e.altKey && e.key === 's') {
        $('#markRoadTaskButton').trigger('click');
        console.log('alt+s');
    }
}
exports.triggerDownloadOnShortcut = triggerDownloadOnShortcut;


/***/ }),

/***/ 832:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {


Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.observer = void 0;
var domUtils_1 = __webpack_require__(551);
var eventHandlers_1 = __webpack_require__(201);
exports.observer = new MutationObserver(function (mutations) {
    mutations.forEach(function (mutation) {
        if (mutation.type === 'childList' && $('#auditAlarmModalData').length > 0) {
            (0, domUtils_1.addButtonIfModalExists)();
        }
        if (mutation.type === 'attributes' && mutation.attributeName === 'data-row') {
            (0, eventHandlers_1.updateModalInformation)();
        }
    });
});


/***/ }),

/***/ 833:
/***/ ((__unused_webpack_module, exports) => {


Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.convertImageUrl = exports.getImageName = exports.convertImageUrlToS3Path = void 0;
function convertImageUrlToS3Path(url) {
    // 检查 URL 是否有效
    if (!url || typeof url !== 'string') {
        return null;
    }
    // 定义转换逻辑
    var urlParts = new URL(url);
    // const hostname = urlParts.hostname;
    var path = urlParts.pathname;
    // 确保 URL 的主机部分符合预期
    // if (!hostname.includes('myhuaweicloud.com')) {
    //   throw new Error('URL does not belong to the expected domain');
    // }
    // 构建并返回 S3 路径
    var s3Path = "s3://aiot-images".concat(path);
    // 文件名
    var fileName = path.split('/').pop() || Math.random().toString(36).substring(7);
    return {
        s3Path: s3Path,
        fileName: fileName,
    };
}
exports.convertImageUrlToS3Path = convertImageUrlToS3Path;
// 获取图片网络链接文件名
function getImageName(url) {
    var urlParts = new URL(url);
    var path = urlParts.pathname;
    var fileName = path.split('/').pop() || Math.random().toString(36).substring(7);
    return fileName;
}
exports.getImageName = getImageName;
function convertImageUrl(originalUrl) {
    // // 首先,我们验证 URL 是否符合预期的格式
    // if (!originalUrl.startsWith('https://aiot-images.obs.cn-east-3.myhuaweicloud.com/alerts/')) {
    //   throw new Error('URL does not match the expected format.');
    // }
    // 将 'alerts' 替换为 'raw'
    var convertedUrl = originalUrl.replace('/alerts/', '/raw/');
    // 在文件名前添加 'r'
    // 分割 URL 来找到文件名部分,然后添加 'r'
    var parts = convertedUrl.split('/');
    var fileNameIndex = parts.length - 1; // 文件名总是最后一部分
    parts[fileNameIndex] = parts[fileNameIndex].replace(/^\d+-/, '');
    parts[fileNameIndex] = 'r' + parts[fileNameIndex];
    // 重新组合 URL
    convertedUrl = parts.join('/');
    return convertedUrl;
}
exports.convertImageUrl = convertImageUrl;


/***/ }),

/***/ 921:
/***/ ((__unused_webpack_module, exports) => {


Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.AUTH_TOKEN = void 0;
// token
exports.AUTH_TOKEN = 'Token aec2e89b17af851676f0398e7d56d662fb7d6d8c';


/***/ }),

/***/ 156:
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {


var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
    if (mod && mod.__esModule) return mod;
    var result = {};
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    __setModuleDefault(result, mod);
    return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
var app_1 = __importDefault(__webpack_require__(859));
if (true) {
    (0, app_1.default)();
}
else {}


/***/ }),

/***/ 668:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {


Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.postData = exports.getData = void 0;
var constants_1 = __webpack_require__(921);
var message_1 = __webpack_require__(603);
var getData = function (url, type, usermethod) {
    if (type === void 0) { type = "document" /* XhrResponseType.DOCUMENT */; }
    if (usermethod === void 0) { usermethod = "GET" /* XhrMethod.GET */; }
    return new Promise(function (resolve, reject) {
        GM_xmlhttpRequest({
            method: usermethod,
            url: url,
            responseType: type,
            timeout: 5 * 60 * 1000,
            headers: {
                Authorization: constants_1.AUTH_TOKEN,
            },
            onload: function (response) {
                console.log('response - getData :>> ', response);
                if (response.status >= 200 && response.status < 400) {
                    resolve(response.response);
                }
                else {
                    reject(response);
                }
            },
            onerror: function (error) {
                new message_1.MessageBox('网络错误');
                reject(error);
            },
            ontimeout: function () {
                new message_1.MessageBox('网络超时', 'none', 2 /* IMPORTANCE.LOG_POP_GM */);
                reject('timeout');
            },
        });
    });
};
exports.getData = getData;
var postData = function (url, postData, _a) {
    var _b = _a === void 0 ? {
        responseType: "application/x-www-form-urlencoded" /* XhrResponseType.FORM */,
        usermethod: "POST" /* XhrMethod.POST */,
        contentType: "json" /* XhrResponseType.JSON */,
    } : _a, _c = _b.responseType, responseType = _c === void 0 ? "application/x-www-form-urlencoded" /* XhrResponseType.FORM */ : _c, _d = _b.usermethod, usermethod = _d === void 0 ? "POST" /* XhrMethod.POST */ : _d, _e = _b.contentType, contentType = _e === void 0 ? "json" /* XhrResponseType.JSON */ : _e;
    return new Promise(function (resolve, reject) {
        GM_xmlhttpRequest({
            method: usermethod,
            url: url,
            headers: {
                'Content-Type': contentType,
                Authorization: constants_1.AUTH_TOKEN,
            },
            data: postData,
            responseType: responseType,
            timeout: 1 * 60 * 1000,
            onload: function (response) {
                if (response.status >= 200 && response.status < 400) {
                    resolve(response);
                }
                else {
                    new message_1.MessageBox('请求错误:' + response.status);
                    reject(response.status);
                }
            },
            onerror: function (error) {
                new message_1.MessageBox('网络错误');
                reject(error);
            },
            ontimeout: function () {
                new message_1.MessageBox('网络超时', 'none', 2 /* IMPORTANCE.LOG_POP_GM */);
                reject('timeout');
            },
        });
    });
};
exports.postData = postData;


/***/ }),

/***/ 603:
/***/ ((__unused_webpack_module, exports) => {


Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.MessageBox = void 0;
// 需要手动增加 GM_addStyle 和 GM_notification 权限
/**
 * 消息通知类:不依赖框架
 * @param text string | undefined
 * @param setTime number | string = 5000,
 * @param importance number = 1
 * @example
 * 0.先在入口文件中调用静态方法 MessageBox.generate() 方法初始化消息弹出窗口;
 * 1. new MessageBox('hello')
 * 2.空初始化时调用 show() 显示消息;
 * 3.setTime:ms,非数字时为永久消息,需手动调用 refresh() 刷新消息,remove() 移除消息;
 * 4.importance:1: log + 自定义弹窗;2: log + 自定义弹窗 + GM系统提示;其它值:自定义弹窗;
 */
var MessageBox = /** @class */ (function () {
    function MessageBox(text, setTime, importance) {
        if (setTime === void 0) { setTime = 5000; }
        if (importance === void 0) { importance = 1 /* IMPORTANCE.LOG_POP */; }
        this._msg = null; // 永久显示标记,和元素地址
        this._text = text;
        this._setTime = setTime;
        this._importance = importance;
        this._timer = 0; // 计数器
        // 非空初始化,立即执行;
        if (text !== undefined) {
            this.show();
        }
    }
    // 静态方法,初始化消息盒子,先调用本方法初始化消息弹出窗口
    MessageBox.generate = function () {
        // 添加样式
        GM_addStyle("\n      #messageBox {\n        width: 222px; \n        position: fixed; \n        right: 5%; \n        bottom: 20px; \n        z-index: 99999\n      }\n      #messageBox div {\n        width: 100%; \n        background-color: #64ce83; \n        float: left; \n        padding: 5px 10px; \n        margin-top: 10px; \n        border-radius: 10px; \n        color: #fff; \n        box-shadow: 0px 0px 1px 3px #ffffff\n      }\n      ");
        this._msgBox = document.createElement('div'); // 创建类型为div的DOM对象
        this._msgBox.id = 'messageBox';
        document.body.append(this._msgBox); // 消息盒子添加到body
    };
    // 显示消息
    MessageBox.prototype.show = function (text, setTime, importance) {
        var _this = this;
        if (text === void 0) { text = this._text; }
        if (setTime === void 0) { setTime = this._setTime; }
        if (importance === void 0) { importance = this._importance; }
        if (this._msg !== null) {
            throw new Error('先移除上条消息,才可再次添加!');
        }
        if (text === undefined) {
            throw new Error('未输入消息');
        }
        this._text = text;
        this._setTime = setTime;
        this._importance = importance;
        this._msg = document.createElement('div');
        this._msg.textContent = text;
        MessageBox._msgBox.append(this._msg); // 显示消息
        switch (importance) {
            case 1: {
                console.log(text);
                break;
            }
            case 2: {
                console.log(text);
                GM_notification(text);
                break;
            }
            default: {
                break;
            }
        }
        if (setTime && !isNaN(Number(setTime))) {
            // 默认5秒删掉消息,可设置时间,none一直显示
            setTimeout(function () {
                _this.remove();
            }, Number(setTime));
        }
    };
    MessageBox.prototype.refresh = function (text) {
        if (isNaN(Number(this._setTime)) && this._msg) {
            this._msg.textContent = text;
            switch (this._importance) {
                case 1: {
                    console.log(text);
                    break;
                }
                case 2: {
                    console.log(text);
                    GM_notification(text);
                    break;
                }
                default: {
                    break;
                }
            }
        }
        else {
            throw new Error('只有弹窗永久消息支持刷新内容:' + this._setTime);
        }
    };
    // 移除方法,没有元素则等待setTime 5秒再试5次
    MessageBox.prototype.remove = function () {
        var _this = this;
        if (this._msg) {
            this._msg.remove();
            this._msg = null; // 清除标志位
        }
        else {
            // 空初始化时,消息异步发送,导致先执行移除而获取不到元素,默认 setTime=5000
            // 消息发出后,box 非空,可以移除,不会执行 setTime="none"
            if (this._timer == 4) {
                throw new Error('移除的元素不存在:' + this._msg);
            }
            this._timer++;
            setTimeout(function () {
                _this.remove();
            }, Number(this._setTime));
        }
    };
    return MessageBox;
}());
exports.MessageBox = MessageBox;


/***/ }),

/***/ 224:
/***/ ((__unused_webpack_module, exports) => {


Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.logStyle = void 0;
function logStyle() {
    return "font-weight: bold; color: #ffffff; background:linear-gradient(-45deg, #0058ff 50%, #47caff 50% );background: -webkit-linear-gradient( 120deg, #0058ff 30%, #41d1ff ); padding: 4px 8px; border-radius: 4px;";
}
exports.logStyle = logStyle;


/***/ }),

/***/ 669:
/***/ ((module) => {

module.exports = jQuery;

/***/ })

/******/ 	});
/************************************************************************/
/******/ 	// The module cache
/******/ 	var __webpack_module_cache__ = {};
/******/ 	
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/ 		// Check if module is in cache
/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
/******/ 		if (cachedModule !== undefined) {
/******/ 			return cachedModule.exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = __webpack_module_cache__[moduleId] = {
/******/ 			// no module.id needed
/******/ 			// no module.loaded needed
/******/ 			exports: {}
/******/ 		};
/******/ 	
/******/ 		// Execute the module function
/******/ 		__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/ 	
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/ 	
/************************************************************************/
/******/ 	
/******/ 	// startup
/******/ 	// Load entry module and return exports
/******/ 	// This entry module is referenced by other modules so it can't be inlined
/******/ 	var __webpack_exports__ = __webpack_require__(156);
/******/ 	
/******/ })()
;