Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Delete all your messages from DM or Channel in Discord

Delete all messages in a Discord channel or DM


👉 UPDATE: This gist moved to https://github.com/victornpb/undiscord


  1. Open Discord in a browser like Chrome or Firefox;

  2. Open DevTools pressing F12 or ⌘ command+option+J;

  3. Copy the deleteDiscordMessages.js script and paste it in the Console, then press ENTER;

  4. A window will be opened, fill the variables and click the START button.

Variables

authToken

  1. Open the dev tools (F12), open the Network tab. (You should clear all requests for better readability if you see some.)
  2. Delete one message manually. In the request log, you will see a request with a DELETE method.
  3. Click on the request to open the details, and on the Headers tab, copy the 'authorization' token. It's a long text > with dots like MTX5MzQ1MjAyMjU0NjA2MzM2.ROFLMAO.UvqZqBMXLpDuOY3Z456J3JRIfbk.

authorId

  • Right click your avatar in a message you sent in the chat, Copy ID

    NOT THE MESSAGE THE AVATAR.
    (You cannot delete the other's person messages a in DM channel, you will get Error 403)

channelId

  • For public channels: Right click a channel, Copy ID
  • For a DM/Direct messages: copy the number after /@me/ in the URL)

firstMessageId

  • Delete messages after one message:
    Right click a message, Copy ID
  • Delete since the begining of a channel:
    Leave this variable empty "".


DeveloperMode

If the Copy ID menu doesn't show up when right clicking:

  • Enable developer mode in discord Go to user Settings > Appearance in discord and enable Developer mode.

DO NOT SHARE YOUR authToken!

Sharing your authToken on the internet will give full access to your account! There are bots gathering credentials all over the internet. If you post your token by accident, LOGOUT from discord on that same browser you got that token imediately. Changing your password will make sure that you get logged out of every device. I advice that you turn on 2FA afterwards.

If you are unsure do not share screenshots, or copy paste logs on the internet.


DISCLAIMER: THE SOFTWARE AND ALL INFORMATION HERE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

By using any code or information provided here you are agreeing to all parts of the above Disclaimer.

Last tested: 2019-AUG-21

/*
This file is now hosted here:
https://github.com/victornpb/undiscord
*/
@ReturnOfTheScanners
Copy link

ReturnOfTheScanners commented Jul 25, 2019

@victornbp I managed to find another code that did work for me, thanks though.

Specifically this one, I'm afraid I forgot the github page I found it on:

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
            }
        
            //filter by author
            messages = messages.filter(m => m.author.id == author_id)
            // unique by id
            messages = messages.filter((e, i) => messages.findIndex(a => a.id === e.id) === i);

            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 = " auth token here"
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(' ID  ', ' Channel ID ', authToken)
}

@Dynamistic
Copy link

Dynamistic commented Jul 26, 2019

^ that doesnt work, anyways loks like the problem is if there is a page full of calls started from authid it cant go further cause its trying to delete them first but of coruse u cant do that.

@Dynamistic
Copy link

Dynamistic commented Jul 26, 2019

