普通网友 2025-09-27 10:40 采纳率: 99.1%
浏览 4
已采纳

B站已删除视频如何通过缓存找回?

如何通过浏览器或手机缓存找回B站已删除的视频? 当B站视频被作者删除或下架后,常规途径无法直接观看。部分用户尝试通过本地缓存找回内容:例如,在观看视频时浏览器或App曾自动缓存片段,是否可通过查找Temporary Internet Files、Android的data文件夹或使用抓包工具(如Fiddler)捕获传输中的视频流?但面临问题——B站采用分段加载(m3u8+ts)或加密HLS流,且缓存文件易被自动清理。此外,缓存完整性差、缺乏合并手段,导致难以还原完整视频。那么,在不违反平台政策的前提下,有哪些合法可行的缓存提取与恢复方法?
  • 写回答

1条回答 默认 最新

  • 桃子胖 2025-09-27 10:41
    关注

    一、浏览器与移动端缓存机制基础解析

    现代网页视频平台如B站(bilibili)普遍采用动态流媒体传输协议,例如HLS(HTTP Live Streaming),其核心结构为m3u8索引文件配合分片的.ts视频片段。这类设计不仅提升加载效率,也增强了版权保护能力。当用户在浏览器或App中观看视频时,系统会临时缓存部分数据至本地存储区域:

    • 浏览器端:Chrome/Firefox等通过IndexedDB、Cache API或Temporary Internet Files目录缓存资源。
    • Android设备:B站App通常将缓存写入/Android/data/tv.danmaku.bili/cache/或类似路径。
    • iOS设备:受限于沙盒机制,缓存更难直接访问,需依赖iTunes备份或第三方工具导出。
    平台类型缓存路径示例文件格式可读性
    Windows ChromeC:\Users\<user>\AppData\Local\Google\Chrome\User Data\Default\Cache二进制块(含.ts片段)低(需解析)
    Android B站App/data/data/tv.danmaku.bili/cache/video_cache.tmp/.bin(加密或分段)中(需root权限)
    macOS Safari~/Library/Caches/com.apple.Safari/Cache.dbSQLite数据库
    B站PC客户端C:\Users\<user>\Documents\bilibili\cache.blv封装格式中(专用解码器)

    二、基于抓包技术的实时流捕获方法

    对于尚未完全删除但已无法公开访问的视频,若曾被浏览过,可通过网络层拦截手段获取传输中的视频流。常用工具有Fiddler、Charles Proxy和mitmproxy,结合浏览器开发者工具进行请求嗅探。

    1. 配置HTTPS代理并安装CA证书以解密TLS流量。
    2. 在B站播放目标视频的同时监控Network标签页。
    3. 过滤XHR/Fetch请求,查找包含.m3u8video?token=的URL。
    4. 使用wget/curl或专用脚本下载m3u8及其关联ts分片。
    5. 检查是否启用AES-128加密(查看EXT-X-KEY字段)。
    6. 若存在加密,则需提取key URI并在合并时传入解密参数。
    
    import m3u8
    import requests
    from Crypto.Cipher import AES
    
    # 示例:解析m3u8并下载分片
    m3u8_url = "https://example.com/index.m3u8"
    playlist = m3u8.load(m3u8_url)
    
    if playlist.key:
        key_uri = playlist.key.uri
        decryption_key = requests.get(key_uri).content
        cipher = AES.new(decryption_key, AES.MODE_CBC)
    
    for segment in playlist.segments:
        ts_data = requests.get(segment.uri).content
        if playlist.key:
            # 需对齐IV并处理填充
            padded = ts_data + b'\x00' * (16 - len(ts_data) % 16)
            ts_data = cipher.decrypt(padded)[:len(ts_data)]
        with open("output.ts", "ab") as f:
            f.write(ts_data)
    

    三、移动端缓存提取与数据恢复实践

    针对Android设备,若具备root权限,可深入分析B站App内部缓存结构。B站自研缓存引擎可能使用自定义容器格式(如.blv或.multi_part),需逆向解析头部信息。

    graph TD A[启动B站App并播放目标视频] --> B{是否完成全片缓冲?} B -- 是 --> C[进入ADB shell环境] B -- 否 --> D[手动滑动进度条强制预加载] C --> E[定位/data/data/tv.danmaku.bili/cache目录] E --> F[查找最近修改的.tmp或.bin文件] F --> G[使用file命令识别MIME类型] G --> H{是否为MPEG-TS或fMP4?} H -- 是 --> I[重命名为.ts或.mp4尝试播放] H -- 否 --> J[使用010 Editor分析二进制头]

    常见挑战包括:

    • 缓存文件被拆分为多个子块,无明确命名规则。
    • 部分内容受DRM或Token时效限制。
    • App后台自动清理策略导致缓存迅速失效。
    • 多清晰度混合存储,需根据metadata区分轨道。

    四、合法边界内的自动化恢复方案设计

    为实现可持续、合规的数据留存,建议构建基于用户授权的本地录制框架,避免直接侵犯平台版权机制。以下为一个边缘计算架构原型:

    组件功能描述技术选型合法性考量
    Puppeteer + Stealth模拟用户行为触发缓存Headless Chrome符合robots.txt且限速访问
    Ffmpeg合并ts分片并转码为MP4-c copy避免重编码仅用于个人存档
    SQLite Metadata DB记录视频URL、时间戳、缓存状态ACID事务支持不共享元数据
    定期清理模块自动删除超过30天的缓存Cron Job防止长期非法持有
    通知接口邮件提醒缓存成功/失败SMTP/Webhook增强透明度
    
    # 自动化抓取与合并脚本片段
    #!/bin/bash
    VIDEO_ID="BV1xx411c7rP"
    M3U8_URL=$(curl -s "https://api.bilibili.com/x/player/playurl?bvid=$VIDEO_ID" | jq -r '.data.dash.video[0].baseUrl')
    
    # 下载主m3u8
    wget "$M3U8_URL" -O video.m3u8
    
    # 使用ffmpeg智能合并(支持加密流)
    ffmpeg -allowed_extensions ALL \
           -i video.m3u8 \
           -c copy \
           -bsf:a aac_adtstoasc \
           recovered_video.mp4
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 9月27日