1

我正在尝试基于浏览器上传到 YouTube。我正在为 ZF2 使用 PHP、Zend Framework 2 和 ZendGData 客户端库。我已经按照 Google Developers 指南进行了设置,并成功地执行了未经授权的请求 - 即搜索视频。我还能够执行授权请求 - 即从我的 YouTube 帐户中检索我的全名。

当我尝试上传时 - 检索上传令牌时出现错误:

预期响应代码 200,得到 403

此操作需要开发人员密钥

错误 403

我的上传器控制器如下所示。如教程中所述,我已使用https://code.google.com/apis/youtube/dashboard设置了开发人员密钥,并将其包含在我的代码中。还提供了相应的用户/电子邮件和密码。我正在使用 Curl 连接到开发指南中未涵盖的 API,但我认为这不是问题所在。

`

namespace Uploader\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use ZendGData\YouTube;
use ZendGData\ClientLogin;
use Zend\Http\Client\Adapter;


class UploaderController extends AbstractActionController
{
    public function indexAction()
    {   
        $adapter = new Adapter\Curl();
        $curl = new \ZendGData\HttpClient();
        $curl->setAdapter($adapter);

        $adapter->setOptions(array(
            'curloptions' => array(
                CURLOPT_SSL_VERIFYPEER => FALSE,
                CURLOPT_SSL_VERIFYHOST => FALSE,
            )
        ));

        $authenticationURL= 'https://www.google.com/accounts/ClientLogin';
        $httpClient = ClientLogin::getHttpClient(
                          $username = '***********@gmail.com',
                          $password = '*********',
                          $service = 'youtube',
                          $client = $curl,
                          $source = 'Testing', // a short string identifying your application
                          $loginToken = null,
                          $loginCaptcha = null,
                          $authenticationURL
                          );

        $developerKey = 'AI39si55e**********************************************************************nY9p5NJ8y-8PwS9d8Jw';
        $applicationId = 'Testing';
        $clientId = "Youtube Tester V1";

        $yt = new YouTube($httpClient, $applicationId, $clientId, $developerKey);
        $yt->setMajorProtocolVersion(2);

        $myVideoEntry = new YouTube\VideoEntry;

        $myVideoEntry->setVideoTitle('My Test Movie');
        $myVideoEntry->setVideoDescription('My Test Movie');
        // The category must be a valid YouTube category!
        $myVideoEntry->setVideoCategory('Autos');

        // Set keywords. Please note that this must be a comma-separated string
        // and that individual keywords cannot contain whitespace
        $myVideoEntry->SetVideoTags('cars, funny');

        $tokenHandlerUrl = 'http://gdata.youtube.com/action/GetUploadToken';
        $tokenArray = $yt->getFormUploadToken($myVideoEntry, $tokenHandlerUrl);

        $data = array('tokenValue' => $tokenArray['token'], 'postUrl' => $tokenArray['url']);

        return new ViewModel( $data );
    }

}

`

据我所知,我几乎完全遵循了开发人员指南并拥有开发人员密钥,但仍然出现错误。任何想法可能是什么问题?

4

2 回答 2

2
$tokenArray = $yt->getFormUploadToken($myVideoEntry, $clientId, $developerKey);

// vendor/zendframework/zendgdata/library/ZendGData/YouTube.php
public function getFormUploadToken(
        $videoEntry, $clientId, $developerKey,
        $url='https://gdata.youtube.com/action/GetUploadToken')
    {
        //$extraHeaders = $this->getHttpClient()->getRequest()->getHeaders()->toArray();
        $extraHeaders = array(
            'X-GData-Client' => $clientId,
            'X-GData-Key' => 'key='. $developerKey
        );

        if ($url != null && is_string($url)) {
            // $response is a Zend\Http\Response object
            $response = $this->post($videoEntry, $url, null, null, $extraHeaders);
            return self::parseFormUploadTokenResponse($response->getBody());
        } else {
            throw new App\Exception(
                'Url must be provided as a string URL');
        }
    }
于 2013-03-02T18:48:32.600 回答
1

因此,在自己为此苦苦挣扎了一段时间之后,我终于找到了一个很好的解决方法。似乎您在实例化 YouTube 对象时提供的 dev 密钥没有被插入到标头中。要解决此问题,只需在执行操作时提供标头即可。这适用于任何条目,例如播放列表或视频。

$dev_key = '****';
$entry = new ZendGData\YouTube\VideoEntry();
// do entry stuff here
$uploadUrl = 'http://uploads.gdata.youtube.com/feeds/api/users/default/uploads'
$className = 'ZendGData\YouTube\VideoEntry';
$extraHeaders = array('X-GData-Key' => "key=$dev_key");
try {
    $yt->insertEntry($entry, $uploadUrl, $className, $extraHeaders);
} catch (Exception $e) {
    die($e->getMessage());
}
于 2013-07-12T16:24:08.537 回答