はじめに
毎週複数の同じ検索ワードで検索しては、再生リストに追加してYoutube動画を見ていました。
それが面倒になり、自動化できないかプログラミングしてみました。
PythonでYoutubeの動画を検索して、自動で再生リストに追加するプログラムを作ってみた。
上記のGASバージョンです。
Pythonで週一定期実行したかったのですが、方法がみつからず。
GASなら定期実行ができるので移植しました。
環境
- google app script
- youtube api v3
- windows 10
仕様
- 7日以内にアップロードされた動画を対象とする
- 各検索ワードに対して、関連度が高い1つの動画を再生リストに追加する
- すでに再生リストに含まれる動画は重複しないようにする
流れ
- youtubeの認証を通す
- 7日前の日付を取得する
- 検索ワードで検索結果を取得する
- すでに再生リストに含まれるかチェックする
- 検索された動画を再生リストに追加する
つまづいたところ
- Youtube appのマニュアルのJavascriptの記述では実行できない
- javascriptじゃないのかよ!!!
コード
function searchVideosByKeywords(keywords,strLastWeek){
var videoIdArray = []
for(let indKeyword=0; indKeyword < keywords.length;indKeyword++){
var searchResponse = YouTube.Search.list(
"id,snippet",
{
q: keywords[indKeyword],
type: "video",
regionCode: 'jp',
maxResults: 1,
publishedAfter: strLastWeek,
},
);
// console.log(searchResponse['items'][0]['id']['videoId']);
// console.log(searchResponse['items'][0]['snippet']['title']);
videoIdArray.push(searchResponse['items'][0]['id']['videoId']);
}
return videoIdArray;
}
function insertVideosIntoPlaylist(playlistItemsListResponse,videoIdArray,strPlaylist){
var videoAlready = []
for (let itemVideo in playlistItemsListResponse["items"]){
videoAlready.push(playlistItemsListResponse["items"][itemVideo]["snippet"]["resourceId"]["videoId"]);
}
// var id = "q4qYRIJzlCs";
for (let indVideo in videoIdArray){
if(! isExistInArray(videoIdArray[indVideo],videoAlready)){
var playlistItemInsertResponse = YouTube.PlaylistItems.insert(
{snippet:{
playlistId: strPlaylist,
resourceId:{
videoId: videoIdArray[indVideo],
kind:"youtube#video",
}
}
},
"snippet",
);
}
}
}
function collectNogizakaRadio(){
const PLAYLIST_ID = "PLophPL_kQhKnXBP3y78orNmdNZDxNmMQS"
var keywordArray = [];
keywordArray.push('乃木坂');
keywordArray.push('日向坂');
keywordArray.push('欅坂');
var dtNow = new Date();
var dtLastWeek = new Date();
dtLastWeek.setDate(dtNow.getDate() - 7);
// console.log(dtLastWeek);
const strLastWeek = dtLastWeek.toJSON();
// console.log(strLastWeek);
var videoIdArray = searchVideosByKeywords(keywordArray,strLastWeek);
var playlistItemsListResponse = YouTube.PlaylistItems.list(
"snippet",
{
playlistId: PLAYLIST_ID
}
);
insertVideosIntoPlaylist(playlistItemsListResponse,videoIdArray,PLAYLIST_ID);
console.log("done");
}
function isExistInArray(str,ary){
var bool = false;
for(let ind in ary){
bool = bool || (str == ary[ind]);
}
return bool;
}
おわりに
このプログラムで以下を含みます。
- 特定のキーワードでYoutube動画検索したときの結果の取得
- 特定のYoutube再生リストの動画の取得
- 特定のYoutube再生リストに特定の動画を追加する
Youtubeのときと違って、トークンとか管理しなくていいのは楽。
しかし、なぜAPIごとの記法が異なるのか、たどり着くまで大変だった。
これで運用してみたいと思います。
困っていること
Youtubeアカウントをメインアカウントではなく、
ブラインドアカウントから再生リストを操作したいのですが、できません。
方法をご存じの方がいたら教えてください。