解决的问题:
因目前只有选择本地文件上传一个途径,要上传需要先将图片保存至本地后才能上传。故开发此脚本,使用此脚本后:既能拖拽上传还能直接获取到直接访问链接。
使用效果:
在“上传照片”旁边会出现一个“拖拽上传”按钮
点击“拖拽上传”,并往弹出的框内拖入单张图片,点击“上传”按钮,即可上传到目标专辑中
上传成功后会将“直连链接”放入剪切板
脚本代码:
注:此脚本中涉及的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...
})();
评论区