1

YouTube へのブラウザ ベースのアップロードを実行しようとしています。PHP、Zend Framework 2、および ZF2 用の 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_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 に答える