TECH BLOG

エルカミーの技術ブログです

【Difyで作るシリーズ 5】 YouTubeの特定のチャンネルの最新動画を取得し要約する

はじめに

Difyというサービスを聞いたことがあるけれど、「何ができるかわからない」、「どう使うのかわからない」などの理由で使ったことがない方は多いのではないでしょうか。

そのような方のために、「Dify で何ができるのか?や Dify を使った活用事例」を紹介する記事をシリーズ化していきます。

今回は第5回目で、特定のYouTubeチャンネルから、指定した日時範囲内に投稿された最新の動画を取得し、その動画を要約するワークフローを作成する方法について紹介します。

🙂
この記事の対象者
  • Dify という言葉を聞いたことがあるが、何ができるのかがわからない方
  • Dify を業務に取り入れたいと検討している方
事前準備
  • Dify へのサインアップ
  • OpenAI APIまたはGemini APIのAPIキーの取得
    • Gemini APIの場合
      1. ここにアクセスし、「APIキーを作成」を選択します。
      2. 「新しいプロジェクトでAPIキーを作成」を押します。
      3. APIキーをコピーします。
    • Open AI APIの場合
      • サインアップした後、こちらからAPIキーを作成し、保存します。
  • APIキーのセットアップ
  • YouTube Data APIのAPIキーの取得
    • こちらを参考に、YouTube Data APIのAPIキーを取得します。
  • Search APIのAPIキーの取得
    • こちらからサインアップ後、APIキーを取得し
環境
  • Chrome
  • Dify v0.11.1(2024年11月13日時点)

概要

完成イメージ

まずは、今回作成するアプリの完成イメージについてです。

📌
イメージ
  1. 左側の項目に、チャンネルのID(channelId)と、検索する日時の範囲(「publishedAfter」から「publishedBefore」)を日本時間で入力します。

    入力形式は、「YYYY-MM-DD-HH:MM」です。

  2. 右側に動画の要約が返ってきます。
image block

上記のアプリを構築するためにワークフローを作る説明をします。

💡
ワークフローとは

一つ一つの処理を小さなブロック(ノード)としてつなぎ合わせて、一連のプロレスを自動化する機能です。

今回作成するワークフローのDifyの画面です。

image block

このワークフローは、以下のブロックで構成されます。

flowchart LR
    A[開始<br>channelId <br>publishedAfter<br>publishedBefore] 
	    --> B[世界標準時に変換]
    B --> C[HTTPリクエスト]
    C --> D[JSON Parse]
    D --> E[YouTube Transcripts API]
    E --> F[LLM]
    F --> G[終了]
  1. 開始:指定する項目(channelId、publishedAfter、publishedBefore)を入力します。
  2. 世界標準時に変換:入力された時間を世界標準時に変換します。
  3. HTTPリクエスト:指定したチャンネルの、指定した日時の範囲にある動画のIDを取得します。
  4. JSON Parse:HTTPリクエストの結果から、動画のIDのみを抽出します。
  5. YouTube Transcripts API:動画IDをもとに字幕を取得します。
  6. LLM:字幕から、動画の内容を要約します。
  7. 終了:要約した内容を出力します。

1. ワークフローの新規作成
  1. 最初の画面の「最初から作成」を選択します。
    image block
  2. 「ワークフロー」を選択し、「アプリのアイコンと名前」を入力してから「作成する」を選択します。
    image block
2. ワークフロー作成画面上での作業
  1. 「開始」ノードを選択します。

    入力フィールドの 「フィールドタイプ」の「短文」を選択し、「変数名」と「ラベル名」に「channelId」と入力して「保存」を選択します。

    image block

    同様に、「publishedAfter」と「publishedBefore」を追加します。

    変数名とラベル名は同一のもので差し支えありません。

    image block
  2. 「コード」ノードを追加します。

    「入力変数」の「+」ボタンを押します。

    「{x}変数を設定」をクリックし、「開始」の「{x}publishedAfter」を追加します。

    image block

    同様に、「{x}publishedBefore」を追加します。

    image block

    コードブロックに、以下のコードを入力します。

    from datetime import datetime, timedelta, timezone
    
    def validate_and_format_time(input_time: str) -> datetime:
        return datetime.strptime(input_time, "%Y-%m-%d-%H:%M").replace(tzinfo=timezone(timedelta(hours=9)))
    
    def convert_to_utc_range(publishedAfter: str, publishedBefore: str) -> dict:
        try:
            jst_after = validate_and_format_time(publishedAfter)
            jst_before = validate_and_format_time(publishedBefore)
            utc_after = jst_after.astimezone(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
            utc_before = jst_before.astimezone(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
            return {"publishedAfterUTC": utc_after, "publishedBeforeUTC": utc_before}
        except ValueError as e:
            return {"error": str(e)}
    
    def main(publishedAfter: str, publishedBefore: str) -> dict:
        return convert_to_utc_range(publishedAfter, publishedBefore)
    

    ここではPythonで、開始時に日本時間で入力された「publishedAfter」と「publishedBefore」を世界標準時に変換する処理を記述しています。

    image block

    「出力変数」の「+」ボタンを押し、「publishedAfterUTC」と「publishedBeforeUTC」を追加します。

    image block
  3. 「HTTPリクエスト」ノードを追加します。
    💡
    「HTTPリクエスト」ノードとは

    外部APIやウェブサービスと通信するための機能を提供します。指定したURLやパラメータを用いてリクエストを送り、そのレスポンスを後続の処理で利用できます。

    「GET」を選択し、下記のURLを入力します。

    https://www.googleapis.com/youtube/v3/search

    image block
  4. 「パラメータ」の各キーと値を下記の表のように入力します。
    キー 備考
    channelId {x}channelId APIで取得する対象のYouTubeチャンネルのIDを指定します.
    part snippet,id 取得するデータの種類を指定します。snippetは基本的なメタ情報を含み、idは動画IDを返します。
    order date 動画を投稿日順に並べるよう指定します。
    maxResults 1 取得する動画の最大数を指定します。ここでは最新の1件を取得します。
    type video 動画のみを対象に検索するよう指定します。
    publishedAfter {x}publishedAfterUTC 指定した日時以降に投稿された動画を検索するための日付を指定します。
    publishedBefore {x}publishedBeforeUTC 指定した日時以前に投稿された動画を検索するための日付を指定します。
    key 任意の値 事前準備で取得したYouTube Data APIのAPIキーを指定します。
    image block
  5. 「ツール」から「JSON Parse」を追加します。
    💡
    「JSON Parse」ノードとは
    image block

    「JSON data」と「JSON filter」の値を下記の表のように設定します。

    「入力変数」の「JSON data」に「HTTPリクエスト」の「{x}body」を選択します。

    「JSON filter」で下記のように記述します。

    items[0]["id"]["videoId"]

    項目 備考
    JSON data {x}body 「HTTPリクエスト」の「{x}body」を選択
    JSON filter items[0]["id"]["videoId"]
    image block

    ここでは、「HTTPリクエスト」ノードの出力から、動画のID(videoId)を抽出しています。

  6. 次に、「ツール」から「YouTube Transcripts API」を選択し、追加します。
    💡
    「YouTube Transcripts API」ノードとは

    動画のIDをもとに、動画の字幕を取得します。

    「承認するには」を選択します。

    image block

    事前準備で取得したSearch API キーを入力し、「保存」を選択します。

    image block

    入力変数の「video_id」に「JSON Parse」の「{x}text」を選択します。

    「language」に「ja(日本語)」を入力します。

    image block
  7. 「LLM」ノードを追加し、「コンテキスト」に「YouTube Transcripts API」の「{x}text」を選択します。
    image block

    「SYSTEM」にプロンプトを入力します。

    image block

    改行し、「/」を入力した後、「コンテキスト」を選択します。

    image block
  8. 「終了」ノードを追加し、「出力変数」の「変数名」に「output」を、「{x} 変数を設定」に「LLM」の「text」を選択します。
    image block

以上でワークフローが完成しました。

3. ワークフローの動作確認
  1. 「公開する」を選択し、「アプリを実行」選択します。
    image block

    アプリを実行します。

  2. 右下に動画内容の要約が返ってきました。
    image block

応用

今回は、DifyのUI(画面)上でYouTubeの動画の要約が返ってくるワークフローを作成しましたが、Slackと連携し、定期実行を設定することで、新しく更新された動画内容の要約を定期的に取得することも可能です。

おわりに

今回は、特定のYouTubeチャンネルから、指定した日時範囲内に投稿された最新の動画を取得し、その動画を要約するワークフローの作成手順を紹介しました。今後もDifyを利用したアプリの作成手順を紹介していきます。ぜひ引き続きご覧下さい。