【图文详解】Java自动上传视频到Youtube

马上春节了,下半年折腾了一个「自动生产视频上传到 Youtube」的项目,想分享出来。但是发现内容太多,所以准备将整体拆出来分开写。本文是目的是通过 Java 语言将视频自动上传到 Youtube。此功能大部分人都是用 Python 完成,不会 Python 语法,所以用 Java 完成的,期间看谷歌官方*****后还碰到很多大坑,这里分享出来希望能帮到一些人。

Google Console Api 开通

首先需要在谷歌 Api 控制台创建项目申请 Youtube API 服务,下载**文件。

Google Console API

创建项目,这里比较简单,没什么要注意,如下图。

【图文详解】Java自动上传视频到Youtube

启动 Youtube 相关API服务。如果你不知道用到哪些,搜索出来加全部启动即可。

【图文详解】Java自动上传视频到Youtube

【图文详解】Java自动上传视频到Youtube

创建 Oauth 凭证 。如果应用类型不知道或者不在选项内,可以选择「其他」,并没有什么影响。

【图文详解】Java自动上传视频到Youtube

【图文详解】Java自动上传视频到Youtube

下载**凭证

【图文详解】Java自动上传视频到Youtube

ok,这里已经完成。

代码书写

先用官方代码测试,别自定义比如设置上传视频的类别、缩略图、视频路径等等功能。如果 demo 跑不通一切都白写。

官方 demo 重点是如下四份资料。

【图文详解】Java自动上传视频到Youtube

Auth 类,这里需要注意从控制台下载的**文件名称。只要保证代码和名称两者填写一致即可,看好路径,其他以后都不用管。

 Reader clientSecretReader = new InputStreamReader(Auth.class.getResourceAsStream("/client_secrets.json"));

UploadVideo中需要注意的内容很多。首先以防万一,将代理开启,这里是个天坑。我的电脑有 tizi 结果死活上传不了,找了 6-7 个小时才偶然解决。

【图文详解】Java自动上传视频到Youtube

        System.setProperty("http.proxyHost", proxyHost);
        System.setProperty("http.proxyPort", proxyPort);

        // 对https也开启代理
        System.setProperty("https.proxyHost", proxyHost);
        System.setProperty("https.proxyPort", proxyPort);

然后是本地授权文件重命名。

【图文详解】Java自动上传视频到Youtube

   Credential credential = Auth.authorize(scopes, "uploadvideo");

这一步并不必要,但是如果你有多个类似项目,这里就可以区分开来。首次上传时会在浏览器中请求授权,确定后会在本地生成此命名的文件在本地。如果将文件删掉,又会重新请求授权生成

【图文详解】Java自动上传视频到Youtube

接着是上传视频路径位置,前面图片可以看到,这里在 resources下,所以写成如下

  InputStreamContent mediaContent = new InputStreamContent(VIDEO_FILE_FORMAT,
                    UploadVideo.class.getResourceAsStream("/sample-video.mp4"));

然后是视频的各种信息,基本上大家能都看懂。包括是否公开、视频标题、描述、分类(默认人类是 人物和博客)、标签等等。

为了将首次请求授权过程给大家展示,这里我将上一步名字重新修改成guozhtest

 Credential credential = Auth.authorize(scopes, "guozhtest");

好的,运行代码测试看看。一运行 main方法,浏览器会自动打开如下界面,如果已经登录应该不会显示如下

【图文详解】Java自动上传视频到Youtube

选择账号登录后会出现如下界面。因为我账号中创建了多个频道,这里需要我们选择上传的频道。可以看出来我有三个频道,一个主频道,下面两个子频道。

【图文详解】Java自动上传视频到Youtube

不知道大家是否了解 Youtube 的频道机制,这里就不多说了。一定不要在主账号下发布视频,创建子频道发布视频,不然一旦主账号被惩罚那就完了。

接着如下图

【图文详解】Java自动上传视频到Youtube

最后整个浏览器页面显示如下,可以将页面关闭。

【图文详解】Java自动上传视频到Youtube

在回到代码中看日志,如下图。如果上传不成功这里也会有提示,这里可以看出来我上传成功了。

【图文详解】Java自动上传视频到Youtube

可以去 Youtube 创作者后台看看,果然已经上传成功发布上去了。

【图文详解】Java自动上传视频到Youtube

最后来看看请求授权生成的本地文件,相信大家已经了解整个过程了。

【图文详解】Java自动上传视频到Youtube

到这一步可以完成大部分需求,甚至修修改改直接可以用在项目中了。但是要做到完美还剩下两点,设置视频分类和设置缩略图。

Youtube自动上传设置视频分类

代码中很好设置,加上如下代码即可。

snippet.setCategoryId("24");

难点是我们不知道 Youtube 分类对应的 id 是啥!!对的 你没看错,api 文档中竟然没有。。程序代码默认「人物和博客」其实也没啥事,毕竟万金油般的存在。但如果我真的对视频内容很明确不属于该类,这就尴尬了。如下图是 Youtube 提供的视频分类选项。

【图文详解】Java自动上传视频到Youtube

在全网搜了很久终于找到(在后面源码中会提供)。好的,接下来只要设置好对应分类 id 即可。

Youtube API为视频设置添加缩略图

这里纠正我一个误区,最开始我以为缩略图也是这标题描述等一起上传的。后面才知道逻辑:先上传视频获取视频id再为此id视频设置缩略图

刚才视频上传成功打印出的日志可以再看看

================== Returned Video ==================

  - Id: ePlfxf1vGxQ
  - Title: Test Upload via Java on Wed Jan 23 22:37:04 CST 2019
  - Tags: [test, example, java, YouTube Data API V3, erase me]
  - Privacy Status: public
  - Video Count: 0

第一行就是视频上传成功返回的视频 id 。用作设置缩略图参数。这里我就不测试官方上传缩略图代码了,官方代码用作测试写的非常好,大家可以运行试一试(代码见最后)。可以分享下其中一点整合经验。

  • 和前面一样,最后添加代理,不然可能会失败
   		System.setProperty("http.proxyHost", proxyHost);
        System.setProperty("http.proxyPort", proxyPort);

        // 对https也开启代理
        System.setProperty("https.proxyHost", proxyHost);
        System.setProperty("https.proxyPort", proxyPort);
  • 首次授权也会在本地生成一个文件,和前面一样。我不知道这几行代码可不可以和前面授权上传视频整合成一个,将他们省略,用同一个 youtube 对象。大家有兴趣可以试一试,我是重新生成,用了两个对象。
Credential credential = Auth.authorize(scopes, "gifuploadthumbnail");
youtube = new YouTube.Builder(Auth.HTTP_TRANSPORT, Auth.JSON_FACTORY, credential).setApplicationName(
        "youtube-cmdline-uploadthumbnail-sample").build();
System.out.println("You chose " + videoId + " to upload a thumbnail.");
  • 官方代码提供的是一个独立测试类UploadThumbnail,我们需要修改成一个方法。这里大家应该都理解。
public static void coustomThumb(String videoId,String imgPath){
    //代码写在这
}

源码获取

这是自动生产项目的其中一部分,欢迎关注下篇。其中所有代码我都整理出来,在微信公众号「第一勺金」回复「20190124」即可。

原创第一勺金