
استخراج لحظات جذاب یوتیوب با API در n8n
10 دقیقه مطالعه · منتشر شده ۱۴۰۵/۴/۲۷
دانلود workflow
فایل JSON آماده import در n8n — credentialها باید در n8n شما تنظیم شوند.
- فایل JSON را دانلود کنید.
- در n8n: Workflows → Import from File.
- Credentialهای هر node را متصل کنید.
- 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) |
|---|---|---|---|---|---|
Webhook | Webhook | دریافت درخواستهای HTTP با شناسه ویدیوی یوتیوب | - | Set (Input variables) | مسیر: youtube-engaging-moments-extractor |
Set (Input variables) | Set | استخراج ytID به متغیر youtubeVideoID | Webhook | HTTP Request | |
HTTP Request | HTTP Request | دریافت دادههای شدت بازپخش از API غیررسمی | Set (Input variables) | If (has intensity data?) | استفاده از https://yt.lemnoslife.com/videos?part=mostReplayed&id={{ $json.youtubeVideoID }} |
If (has intensity data?) | If | بررسی وجود دادههای mostReplayed | HTTP Request | SplitOut (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 }}"} |
SplitOut | SplitOut | تقسیم آرایه نشانگرها به آیتمهای مجزا | If (has intensity data?) | Filter (intensity > 0.6) | |
Filter (intensity > 0.6) | Filter | فیلتر کردن لحظات بر اساس intensityScoreNormalized | SplitOut | Set (millisecs to seconds) | آستانه: $json.intensityScoreNormalized > 0.6 |
Set (millisecs to seconds) | Set | تبدیل startMillis به startSec | Filter (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 |
Aggregate | Aggregate | ترکیب لحظات قالببندی شده در یک آرایه | Set (Create each moment...) | Set (prepare response) | ایجاد آرایه engagingMoments |
Set (prepare response) | Set | افزودن youtubeID به شیء پاسخ نهایی | Aggregate | RespondToWebhook (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های مرتبط
- پرسش از هوش مصنوعی درباره تبلیغات متا: بینش فوری از دادههای…AI
- تحلیل پیام تلگرام با هوش مصنوعی و ارسال اعلان خودکارAI
- تحلیل استارتاپهای Crunchbase با Bright Data و Gemini AIAI
- تحلیل تبلیغات ویدیویی متا با Gemini و Google SheetsAI
- تحلیلگر صفحه فرود با OpenAI: افزایش نرخ تبدیلAI
- تحلیل هوشمند تبلیغات رقبا در فیسبوک با گزارشدهی خودکارAI
