Skip to content

Instantly share code, notes, and snippets.

@AndersMoberg
Last active August 8, 2024 19:42
Show Gist options
  • Save AndersMoberg/7fc19006142d221a3906828757bafef3 to your computer and use it in GitHub Desktop.
Save AndersMoberg/7fc19006142d221a3906828757bafef3 to your computer and use it in GitHub Desktop.
Userscript, clears bookmarks and saves them to file
// ==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