|
Post by cetav13115 on Oct 8, 2023 3:32:10 GMT -8
I noticed some people sharing stuff from Discord for others here to download. In recent times Discord wants to make file links expire because malware, server load or something. Someone may need to archive a bunch of them since they may not be accessible in the future.
|
|
|
Post by ephemeralViolette on Oct 8, 2023 22:46:12 GMT -8
I went ahead and scraped every Discord CDN link on this forum, then mass downloaded them and uploaded it all to Internet Archive. You can find the archive here: archive.org/details/winclassic-discord-cdn-archivePosts can be easily associated with their related post via the first number in each file name. However, I'm not entirely confident that the links could be easily transferred over on the forums for various reasons.
|
|
|
Post by Brawllux on Oct 8, 2023 23:37:13 GMT -8
I went ahead and scraped every Discord CDN link on this forum, then mass downloaded them and uploaded it all to Internet Archive. You can find the archive here: archive.org/details/winclassic-discord-cdn-archivePosts can be easily associated with their related post via the first number in each file name. However, I'm not entirely confident that the links could be easily transferred over on the forums for various reasons. Attachments:
|
|
|
Post by OrthodoxWin32 on Oct 9, 2023 0:26:57 GMT -8
This happened to me before because of a false positive on VirusTotal.
|
|
|
Post by ephemeralViolette on Oct 9, 2023 14:16:00 GMT -8
|
|
|
Post by cetav13115 on Oct 10, 2023 6:43:17 GMT -8
I guess at this point the only thing to try and do is to archive the links individually on archive.org Attachments:
|
|
|
Post by ephemeralViolette on Oct 10, 2023 14:11:20 GMT -8
New mirror: drive.google.com/file/d/1v3qa_MPPUg3_MzQxmb27fOPpbU1_pwtc/view?usp=sharingI password encrypted it with "fuck virustotal" in order to bypass automated malware scanners, because FUCK VirusTotal and their false positives. Also, archiving each link individually onto Wayback Machine wouldn't really be possible. At least, not with only one person doing the work. You'd get rate limited pretty fast, which is why I opted for crawling the links directly and just uploading a local archive.
|
|
herit://that1cutie
Sophomore Member
sad girl times
Posts: 165
OS: Windows 10
Theme: Shitbox Edition
|
Post by herit://that1cutie on Oct 13, 2023 5:48:53 GMT -8
I plan to do this *very* soon for all the resources posted to ClassicServ as well.
|
|
Jevil7452
Regular Member
Posts: 434
OS: Windows 7 Enterprise (6.1.7601)
Theme: Windows Aero by Microsoft Corporation
CPU: Intel Core i7-3770k
RAM: 32GB (4x8GB DDR3)
GPU: NVIDIA GeForce GTX 980 Ti + Intel(R) HD Graphics 4000
Computer Make/Model: OEM0
|
Post by Jevil7452 on Mar 4, 2024 13:21:50 GMT -8
For the posts that haven't moved over to another image host, you are able to access their image/resources by opening developer tools, searching for cdn.discordapp.com, copying the link, and pasting it into a Discord client and clicking it from there. It's needed to do developer tools stuff only for images, bare links you can just copy and paste into discord directly.
|
|
|
Post by ephemeralViolette on Mar 4, 2024 16:40:44 GMT -8
For the posts that haven't moved over to another image host, you are able to access their image/resources by opening developer tools, searching for cdn.discordapp.com, copying the link, and pasting it into a Discord client and clicking it from there. It's needed to do developer tools stuff only for images, bare links you can just copy and paste into discord directly. Good thought. Since links on the forum still aren't mirrored over (and I don't think can reasonably be), it would be good for this to be listed as some form of instructions for accessing old links. Maybe a disclaimer under posts with Discord CDN links would be good.
|
|
Cynosphere
Freshman Member
Posts: 46
OS: Windows 10 Home 22H2
Theme: Classic (Scheme: Amora Focus)
CPU: AMD Ryzen 7 3700X
RAM: 32 GB
GPU: AMD Radeon RX 7900 XT
|
Post by Cynosphere on Mar 5, 2024 7:11:46 GMT -8
Bot accounts can refresh attachment URLs, so I wrote a userscript to automatically replace links and images {Spoiler} // ==UserScript== // @name Automatic External Discord Attachment Refresher // @namespace c7.pm // @match *://*/* // @version 1.0.0 // @author Cynosphere // @description 2/23/2024, 1:30:22 PM // @run-at document-body // @grant GM.xmlHttpRequest // @connect discord.com // ==/UserScript==
(()=>{ const headers = { "User-Agent": "DiscordBot (https://c7.pm, 1.0.0) AttachmentRefresherUserscript", "Authorization": "Bot TOKENHERE", "Content-Type": "application/json", };
const selectors = [ `a[href*="cdn.discordapp.com/attachments/"]:not([href*="?ex="])`, `img[src*="cdn.discordapp.com/attachments/"]:not([src*="?ex="])`, `a[href*="media.discordapp.net/attachments/"]:not([href*="?ex="])`, `img[src*="media.discordapp.net/attachments/"]:not([src*="?ex="])`, ];
let timer;
function debounce(cb, delay = 500) { if (timer) clearTimeout(timer); timer = setTimeout(cb, delay) }
const pending = new Map();
function xhr(props) { return new Promise((resolve, reject) => { GM.xmlHttpRequest(Object.assign({}, props, { onload(res) { resolve(res); }, onabort() { reject(new DOMException("Aborted", "AbortError")); }, ontimeout() { reject(new TypeError("Network request failed, timeout")); }, onerror(err) { reject(new TypeError("Failed to fetch: " + err.finalUrl)); }, })); }) }
async function refresh() { const urls = []; for (const url of pending.keys()) { urls.push(url); }
const data = await xhr({ url: "https://discord.com/api/v10/attachments/refresh-urls", method: "POST", headers, data: JSON.stringify({attachment_urls: urls}), responseType: "json" }).then(res=>JSON.parse(res.responseText));
for (const {original, refreshed} of data.refreshed_urls) { const elem = pending.get(original); if (elem.tagName === "A") { elem.href = refreshed; } else if (elem.tagName === "IMG") { elem.src = refreshed; }
pending.delete(original); }
console.log(`Refreshed ${urls.length} attachments.`); }
function mutate(elem) { let url = elem.href ?? elem.src; if (!url) return;
if (!pending.has(url)) { pending.set(url, elem); debounce(refresh); } }
if (!location.hostname.endsWith("discord.com")) { new MutationObserver((records) => { const changedElems = new Set();
for (const record of records) { changedElems.add(record.target);
for (const elem of record.removedNodes) if (elem instanceof HTMLElement || elem instanceof SVGElement) changedElems.add(elem); }
for (const elem of changedElems) { if (!elem) { changedElems.remove(elem); continue; } for (const selector of selectors) { if (elem?.matches?.(selector)) mutate(elem); elem ?.querySelectorAll?.(selector) ?.forEach?.((e) => (e instanceof HTMLElement || e instanceof SVGElement) && mutate(e)); } } }).observe(document.body, { childList: true, characterData: true, subtree: true }); } })();
|
|
fraxgut
New Member
Posts: 11
OS: Windows 10 IoT Enterprise LTSC 21H2 - Gentoo GNU Linux
Theme: Watercolor / Classic (W) - bspwm (L)
|
Post by fraxgut on May 2, 2024 20:39:44 GMT -8
Works pretty well!
|
|