استخراج لحظات جذاب یوتیوب با API در n8n

استخراج لحظات جذاب یوتیوب با API در n8n

10 دقیقه مطالعه · منتشر شده ۱۴۰۵/۴/۲۷

دانلود workflow

فایل JSON آماده import در n8n — credentialها باید در n8n شما تنظیم شوند.

  1. فایل JSON را دانلود کنید.
  2. در n8n: Workflows → Import from File.
  3. Credentialهای هر node را متصل کنید.
  4. workflow را فعال کنید.

شناسه workflow: 2152 · منبع: کاتالوگ Axeto

استخراج لحظات جذاب ویدیوهای یوتیوب از طریق API

این گردش کار یک نقطه پایانی API را فراهم می‌کند که لحظات بالقوه جذاب را از ویدیوهای یوتیوب استخراج می‌کند. این گردش کار از داده‌های غیررسمی "بیشترین بازپخش" (most replayed) برای شناسایی مُهر زمانی (timestamps) با امتیاز شدت بالا استفاده می‌کند و آن را برای تجزیه و تحلیل محتوا و بازاریابی مفید می‌سازد.

دسته‌بندی‌ها: بازاریابی، تجزیه و تحلیل محتوا

کاتالوگ Axeto.ai: https://axeto.ai/n8n

نمای کلی گردش کار

این گردش کار از طریق یک وب‌هوک (Webhook) فعال می‌شود و شناسه ویدیوی یوتیوب را دریافت می‌کند. سپس با یک API غیررسمی یوتیوب برای نشانگرهای شدت پخش مجدد (replay intensity) پرس‌وجو می‌کند. داده‌ها برای فیلتر کردن لحظات با شدت بالا، تبدیل مُهر زمانی (timestamps) و حذف رویدادهای نزدیک به هم پردازش می‌شوند. در نهایت، این لحظات را در قالب پیام‌های قابل فهم برای انسان با لینک‌های مستقیم یوتیوب فرمت کرده و به عنوان یک پاسخ JSON برمی‌گرداند.

مراحل کلیدی:

1. دریافت ورودی: درخواست‌های HTTP ورودی با شناسه ویدیوی یوتیوب را می‌پذیرد.

2. بازیابی داده: داده‌های "بیشترین بازپخش" (most replayed) را از یک API غیررسمی یوتیوب دریافت می‌کند.

3. اعتبارسنجی داده: بررسی می‌کند که آیا داده‌های شدت در پاسخ API موجود هستند یا خیر.

4. فیلتر کردن لحظات: لحظات جذاب را بر اساس شدت و نزدیکی زمانی استخراج، فیلتر و اصلاح می‌کند.

5. قالب‌بندی پاسخ: توضیحات قابل فهم برای انسان را ایجاد کرده و نتایج را تجمیع می‌کند.

6. پاسخ API: یک payload JSON حاوی لحظات جذاب شناسایی شده یا یک پیام خطا را برمی‌گرداند.

تشریح گام به گام نودها

۱. دریافت و اعتبارسنجی ورودی

این بخش درخواست ورودی اولیه را مدیریت کرده و شناسه ویدیوی یوتیوب مورد نیاز را استخراج می‌کند.

  • نودها:

* Webhook (Trigger)

* Set (متغیرهای ورودی)

  • جزئیات:

* Webhook:

* نوع: HTTP Webhook Trigger

* پیکربندی:

* مسیر (Path): youtube-engaging-moments-extractor

* حالت پاسخ (Response Mode): Use Response Node (پاسخ با تأخیر)

* می‌پذیرد: درخواست‌های GET با پارامتر کوئری ytID.

* ورودی/خروجی: درخواست‌های HTTP خارجی را دریافت می‌کند؛ داده‌ها را به نود Set خروجی می‌دهد.

* موارد مرزی (Edge Cases): پارامتر ytID ناموجود یا بدشکل می‌تواند منجر به خطا در نودهای بعدی شود.

* Set (متغیرهای ورودی):

* نوع: Set Node

* پیکربندی: یک متغیر به نام youtubeVideoID با استخراج ytID از پارامترهای کوئری وب‌هوک ایجاد می‌کند.

* عبارت (Expression): ={{ $json.query.ytID }}

* ورودی/خروجی: داده‌ها را از Webhook دریافت می‌کند؛ به نود HTTP Request خروجی می‌دهد.

* موارد مرزی (Edge Cases): اگر ytID ارائه نشود، متغیر youtubeVideoID تعریف نشده خواهد بود و باعث ایجاد URL نامعتبر برای درخواست HTTP می‌شود.

۲. بازیابی داده از API غیررسمی یوتیوب