So yes I have confirmed WHAT the problem is, the solution, I havent figured it out yet. posts that are undeletable that say authid has started call is blocking the delete script because its trying to delete those messages first (if it fits a whole page on the search -> from:user

Ill try to find a work around if i have the time, but i hope OP can work it out before then, please and thanks.

@JoeCow
Copy link

JoeCow commented Jul 26, 2019

So yes I have confirmed WHAT the problem is, the solution, I havent figured it out yet. posts that are undeletable that say authid has started call is blocking the delete script because its trying to delete those messages first (if it fits a whole page on the search -> from:user

Ill try to find a work around if i have the time, but i hope OP can work it out before then, please and thanks.

I posted a workaround here. This should work still as looking through revisions there has been one minor change to the script since I posted which pushed the second edit down 2 lines but I have edited the linked comment to reflect that. Since I am not a coder and just used logic to edit the script a little it's not the best solution as I do believe you need to reload and paste in the edited scripts every time you fill up with system messages. Would have made my own fork with the changes already done but figure someone who actually knows code will/can come up with something more graceful.

@victornpb
Copy link
Author

victornpb commented Jul 26, 2019

I’ll try to handle this edge case

@Mikri2005
Copy link

Mikri2005 commented Aug 5, 2019

@JoeCow same issues for me. It just kinda stopped working, with the system file errors, and same thing when I tried your update as well. It's been doing this each time.

I've used STOP=0 & STOP=1 to abort, and restart, with both scripts, but I'm still stuck.
Screen Shot 2019-08-04 at 10 36 44 PM

@victornpb any ideas? To add, your original script worked great for one DM, but when I went to switch to another it went through a few hundred, and hit a wall.

@JoeCow
Copy link

JoeCow commented Aug 5, 2019

@Mikri2005

I've used STOP=0 & STOP=1 to abort, and restart, with both scripts, but I'm still stuck

I never said to use STOP= I could be wrong but as far I can tell it simply pauses the script and once the script is started it wont check for updated variables aside from STOP itself, here's more explicit instructions:

  1. Follow victors instructions and run as normal (I recommend putting the start script in a text editor so that you don't need to fill in the variables again) if the output fills with system message continue to step 2
  2. Reload the webpage you ran the script from
  3. Edit the scripts as I instructed in my comment (Keep both scripts in a text editor as you may need them again depending on how many system messages you have)
  4. Paste in the edited main script and press enter
  5. Fill in the edited start script as you normally would or better yet it should already be filled in. Fill in afterMessageID in the edited start script by going into the dm and finding your most recent message (Discord's search feature is useful here) and copying the message id
  6. Paste in the edited and filled in start script and press enter
  7. Depending on how many system message you have it may eventually fill with them again, in that case reload the webpage and repeat from Step 4 being sure to update var afterMessageId = ""; with your latest message each time

Copy link

ghost commented Aug 12, 2019

Incredibly unoptimized, slow, and barely functional. Eats up massive amounts of RAM, like 3GB.

Would not recommend using this. Try out this guy's.

@victornpb
Copy link
Author

victornpb commented Aug 13, 2019

I will eventually incorporate the suggestions from the other comments once I get some free time.

@WeaponizedMeme I have no Idea how you came up with this number, Discord takes that amount of RAM not this. The code you recommended uses basically the same approach except it doesn't bother to check anything prior to deleting messages, it doesn't actually check to see if the chat is indexed, doesn't check if you're getting throttled. In fact that other code is slower as it blindly waits half a second between every message, while I implemented an algorithm that actually tries to delete messages as fast as discord allows it without getting rate limited...

The code you linked is shorter in length I'll give you that, but it is shorter for a reason.

@mgcbufly
Copy link

mgcbufly commented Aug 18, 2019

Hi. I'm getting an issue where nothing is being deleted.
When I first ran this script it deleted about 20k of my messages, but ever since then the blue numbers on the side just keep increasing while the number of messages stays unchanged.
I only encounter this in a specific DM. The script works in other DMs/servers I've used it in. Any tips or ideas as to what is causing this?

BTW The small decrease in messages is from me manually deleting/clicking while I was hoping the script would start working

image

@xTerminatioNx
Copy link

xTerminatioNx commented Aug 18, 2019

Worked really well for me. Was a very long DM history I was looking to delete though so did eventually get clogged up with system messages.

Used the recommended modifications here though and that fixed that issue.

Thanks victornpb for the great script and JoeCow for the modifications to combat the system messages.

@xTerminatioNx
Copy link

xTerminatioNx commented Aug 18, 2019

Hi. I'm getting an issue where nothing is being deleted.
When I first ran this script it deleted about 20k of my messages, but ever since then the blue numbers on the side just keep increasing while the number of messages stays unchanged.
I only encounter this in a specific DM. The script works in other DMs/servers I've used it in. Any tips or ideas as to what is causing this?

BTW The small decrease in messages is from me manually deleting/clicking while I was hoping the script would start working

image

Hello @mgcbufly

This is probably due to system messages.

Eventually they will fill up the queue and not be able to be deleted. So it will keep querying and only getting the same system messages in return.

Use JoeCow's modifications that he described here: https://gist.github.com/victornpb/135f5b346dea4decfc8f63ad7d9cc182#gistcomment-2934064

@Chipiron95
Copy link

Chipiron95 commented Aug 19, 2019

Hey, what can i do with?:

Started at 8/19/2019, 10:47:37 AM
channelId=544122824873476126 authorId=527227515706540053 firstMessageId=
---- You can abort by setting STOP=1 on the console ----
API respondend with non OK status! {"code":0,"message":"401: Unauthorized"}

@victornpb
Copy link
Author

victornpb commented Aug 21, 2019

OK, I finally put some time in handling system messages. It seems to be working now, but I'm limited to generating dummy messages to delete. Please let me know if you find any issue.

Thanks @JoeCow for the contribution. In the end I handled things differently, It should not leave messages behind anymore.

Also I made it simpler to use I implemented a minimal user interface, and I can fill the author and channel you're on automatically, so you only need to provide the authToken. That made the code quite bigger tho. But I don't want to make the code cryptic just to make it short because I want it to still be readable, so pleople can trust it before running it.
Screen Shot 2019-08-21 at 1 47 13 AM

EDIT:

@victornpb
Copy link
Author

victornpb commented Aug 21, 2019

I'm migrating this Gist to a GitHub Repository. It will be easier for me to make changes and answer issues and questions individually using the the issues tab.

Please post your comments, questions, issues, ideas HERE


GIST MOVED TO

https://github.com/victornpb/undiscord

@SKN1
Copy link

SKN1 commented Dec 26, 2019

Error deleting message, API responded with status 403! {"message":"Cannot execute action on a DM channel","code":50003}

how fix it?

@phrohdoh
Copy link

phrohdoh commented Dec 27, 2019

@SKN1 the comment just before yours tells you to ask questions on the GitHub repo, not this gist.

@DYR0S
Copy link

DYR0S commented Mar 26, 2020

Can I have your discord? I need you with something

@Connor200024
Copy link

Connor200024 commented Apr 14, 2020

Isn't this just against discord TOS? ;) My suggestion it's pointless and awful to use! :D

@ZeldaPlayer29
Copy link

ZeldaPlayer29 commented Jul 12, 2020

Hi, I'm having some trouble using this and wanted to ask if it works for messages in banned servers? I'm filling in all the details, with the exception of GuildID because I can't get that (I think it's the server), but I'm just getting 404 errors.

@TosBreaker
Copy link

TosBreaker commented Oct 18, 2020

Anyone wondering. yes. This is a TOS breaker. It WILL get you banned. I do not know if they will delete your account. But this is self botting. Your account will.100% be banned, as I found out.

If discord implemented a function to delete messages, however, it would resolve this issue. Seems they wont though.

I managed to delete a few thousand messages however, before getting banned. Say about in the region of 10,000.

Then I ended up getting banned.

@sc0rp10n-py
Copy link

sc0rp10n-py commented Nov 19, 2020

This works fine when deleting messages from a public channel, but throws a 404 error for DMs. Tried with several different people. Can you see if you can reproduce that problem?

for DM
use guild id :@me
and channel id: text after @me/ in url

@sc0rp10n-py
Copy link

sc0rp10n-py commented Nov 19, 2020

Same...404 error

for DM
use guild id :@me
and channel id: text after @me/ in url

@CyberpunkVx-1729
Copy link

CyberpunkVx-1729 commented Jul 28, 2021

Thanks #victornpb
I owe you one !

@bipstick
Copy link

bipstick commented Aug 5, 2021

it worked fine and delted like 55 messages but then i get smth that looks like this :
Screenshot_1

i didnt change any info or settings it just stopped. suggestions?>

@hh4yl3yy
Copy link

hh4yl3yy commented Nov 30, 2021

its not letting me do anything and ive entered all the ids and stuff

@hh4yl3yy
Copy link

hh4yl3yy commented Nov 30, 2021

please help me nothings working

@fourteen-1
Copy link

fourteen-1 commented Dec 2, 2021

how do i find the auth token in firefox? "get" isn't doing anything and i cant manually find it in console

@RZ-Code-Studio
Copy link

RZ-Code-Studio commented Dec 24, 2021

404 message on public channel. filled everything in. Doesn't work. Exit code `0```

@victornpb
Copy link
Author

victornpb commented Apr 29, 2022


DISCUSSION MOVED TO

👉 https://github.com/victornpb/undiscord/discussions


⛔️ DO NOT USE THIS COMMENT SECTION, YOU WILL NOT BE ANSWERED HERE!

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