使用Youtube API,我试图编写一个脚本,列出用户拥有的所有未加字幕的视频,无论是公共的,私人的还是未列出的。首先,我使用用户的凭证进行身份验证:
require_once 'Zend/Loader.php'; // the Zend dir must be in your include_path
Zend_Loader::loadClass('Zend_Gdata_YouTube');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
try {
$httpClient = Zend_Gdata_ClientLogin::getHttpClient(
$username = $Youtube_Login["Username"],
$password = $Youtube_Login["Password"],
$service = 'youtube',
$client = null,
$source = 'NAME', // a short string identifying your application
$loginToken = null,
$loginCaptcha = null,
$authenticationURL);
$yt = new Zend_Gdata_YouTube($httpClient, $applicationId, $clientId, $developerKey);
} catch ( Exception $e ) {
$err[] = $e->getMessage();
return false;
}
然后,我尝试用两种方式返回一个列表。我首先尝试使用查询从数据库中提取没有字幕的视频:
try{
$query = $yt->newVideoQuery();
$query->setParam('caption', 'false');
$query->setParam('author', $Youtube_Login["Username"]);
$query->orderBy = 'viewCount';
$videoFeed = $yt->getVideoFeed($query);
} catch (Zend_Gdata_App_Exception $e) {
$err[] = $e->getMessage();
end_script(false);
}
然而,结果中缺少私人和未列出的视频。因此,对于第二次尝试,我使用getUserUploads()函数拉出所有视频,然后检查它们是否缺少字幕:
try{
$videoFeed = $yt->getuserUploads($Youtube_Login["Username"]);
} catch (Zend_Gdata_App_Exception $e) {
$err[] = $e->getMessage();
end_script(false);
}
foreach ($videoFeed as $videoEntry) {
foreach ($videoEntry->link as $link) {
if($link->rel == "http://gdata.youtube.com/schemas/2007#video.captionTracks"){
if($link->extensionAttributes['http://gdata.youtube.com/schemas/2007:hasEntries']['value'] == 'false'){
// Video has no caption entries, print entry info
}
}
}
}
返回正确的结果,但以效率、速度和数据传输为代价。因为谷歌每天只允许这么多的数据传输,而且视频的数量很大(而且还在增加),所以这是一个不合格的解决方案。
是否有任何方法可以正确验证第一次尝试,以便找到未发布和未列出的视频,我的客户也需要列出?或者,另一种完全不需要下载和遍历整个视频列表的方式?
谢谢!
更新:
我已经和我的雇主讨论过了,OAuth不是一个选择,2条腿或3条腿。
那么,是否完全没有办法对newVideoQuery()函数进行身份验证?是否有故意阻碍无法检索视频的个人数据,即使是视频所有者?
使用Oauth认证过程。这样会更安全,你最终会得到一个可以使用的令牌,而不是每次都重复验证过程。
https://developers.google.com/youtube/2.0/developers_guide_protocol_oauth2