این مرحله داده‌های خام مربوط به بازپخش‌های ویدیو را واکشی می‌کند.

  • نودها:

* HTTP Request

  • جزئیات:

* HTTP Request:

* نوع: HTTP Request Node

* پیکربندی:

* متد (Method): GET

* آدرس URL: https://yt.lemnoslife.com/videos?part=mostReplayed&id={{ $json.youtubeVideoID }}

* ورودی/خروجی: youtubeVideoID را از نود Set دریافت می‌کند؛ پاسخ API را به نود If خروجی می‌دهد.

* موارد مرزی (Edge Cases):

* API غیررسمی ممکن است در دسترس نباشد یا با محدودیت نرخ (rate limiting) مواجه شود.

* شناسه ویدیوی یوتیوب نامعتبر ممکن است منجر به عدم بازگشت هیچ داده‌ای شود.

* این API غیررسمی است و ممکن است محدودیت‌های استفاده داشته باشد یا بدون اطلاع قبلی تغییر کند.

۳. اعتبارسنجی داده شدت (Intensity Data)

این بخش بررسی می‌کند که آیا داده‌های بازیابی شده حاوی اطلاعات مورد انتظار "پربازدیدترین" (most replayed) هستند یا خیر.

  • نودها:

* If (آیا داده شدت وجود دارد؟)

* NoOp (داده شدت برای ویدیو موجود نیست)

* RespondToWebhook (پاسخ با "نتیجه‌ای یافت نشد")

  • جزئیات:

* If (آیا داده شدت وجود دارد؟):

* نوع: If Node

* پیکربندی: وجود فیلد items[0].mostReplayed را در پاسخ API بررسی می‌کند.

* ورودی/خروجی: داده‌ها را از HTTP Request دریافت می‌کند؛ به SplitOut (اگر شرط درست باشد) یا NoOp (اگر شرط نادرست باشد) منشعب می‌شود.

* موارد مرزی (Edge Cases): تغییرات در ساختار پاسخ API می‌تواند باعث شود این شرط به اشتباه ناموفق باشد.

* NoOp (داده شدت برای ویدیو موجود نیست):

* نوع: NoOp Node (نگهدارنده موقت)

* پیکربندی: هیچ عملیاتی انجام نمی‌دهد؛ به عنوان هدف برای شاخه نادرست نود If عمل می‌کند.

* ورودی/خروجی: داده‌ها را از نود If (شاخه نادرست) دریافت می‌کند؛ به RespondToWebhook (پاسخ با "نتیجه‌ای یافت نشد") خروجی می‌دهد.

* RespondToWebhook (پاسخ با "نتیجه‌ای یافت نشد"):

* نوع: Respond to Webhook Node

* پیکربندی: یک پاسخ JSON ارسال می‌کند که نشان می‌دهد هیچ داده‌ای یافت نشده است.

* JSON: {"engagingMoments": null, "youtubeID": "{{ $('Webhook').item.json.query.ytID }}"}

* ورودی/خروجی: داده‌ها را از نود NoOp دریافت می‌کند؛ پاسخ HTTP را به کلاینت ارسال می‌کند.

۴. استخراج و فیلتر داده

این مرحله پردازش اصلی است که در آن لحظات مرتبط شناسایی و پالایش می‌شوند.

  • نودها:

* SplitOut

* Filter (شدت > ۰.۶)

* Set (میلی‌ثانیه به ثانیه)

* Filter (حذف لحظات نزدیک به هم)

  • جزئیات:

* SplitOut:

* نوع: SplitOut Node

* پیکربندی: آرایه items[0].mostReplayed.markers را تقسیم می‌کند و برای هر نشانگر (marker) یک آیتم جداگانه ایجاد می‌کند.

* ورودی/خروجی: داده‌ها را از نود If (شاخه درست) دریافت می‌کند؛ به نود Filter (شدت > ۰.۶) خروجی می‌دهد.

* موارد مرزی (Edge Cases): آرایه نشانگر خالی یا بدشکل منجر به عدم تولید آیتم خروجی می‌شود.

* Filter (شدت > ۰.۶):

* نوع: Filter Node

* پیکربندی: نشانگرهایی را که intensityScoreNormalized آن‌ها بزرگتر از ۰.۶ نیست، فیلتر می‌کند.

* عبارت (Expression): $json.intensityScoreNormalized > 0.6

* ورودی/خروجی: داده‌ها را از SplitOut دریافت می‌کند؛ به نود Set (میلی‌ثانیه به ثانیه) خروجی می‌دهد.

* موارد مرزی (Edge Cases): نشانگرهایی که فیلد intensityScoreNormalized را ندارند، حذف خواهند شد.

