2501_93323859 2025-11-11 14:34 采纳率: 25%
浏览 11

爬取网站下的视频资源

通过抓包工具找到了视频的存放地址的m3u8文件,爬取到了m3u8文件下面的所有视频
加密的参数是#EXT-X-KEY:METHOD=AES-128,URI="https://ndvideo-key.ykt.eduyun.cn/v1/resource_keys/422b105193e64952831a5d5007880cf8%22,IV=0x00000000000000000000000000000000
现在通过url想找key,key是一个随机变化的,如何拿到key

  • 写回答

3条回答 默认 最新

  • u013132758 新星创作者: 人工智能技术领域 2025-11-11 14:49
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 关键点分析:
      - 已经获取到视频的m3u8文件地址及加密参数。
      - 需要按照m3u8文件中的链接顺序依次下载视频片段,并进行解密(因为视频片段加密)。

    2. 解决方案:
      - 下载视频片段

      • 可以使用Python的requests库来下载m3u8文件中的每个视频片段链接。
      • 示例代码如下:
    import requests
    
    m3u8_url = 'your_m3u8_file_url'
    response = requests.get(m3u8_url)
    m3u8_content = response.text
    
    # 解析m3u8文件,获取视频片段链接
    segment_urls = []
    lines = m3u8_content.split('\n')
    for line in lines:
        if line.startswith('http'):
            segment_urls.append(line)
    
    # 下载视频片段
    for i, url in enumerate(segment_urls):
        segment_response = requests.get(url)
        with open(f'segment_{i}.ts', 'wb') as f:
            f.write(segment_response.content)
    
    • 解密视频片段
      • 对于AES - 128加密,需要使用cryptography库。
      • 首先安装cryptography库:pip install cryptography
      • 示例代码如下:
    from cryptography.hazmat.backends import default_backend
    from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
    from cryptography.hazmat.primitives import padding
    
    # 获取加密密钥等信息(这里假设已经从m3u8文件中解析出正确的密钥等)
    key_uri = 'https://ndvideo-key.yk'
    key_response = requests.get(key_uri)
    key = key_response.content
    
    iv = b'\x00' * 16  # 初始化向量,假设固定为16字节0
    
    # 对每个视频片段进行解密
    for i in range(len(segment_urls)):
        segment_file = f'segment_{i}.ts'
        with open(segment_file, 'rb') as f:
            encrypted_segment = f.read()
    
        cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())
        decryptor = cipher.decryptor()
        unpadder = padding.PKCS7(128).unpadder()
    
        decrypted_segment = decryptor.update(encrypted_segment) + decryptor.finalize()
        decrypted_segment = unpadder.update(decrypted_segment) + unpadder.finalize()
    
        with open(f'decrypted_segment_{i}.ts', 'wb') as f:
            f.write(decrypted_segment)
    
    • 合并视频片段
      • 可以使用ffmpeg命令行工具来合并解密后的视频片段。
      • 示例命令:ffmpeg -i "concat:decrypted_segment_0.ts|decrypted_segment_1.ts|..." -c copy output.mp4(这里...替换为所有解密后的片段文件名)。
      • 也可以使用Python的moviepy库来实现合并,示例代码如下:
    from moviepy.editor import concatenate_videoclips, VideoFileClip
    
    clips = []
    for i in range(len(segment_urls)):
        clip = VideoFileClip(f'decrypted_segment_{i}.ts')
        clips.append(clip)
    
    final_clip = concatenate_videoclips(clips)
    final_clip.write_videofile('output.mp4')
    
    1. 多种解决方案优缺点:
      - 使用requests库下载和cryptography库解密

      • 优点:纯Python实现,不需要额外安装复杂的命令行工具,代码相对灵活,易于理解和修改。
      • 缺点:性能可能相对较低,尤其是在处理大量视频片段时。
      • 使用ffmpeg合并视频片段
      • 优点ffmpeg是一个强大且高效的工具,处理视频合并等任务速度快,功能丰富。
      • 缺点:需要安装ffmpeg命令行工具,并且在代码中调用命令行可能会增加一些复杂性。
      • 使用moviepy库合并视频片段
      • 优点:纯Python库,使用方便,代码简洁。
      • 缺点:对于复杂的视频处理可能不如ffmpeg功能全面,并且性能上可能也稍逊一筹。
    2. 总结:
      - 爬取网站下加密的视频资源,首先要获取m3u8文件及加密参数,然后依次下载视频片段并解密,最后合并视频片段。可以使用Python的requestscryptographymoviepy等库以及ffmpeg工具来完成整个过程。不同的实现方式各有优缺点,可根据具体需求和场景选择合适的方法。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    评论

报告相同问题?

问题事件

  • 创建了问题 11月11日