求用Python下载Snapchat中24小时有效Snap的方法
Python实现Snapchat个人Snap(24小时消失内容)的下载方法
我一直在寻找用Python下载Snapchat中点击用户头像后出现、24小时后消失的Snap的方法,目前仅实现了下载Story的功能,代码如下:
import requests import re import shutil def download_file(download_url): with requests.get(download_url, stream=True) as r: with open(fr'video.png', 'wb') as f: shutil.copyfileobj(r.raw, f) url = 'https://story.snapchat.com/p/4cf3899b-690c-4872-a8a0-1c2f91db6563/2619293115389952' headers = { 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36', } response = requests.get(url, headers=headers) download_url = re.search( r'"snapUrls":{"mediaUrl":"([^"]+)', response.text).group(1) download_file(download_url)
解决方案
这类个人Snap属于用户私密内容,无法通过公开链接直接获取,必须验证身份后通过Snapchat内部API访问,以下是具体实现步骤:
模拟登录获取会话凭证
Snapchat登录包含验证码、双因素认证等校验,建议用selenium模拟浏览器登录,获取有效会话的cookies和授权token,避免手动处理复杂验证流程。调用API获取Snap列表
通过抓包工具(如Charles)获取用户Snap的API端点(通常格式类似https://story.snapchat.com/api/v2/feed/{user_id}),请求需携带登录后获取的Authorizationtoken。解析媒体URL并下载
从API返回的JSON数据中提取每个Snap的mediaUrl,处理URL转义后,通过会话请求下载媒体内容。
示例代码:
import requests import shutil from selenium import webdriver import time # 1. 用Selenium模拟登录获取会话 driver = webdriver.Chrome() driver.get('https://accounts.snapchat.com/accounts/login') # 手动完成登录(或自动填充账号密码,处理验证码) input("登录完成后按回车继续...") # 提取会话cookies和token session = requests.Session() for cookie in driver.get_cookies(): session.cookies.set(cookie['name'], cookie['value']) # 从页面本地存储中提取授权token(需根据实际页面结构调整) token = driver.execute_script("return window.localStorage.getItem('auth_token');") driver.quit() # 2. 获取目标用户的Snap列表 user_id = "目标用户ID" # 通过搜索API或用户主页获取 headers = { 'Authorization': f'Bearer {token}', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36' } response = session.get(f'https://story.snapchat.com/api/v2/feed/{user_id}', headers=headers) snap_data = response.json() # 3. 下载每个Snap for snap in snap_data.get('snaps', []): media_url = snap.get('mediaUrl') if not media_url: continue # 处理URL转义字符 media_url = media_url.replace('\\/', '/') # 生成文件名 file_ext = media_url.split('.')[-1].split('?')[0] file_name = f"snap_{snap['id']}.{file_ext}" # 下载文件 with session.get(media_url, stream=True) as r: r.raise_for_status() with open(file_name, 'wb') as f: shutil.copyfileobj(r.raw, f) print(f"已下载: {file_name}")
注意事项
- Snapchat内部API未公开,端点和参数可能随时变化,需定期抓包更新
- 频繁请求API可能触发账号封禁,建议控制请求频率
- 操作需严格遵守Snapchat服务条款,仅下载自己有权限访问的内容
内容的提问来源于stack exchange,提问作者Abdallah Eldesouky
相关产品推荐
相关产品推荐

