油猴为网站添加图床接口


杂七杂八69 阅0 评

由于我的图片接口开启了 跨域 怎么解决呢
chrome 浏览器 安装插件 CORS Unblock 需要手动开启哦。
当然你也可以直接用 公共图床 上传 然后手动复制链接了,不过有点麻烦。

// ==UserScript==
// @name         图床
// @namespace    http://buyi.info/
// @version      2.6.1
// @description  添加图床上传接口
// @author       布衣
// @match        https://*/admin/write-post.php*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 确保 DOM 元素已加载
    window.addEventListener('load', function() {
        const advancePanelBtn = document.getElementById('advance-panel-btn');

        if (advancePanelBtn) {
            // 创建一个新的 div 来包裹上传按钮
            const buttonContainer = document.createElement('div');
            buttonContainer.style.marginTop = '10px';
            buttonContainer.style.display = 'flex';
            buttonContainer.style.flexDirection = 'column';
            buttonContainer.style.alignItems = 'flex-start';

            // 创建"图床"的标签
            const titleLabel = document.createElement('label');
            titleLabel.innerText = '图床';
            titleLabel.style.display = 'block';
            titleLabel.style.marginBottom = '5px';
            titleLabel.style.fontWeight = 'bold';

            // 创建文件上传 input
            const uploadInput = document.createElement('input');
            uploadInput.type = 'file';
            uploadInput.id = 'upload-button';
            uploadInput.style.display = 'none';

            // 创建文件选择标签
            const label = document.createElement('label');
            label.htmlFor = uploadInput.id;
            label.innerText = '选择文件';
            label.style.cursor = 'pointer';
            label.style.backgroundColor = '#007bff';
            label.style.color = '#fff';
            label.style.padding = '5px 8px';
            label.style.borderRadius = '4px';
            label.style.textAlign = 'center';
            label.style.display = 'inline-block';
            label.classList.add('select-button'); // 添加 CSS 类

            // 创建显示文件名的标签
            const fileNameLabel = document.createElement('span');
            fileNameLabel.style.marginTop = '5px';
            fileNameLabel.style.fontWeight = 'bold';
            fileNameLabel.innerText = ''; // 初始为空

            // 创建上传按钮
            const actualUploadButton = document.createElement('button');
            actualUploadButton.type = 'button';
            actualUploadButton.innerText = '上传';
            actualUploadButton.style.padding = '5px 8px';
            actualUploadButton.style.fontSize = '14px';
            actualUploadButton.style.backgroundColor = '#28a745';
            actualUploadButton.style.color = '#fff';
            actualUploadButton.style.border = 'none';
            actualUploadButton.style.borderRadius = '4px';
            actualUploadButton.style.cursor = 'pointer';
            actualUploadButton.classList.add('upload-button'); // 添加 CSS 类

            // 创建进度条
            const progressContainer = document.createElement('div');
            progressContainer.style.width = '100%';
            progressContainer.style.backgroundColor = '#f3f3f3';
            progressContainer.style.borderRadius = '4px';
            progressContainer.style.overflow = 'hidden';
            progressContainer.style.marginTop = '5px';
            progressContainer.style.display = 'none'; // 初始隐藏
            const progressBar = document.createElement('div');
            progressBar.style.height = '8px';
            progressBar.style.backgroundColor = '#28a745';
            progressBar.style.width = '0%'; // 初始宽度为0
            progressBar.style.transition = 'width 0.3s ease'; // 过渡效果

            // 创建百分比文本
            const percentLabel = document.createElement('span');
            percentLabel.style.marginTop = '5px';
            percentLabel.style.fontWeight = 'bold';
            percentLabel.innerText = '0%';
            percentLabel.style.display = 'none'; // 初始隐藏

            progressContainer.appendChild(progressBar);
            progressContainer.appendChild(percentLabel); // 添加百分比文本

            // 在 <head> 中插入 CSS 样式
            const style = document.createElement('style');
            style.textContent = `
                .upload-button, .select-button {
                    transition: all 0.3s ease;
                }
                .upload-button:hover {
                    background: linear-gradient(45deg, #28a745, #45a049);
                    transform: scale(1.05);
                }
                .select-button:hover {
                    background: linear-gradient(45deg, #007bff, #0056b3);
                    transform: scale(1.05);
                }
            `;
            document.head.appendChild(style);

            // 获取现有的 textarea 元素
            const responseTextArea = document.querySelector('textarea#text');

            // 文件选择事件
            uploadInput.addEventListener('change', function() {
                const file = uploadInput.files[0];
                if (file) {
                    fileNameLabel.innerText = `已选择文件: ${file.name}`; // 显示文件名称
                } else {
                    fileNameLabel.innerText = ''; // 清空文件名称
                }
            });

            // 上传按钮点击事件
            actualUploadButton.onclick = function() {
                const file = uploadInput.files[0];
                if (file) {
                    const validImageTypes = ['image/jpg', 'image/jpeg', 'image/png', 'image/gif', 'image/webp'];
                    if (!validImageTypes.includes(file.type)) {
                        alert('请上传有效的图片文件。');
                        return;
                    }

                    const formData = new FormData();
                    formData.append('file', file);
                    formData.append('name', file.name);
                    formData.append('uuid', 'o_1iaqr3gie1s991p7usrhv011e3ea');
                    formData.append('path', 'tcl');

                    // 显示进度条和百分比文本
                    progressContainer.style.display = 'block'; // 显示进度条
                    percentLabel.style.display = 'inline'; // 显示百分比文本

                    // 使用 XMLHttpRequest 来支持进度监控
                    const xhr = new XMLHttpRequest();
                    xhr.open('POST', 'https://file.sang.pub/api/upload', true);

                    // 监听上传进度
                    xhr.upload.onprogress = function(event) {
                        if (event.lengthComputable) {
                            const percentComplete = Math.round((event.loaded / event.total) * 100);
                            progressBar.style.width = percentComplete + '%'; // 更新进度条宽度
                            percentLabel.innerText = percentComplete + '%'; // 更新百分比文本
                        }
                    };

                    // 处理响应
                    xhr.onload = function() {
                        if (xhr.status >= 200 && xhr.status < 300) {
                            const text = xhr.responseText;
                            console.log('原始响应:', text); // 打印原始响应

                            // 定义默认的 alt 文本
                            const altText = '图片';

                            // 生成 Markdown 格式的字符串
                            const markdownImage = `![${altText}](${text})`;

                            if (responseTextArea) {
                                // 在光标处插入文本
                                const start = responseTextArea.selectionStart;
                                const end = responseTextArea.selectionEnd;

                                // 插入 Markdown 格式文本
                                responseTextArea.value =
                                    responseTextArea.value.substring(0, start) +
                                    markdownImage +
                                    responseTextArea.value.substring(end);

                                // 设置光标位置到插入的文本后
                                responseTextArea.selectionStart = responseTextArea.selectionEnd = start + markdownImage.length;
                                responseTextArea.focus(); // 将焦点放回 textarea
                            } else {
                                console.error('找不到 textarea 元素');
                            }

                            // 上传完成后重置文件输入和名称
                            uploadInput.value = ''; // 清空文件输入
                            fileNameLabel.innerText = ''; // 清空文件名称
                            progressContainer.style.display = 'none'; // 隐藏进度条
                            percentLabel.style.display = 'none'; // 隐藏百分比文本
                        } else {
                            alert('上传失败,请重试。');
                        }
                    };

                    // 发送上传请求
                    xhr.send(formData);
                } else {
                    alert('请先选择一个文件。');
                }
            };

            // 创建一个新的 div 来包含选择文件和上传按钮
            const actionContainer = document.createElement('div');
            actionContainer.style.display = 'flex';
            actionContainer.style.gap = '5px';
            actionContainer.appendChild(label);
            actionContainer.appendChild(uploadInput);
            actionContainer.appendChild(actualUploadButton);

            // 将标题标签、操作容器和进度条添加到 buttonContainer 中
            buttonContainer.appendChild(titleLabel);
            buttonContainer.appendChild(actionContainer);
            buttonContainer.appendChild(fileNameLabel); // 添加文件名显示标签
            buttonContainer.appendChild(progressContainer); // 添加进度条容器

            // 将按钮容器添加到 advance-panel-btn 之后
            advancePanelBtn.parentNode.insertBefore(buttonContainer, advancePanelBtn.nextSibling);
        }
    });
})();
最后更新 2024-10-26
评论 ( 0 )
OωO
隐私评论