* Set (میلی‌ثانیه به ثانیه):

* نوع: Set Node

* پیکربندی: مُهر زمانی startMillis را با تقسیم بر ۱۰۰۰ به ثانیه (startSec) تبدیل کرده و فیلد اصلی startMillis را حذف می‌کند.

* عبارت (Expression): ={{ $json.startMillis / 1000 }}

* ورودی/خروجی: نشانگرهای فیلتر شده را دریافت می‌کند؛ به نود Filter (حذف لحظات نزدیک به هم) خروجی می‌دهد.

* موارد مرزی (Edge Cases): مقادیر startMillis ناموجود یا صفر می‌تواند بر محاسبات بعدی تأثیر بگذارد.

* Filter (حذف لحظات نزدیک به هم):

* نوع: Filter Node

* پیکربندی: لحظاتی را که در فاصله ۲۰ ثانیه‌ای از لحظه شناسایی شده بعدی رخ می‌دهند، حذف می‌کند. این کار بخش‌های جذاب متمایز را تضمین می‌کند.

* عبارت (Expression): $input.all()[itemIndex + 1].json.startSec > ($json.startSec + 20)

* ورودی/خروجی: نشانگرهای تبدیل شده به مُهر زمانی را دریافت می‌کند؛ به نود Set (ایجاد هر لحظه) خروجی می‌دهد.

* موارد مرزی (Edge Cases): آخرین آیتم در لیست هیچ آیتم بعدی برای مقایسه ندارد. فرض می‌شود ورودی بر اساس startSec مرتب شده است.

۵. قالب‌بندی و تجمیع لحظات

این مرحله با ایجاد توضیحات کاربرپسند و تجمیع نتایج، خروجی نهایی را آماده می‌کند.

  • نودها:

* Set (ایجاد هر لحظه (قابل خواندن برای انسان))

* Aggregate

  • جزئیات:

* Set (ایجاد هر لحظه (قابل خواندن برای انسان)):

* نوع: Set Node

* پیکربندی: یک پیام قابل خواندن برای انسان و یک لینک مستقیم یوتیوب برای هر لحظه جذاب ایجاد می‌کند.

* humanReadableMessage: رشته قالب‌بندی شده شامل شماره لحظه و URL یوتیوب با مُهر زمانی ۳ ثانیه قبل از شروع لحظه.

* startSec: ثانیه شروع گرد شده لحظه.

* directYTURL: لینک مستقیم یوتیوب به لحظه.

* ورودی/خروجی: لحظات فیلتر شده را دریافت می‌کند؛ به نود Aggregate خروجی می‌دهد.

* موارد مرزی (Edge Cases): اگر startSec کمتر از ۳ باشد، مُهر زمانی در URL ممکن است منفی باشد.

* Aggregate:

* نوع: Aggregate Node

* پیکربندی: تمام اشیاء لحظه قالب‌بندی شده را در یک آرایه JSON واحد به نام engagingMoments ترکیب می‌کند.

* ورودی/خروجی: لحظات قالب‌بندی شده را دریافت می‌کند؛ به نود Set (آماده‌سازی پاسخ) خروجی می‌دهد.

* موارد مرزی (Edge Cases): ورودی خالی منجر به آرایه engagingMoments خالی می‌شود.

۶. مدیریت پاسخ

مرحله نهایی داده‌های پردازش شده را به فراخواننده ارسال می‌کند.

  • نودها:

* Set (آماده‌سازی پاسخ)

* RespondToWebhook (پاسخ با لحظات)

  • جزئیات:

* Set (آماده‌سازی پاسخ):

* نوع: Set Node

* پیکربندی: youtubeID اصلی (که از درخواست وب‌هوک اولیه بازیابی شده است) را به شیء نتایج تجمیع شده اضافه می‌کند.

* ورودی/خروجی: لحظات تجمیع شده را دریافت می‌کند؛ به نود RespondToWebhook خروجی می‌دهد.

* موارد مرزی (Edge Cases): اگر youtubeID در مرحله اول به درستی ثبت نشده باشد، این فیلد خالی خواهد بود.

* RespondToWebhook (پاسخ با لحظات):

* نوع: Respond to Webhook Node

* پیکربندی: پاسخ نهایی JSON حاوی engagingMoments و youtubeID را به کلاینت ارسال می‌کند.

* ورودی/خروجی: شیء پاسخ آماده شده را دریافت می‌کند؛ پاسخ HTTP را ارسال می‌کند.

جدول خلاصه

نام گره (Node Name)نوع گره (Node Type)نقش (Role)گره(های) ورودی (Input Node(s))گره(های) خروجی (Output Node(s))توضیحات (Notes)
WebhookWebhookدریافت درخواست‌های HTTP با شناسه ویدیوی یوتیوب-Set (Input variables)مسیر: youtube-engaging-moments-extractor
Set (Input variables)Setاستخراج ytID به متغیر youtubeVideoIDWebhookHTTP Request
HTTP RequestHTTP Requestدریافت داده‌های شدت بازپخش از API غیررسمیSet (Input variables)If (has intensity data?)استفاده از https://yt.lemnoslife.com/videos?part=mostReplayed&id={{ $json.youtubeVideoID }}
If (has intensity data?)Ifبررسی وجود داده‌های mostReplayedHTTP RequestSplitOut (true), NoOp (false)
NoOp (No intensity data available...)NoOpجایگزین برای شاخه عدم وجود دادهIf (has intensity data?)RespondToWebhook (Respond with "no results")
RespondToWebhook (Respond with "no...")RespondToWebhookارسال پاسخ JSON در صورت عدم وجود داده شدتNoOp (No intensity data available...)-JSON: {"engagingMoments": null, "youtubeID": "{{ $('Webhook').item.json.query.ytID }}"}
SplitOutSplitOutتقسیم آرایه نشانگرها به آیتم‌های مجزاIf (has intensity data?)Filter (intensity > 0.6)
Filter (intensity > 0.6)Filterفیلتر کردن لحظات بر اساس intensityScoreNormalizedSplitOutSet (millisecs to seconds)آستانه: $json.intensityScoreNormalized > 0.6
Set (millisecs to seconds)Setتبدیل startMillis به startSecFilter (intensity > 0.6)Filter (Filter out moments close to each other)={{ $json.startMillis / 1000 }}
Filter (Filter out moments close...)Filterحذف لحظات نزدیک به همSet (millisecs to seconds)Set (Create each moment)حداقل فاصله: $input.all()[itemIndex + 1].json.startSec > ($json.startSec + 20)
Set (Create each moment...)Setقالب‌بندی لحظات به پیام‌ها/لینک‌های قابل فهم برای انسانFilter (Filter out moments close to each other)Aggregateشامل humanReadableMessage و directYTURL
AggregateAggregateترکیب لحظات قالب‌بندی شده در یک آرایهSet (Create each moment...)Set (prepare response)ایجاد آرایه engagingMoments
Set (prepare response)Setافزودن youtubeID به شیء پاسخ نهاییAggregateRespondToWebhook (Respond with moments)
RespondToWebhook (Respond with moments)RespondToWebhookارسال پاسخ نهایی JSON به کلاینتSet (prepare response)-JSON: {"engagingMoments": {{ $json.engagingMoments }}, "youtubeID": "{{ $json.youtubeID }}"}

Nodeهای استفاده‌شده

سوالات متداول

این گردش کار n8n چگونه لحظات جذاب یوتیوب را شناسایی می‌کند؟

این گردش کار با استفاده از یک API غیررسمی یوتیوب، داده‌های "بیشترین بازپخش" (most replayed) را واکشی می‌کند. این داده‌ها نشان‌دهنده نقاطی در ویدیو هستند که بینندگان بیشتر تمایل به بازپخش آن‌ها دارند، که نشان‌دهنده جذابیت بیشتر آن لحظات است.

چه نوع داده‌هایی توسط این API استخراج می‌شود؟

این گردش کار مُهر زمانی (timestamps) لحظات با شدت بالای بازپخش را استخراج می‌کند. سپس این لحظات را پردازش کرده و به صورت پیام‌های قابل فهم برای انسان همراه با لینک مستقیم به آن بخش از ویدیو در یوتیوب ارائه می‌دهد.

آیا استفاده از این API غیررسمی یوتیوب امن است؟

API مورد استفاده در این گردش کار غیررسمی است و ممکن است بدون اطلاع قبلی تغییر کند یا محدودیت‌هایی داشته باشد. توصیه می‌شود در محیط‌های تولیدی با احتیاط از آن استفاده کرده و در صورت امکان، جایگزین‌های رسمی را در نظر بگیرید.

کاربرد این گردش کار در بازاریابی چیست؟

این گردش کار به بازاریابان کمک می‌کند تا بفهمند کدام بخش از ویدیوهایشان بیشترین توجه را جلب می‌کند. این اطلاعات برای بهینه‌سازی محتوا، شناسایی نقاط قوت و ضعف، و بهبود استراتژی‌های تبلیغاتی و تولید محتوای آینده بسیار ارزشمند است.

workflowهای مرتبط

این workflow در کاتالوگ Axeto.ai بایگانی شده است. لایسنس اصلی متعلق به سازنده workflow است.