Last active
August 8, 2024 19:42
-
-
Save AndersMoberg/7fc19006142d221a3906828757bafef3 to your computer and use it in GitHub Desktop.
Userscript, clears bookmarks and saves them to file
This file contains 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 Clears Twitter bookmarks and saves them to file | |
// @version 1 | |
// @grant none | |
// @match https://twitter.com/i/bookmarks | |
// @match https://x.com/i/bookmarks | |
// @require https://raw.githubusercontent.com/eligrey/FileSaver.js/master/dist/FileSaver.min.js | |
// @downloadURL https://gist.github.com/AndersMoberg/7fc19006142d221a3906828757bafef3/raw/0939ee3d2bba056185265af3307b420f844f28e7/twitter.exportandcleanbookmarks.user.js | |
// @updateURL https://gist.github.com/AndersMoberg/7fc19006142d221a3906828757bafef3/raw/0939ee3d2bba056185265af3307b420f844f28e7/twitter.exportandcleanbookmarks.user.js | |
// ==/UserScript== | |
function asyncDelay(ms) { | |
return new Promise(function(resolve) { | |
setTimeout(resolve, ms); | |
}); | |
} | |
async function getDeleteButton(element) { | |
const button = element.querySelectorAll('button[aria-label~="Bokmärkt"]'); | |
if(button.length == 0) { | |
throw new error('No button'); | |
} | |
return button[0]; | |
} | |
async function doOne(element) { | |
const a_href = element.querySelectorAll('a[href*="status"]')[0]; | |
console.log(a_href.href); | |
const url = a_href.href; | |
try{ | |
const button = await getDeleteButton(element); | |
button.click(); | |
await asyncDelay(2000); | |
return url; | |
} catch { | |
throw new error('No button'); | |
} | |
} | |
async function cleanCurrentOnScreen() { | |
const promptResult = prompt('How many bookmarks do you want to delete? Be wary of the selection.','20'); | |
const times = Number(promptResult) | |
if(times == NaN || times <= 0) { | |
alert('Not a valid number: ' + times.toString()) | |
return; | |
} | |
let results = []; | |
for (let index = 0; index < times; index++) { | |
try { | |
const bookmarks = document.querySelectorAll('div[aria-label~="Bokmärken"]')[0].firstChild.children; | |
results.push(await doOne(bookmarks[0])); | |
} catch { | |
console.error(index + ' Cant find button!'); | |
} | |
} | |
const resultsStr = JSON.stringify(results,null,2); | |
var blob = new Blob([resultsStr], {type: "application/json"}); | |
saveAs(blob, `twitter-${new Date().toISOString()}.json`); | |
} | |
async function addButton() { | |
let button = document.createElement("button"); | |
button.innerText = "Clear" | |
button.onclick = cleanCurrentOnScreen; | |
let nav = document.querySelector('nav'); | |
if(nav === null) { | |
await asyncDelay(1000); | |
addButton(); | |
} else { | |
document.querySelector('nav').appendChild(button); | |
} | |
} | |
window.addEventListener('load', addButton(), false); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment