ElcamyTECH
Articles
Dify

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

Tech生成AIDifyDify2025/02/17

更新日: 2025-08-07

はじめに

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

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

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

メモ

この記事の対象者

  • Dify という言葉を聞いたことがあるが、何ができるのかがわからない方
  • Dify を業務に取り入れたいと検討している方
メモ

事前準備

  • Dify へのサインアップ
  • OpenAI APIまたはGemini APIのAPIキーの取得
    • Gemini APIの場合
      1. ここにアクセスし、「APIキーを作成」を選択します。
      2. 「新しいプロジェクトでAPIキーを作成」を押します。
      3. APIキーをコピーします。
        • OpenAI APIの場合
        • サインアップした後、こちらからAPIキーを作成し、保存します。
        • APIキーのセットアップ
        • YouTube Data APIのAPIキーの取得
        • こちらを参考に、YouTube Data APIのAPIキーを取得します。
        • Search APIのAPIキーの取得
        • こちらからサインアップ後、APIキーを取得します。

環境

  • Dify v1.7.1(2025年08月01日時点)

概要

完成イメージ

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

メモ

イメージ

  1. 左側の項目に、チャンネルのID(channelId)と、検索する日時の範囲(「publishedAfter」から「publishedBefore」)を日本時間で入力します。 入力形式は、「YYYY-MM-DD-HH:MM」です。

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

    image

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

メモ

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

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

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

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

作業手順

ここからは、ワークフロー構築の手順について説明します。

手順

  1. ワークフローの新規作成
  2. ワークフロー作成画面上での作業
  3. ワークフローの動作確認

1. ワークフローの新規作成

  1. 最初の画面の「最初から作成」を選択します。

    image

  2. 「ワークフロー」を選択し、「アプリのアイコンと名前」を入力してから「作成する」を選択します。

    image

2. ワークフロー作成画面上での作業

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

    image 同様に、「PublishedAfter」と「PublishedBefore」を追加します。 変数名とラベル名は同一のもので差し支えありません。

    image

  2. **「コード」**ノードを追加します。 「入力変数」の「+」ボタンを押します。 「{x}変数を設定」をクリックし、「開始」の「{x}PublishedAfter」を追加します。

    image 同様に、「{x}PublishedBefore」を追加します。このとき、変数名のラベルはそれぞれ「PublishedAfter」、「PublishedBefore」にしてください。

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

    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 「出力変数」の「+」ボタンを押し、「PublishedAfterUTC」と「PublishedBeforeUTC」を追加します。ここで、コードブロックの名前もわかりやすく「世界標準時変換」としておきます。

image

  1. **「HTTPリクエスト」**ノードを追加します。

    :::message

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

    :::

「GET」を選択し、下記のURLを入力します。 https://www.googleapis.com/youtube/v3/search

image

  1. 「パラメータ」の各キーと値を下記の表のように入力します。
キー備考
channelId{x}channelIdAPIで取得する対象のYouTubeチャンネルのIDを指定します.
partsnippet,id取得するデータの種類を指定します。snippetは基本的なメタ情報を含み、idは動画IDを返します。
orderdate動画を投稿日順に並べるよう指定します。
maxResults1取得する動画の最大数を指定します。ここでは最新の1件を取得します。
typevideo動画のみを対象に検索するよう指定します。
PublishedAfter{x}PublishedAfterUTC指定した日時以降に投稿された動画を検索するための日付を指定します。
PublishedBefore{x}PublishedBeforeUTC指定した日時以前に投稿された動画を検索するための日付を指定します。
key任意の値事前準備で取得したYouTube Data APIのAPIキーを指定します。

image

  1. 「ツール」から**「JSON Parse」**を追加します。

    :::message

    「JSON Parse」ノードとは

    :::

    image 「JSON data」と「JSON filter」の値を下記の表のように設定します。 「入力変数」の「JSON data」に「HTTPリクエスト」の「{x}body」を選択します。 「JSON filter」で下記のように記述します。 items[0]["id"]["videoId"]

項目備考
JSON data{x}body「HTTPリクエスト」の「{x}body」を選択
JSON filteritems[0]["id"]["videoId"]ここでは、「HTTPリクエスト」ノードの出力から、動画のID(videoId)を抽出しています。

image

  1. 次に、「ツール」から「SearchAPI」の中にある**「YouTube Transcripts API」**を選択し、追加します。(ツールから見つからない場合は、マーケットプレイスからSearchAPIをインストールしてください。)

    :::message

    「YouTube Transcripts API」ノードとは 動画のIDをもとに、動画の字幕を取得します。 Youtubeのプラグインにも存在しますが、自動生成される字幕を取得することができないため、SearchAPIでの字幕取得を推奨します。

    :::

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

image

  1. **「LLM」**ノードを追加し、「コンテキスト」に「YouTube Transcripts API」の「{x}text」を選択し、「SYSTEM」にプロンプトを入力します。改行し、「/」を入力した後、「コンテキスト」を選択します。

    image これで、最新動画の内容の要約は完了です。次に、最新動画のタイトルを取得します。

  2. 「HTTPリクエスト」ノードに戻り、「+」ボタンを押して、「JSON Parse」を新しく作成します。

    image

  3. 「JSON data」と「JSON filter」の値を下記の表のように設定します。 「入力変数」の「JSON data」に「HTTPリクエスト」の「{x}body」を選択します。 「JSON filter」で下記のように記述します。 items[0]["id"]["title"]

項目備考
JSON data{x}body「HTTPリクエスト」の「{x}body」を選択
JSON filteritems[0]['snippet']['title']ここでは、「HTTPリクエスト」ノードの出力から、動画のタイトルを抽出しています。

このとき、ふたつの「JSONParse」ノードが並列に接続されているかも確認しておきましょう。(役割ごとにノードの名前を変更しておくと見やすくなります。)

image

  1. 「LLM」ノードから「テンプレート」ノードを追加し、「JSON Parse」ノードと並列につなぎます。

    image

  2. 「入力変数」に「JSON Parse TITLE」の「text」と、「LLM」ノードの「text」を追加します。 それぞれのラベルを「title」と「text」としてあげましょう。

    image

  3. コードの欄に以下の文章を、コピー&ペーストします。

    タイトル: {{ title }}
    動画の要約
    {{ text }}

    image

  4. **「終了」**ノードを追加し、「出力変数」の「変数名」に「output」を、「{x} 変数を設定」に「テンプレート」の「output」を選択します。

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

3. ワークフローの動作確認

  1. 「公開する」を選択し、「アプリを実行」選択します。

    image アプリを実行します。

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

    image

応用

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

おわりに

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

関連記事

Elcamyについて

AI・データエンジニアリング・クラウドを中心に、技術で事業課題を解決しています。 お気軽にご相談ください。