Greasy Fork is available in English.
Permanently delete conversations on claude.ai
// ==UserScript==
// @name Mass Delete - Claude
// @namespace http://greasyfork.icu/en/users/670188-hacker09?sort=daily_installs
// @version 1
// @description Permanently delete conversations on claude.ai
// @author hacker09
// @match https://claude.ai/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=claude.ai
// @grant unsafeWindow
// ==/UserScript==
(() => {
const getCookieValue = (name) => (
document.cookie.split('; ').find(row => row.startsWith(`${name}=`))?.split('=')[1] ?? undefined
);
const org = getCookieValue('lastActiveOrg');
if (!org) {
console.error("Cannot get current organization ID");
return;
}
let checkboxesVisible = false;
let chats = [];
const fetchAndAddCheckboxes = async () => {
try {
const response = await fetch(`https://claude.ai/api/organizations/${org}/chat_conversations`, {
method: "GET",
credentials: "include",
});
chats = await response.json();
chats.forEach(chat => {
const chatElement = document.querySelector(`a[href="/chat/${chat.uuid}"]`);
if (chatElement && !chatElement.parentNode.nextElementSibling?.querySelector('input[type="checkbox"]')) {
const checkboxContainer = document.createElement('div');
checkboxContainer.style.marginTop = '5px';
const checkbox = document.createElement('input');
checkbox.type = 'checkbox';
checkbox.dataset.chatId = chat.uuid;
checkboxContainer.appendChild(checkbox);
chatElement.parentNode.parentNode.insertBefore(checkboxContainer, chatElement.parentNode.nextSibling);
}
});
if (!document.getElementById('selectAllCheckbox')) {
const selectAllContainer = document.createElement('div');
selectAllContainer.style.marginBottom = '10px';
const selectAllCheckbox = document.createElement('input');
selectAllCheckbox.type = 'checkbox';
selectAllCheckbox.style.marginRight = '5px';
selectAllCheckbox.id = 'selectAllCheckbox';
selectAllCheckbox.addEventListener('change', () => {
const checkboxes = document.querySelectorAll('input[type="checkbox"]');
checkboxes.forEach(checkbox => {
if (checkbox.id !== 'selectAllCheckbox') {
checkbox.checked = selectAllCheckbox.checked;
}
});
});
const selectAllLabel = document.createElement('label');
selectAllLabel.textContent = 'Select All';
selectAllContainer.appendChild(selectAllCheckbox);
selectAllContainer.appendChild(selectAllLabel);
const previousChatsHeader = document.querySelector('h3.text-sm.text-center.text-text-400');
if (previousChatsHeader) {
previousChatsHeader.parentNode.insertBefore(selectAllContainer, previousChatsHeader);
}
}
checkboxesVisible = true;
} catch (error) {
console.error("Failed to fetch chat conversations:", error);
}
};
const deleteChats = async (chatIds) => {
try {
await Promise.all(
chatIds.map(id => fetch(`https://claude.ai/api/organizations/${org}/chat_conversations/${id}`, {
method: "DELETE",
credentials: "include",
}))
);
window.location.reload();
} catch (error) {
console.error("Error clearing history:", error);
}
};
unsafeWindow.clearHistory = async () => {
if (!checkboxesVisible) {
await fetchAndAddCheckboxes();
} else {
const selectedChats = Array.from(document.querySelectorAll('input[type="checkbox"]:checked'))
.filter(checkbox => checkbox.id !== 'selectAllCheckbox')
.map(checkbox => checkbox.dataset.chatId);
if (selectedChats.length > 0) {
const confirmMessage = `Are you sure you want to delete the selected ${selectedChats.length} conversation(s)?`;
if (confirm(confirmMessage)) {
deleteChats(selectedChats);
}
} else if (selectedChats.length === 0) {
const checkboxes = document.querySelectorAll('input[type="checkbox"]');
checkboxes.forEach(checkbox => {
if (checkbox.id !== 'selectAllCheckbox') {
checkbox.parentNode.remove();
}
});
const selectAllCheckbox = document.getElementById('selectAllCheckbox');
if (selectAllCheckbox) {
selectAllCheckbox.parentNode.remove();
}
checkboxesVisible = false;
}
}
};
const createButton = () => {
const button = document.createElement("button");
button.textContent = 'Delete Conversations';
button.style.position = 'fixed';
button.style.right = '20px';
button.style.bottom = '60px'; // 改為從底部往上 60px
button.style.zIndex = 1000;
button.classList.add("block", "p-4");
button.addEventListener("click", () => {
unsafeWindow.clearHistory();
});
document.body.appendChild(button);
};
createButton();
})();