使用Simple Access API(API密钥)错误“401 Unauthorized”在我的YouTube帐户中上传视频

时间:2014-02-14 00:37:12

标签: youtube youtube-api

我正在尝试使用Simple Access API(API密钥)在我的YouTube帐户中上传视频。

我得到了这个例外。

You chose src/resources/video.avi to upload.
Initiation Started
Initiation Completed
Exception: 401 Unauthorized 
com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized
at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:143)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:115)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:421)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:340)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:458)
at com.google.api.services.samples.YoutubeSample.queryGoogleYouTube(YoutubeSample.java:126)
at com.google.api.services.samples.YoutubeSample.main(YoutubeSample.java:152)

有什么问题?

使用youtube-API的简单访问API(API密钥)的文档很差。 有谁可以帮助我?

我的简单访问API:

Simple API Access

Use API keys to identify your project when you do not need to access user data.

Key for server apps (with IP locking)
API key:   AIzaSxxxxxxxxxxxxxxxxxxxxxxx-bVE8jRlzXY
IPs:   Any IP allowed
Activated on:   Feb 11, 2014 7:50 PM
Activated by:   myaccount@gmail.com – you 

这是我的代码。

package com.google.api.services.samples;

import com.google.api.client.googleapis.media.MediaHttpUploader;
import com.google.api.client.googleapis.media.MediaHttpUploaderProgressListener;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.InputStreamContent;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.youtube.YouTube;
import com.google.api.services.youtube.YouTubeRequestInitializer;
import com.google.api.services.youtube.model.Video;
import com.google.api.services.youtube.model.VideoSnippet;
import com.google.api.services.youtube.model.VideoStatus;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

public class YoutubeSample {

    private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();

    private static final JsonFactory JSON_FACTORY = new JacksonFactory();

private static YouTube youtube;

private static String VIDEO_FILE_FORMAT = "video/*";

private static final String APPLICATION_NAME = "YoutubeTest";

//Simple API Access
//Use API keys to identify your project when you do not need to access user data.
//Key for server apps (with IP locking) 
private static final String API_KEY = "AIzaSxxxxxxxxxxxxxxxxxx-bVE8jRlzXY"; // This has changed. 

private static File getVideoFromUser() throws IOException {
    return new File("src/resources/video.avi");
}

private static void queryGoogleYouTube() throws Exception {

    ClientCredentials.errorIfNotSpecified();

    try {

//In this piece of code that is my difficulty           
youtube = new YouTube.Builder(HTTP_TRANSPORT, JSON_FACTORY,
                new HttpRequestInitializer() {
                    public void initialize(HttpRequest request)
                            throws IOException {
                    }
                })
                .setApplicationName(APPLICATION_NAME)
                .setYouTubeRequestInitializer(new YouTubeRequestInitializer(API_KEY)).build();

        File videoFile = getVideoFromUser();
        System.out.println("You chose " + videoFile + " to upload.");

        Video videoObjectDefiningMetadata = new Video();

        VideoStatus status = new VideoStatus();
        status.setPrivacyStatus("public");
        videoObjectDefiningMetadata.setStatus(status);

        VideoSnippet snippet = new VideoSnippet();

        Calendar cal = Calendar.getInstance();
        snippet.setTitle("Test Upload via Java on " + cal.getTime());
        snippet.setDescription("Video uploaded via YouTube Data API V3 using the Java library "
                + "on " + cal.getTime());

        // Set your keywords.
        List<String> tags = new ArrayList<String>();
        tags.add("test");
        tags.add("example");
        tags.add("java");
        tags.add("YouTube Data API V3");
        tags.add("erase me");
        snippet.setTags(tags);

        videoObjectDefiningMetadata.setSnippet(snippet);

        InputStreamContent mediaContent = new InputStreamContent(
                VIDEO_FILE_FORMAT, new BufferedInputStream(
                        new FileInputStream(videoFile)));
        mediaContent.setLength(videoFile.length());

        YouTube.Videos.Insert videoInsert = youtube.videos().insert(
                "snippet,statistics,status", videoObjectDefiningMetadata,
                mediaContent);

        MediaHttpUploader uploader = videoInsert.getMediaHttpUploader();

        uploader.setDirectUploadEnabled(false);

        MediaHttpUploaderProgressListener progressListener = new MediaHttpUploaderProgressListener() {
            public void progressChanged(MediaHttpUploader uploader)
                    throws IOException {
                switch (uploader.getUploadState()) {
                case INITIATION_STARTED:
                    System.out.println("Initiation Started");
                    break;
                case INITIATION_COMPLETE:
                    System.out.println("Initiation Completed");
                    break;
                case MEDIA_IN_PROGRESS:
                    System.out.println("Upload in progress");
                    System.out.println("Upload percentage: "
                            + uploader.getProgress());
                    break;
                case MEDIA_COMPLETE:
                    System.out.println("Upload Completed!");
                    break;
                case NOT_STARTED:
                    System.out.println("Upload Not Started!");
                    break;
                }
            }
        };
        uploader.setProgressListener(progressListener);

        // Execute upload.
        Video returnedVideo = videoInsert.execute();

        // Print out returned results.
        System.out
                .println("\n================== Returned Video ==================\n");
        System.out.println("  - Id: " + returnedVideo.getId());
        System.out.println("  - Title: "
                + returnedVideo.getSnippet().getTitle());
        System.out.println("  - Tags: "
                + returnedVideo.getSnippet().getTags());
        System.out.println("  - Privacy Status: "
                + returnedVideo.getStatus().getPrivacyStatus());
        System.out.println("  - Video Count: "
                + returnedVideo.getStatistics().getViewCount());

    } catch (Exception e) {
        System.err.println("Exception: " + e.getMessage());
        e.printStackTrace();
    } catch (Throwable t) {
        System.err.println("Throwable: " + t.getMessage());
        t.printStackTrace();
    }
}

public static void main(String[] args) {
    try {
        queryGoogleYouTube();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

1 个答案:

答案 0 :(得分:0)

正如您在发布的代码段中所看到的,当您需要访问用户数据时,简单访问API密钥旨在识别您的项目(即为了配额)。将视频上传到帐户是一种访问用户数据的形式,因此您需要使用oauth2,请求范围“https://www.googleapis.com/auth/youtube.upload”,然后使用访问令牌执行上传。

一旦你运行了oauth2流并且你的用户授予了对作用域的访问权限,你的代码的其余部分看起来似乎是正确的(但我不是Java专家所以不要让我这么做!)