马上春节了,下半年折腾了一个「自动生产视频上传到 Youtube」的项目,想分享出来。但是发现内容太多,所以准备将整体拆出来分开写。本文是目的是通过 Java 语言将视频自动上传到 Youtube。此功能大部分人都是用 Python 完成,不会 Python 语法,所以用 Java 完成的,期间看谷歌官方视频、教程后还碰到很多大坑,这里分享出来希望能帮到一些人。
Google Console Api 开通
首先需要在谷歌 Api 控制台创建项目申请 Youtube API 服务,下载密钥文件。
创建项目,这里比较简单,没什么要注意,如下图。
启动 Youtube 相关API服务。如果你不知道用到哪些,搜索出来加全部启动即可。
创建 Oauth 凭证 。如果应用类型不知道或者不在选项内,可以选择「其他」,并没有什么影响。
下载密钥凭证
ok,这里已经完成。
代码书写
先用官方代码测试,别自定义比如设置上传视频的类别、缩略图、视频路径等等功能。如果 demo 跑不通一切都白写。
官方 demo 重点是如下四份资料。
Auth
类,这里需要注意从控制台下载的密钥文件名称。只要保证代码和名称两者填写一致即可,看好路径,其他以后都不用管。
Reader clientSecretReader = new InputStreamReader(Auth.class.getResourceAsStream("/client_secrets.json"));
UploadVideo
中需要注意的内容很多。首先以防万一,将代理开启,这里是个天坑。我的电脑有 tizi 结果死活上传不了,找了 6-7 个小时才偶然解决。
System.setProperty("http.proxyHost", proxyHost);
System.setProperty("http.proxyPort", proxyPort);
// 对https也开启代理
System.setProperty("https.proxyHost", proxyHost);
System.setProperty("https.proxyPort", proxyPort);
然后是本地授权文件重命名。
Credential credential = Auth.authorize(scopes, "uploadvideo");
这一步并不必要,但是如果你有多个类似项目,这里就可以区分开来。首次上传时会在浏览器中请求授权,确定后会在本地生成此命名的文件在本地。如果将文件删掉,又会重新请求授权生成。
接着是上传视频路径位置,前面图片可以看到,这里在 resources
下,所以写成如下
InputStreamContent mediaContent = new InputStreamContent(VIDEO_FILE_FORMAT,
UploadVideo.class.getResourceAsStream("/sample-video.mp4"));
然后是视频的各种信息,基本上大家能都看懂。包括是否公开、视频标题、描述、分类(默认人类是 人物和博客)、标签等等。
为了将首次请求授权过程给大家展示,这里我将上一步名字重新修改成guozhtest
Credential credential = Auth.authorize(scopes, "guozhtest");
好的,运行代码测试看看。一运行 main
方法,浏览器会自动打开如下界面,如果已经登录应该不会显示如下
选择账号登录后会出现如下界面。因为我账号中创建了多个频道,这里需要我们选择上传的频道。可以看出来我有三个频道,一个主频道,下面两个子频道。
不知道大家是否了解 Youtube 的频道机制,这里就不多说了。一定不要在主账号下发布视频,创建子频道发布视频,不然一旦主账号被惩罚那就完了。
接着如下图
最后整个浏览器页面显示如下,可以将页面关闭。
在回到代码中看日志,如下图。如果上传不成功这里也会有提示,这里可以看出来我上传成功了。
可以去 Youtube 创作者后台看看,果然已经上传成功发布上去了。
最后来看看请求授权生成的本地文件,相信大家已经了解整个过程了。
到这一步可以完成大部分需求,甚至修修改改直接可以用在项目中了。但是要做到完美还剩下两点,设置视频分类和设置缩略图。
Youtube自动上传设置视频分类
代码中很好设置,加上如下代码即可。
snippet.setCategoryId("24");
难点是我们不知道 Youtube 分类对应的 id 是啥!!对的 你没看错,api 文档中竟然没有。。程序代码默认「人物和博客」其实也没啥事,毕竟万金油般的存在。但如果我真的对视频内容很明确不属于该类,这就尴尬了。如下图是 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」即可。
本文由老郭种树原创,转载请注明:https://guozh.net/318/
赞一个,我的大刀已经饥渴难耐了,加油
兄弟 还真是支持我。
不錯 這個月試試
想用java对接google云,可以联系博主么?
大兄弟,有啥事 在网站上怎么能快速联系我呢,比如我现在回复,你还看得到吗。。。
可以给下java的源代码看下吗
我记得文章中应该有吧
:exclaim: 别说还真不错昂
hhh
跳转页面中提示要google 通过验证 怎么处理
我想问问使用goole drive api去上传文件时,我需要去oauth认证中添加域名吗,我现在只是想进行本地测试
+1 , 想做个自己用的都不行
本地视频:先加密压缩上传奶牛快传(非登录状态最大2G),然后 VPS 上下载下来(自己解析获取真实链接),解压出来,利用 VPS 上的脚本上传到 Youtube
我主要是白嫖 YouTube 的字幕生成的功能,有些英文视频没字幕,而且也是用 VPS 下载的,我的套路是:VPS 上下载视频,然后利用脚本上传 Youtube,等字幕完成后,再下载字幕,然后将视频和字幕加密压缩发送到奶牛快传,然后再从奶牛快传上下载下来
目前就是麻烦了一点,如果能搞个一套完整的web服务就方便了,直接在网页里点点鼠标就行了
Credential credential = Auth.authorize(scopes, “uploadvideo”); 这个里面的uploadvideo哪来的
为什么 Credential credential = Auth.authorize(scopes, “uploadvideo”); 这里 会报java.net.SocketTimeoutException: connect timed out
上传上去的视频变成私享,这是啥原因啊,我的状态设置的公开。
哥们,你这个问题解决了吗,我也碰到这个问题