Last active
May 15, 2022 17:11
-
-
Save lljxx1/53daa853afeb99e926a4a0058d212836 to your computer and use it in GitHub Desktop.
炸号微博备份,F12打开浏览器控制台,执行代码
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // ==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 | |
| // ==/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 | |
| }); | |
| })(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment