YTB 外れ値ファインダー

上級

これは自動化ワークフローで、16個のノードを含みます。主にIf, Set, Code, Wait, Airtableなどのノードを使用。 Apify + Airtableであなたの細分化市場で隐藏されたYouTubeトレンド/異常動画を発見する

前提条件
  • Airtable API Key
  • ターゲットAPIの認証情報が必要な場合あり

カテゴリー

-
ワークフロープレビュー
ノード接続関係を可視化、ズームとパンをサポート
ワークフローをエクスポート
以下のJSON設定をn8nにインポートして、このワークフローを使用できます
{
  "id": "",
  "meta": {
    "instanceId": "",
    "templateCredsSetupCompleted": true
  },
  "name": "YTB Outlier Finder",
  "tags": [],
  "nodes": [
    {
      "id": "--0",
      "name": "待機",
      "type": "n8n-nodes-base.wait",
      "position": [
        0,
        -460
      ],
      "webhookId": "",
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "--1",
      "name": "条件分岐",
      "type": "n8n-nodes-base.if",
      "position": [
        -160,
        -640
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.data.status }}",
              "rightValue": "SUCCEEDED"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "--2",
      "name": "完了確認",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -440,
        -640
      ],
      "parameters": {
        "url": "https://api.apify.com/v2/acts/streamers~youtube-scraper/runs/last?token=[YOUR_API_TOKEN]",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "--3",
      "name": "動画データ取得",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        160,
        -660
      ],
      "parameters": {
        "url": "https://api.apify.com/v2/acts/streamers~youtube-scraper/runs/last/dataset/items?token=[YOUR_API_TOKEN]",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "--4",
      "name": "動画データセット作成",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -700,
        -640
      ],
      "parameters": {
        "url": "https://api.apify.com/v2/acts/streamers~youtube-scraper/runs?token=[YOUR_API_TOKEN]",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n    \"dateFilter\": \"week\",\n    \"downloadSubtitles\": true,\n    \"hasCC\": false,\n    \"hasLocation\": false,\n    \"hasSubtitles\": false,\n    \"is360\": false,\n    \"is3D\": false,\n    \"is4K\": false,\n    \"isBought\": false,\n    \"isHD\": false,\n    \"isHDR\": false,\n    \"isLive\": false,\n    \"isVR180\": false,\n    \"lengthFilter\": \"between420\",\n    \"maxResultStreams\": 0,\n    \"maxResults\": 3,\n    \"maxResultsShorts\": 0,\n    \"preferAutoGeneratedSubtitles\": false,\n    \"saveSubsToKVS\": false,\n    \"searchQueries\": [\n        \"{{ $json.keyword1 }}\",\n        \"{{ $json.keyword2 }}\",\n        \"{{ $json.keyword3 }}\"\n    ],\n    \"sortingOrder\": \"relevance\",\n    \"subtitlesLanguage\": \"en\"\n} ",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "--5",
      "name": "アイテムループ処理",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        400,
        -660
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "Mistral-Cloud-Chat-Model-6",
      "name": "Mistral Cloud Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatMistralCloud",
      "position": [
        980,
        -300
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "mistralCloudApi": {
          "id": "",
          "name": "Mistral Cloud account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "--7",
      "name": "何もしない",
      "type": "n8n-nodes-base.noOp",
      "position": [
        900,
        -680
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "Airtable-8",
      "name": "Airtable",
      "type": "n8n-nodes-base.airtable",
      "position": [
        1460,
        -320
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultUrl": "https://airtable.com/[YOUR_DB]",
          "cachedResultName": "YTB Trend Finder"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultUrl": "https://airtable.com/[YOUR_DB]",
          "cachedResultName": "Listing"
        },
        "columns": {
          "value": {
            "Link": "={{ $('Loop Over Items').item.json.url }}",
            "Title": "={{ $('Loop Over Items').item.json.title }}",
            "Duration": "={{ $('Loop Over Items').item.json.duration }}",
            "Structure": "={{ $json.text }}",
            "SubsCount": "={{ $('Loop Over Items').item.json.numberOfSubscribers }}",
            "Thumbnail": "={{ [{ \"url\": $('Loop Over Items').item.json.thumbnailUrl }] }}",
            "ViewsCount": "={{ $('Loop Over Items').item.json.viewCount }}",
            "ChannelName": "={{ $('Loop Over Items').item.json.channelName }}",
            "CommentsCount": "={{ $('Loop Over Items').item.json.commentsCount }}"
          },
          "schema": [
            {
              "id": "Link",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Link",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Title",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "ChannelName",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "ChannelName",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Thumbnail",
              "type": "array",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Thumbnail",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "ViewsCount",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "ViewsCount",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "SubsCount",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "SubsCount",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "CommentsCount",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "CommentsCount",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Duration",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Duration",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Structure",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Structure",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "VSC Ratio",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": true,
              "required": false,
              "displayName": "VSC Ratio",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "create"
      },
      "credentials": {
        "airtableTokenApi": {
          "id": "",
          "name": "Airtable Personal Access Token account"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "--9",
      "name": "スケジュールトリガー",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -1220,
        -640
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtDay": [
                1
              ]
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "-2-10",
      "name": "付箋2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1300,
        -900
      ],
      "parameters": {
        "color": 7,
        "width": 780,
        "height": 440,
        "content": "## SETUP\n\n**Scheduled Trigger :** Select the Frequency you want. If you change it, update the data accordingly in the \"Create Videos Dataset\" HTTP Request Node in Body ➡️ JSON ➡️ dateFilter.\n\n\n**Setup Keywords :** Enter Keyword Related to the niche you want. If you change the number of keywords, update the data accordingly in the \"Create Videos Dataset\" HTTP Request Node in Body ➡️ JSON ➡️ searchQueries.\n\n**Create Videos Dataset :** Refer to the Apify Documentation for more https://docs.apify.com/api/v2/getting-started\n\n**APIs :** For all HTTP Request node in the URL field, replace [YOUR_API_TOKEN] with your API Token. "
      },
      "typeVersion": 1
    },
    {
      "id": "--11",
      "name": "テキストクリーニング",
      "type": "n8n-nodes-base.code",
      "position": [
        700,
        -500
      ],
      "parameters": {
        "jsCode": "// Assume input is a single string like SRT format\nconst input = $input.first().json.subtitles[0].srt; // or wherever your caption string is\n\n// Step-by-step cleanup\nconst cleaned = input\n  // Remove caption numbers (lines with only digits)\n  .replace(/^\\d+\\s*$/gm, \"\")\n  // Remove timing lines\n  .replace(/^\\d{2}:\\d{2}:\\d{1,2},\\d{1,3} --> \\d{2}:\\d{2}:\\d{1,2},\\d{1,3}\\s*$/gm, \"\")\n  // Remove leftover newlines\n  .replace(/\\n{2,}/g, \"\\n\")\n  // Trim and flatten everything to single paragraph\n  .replace(/\\n/g, \" \")\n  .trim();\n\nreturn [{ cleanedText: cleaned }];"
      },
      "typeVersion": 2
    },
    {
      "id": "--12",
      "name": "テキスト統合",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        960,
        -500
      ],
      "parameters": {
        "text": "={{ $json.cleanedText }}",
        "messages": {
          "messageValues": [
            {
              "type": "HumanMessagePromptTemplate",
              "message": "=You are a summarization assistant.  Given a transcript of a YouTube video, your task is to summarize the content using only information found in the transcript, do not invent, infer, or add anything beyond what is said.  Structure your output as follows: \n\n1. Intro how the video begins or introduces the topic.  Don't do any modification on this part. \n\n2. Structure of the Video A breakdown of the video’s flow using bullet points: \nMajor Points: The main topics or arguments discussed.  \nSubpoints: Supporting details, examples, or smaller elements related to each major point. Use indentation or clear labeling to distinguish between major points and their related subpoints. \n"
            }
          ]
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 1.5
    },
    {
      "id": "--13",
      "name": "キーワード設定",
      "type": "n8n-nodes-base.set",
      "position": [
        -960,
        -640
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "",
              "name": "keyword1",
              "type": "string",
              "value": "Healthy food"
            },
            {
              "id": "",
              "name": "keyword2",
              "type": "string",
              "value": "Meal prep healthy"
            },
            {
              "id": "",
              "name": "keyword3",
              "type": "string",
              "value": "High Protein Snack"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "--14",
      "name": "付箋",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1300,
        -1140
      ],
      "parameters": {
        "color": 7,
        "width": 780,
        "height": 220,
        "content": "## How this is Working ?\n**1 -** Every Week retrieve Keywords you want to track\n**2 -** Thanks to Apify, scrap video from Youtube Search related to these Keywords filtered by relevance\n**3 -** Wait until the Dataset is completed\n**4 -** Get the Information contained in the Dataset\n**5 -** For each Video, clean and summarize the script\n**6 -** Upload everything in your Airtable Database\n\n**Youtube Video Tutorial : https://youtu.be/pH2hVaij3FY**\n**Need Help with Your Workflows ? https://tally.so/r/wayeqB**"
      },
      "typeVersion": 1
    },
    {
      "id": "-1-15",
      "name": "付箋1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1360,
        -700
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 620,
        "content": "## Airtable DB Fields\n**1 -** Video Link (ID)\n**2 -** Video Title\n**3 -** Channel Name\n**4 -** Thumbnail ⬇️\nTo Upload an Image on Airtable Attachement Field you need an Array of the URL in this format : {{ [{ \"url\": $json.thumbnail}] }}\n**5 -** Views Count\n**6 -** Subs Count\n**7 -** Comments Count\n**8 -** Duration\n**9 -** Structure\n**10 -** VSC Ratio ⬇️\nFormula :(ViewsCount/SubsCount)*0.7 + (CommentsCount/ViewsCount)*0.3)\n"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "",
  "connections": {
    "--1": {
      "main": [
        [
          {
            "node": "--3",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "--0",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "--0": {
      "main": [
        [
          {
            "node": "--2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Airtable-8": {
      "main": [
        [
          {
            "node": "--5",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "--11": {
      "main": [
        [
          {
            "node": "--12",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "--13": {
      "main": [
        [
          {
            "node": "--4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "--3": {
      "main": [
        [
          {
            "node": "--5",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "--5": {
      "main": [
        [
          {
            "node": "--7",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "--11",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "--12": {
      "main": [
        [
          {
            "node": "Airtable-8",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "--9": {
      "main": [
        [
          {
            "node": "--13",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "--2": {
      "main": [
        [
          {
            "node": "--1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "--4": {
      "main": [
        [
          {
            "node": "--2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Mistral-Cloud-Chat-Model-6": {
      "ai_languageModel": [
        [
          {
            "node": "--12",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    }
  }
}
よくある質問

このワークフローの使い方は?

上記のJSON設定コードをコピーし、n8nインスタンスで新しいワークフローを作成して「JSONからインポート」を選択、設定を貼り付けて認証情報を必要に応じて変更してください。

このワークフローはどんな場面に適していますか?

上級

有料ですか?

このワークフローは完全無料です。ただし、ワークフローで使用するサードパーティサービス(OpenAI APIなど)は別途料金が発生する場合があります。

ワークフロー情報
難易度
上級
ノード数16
カテゴリー-
ノードタイプ12
難易度説明

上級者向け、16ノード以上の複雑なワークフロー

作成者
Nasser

Nasser

@nasser

Data Engineer, now automating processes mostly with n8n, Make and code

外部リンク
n8n.ioで表示

このワークフローを共有

カテゴリー

カテゴリー: 34