0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【スケジューラ】YouTubeのチャンネル内動画の情報を自動取得してみる

Last updated at Posted at 2023-07-03

はじめに

自身のYouTubeチャンネルに投稿した動画のID等の情報を自動で取得する処理を作ってみようかなと思い、Sharperlightのスケジューラを使用し作成してみました。

処理としては、先ずGoogle API Keyを準備してYouTubeのAPIにアクセスします。ページング等も行いチャンネル内の全ての画像の情報を取得します。取得したデータはcsvファイルとして一時保存。
Sharperlightクエリで一時保存したcsvを読みとり、予め準備しておいたデータベーステーブルに書き込みます。

スケジュールタスクの作成

Sharperlightアプリケーションメニューからスケジューラを起動します。
新規ボタンを利用してスケジュールタスクの作成を開始します。

一般タブ

ここでは初めに、グループやコード等の詳細を記入します。
image.png

アクションタブ

アクションタブではその名のとおり、このタスクに遂行させる処理を記入していきます。
新規アイコンでアクション一覧を表示して、使用するアクションを選択します。
image.png
image.png

データの取得

最初にAPIから情報を取得するアクションを作成します。JavaScriptで作成するのが便利そうなのでアクション一覧よりJavaScriptを選択します。
JavaScriptアクションが追加されたエディタが表示されるので、以下のコードを書いてみました。
コード中のこのようなSharperlight関数 lib_task.ParamGet('xxxxx')は、このタスクに渡される引数を参照するためのものです。
基礎となるURLアドレスやGoogle API Key等は引数で渡せるようにしておきました。
ページング処理は、戻り値のnextPageToken属性を利用しています。
また今回は10ページまでと直接指定しています。ここも引数でもいいかもね。
(エラーハンドリングは省略)

var nextPageToken = "";
var url = lib_task.ParamGet('BaseAPIUrl') + "&maxResults=" + lib_task.ParamGet('MaxResultPerPage') + "&playlistId=" + lib_task.ParamGet('PlayListId') + "&key=" + lib_task.ParamGet('GoogleAPIKey');
var xUrl = "";

var path = "{_Task.Param.FilePath}";
for (var p=0; p<10; p++){
       if (nextPageToken == ""){
              xUrl = url;
       }else{
              xUrl = url + "&pageToken=" + nextPageToken;
       }
       console.log("P=" + p + ":  " + xUrl);
       let ytSnippet = lib_sys.urlContent.Get(xUrl);
       let ytSnippetObj = JSON.parse(ytSnippet);
       nextPageToken = ytSnippetObj.nextPageToken;
       let content = "";
       if (ytSnippetObj.items.length == 0) { break; }
       for (var i=0; i<ytSnippetObj.items.length; i++){
              content += lib_app.expression.Eval( "ChCRLF()" ) + ytSnippetObj.items[i].id;
              content += "," + ytSnippetObj.items[i].snippet.position;
              content += "," + ytSnippetObj.items[i].snippet.publishedAt;
              content += "," + ytSnippetObj.items[i].snippet.channelId;
              content += "," + ytSnippetObj.items[i].snippet.title.replace(',','@@@');
              content += "," + ytSnippetObj.items[i].snippet.channelTitle.replace(',','@@@');
              content += "," + ytSnippetObj.items[i].snippet.playlistId;
              content += "," + ytSnippetObj.items[i].snippet.resourceId.kind;
              content += "," + ytSnippetObj.items[i].snippet.resourceId.videoId;
       }

       lib_sys.io.file.AppendAllText(path,content);
       if (typeof nextPageToken === "undefined") { break; }

}

以上で主となるアクションが完成。取得された情報はcsvファイルとして保存されるので、そのファイルをクエリしてデータベースに書き込むアクションを作成します。

データの書き戻し

ここでは書き戻しアクションを選択します。このアクションは先のJavaScriptアクションの次に実行される必要があるので、すぐ真下に定義します。
書き戻しアクションでは、下記の情報を定義します。

  • 書込み先のデータベースの接続情報の指定
  • ソースデータを準備するためのクエリの定義

今回使用するデータベースは、Sharperlightマテリアライズクエリで作成されるデータベースを利用しました。その中にあらかじめデーブルも作成しておきました。
製品コードに作成しておいたマテリアライズクエリのコードを指定します。こうすることでSharperlightエンジンは、そのデータベース接続情報を取得できます。
更に書込み先テーブルの指定を行います。その他の属性はそのままでいいでしょう。
image.png
次に、書込むデータを準備するクエリを定義します。これは単にAPIから取得した情報が記されているcsvファイルを読み、全レコードを返すという単純なクエリです。クエリを編集ボタンでクエリビルダを起動して作成します。
このような定義になります。TitleChannelTitleに関して、拡張表現が定義されています。これらは、TitleやChannelTitle内にカンマが含まれていた場合、csvファイルを作成する時点で読み取り時の誤作動を防ぐという意味で特殊な記号に変換していたものを、元のカンマに戻すという処理をしています。
image.png

テーブルの初期化

UPDATEとINSERTを併用したSQL文で書き戻し処理を記してデータの重複を防ぐことも可能ですが、今回は単に書き戻しアクションでINSERTのみを行うようにしたので、書き戻し前にテーブルを初期化するアクションが必要です。
アクション一覧からSQLステートメントを選択し、Truncate Table構文を実行するようにします。
そして書き戻しアクションのひとつ前に配置します。
image.png

csvファイルの初期化

最後にAPIから取得したデータを一時保存するためのcsvファイルの初期化アクションを二つ追加します。
ひとつはcsvファイルを削除するアクション、もうひとつはcsvファイルを作成しヘッダー行を追加するアクションです。
image.png

以上で全てのアクションが作成できました。OKボタンで保存します。
image.png

スケジュールタスクの実行

スケジュールタスクの一覧ダイアログから作成したばかりのタスクを選択し、右クリックメニューより実行を選択します。
実行後エラーが発生しなければ、指定したデータベーステーブルを確認してみます。エラーが発生した場合は、定義したアクションを確認していきます。JavaScriptアクションは単体でデバッグができるようになっています。
このようなデータが確認できれば成功ですね。
image.png

スケジューリング

上記では手動でタスクを実行しましたが、タスクのトリガタブで実行時間のスケジューリングが可能です。
image.png

あとがき

これでYouTube動画の情報が取得されました。こんどはこの情報を利用して、自分オリジナルの動画メニューでも作ってみます。
この記事が何かのお役に立てればなによりです。では失礼します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?