使用Python提取.swf文件中的视频

4

我已经编写了生成视频链接的代码,就像下面这个链接一样。 获得链接后,我尝试以以下方式下载:

import urllib.request
import os

url = 'http://www.videodetective.net/flash/players/?customerid=300120&playerid=351&publishedid=319113&playlistid=0&videokbrate=750&sub=RTO&pversion=5.2%22%20width=%22670%22%20height=%22360%22'
response = urllib.request.urlopen(url).read()
outpath = os.path.join(os.getcwd(), 'video.mp4')
videofile = open(outpath , 'wb')
videofile.write(response)
videofile.close()   

我在那个目录下只得到了一个58kB的文件,但是无法读取。有人能指点一下我吗?


尝试这段代码:https://dev59.com/93E85IYBdhLWcg3wpFKu - Sologoub
1
@Sologoub:这跟问题有什么关系? - Niklas B.
如果他想弄清楚的话,我链接的代码可以作为一个工作起点...尽管如你所指出的那样,错误似乎更加明显。 - Sologoub
1个回答

17

根据你的代码,你并没有下载编码视频文件,而是下载了用于播放视频的Flash应用程序(以CWS格式)。该应用程序在浏览器中执行,动态加载和播放视频。您需要进行一些逆向工程来确定实际的视频源。以下是我的尝试:

解压SWF文件

首先,将你提到的58K文件保存到硬盘上,命名为test.swf(或类似名称)。 然后可以使用小型Perl脚本cws2fws来完成解压缩:

perl cws2fws test.swf

这会在相同的目录下生成一个名为test.fws.swf的新文件。

在FWS文件中搜索配置URL

我使用了一个简单的

strings test.fws.swf | grep http

这将生成:

...
cookieOhttp://www.videodetective.net/flash/players/flashconfiguration.aspx?customerid=
...

有趣。让我们尝试将已知的customeridplayeridpublishedid参数放到此URL中:

http://www.videodetective.net/flash/players/flashconfiguration.aspx?customerid=300120&playerid=351&publishedid=319113
如果我们在浏览器中打开它,就可以看到播放器配置的XML文件,而该文件又指向...。

如果我们在浏览器中打开它,就可以看到播放器配置的XML文件,而该文件又指向

http://www.videodetective.net/flash/players/playlist.aspx?videokbrate=450&version=4.6&customerid=300120&fmt=3&publishedid=&sub=

现在,如果我们打开它,我们最终可以看到源URL:

http://cdn.videodetective.net/svideo/mp4/450/6993/293732.mp4?c=300120&r=450&s=293732&d=153&sub=&ref=&fmt=4&e=20111228220329&h=03e5d78201ff0d2f7df9a

现在我们可以下载这个h264视频文件,任务完成。

用Python脚本自动化整个过程

这是完全不同的任务(留给读者作为练习)。


1
原来这个Perl脚本使用了zlib,而且非常简单。这个也是 https://github.com/binjo/utils/blob/master/cws2fws.py - nindalf
好的,但实际上我认为你不需要提取文件来自动化获取配置XML和所有相关信息的过程。这只是为了获取初始信息所在位置。祝玩得愉快。 - Niklas B.
当我使用脚本将cws转换为fws时,它告诉我:zlib.error: Error -3 while decompressing data: incorrect header check。这是表示我的swf文件有错误或其他原因吗?顺便说一下,您的脚本链接已失效。 - Tony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接