Snapchat 一次性下载所有回忆

Snapchat download all memories at once

多年来我在 snapchat 上保存了很多照片,现在我想找回它们,问题是它们不容易导出,但幸运的是,如果你上网,你可以请求所有数据(就是这样)很棒)

我可以看到我所有的照片下载 link 并使用本地 HTML 文件如果我点击下载它开始下载。

这是棘手的部分,我需要进行大约 15,000 次下载,手动单击每个单独的下载需要很长时间,我尝试通过下载按钮提取所有 link,然后这会创建很多 Urls(很棒)但问题是,如果您将 url 传递到浏览器中,则会出现 ("Error: HTTP method GET is not supported by this URL")

我尝试了多种不同的 chrome 扩展,其中 none 显示了实际下载,只是左侧的 HTML。

下载按钮是一个可点击的 link,它只是在选项卡中开始下载。它属于 Href A

我正在尝试找出批量下载每个文件的最佳方式。

所以,我只是通过下载自己的记忆来观看他们的代码。他们使用自定义 JavaScript 函数下载您的数据(正文中带有 ID 的 POST 请求)。

你可以复制这个请求,但你也可以只使用他们的方法。 打开控制台并使用 downloadMemories(<url>)

或者,如果您没有 URL,您可以自己检索它们:

var links = document.getElementsByTagName("table")[0].getElementsByTagName("a");
eval(links[0].href);

更新

我为此编写了一个脚本: https://github.com/ToTheMax/Snapchat-All-Memories-Downloader

使用 .json 文件,您可以通过 python:

一个一个地下载它们
req = requests.post(url, allow_redirects=True)
response = req.text
file = requests.get(response)

然后获取正确的分机号和日期:

day = date.split(" ")[0]
time = date.split(" ")[1].replace(':', '-')
filename = f'memories/{day}_{time}.mp4' if type == 'VIDEO' else f'memories/{day}_{time}.jpg'

然后写入文件:

with open(filename, 'wb') as f:
    f.write(file.content)

我做了一个机器人来下载所有的回忆。

可以下载here

它不需要任何额外的安装,只需将 memories_history.json 文件和 运行 放在同一目录中即可。它会跳过已经下载的文件。

简答

下载可自动执行此过程的桌面应用程序。

访问 downloadmysnapchatmemories.com to download the app. You can watch this tutorial 指导您完成整个过程。

简而言之,该应用会读取 Snapchat 提供的 memories_history.json 文件,并将每个回忆下载到您的计算机上。

App source code

长答案(上述应用程序的工作原理)

我们可以遍历从 Snapchat 下载的数据中找到的 memories_history.json 文件中的每个记忆。

对于每个记忆,我们向存储为记忆 Download Link 的 URL 发出 POST 请求。响应将是对文件本身的 URL。

然后,我们可以向返回的 URL 发出 GET 请求以检索文件。

例子

这是一个简化的示例,使用NodeJS获取和下载单个内存:

假设我们在 fakeMemory.json 中存储了以下内存:

{
  "Date": "2022-01-26 12:00:00 UTC",
  "Media Type": "Image",
  "Download Link": "https://app.snapchat.com/..."
}

我们可以做到以下几点:

// import required libraries
const fetch = require('node-fetch'); // Needed for making fetch requests
const fs = require('fs'); // Needed for writing to filesystem


const memory = JSON.parse(fs.readFileSync('fakeMemory.json'));

const response = await fetch(memory['Download Link'], { method: 'POST' });

const url = await response.text(); // returns URL to file

// We can now use the `url` to download the file.

const download = await fetch(url, { method: 'GET' });

const fileName = 'memory.jpg'; // file name we want this saved as
const fileData = download.body; // contents of the file

// Write the contents of the file to this computer using Node's file system

const fileStream = fs.createWriteStream(fileName);

fileData.pipe(fileStream);

fileStream.on('finish', () => {
  console.log('memory successfully downloaded as memory.jpg');
});