【问题标题】:Downloading/storing Periscope live streaming broadcasts下载/存储 Periscope 实时流媒体广播
【发布时间】:2026-01-26 20:00:01
【问题描述】:

我正在抓取推文,并在可用时将信息存储到外部资源(例如 Instagram 图片)。现在人们开始使用 Periscope,用户通过推特链接到 Periscope 实时流媒体广播(也可以在接下来的 24 小时内使用)。 Here 是一个示例链接,但它可能很快就会失效/过时。

有什么方法可以获取该广播,即将其作为视频文件存储在本地?

当我查看 Periscope 广播的源代码时,我会得到类似的信息:

<html>
<head>
  ...
  <script src="https://assets.periscope.tv/assets/bugsnag-2.min.js"></script>
  <script src="https://assets.periscope.tv/js/vendor.a8cd99eb89a488ec6ea465f57d3ad41bcd832eff.js"></script>
</head>
<body>
  <div id="periscope-app" class="u-fullHeight"></div>
  <script src="https://assets.periscope.tv/js/application.min.2a8176c317fb715fd0e6c2728cb04318c5c53941.js"></script>
</body>

所以一切基本上都是脚本化的。我试图查看 Javascript 文件,看看我是否可以至少以某种方式重建流 URL 或其他东西。但我没有成功。我还尝试使用 Google Chrome 来检查从侧面发出的请求。但这也没有让我更进一步。

编辑:这是我当前的 Phantom.js 脚本:

var page = require('webpage').create(),
  system = require('system'),
  t, address;

if (system.args.length === 1) {
  console.log('Usage: periscope.js <periscope-url>');
  phantom.exit();
}

page.onResourceRequested = function(request) {
  console.log('Request ' + JSON.stringify(request, undefined, 4));
};

page.onResourceReceived = function(response) {
  console.log('Receive ' + JSON.stringify(response, undefined, 4));
};

address = system.args[1];

page.settings.userAgent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36';
page.open(address, function(status) {
  if (status !== 'success') {
    console.log('FAIL to load the address');
  } else {

  }
  //phantom.exit();
});

当我使用 Google Chrome 的开发者工具时,我发现了 application/vnd.apple.mpegurl 请求,但它从未从 Phantom.js 脚本中弹出。

【问题讨论】:

    标签: javascript twitter download video-streaming live-streaming


    【解决方案1】:

    它在 Chrome 桌面上使用 Http Live Streaming (HLS),因此只需代理/嗅探application/vnd.apple.mpegurl 类型的 HTTP 响应并获取请求 URL。我能够在 VLC 中观看您的直播。

    您可以使用Phantom.js

    【讨论】:

    • 谢谢!是的,我已经设法重现了。我还尝试了各种存储流的方法(vlcffmpeghls-fetch)。使用vlcffmpeg 我没有得到好的结果——没有声音、播放速度错误、错误。 hls-fetch Perl 脚本的结果是完美的。唯一的问题是它在 3 段后停止,但我也许可以自己扩展脚本。无论如何,我不知道如何以编程方式提取流的 URL。
    • 您使用的是playlist.m3u8 URL,对吗?它在 VLC 2.x 中工作得很好。就像我上面说的,要在代码中拦截请求。你可以用 Phantom.js 做到这一点。我用文档链接更新了答案。
    • 我将您的答案标记为正确,因为它与我正在寻找的内容非常接近 - 不过还没有真正看过 Phantom.js。任何人,底线似乎并不像我希望的那样简单:)。
    • 我安装并使用了 Phantom.js。我尝试了不同的示例,这些示例基本上是嗅探和记录 HTTP 请求和响应。但是,我根本无法在所有请求中找到application/vnd.apple.mpegurl——例如,我确实使用 Google Chrome 的开发者控制台找到了这些请求。我错过了什么?我猜我得到的 HTTP 响应包含一些 Javascript 代码,这些代码会发出 Phantom.js 不再涵盖的额外 HTTP 请求。但我真的不知道。
    • 您可能需要覆盖用户代理,以便它“检测”您设备的功能
    【解决方案2】:

    最新版神奇livestreamer(1.12.2)可以下载潜望镜视频

    livestreamer https://www.periscope.tv/w/aKzPpDIxNDYxN3w2OTg1MTQxNZnjGACxw2Nyl6RSvdnX8T3EaE7z5mSvxfK_-uqS5SQv best --output output.mp4
    

    如果您想以编程方式执行此操作,因为这是 *,python 中的潜望镜插件在这里: https://github.com/chrippa/livestreamer/blob/develop/src/livestreamer/plugins/periscope.py

    【讨论】:

    • 感谢您的提示,但显然在他们使用playlist.m3u8 后它不再起作用了。我设法使用Scopedown 下载,然后你有一个 TS 文件(需要适当的编解码器)。