【发布时间】:2016-08-23 09:11:40
【问题描述】:
我正在构建一个 java 程序,它可以选择在嵌入式播放器中播放 YouTube 视频。 问题是大多数音乐视频都无法播放,并且出现以下错误: “该视频包含来自(媒体公司名称)的内容。它被限制在某些网站上播放。”
我尝试在 Chrome 中加载相同的 URL 并得到相同的结果。 https://www.youtube.com/embed/TMZi25Pq3T8
然而,经过一番研究,我很快通过安装一个允许我添加 HTTP 请求标头的 Chrome 扩展程序解决了这个问题,并添加了一个遵循此结构“https://www..com”的 Referer 标头并得到它工作。
所以我认为一定是这样。 我添加了以下代码,以便将请求标头添加到我的 JavaFX WebView / WebEngine:
URI uri = URI.create("https://www.youtube.com/embed/TMZi25Pq3T8");
List<String> cookies = new ArrayList<>();
cookies.add("User-Agent=BDM/v0.92");
cookies.add("Referer=https://www.youtube.com");
Map<String, List<String>> headers = new LinkedHashMap<String, List<String>>();
headers.put("Set-Cookie", cookies);
try {
CookieHandler.getDefault().put(uri, headers);
} catch (IOException ex) {
ex.printStackTrace();
}
System.out.println(webView.getEngine().getUserAgent());
webView.getEngine().load(uri.toString());
仍然,没有成功,同样的错误信息。
我用来通过 APIDiscogs 提取发布数据的网站也能够播放“受限”视频。我在这里错过了什么?
稍后编辑: 进一步说明:
我想为我所犯的错误道歉:
-
System.out.println(webView.getEngine().getUserAgent());行没有打印“BDM/v0.92”,正如我最初所说,它打印了默认的 JavaFX 用户代理,“Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/538.19 (KHTML , 像壁虎) JavaFX/8.0 Safari/538.19"。这导致了 2 号 - 正如 Roman Nazarenko 所指出的,我将 cookie 与请求标头混淆了。
这引出了一个真正的问题,我如何为 JavaFX WebEngine 发送 HTTP 请求标头?唯一的选择是通过调用webView.getEngine().setUserAgent("myUserAgent");来设置用户代理
我在这里发现了一个 hack,但这对我不起作用:https://twitter.com/codingfabian/status/524942996748652544
谢谢!
【问题讨论】:
-
错误是否来自 API 调用?如果是这样,您可能需要检查在提交请求时应该发送哪些参数。这样您就可以在 API 抛出错误的情况下识别任何缺失的参数。
-
您在谈论标头,但您在此处设置 cookie。这些不是一回事。
-
你试过读这个吗? stackoverflow.com/questions/13407482/…。此外,我还找到了这个 YouTube 工程和开发人员博客:youtube-eng.blogspot.co.uk/2011/12/…。它可能会对你有所帮助。
标签: java http youtube-api javafx-webengine