Skip to content

Instantly share code, notes, and snippets.

@emanzitti
Created September 18, 2018 19:12
Show Gist options
  • Save emanzitti/a21c915a5a547aab40d4567d948aa3f6 to your computer and use it in GitHub Desktop.
Save emanzitti/a21c915a5a547aab40d4567d948aa3f6 to your computer and use it in GitHub Desktop.
Delete all of your messages on a Discord server
clearMessages = function (guild_id, author_id, authToken, deleted = new Set()) {
/*
* Discord: Don't copy stuff into this box
* Me: dOn'T COpy sTuFf iNtO tHIs bOx
*/
const searchURL = `https://discordapp.com/api/v6/guilds/${guild_id}/messages/search?author_id=${author_id}&include_nsfw=true`
const headers = { Authorization: authToken }
let clock = 0
interval = 500
function delay(duration) {
return new Promise((resolve, reject) => {
setTimeout(resolve, duration)
})
}
function loadMessages() {
return fetch(searchURL, { headers })
}
function tryDeleteMessage(message) {
// RAce coNDItiOn
if (message.author.id == author_id && !deleted.has(message.id)) { // skip already deleted messages
console.log(`Deleting message ${message.id} from ${message.author.username} (${message.content}...)`)
return fetch(`https://discordapp.com/api/v6/channels/${message.channel_id}/messages/${message.id}`, { headers, method: 'DELETE' })
}
}
let messagesStore = []
loadMessages()
.then(resp => resp.json())
.then(messages => {
messages = messages.messages
if (messages === undefined || messages === null || messages.length == 0) {
console.log(`Couldn't load messages. Check guild id, author id, and auth token.`)
return
}
messages = messages.filter(m => m) // clean undefined
messages = [].concat.apply([], messages); // flatten
messages = messages.filter(m => m) // clean undefined
if (messages.length === 0) {
console.log(`Couldn't load messages. Check guild id, author id, and auth token.`)
return
}
messages = messages.filter(m => m.author.id == author_id)
beforeId = messages[messages.length-1].id
messagesStore = messagesStore.concat(messages)
return Promise.all(messagesStore.map(message => {
return delay(clock += interval)
.then(() => tryDeleteMessage(message))
.then(resp => {
if (resp) {
if (resp.status == 429) {
interval += 10
console.log(`Too fast; bumping interval to ${interval}`)
} else if (resp.status === 204) {
deleted.add(message.id) // mark deleted
return resp.text()
}
}
})
}))
})
.then(function() {
if (messagesStore.length !== 0) {
clearMessages(guild_id, author_id, authToken, deleted)
} else {
console.log(`We have loaded all messages in this chat.`)
}
})
}
var authToken = ""
if (authToken.length === 0) {
var localToken = document.body.appendChild(document.createElement(`iframe`)).contentWindow.localStorage.token
if (localToken === undefined) {
console.log(`Getting the auth token from localStorage isn't supported on Chrome or the desktop client. Use Firefox or grab it from a network request's headers.`)
console.log(`To do that go to the Network tab of your inspector and copy the Authorization header of a request. There are detailed instructions in the tutorial.`)
} else {
authToken = JSON.parse(localToken)
}
}
if (authToken.length !== 0) {
clearMessages('____________guild_id_here_______________', '____________author_id_here______________', authToken)
}

Delete all messages in a Discord channel

This works best in Firefox, I haven't tested it in Chrome. If it has trouble getting the Auth token from LocalStorage so you need to grab it from a request's headers and replace the parameter "authToken" on the last line with it.

Preqrequisites:

  • computer
  • general knowledge of your browser's inspector/developer tools
  • possibly even a brain

1. Grab guild and author ids

The script uses the internal id values Discord refers to the selected server and user by. The easy way to do this is to enable Developer Mode in your Discord settings, after which you can simply right click the server's icon and your name and click "Copy ID". Otherwise, you can grab the server's id from the URL, and you can get your own id using the network tab of your browser's inspector.

2. Get your authorization token

This is now automated on Firefox, despite Discord "hiding" the localStorage variable from the DOM. On Chrome and the desktop client it seems to not be in localStorage (???) so you need to get it from a network request. Follow these easy steps:

  1. Open the Network tab of your inspector
  2. Open any request to Discord's servers
  3. Look for the "Authorization" request header. Copy that into the line var authToken = "". For example it might look like var authToken = "your_auth_token_goes_here"

3. Get the script

Copy-paste the script into the javascript console, and replace ____________guild_id_here_______________ and ____________author_id_here______________ with the respective ids copied in Step 1.

4. Launch

Strike the Return key on your keyboard...come on, this is not rocket science man.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment