// ==UserScript==
// @name 微博备份
// @namespace http://tampermonkey.net/
// @version 0.1
// @description 炸号微博备份
// @author fun
// @match https://weibo.com
// @icon https://www.google.com/s2/favicons?sz=64&domain=weibo.com
// @grant none
// @license MIT
// ==/UserScript==
(function() {
'use strict';
let btn = document.createElement("button");
async function fetchContent(uid = 0, page = 1, since_id = null) {
const req = await fetch(
`https://weibo.com/ajax/statuses/mymblog?uid=${uid}&page=${page}&feature=0&` + (since_id ? 'since_id='+since_id: ''),
{
headers: {
accept: "application/json, text/plain, */*",
"accept-language": "zh-CN,zh;q=0.9,en-IN;q=0.8,en;q=0.7,ar;q=0.6",
"sec-ch-ua":
'" Not A;Brand";v="99", "Chromium";v="101", "Google Chrome";v="101"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"macOS"',
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
traceparent:
"00-09839916bccb8f6ac30255864fd8d20a-028b7278adc46384-00",
"x-requested-with": "XMLHttpRequest",
"x-xsrf-token": "v6RrZpYtRsQDml7q7n0GnO_F",
},
referrer: `https://weibo.com/u/${uid}`,
referrerPolicy: "strict-origin-when-cross-origin",
body: null,
method: "GET",
mode: "cors",
credentials: "include",
}
);
const data = await req.json();
return data
}
async function fetchAll() {
var uid = $CONFIG.uid;
let page = 1;
let allPageData = []
let noMore = false
for (let index = 0; index < Infinity; index++) {
console.log("scan", "page", page);
printLog(`备份第 ${page}`);
for (let index = 0; index < 10; index++) {
const pageData = await fetchContent(uid, page)
if (pageData.ok) {
allPageData.push(pageData);
if (pageData.data.list.length === 0) noMore = true
break;
}
await new Promise((resolve) => {
setTimeout(resolve, 3000);
});
console.log("retry", index);
printLog(`[重试]备份第 ${page}`);
}
page++
if (noMore) break;
await new Promise((resolve) => {
setTimeout(resolve, 3000);
});
}
console.log('all done')
printLog(`备份完毕`);
const parsed = allPageData.reduce((all, item) => {
item.data.list.forEach((c) => {
const formatted = {
images: c.pic_ids.map((d) => {
return c.pic_infos[d].large.url;
}),
text: c.text,
created_at: c.created_at,
// raw: c,
};
if (c.retweeted_status) {
formatted.retweeted_status = {
text: c.retweeted_status.text,
images:
c.retweeted_status.pic_ids &&
c.retweeted_status.pic_ids.map((d) => {
return c.retweeted_status.pic_infos[d].large.url;
}),
};
}
all.push(formatted);
});
return all;
}, [])
console.log(
"data",
allPageData,
parsed
);
document.body.innerText = JSON.stringify(parsed);
}
// fetchAll()
function printLog(msg) {
btn.innerText = msg;
}
btn.innerHTML = '数据备份'
document.body.appendChild(btn)
btn.setAttribute('style', `position: fixed;
top: 20px;
right: 20px;
z-index: 100000;
padding: 7px 15px;
cursor: pointer;`)
let started = false
btn.addEventListener("click", async () => {
if (started) {
alert("started");
return
}
started = true;
await fetchAll();
started = false
});
})();