侧边栏壁纸
博主头像
米老鼠吃薯片 博主等级

行动起来,活在当下

  • 累计撰写 2 篇文章
  • 累计创建 3 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

微博拖拽上传图片

Administrator
2025-12-12 / 0 评论 / 0 点赞 / 7 阅读 / 0 字

解决的问题:

因目前只有选择本地文件上传一个途径,要上传需要先将图片保存至本地后才能上传。故开发此脚本,使用此脚本后:既能拖拽上传还能直接获取到直接访问链接。

使用效果:

在“上传照片”旁边会出现一个“拖拽上传”按钮

点击“拖拽上传”,并往弹出的框内拖入单张图片,点击“上传”按钮,即可上传到目标专辑中

上传成功后会将“直连链接”放入剪切板

脚本代码:

注:此脚本中涉及的api均为官方api

// ==UserScript==
// @name         微博拖拽上传
// @namespace    http://tampermonkey.net/
// @version      2025-12-11
// @description  try to take over the world!
// @author       You
// @match        https://photo.weibo.com/upload/index*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=weibo.com
// @grant        GM_xmlhttpRequest
// ==/UserScript==

(function() {
    'use strict';
    let selectedFile = null
    function dragEnter(e){
        e.stopPropagation();
        e.preventDefault();
    }
    function dragOver(e){
        e.stopPropagation();
        e.preventDefault();
    }
    const insertFileToDiv = (name)=>{
        let innnerHtml = `
        <div style="height:40px;line-height:40px;width:100%;">文件名:${name}</div>
        <div style="width: 100%;height: 40px;display: flex;justify-content: flex-end;align-items: center;">
            <button id="clearDivFileId" style="color: rgba(255, 0, 0,.6);margin-right:10px;" ">删除</button><button id="uploadBtn">上传</button>
        </div>`
        document.querySelector("#dragDiv").innerHTML = innnerHtml
        document.querySelector("#clearDivFileId").addEventListener('click',(e)=>{
            clearFileInDiv()
        })
        document.querySelector("#uploadBtn").addEventListener('click',(e)=>{
            uploadFile()
        })
    }
    const clearFileInDiv = ()=>{
        selectedFile = null
        document.querySelector("#dragDiv").innerText = "拖拽图片到此处"
    }
    const handleFile = (files)=>{
        if(files == null){
            return
        }
        let file = files[0]
        insertFileToDiv(file.name)
    }
    const createDragDiv = ()=>{
        let dragDiv = document.createElement('div')
        dragDiv.innerText = "拖拽图片到此处"
        dragDiv.setAttribute("id","dragDiv")
        dragDiv.setAttribute("style","z-index:9999;background-color: pink;border: 1px solid rgba(0,0,0,.8);border-radius:8px;width:400px;height:300px;text-align:center;line-height:300px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)")
        dragDiv.style.display = "none"
        dragDiv.addEventListener('click',(e)=>{
            e.stopPropagation()
        })
        dragDiv.addEventListener( "drop" , function (e) {
            e.preventDefault();
            e.stopPropagation();
            handleFile(e.dataTransfer.files)
            selectedFile = e.dataTransfer.files[0]
        }, false );
        dragDiv.addEventListener("dragenter",dragEnter,false);
        dragDiv.addEventListener("dragover",dragOver,false);
        document.body.insertAdjacentElement('beforeend',dragDiv);
    }
    window.addEventListener('load',()=>{
        document.body.style.position = 'relative'
        createDragDiv()
        document.body.addEventListener('click',()=>{
            clearFileInDiv()
            document.querySelector("#dragDiv").style.display = "none"
        })
        let dragUploadButton = document.createElement('button')
        dragUploadButton.setAttribute("style","margin-left:20px;background-color: #bfa;border: 1px solid skyblue;padding:5px 10px;border-radius:8px;cursor:pointer;")
        dragUploadButton.innerText = "拖拽上传"
        dragUploadButton.addEventListener('click',(event)=>{
            document.querySelector("#dragDiv").style.display = "flex"
            document.querySelector("#dragDiv").style.flexDirection = "column"
            document.querySelector("#dragDiv").style.justifyContent = "space-between"
            event.stopPropagation()
        })
        document.querySelector('.m_path_tit').insertAdjacentElement('beforeend',dragUploadButton);
    })

    const getAlbumId = ()=>{
        let albumIdInput = document.querySelector(".m_smltSelect input")
        if(albumIdInput == null){
            alert("找不到目标专辑")
            return
        }
        if(albumIdInput.value == null){
            alert("找不到目标专辑")
            return
        }
        return albumIdInput.value
    }

    const copyUrl = (pid)=>{
        let suffix = selectedFile.name.split(".")[selectedFile.name.split(".").length-1]
        let res = "https://cdn.cdnjson.com/pic.html?url=tvax3.sinaimg.cn/large/"+pid+"."+suffix;
        navigator.clipboard.writeText(res)
    }


    const uploadFile = ()=>{
        if(selectedFile == null){
            alert("未选择文件")
        }
        let albumId = getAlbumId()
        console.log(albumId)
        if(albumId == null){
            return
        }
        const formData = new FormData();
        formData.append('pic1', selectedFile, selectedFile.name);
        GM_xmlhttpRequest({
            method: "POST",
            url: "https://picupload.weibo.com/interface/pic_upload.php?s=rdxt&app=miniblog&cb=https://photo.weibo.com/upload/simple_upload/pic/1",
            data: formData,
            onload: function(r) {
                let pidSplit = r.finalUrl.split("pid=")
                if(pidSplit == null || pidSplit.length != 2){
                    console.log("无法解析pid:"+r.finalUrl)
                    return
                }
                let pid = pidSplit[1]
                GM_xmlhttpRequest({
                    url:"https://photo.weibo.com/upload/photo",
                    headers: {
                        "Content-Type": "application/x-www-form-urlencoded",
                        "origin": "https://photo.weibo.com",
                        "priority": "u=0, i",
                        "referer": "https://photo.weibo.com/",
                        "upgrade-insecure-requests": "1",
                    },
                    data: "album_id=" + encodeURIComponent(albumId) +
                    "&pid=" + encodeURIComponent(pid)+
                    "&upload_type=" + encodeURIComponent("1")+
                    "&isOrig=" + encodeURIComponent("0"),
                    method: "POST",
                    onload: function(res) {
                        try{
                            JSON.parse(res.response)
                            copyUrl(pid)
                            clearFileInDiv()
                            alert("上传成功")
                        }catch(e){
                            alert("上传失败")
                        }
                    }
                })
            }
        });
    }

    // Your code here...
})();

0

评论区