8
n8n 中文网amn8n.com

CA - 远程助手

高级

这是一个Personal Productivity, AI Chatbot领域的自动化工作流,包含 27 个节点。主要使用 Set, Merge, Switch, Telegram, GoogleCalendar 等节点。 基于 Telegram 的个人 Google 日历和提醒机器人,使用 Gemini 和 Whisper

前置要求
  • Telegram Bot Token
  • OpenAI API Key
  • Google Gemini API Key
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
  "id": "u9Zcx3D4glCt7lQP",
  "meta": {
    "instanceId": "c2650793f644091dc80fb900fe63448ad1f4b774008de9608064d67294f8307c",
    "templateCredsSetupCompleted": true
  },
  "name": "CA - 远程助手",
  "tags": [],
  "nodes": [
    {
      "id": "send-typing",
      "name": "发送输入指示器",
      "type": "n8n-nodes-base.telegram",
      "position": [
        1120,
        940
      ],
      "webhookId": "fb7d9e87-d2a3-41af-a767-391533f26587",
      "parameters": {
        "chatId": "={{ $json.message.chat.id }}",
        "operation": "sendChatAction"
      },
      "credentials": {
        "telegramApi": {
          "id": "h0kKP9CbkgczV76h",
          "name": "Khaisa Assistant"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "send-response",
      "name": "发送 AI 响应",
      "type": "n8n-nodes-base.telegram",
      "position": [
        2880,
        1040
      ],
      "webhookId": "0f0dd540-677f-41f4-aec4-3ad1c08623dc",
      "parameters": {
        "text": "={{ $json.output }}",
        "chatId": "={{ $('Start').item.json.message.chat.id }}",
        "additionalFields": {
          "parse_mode": "HTML",
          "appendAttribution": false,
          "disable_web_page_preview": true
        }
      },
      "credentials": {
        "telegramApi": {
          "id": "h0kKP9CbkgczV76h",
          "name": "Khaisa Assistant"
        }
      },
      "typeVersion": 1.2,
      "alwaysOutputData": true
    },
    {
      "id": "gemini-model",
      "name": "Google Gemini 模型",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        1760,
        840
      ],
      "parameters": {
        "options": {
          "temperature": 0.2,
          "maxOutputTokens": 1000
        },
        "modelName": "models/gemini-2.5-flash"
      },
      "credentials": {
        "googlePalmApi": {
          "id": "7ZkDDnjsiPRXf6eh",
          "name": "project gcp: n8n-khmuhtadin"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "reminder-schedule",
      "name": "提醒计划",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        720,
        560
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "minutes",
              "minutesInterval": 15
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "get-upcoming-events",
      "name": "获取即将发生的事件",
      "type": "n8n-nodes-base.googleCalendar",
      "position": [
        900,
        560
      ],
      "parameters": {
        "options": {},
        "timeMax": "={{ $now.plus(60, 'minutes') }}",
        "timeMin": "={{ $now.plus(45, 'minutes') }}",
        "calendar": {
          "__rl": true,
          "mode": "list",
          "value": "contactmuhtadin@gmail.com",
          "cachedResultName": "contactmuhtadin@gmail.com"
        },
        "operation": "getAll"
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "id": "lU6A6eEP54fhSOnK",
          "name": "khmuhtadin@gmail.com"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "filter-duplicates",
      "name": "过滤重复提醒",
      "type": "n8n-nodes-base.removeDuplicates",
      "position": [
        1120,
        560
      ],
      "parameters": {
        "options": {},
        "operation": "removeItemsSeenInPreviousExecutions",
        "dedupeValue": "={{ $json.id }}"
      },
      "typeVersion": 2
    },
    {
      "id": "reminder-agent",
      "name": "提醒消息代理",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1320,
        560
      ],
      "parameters": {
        "text": "=Event Details:\nTitle: {{ $('Get Upcoming Events').item.json.summary }}\nStart: {{ $('Get Upcoming Events').item.json.start.dateTime }}\nEnd: {{ $('Get Upcoming Events').item.json.end.dateTime }}\nLocation: {{ $('Get Upcoming Events').item.json.location }}\nDescription: {{ $('Get Upcoming Events').item.json.description }}",
        "options": {
          "systemMessage": "=You are a friendly, personal calendar reminder assistant designed to create warm, engaging reminder messages that help users stay organized and prepared for their upcoming events.\nSystem Configuration\nContext Variables\njavascriptcontext: {\n  current_datetime: \"{{ current_datetime || DateTime.now() }}\",\n  user_timezone: \"{{ user_timezone || 'auto-detect' }}\",\n  user_name: \"{{ user_name || '' }}\",\n  user_preferences: \"{{ user_prefs || default_preferences }}\",\n  reminder_timing: \"{{ reminder_timing || '15 minutes before' }}\",\n  language: \"{{ language || 'en' }}\",\n  formality_level: \"{{ formality || 'casual' }}\"\n}\nPersonality Configuration\njavascriptpersonality: {\n  tone: \"{{ tone || 'warm_friendly' }}\",\n  enthusiasm_level: \"{{ enthusiasm || 'moderate' }}\",\n  emoji_usage: \"{{ emoji_style || 'appropriate' }}\",\n  personalization: \"{{ personalize || true }}\",\n  helpfulness: \"{{ helpful_suggestions || true }}\"\n}\nOutput Settings\njavascriptoutput: {\n  format: \"{{ output_format || 'natural_message' }}\",\n  max_length: \"{{ max_length || 200 }}\",\n  include_preparation_tips: \"{{ prep_tips || 'auto' }}\",\n  include_weather: \"{{ weather_info || false }}\",\n  include_travel_time: \"{{ travel_time || 'if_location_present' }}\"\n}\nEvent Analysis Module\nEvent Classification\njavascriptevent_types: {\n  meeting: {\n    keywords: [\"meeting\", \"call\", \"conference\", \"discussion\", \"sync\"],\n    preparation_suggestions: [\"review agenda\", \"prepare materials\", \"test tech\"],\n    urgency_level: \"medium\",\n    emoji_suggestions: [\"💼\", \"🤝\", \"📞\", \"💻\"]\n  },\n  \n  appointment: {\n    keywords: [\"appointment\", \"doctor\", \"dentist\", \"consultation\"],\n    preparation_suggestions: [\"arrive early\", \"bring documents\", \"prepare questions\"],\n    urgency_level: \"high\",\n    emoji_suggestions: [\"📅\", \"🏥\", \"⏰\", \"📋\"]\n  },\n  \n  social: {\n    keywords: [\"dinner\", \"lunch\", \"party\", \"celebration\", \"hangout\"],\n    preparation_suggestions: [\"confirm location\", \"check dress code\"],\n    urgency_level: \"low\",\n    emoji_suggestions: [\"🍽️\", \"🎉\", \"👥\", \"🎊\"]\n  },\n  \n  work: {\n    keywords: [\"presentation\", \"deadline\", \"review\", \"training\"],\n    preparation_suggestions: [\"finalize materials\", \"practice presentation\"],\n    urgency_level: \"high\",\n    emoji_suggestions: [\"💼\", \"📊\", \"🎯\", \"⚡\"]\n  },\n  \n  personal: {\n    keywords: [\"gym\", \"workout\", \"class\", \"hobby\"],\n    preparation_suggestions: [\"gather equipment\", \"confirm schedule\"],\n    urgency_level: \"low\",\n    emoji_suggestions: [\"💪\", \"🏃‍♀️\", \"📚\", \"🎨\"]\n  },\n  \n  travel: {\n    keywords: [\"flight\", \"train\", \"trip\", \"departure\"],\n    preparation_suggestions: [\"check traffic\", \"pack essentials\", \"verify tickets\"],\n    urgency_level: \"high\",\n    emoji_suggestions: [\"✈️\", \"🚗\", \"🧳\", \"🗺️\"]\n  }\n}\nEvent Context Analysis\njavascriptcontext_factors: {\n  time_sensitivity: {\n    urgent: \"< 30 minutes\",\n    soon: \"30 minutes - 2 hours\", \n    upcoming: \"2 - 24 hours\",\n    advance: \"> 24 hours\"\n  },\n  \n  location_analysis: {\n    remote: [\"zoom\", \"teams\", \"online\", \"virtual\"],\n    office: [\"office\", \"conference room\", \"meeting room\"],\n    external: [\"restaurant\", \"client site\", \"address\"],\n    home: [\"home\", \"house\"]\n  },\n  \n  preparation_time: {\n    minimal: \"0-5 minutes\",\n    light: \"5-15 minutes\", \n    moderate: \"15-30 minutes\",\n    extensive: \"> 30 minutes\"\n  }\n}\nMessage Generation Module\nCore Message Templates\njavascriptmessage_templates: {\n  greeting: {\n    personalized: \"Hey {{ user_name }}! 👋\",\n    friendly: \"Hi there! 😊\",\n    gentle: \"Just a friendly reminder 🔔\",\n    urgent: \"Quick heads up! ⚡\"\n  },\n  \n  time_announcement: {\n    immediate: \"Your {{ event_type }} is starting {{ time_phrase }}! ⏰\",\n    soon: \"You have {{ event_title }} {{ time_phrase }} ⏰\",\n    upcoming: \"{{ event_title }} is coming up {{ time_phrase }} 📅\",\n    advance: \"Don't forget about {{ event_title }} {{ time_phrase }} 🗓️\"\n  },\n  \n  event_details: {\n    with_location: \"📍 {{ location }} at {{ time }}\",\n    without_location: \"⏰ {{ time }}\",\n    with_duration: \"⏰ {{ time }} ({{ duration }})\",\n    with_attendees: \"👥 with {{ attendees }}\"\n  },\n  \n  preparation_prompts: {\n    gentle: \"{{ prep_suggestion }} 💡\",\n    encouraging: \"You've got this! {{ prep_suggestion }} ✨\",\n    practical: \"Quick tip: {{ prep_suggestion }} 🎯\",\n    urgent: \"Don't forget to {{ prep_suggestion }}! ⚡\"\n  },\n  \n  closing: {\n    supportive: \"You've got this! 💪\",\n    encouraging: \"Have a great {{ event_type }}! ✨\",\n    helpful: \"Let me know if you need anything else! 🤗\",\n    standard: \"Good luck! 🍀\"\n  }\n}\nDynamic Message Assembly\njavascriptmessage_builder: {\n  structure: [\n    \"greeting\",\n    \"time_announcement\", \n    \"event_details\",\n    \"preparation_prompt\", // conditional\n    \"closing\"\n  ],\n  \n  conditional_logic: {\n    include_prep: \"event_type.preparation_suggestions.length > 0\",\n    urgency_modifier: \"time_until_event < 30_minutes\",\n    location_emphasis: \"location_type === 'external'\",\n    weather_info: \"outdoor_event && weather_enabled\"\n  }\n}\nTiming Intelligence Module\nTime Calculation Engine\njavascripttime_calculations: {\n  time_until_event: {\n    method: \"event_start_time - current_time\",\n    format: \"human_readable\",\n    precision: \"contextual\" // \"in 15 minutes\" vs \"at 2:30 PM\"\n  },\n  \n  time_phrases: {\n    \"< 5 minutes\": \"right now\",\n    \"5-15 minutes\": \"in {{ minutes }} minutes\", \n    \"15-30 minutes\": \"in {{ minutes }} minutes\",\n    \"30-60 minutes\": \"in about {{ rounded_minutes }} minutes\",\n    \"1-2 hours\": \"in {{ hours }} hour{{ plural }}\",\n    \"2-24 hours\": \"{{ time_description }}\", // \"this afternoon\", \"tomorrow morning\"\n    \"> 24 hours\": \"on {{ date }} at {{ time }}\"\n  },\n  \n  contextual_timing: {\n    morning: \"6:00-12:00\",\n    afternoon: \"12:00-17:00\", \n    evening: \"17:00-21:00\",\n    night: \"21:00-6:00\"\n  }\n}\nUrgency Assessment\njavascripturgency_levels: {\n  critical: {\n    time_threshold: \"< 10 minutes\",\n    tone_modifier: \"urgent\",\n    emoji_intensity: \"high\",\n    preparation_focus: \"immediate_actions\"\n  },\n  \n  high: {\n    time_threshold: \"10-30 minutes\",\n    tone_modifier: \"encouraging_urgent\",\n    emoji_intensity: \"moderate\",\n    preparation_focus: \"quick_prep\"\n  },\n  \n  medium: {\n    time_threshold: \"30 minutes - 2 hours\",\n    tone_modifier: \"friendly_reminder\", \n    emoji_intensity: \"appropriate\",\n    preparation_focus: \"standard_prep\"\n  },\n  \n  low: {\n    time_threshold: \"> 2 hours\",\n    tone_modifier: \"gentle_reminder\",\n    emoji_intensity: \"minimal\",\n    preparation_focus: \"advance_prep\"\n  }\n}\nPersonalization Module\nUser Preference Adaptation\njavascriptpersonalization: {\n  communication_style: {\n    formal: {\n      greeting: \"Good {{ time_of_day }}, {{ user_name }}\",\n      tone: \"professional\",\n      emoji_usage: \"minimal\"\n    },\n    \n    casual: {\n      greeting: \"Hey {{ user_name }}! 👋\",\n      tone: \"friendly\", \n      emoji_usage: \"moderate\"\n    },\n    \n    enthusiastic: {\n      greeting: \"Hi {{ user_name }}! 🌟\",\n      tone: \"energetic\",\n      emoji_usage: \"high\"\n    }\n  },\n  \n  relationship_context: {\n    new_user: \"polite_helpful\",\n    regular_user: \"friendly_familiar\", \n    long_term_user: \"warm_personal\"\n  },\n  \n  event_history: {\n    track_patterns: true,\n    learn_preferences: true,\n    customize_suggestions: true\n  }\n}\nCultural Adaptation\njavascriptcultural_settings: {\n  time_format: {\n    us: \"12-hour\",\n    international: \"24-hour\"\n  },\n  \n  emoji_preferences: {\n    high_emoji_cultures: [\"US\", \"JP\", \"KR\"],\n    low_emoji_cultures: [\"DE\", \"UK_formal\"],\n    contextual: \"adapt_to_user\"\n  },\n  \n  urgency_expression: {\n    direct: [\"US\", \"DE\", \"NL\"],\n    indirect: [\"JP\", \"UK\", \"IN\"]\n  }\n}\nSmart Suggestions Module\nPreparation Intelligence\njavascriptpreparation_engine: {\n  rule_based_suggestions: {\n    location_based: {\n      external_location: \"Check traffic and parking\",\n      new_location: \"Look up directions beforehand\", \n      remote_meeting: \"Test your tech setup\",\n      restaurant: \"Check if reservations are needed\"\n    },\n    \n    time_based: {\n      early_morning: \"Set your alarm a bit earlier\",\n      lunch_time: \"Consider eating something light first\",\n      end_of_day: \"Wrap up current tasks\",\n      weekend: \"Double-check if this is still on\"\n    },\n    \n    event_type_based: {\n      presentation: \"Review your slides one more time\",\n      interview: \"Prepare your questions and examples\",\n      medical: \"Bring your insurance card and ID\",\n      social: \"Confirm any dietary restrictions\"\n    }\n  },\n  \n  contextual_suggestions: {\n    weather_dependent: \"Check the weather if going outside\",\n    traffic_dependent: \"Allow extra time for traffic\",\n    tech_dependent: \"Test your internet connection\",\n    material_dependent: \"Gather any needed documents\"\n  }\n}\nSmart Context Detection\njavascriptcontext_detection: {\n  keywords_analysis: {\n    important_indicators: [\"important\", \"urgent\", \"critical\", \"don't miss\"],\n    preparation_indicators: [\"bring\", \"prepare\", \"review\", \"practice\"],\n    location_indicators: [\"at\", \"in\", \"room\", \"building\", \"address\"],\n    attendee_indicators: [\"with\", \"meeting\", \"and\", \"team\"]\n  },\n  \n  pattern_recognition: {\n    recurring_events: \"adapt_tone_for_familiarity\",\n    first_time_events: \"provide_extra_guidance\", \n    rescheduled_events: \"acknowledge_change\",\n    cancelled_events: \"confirm_cancellation\"\n  }\n}\nEmoji Intelligence Module\nContextual Emoji Selection\njavascriptemoji_engine: {\n  selection_criteria: [\n    \"event_type\",\n    \"urgency_level\", \n    \"user_preference\",\n    \"cultural_context\",\n    \"time_of_day\"\n  ],\n  \n  emoji_categories: {\n    time_related: [\"⏰\", \"🕐\", \"⏱️\", \"⏳\", \"🔔\"],\n    location_related: [\"📍\", \"🏢\", \"🏠\", \"🌐\", \"🗺️\"],\n    activity_related: [\"💼\", \"🍽️\", \"💪\", \"📚\", \"🎉\"],\n    emotion_related: [\"😊\", \"💪\", \"✨\", \"🤗\", \"👋\"],\n    urgency_related: [\"⚡\", \"🚨\", \"⏰\", \"🔥\", \"💨\"]\n  },\n  \n  combination_rules: {\n    max_emojis_per_message: 5,\n    avoid_repetition: true,\n    match_tone: true,\n    cultural_sensitivity: true\n  }\n}\nResponse Validation Module\nQuality Assurance\njavascriptvalidation_checks: {\n  content_validation: {\n    essential_info_present: [\"event_title\", \"time_info\"],\n    appropriate_tone: \"matches_user_preference\",\n    length_appropriate: \"within_limits\",\n    emoji_balance: \"not_overwhelming\"\n  },\n  \n  accuracy_checks: {\n    time_calculation: \"verify_math_correct\",\n    event_details: \"match_source_data\", \n    timezone_handling: \"consistent_timezone\",\n    date_format: \"locale_appropriate\"\n  },\n  \n  user_experience: {\n    clarity: \"message_easily_understood\",\n    actionability: \"clear_next_steps\",\n    helpfulness: \"adds_value\",\n    personality: \"feels_personal_not_robotic\"\n  }\n}\nError Handling Module\nGraceful Degradation\njavascripterror_handling: {\n  missing_data: {\n    no_title: \"use_generic_reference\",\n    no_time: \"use_approximate_timing\", \n    no_location: \"omit_location_reference\",\n    no_description: \"focus_on_available_data\"\n  },\n  \n  time_calculation_errors: {\n    past_event: \"gentle_notification_of_timing\",\n    far_future: \"adjust_language_for_distance\",\n    timezone_mismatch: \"use_user_timezone_preference\"\n  },\n  \n  fallback_strategies: {\n    template_failure: \"use_simple_backup_template\",\n    emoji_failure: \"proceed_without_emojis\",\n    personalization_failure: \"use_generic_friendly_tone\"\n  }\n}\nExample Templates\nTemplate Library\njavascriptexample_outputs: {\n  urgent_meeting: {\n    input: {\n      event: \"Team Standup\",\n      time: \"in 5 minutes\",\n      location: \"Conference Room A\"\n    },\n    output: \"Hi! 👋 Your Team Standup is starting in 5 minutes! 📍 Conference Room A. Quick reminder to grab your notes! 💼 You've got this! ✨\"\n  },\n  \n  upcoming_appointment: {\n    input: {\n      event: \"Doctor Appointment\", \n      time: \"in 30 minutes\",\n      location: \"Downtown Medical Center\"\n    },\n    output: \"Hey there! 😊 Just a friendly reminder - you have your Doctor Appointment in 30 minutes at Downtown Medical Center 🏥 Don't forget to bring your insurance card and arrive a few minutes early! 💡 Good luck! 🍀\"\n  },\n  \n  social_event: {\n    input: {\n      event: \"Dinner with Sarah\",\n      time: \"at 7:00 PM\", \n      location: \"Mario's Italian Restaurant\"\n    },\n    output: \"Hi! 👋 Don't forget about dinner with Sarah at 7:00 PM at Mario's Italian Restaurant! 🍽️ Hope you have a wonderful time! ✨\"\n  },\n  \n  work_presentation: {\n    input: {\n      event: \"Q4 Results Presentation\",\n      time: \"in 2 hours\",\n      location: \"Main Conference Room\"\n    },\n    output: \"Hey! 👋 Your Q4 Results Presentation is coming up in 2 hours in the Main Conference Room 📊 Quick tip: review your slides one more time! 💡 You've got this! 💪\"\n  }\n}\nAdvanced Features Module\nIntelligent Enhancements\njavascriptadvanced_features: {\n  learning_system: {\n    track_user_responses: \"improve_personalization\",\n    analyze_successful_patterns: \"refine_templates\",\n    adapt_timing_preferences: \"optimize_reminder_schedule\"\n  },\n  \n  integration_capabilities: {\n    calendar_data: \"extract_rich_event_context\",\n    weather_service: \"include_weather_relevant_tips\",\n    traffic_data: \"suggest_departure_adjustments\", \n    user_location: \"calculate_travel_time\"\n  },\n  \n  multi_modal_support: {\n    text_message: \"primary_format\",\n    voice_message: \"natural_speech_adaptation\",\n    push_notification: \"concise_format\",\n    email: \"detailed_format\"\n  }\n}\nA/B Testing Framework\njavascriptexperimentation: {\n  testable_elements: [\n    \"greeting_style\",\n    \"emoji_density\", \n    \"preparation_suggestion_timing\",\n    \"message_length\",\n    \"urgency_language\"\n  ],\n  \n  success_metrics: [\n    \"user_engagement\",\n    \"preparation_follow_through\",\n    \"user_satisfaction_ratings\",\n    \"message_open_rates\"\n  ]\n}\nDeployment Configuration\nEnvironment Setup\njavascriptdeployment: {\n  development: {\n    emoji_usage: \"high\", \n    verbosity: \"detailed\",\n    error_visibility: \"full\"\n  },\n  \n  production: {\n    emoji_usage: \"user_preference\",\n    verbosity: \"optimized\",\n    error_visibility: \"user_friendly\"\n  },\n  \n  enterprise: {\n    emoji_usage: \"conservative\", \n    verbosity: \"professional\",\n    error_visibility: \"minimal\"\n  }\n}\nPerformance Optimization\njavascriptoptimization: {\n  template_caching: \"cache_frequently_used_patterns\",\n  emoji_preloading: \"preload_common_emoji_sets\",\n  response_time: \"target_under_200ms\",\n  memory_usage: \"optimize_for_high_volume\"\n}\nUsage Instructions\nQuick Start\n\nConfigure user preferences and timezone\nSet event type classification rules\nCustomize personality settings\nTest with sample events\nDeploy with monitoring\n\nCustomization Guide\n\nPersonality: Adjust tone, emoji usage, formality level\nTiming: Set reminder intervals and urgency thresholds\nSuggestions: Configure preparation recommendation rules\nTemplates: Customize message structures for different scenarios\nIntegration: Connect external services for enhanced context\n\nMonitoring & Maintenance\n\nTrack message effectiveness metrics\nMonitor user engagement patterns\nUpdate templates based on feedback\nRefine personalization algorithms\nTest edge cases regularly\n"
        },
        "promptType": "define"
      },
      "typeVersion": 2
    },
    {
      "id": "send-reminder",
      "name": "发送提醒",
      "type": "n8n-nodes-base.telegram",
      "position": [
        1620,
        560
      ],
      "webhookId": "d9dced76-6c95-496b-87a9-21867b8090c1",
      "parameters": {
        "text": "=🔔 **Reminder Alert!**\\n\\n{{ $('Reminder Message Agent').item.json.output }}",
        "chatId": "YOUR_CHAT_ID",
        "additionalFields": {
          "parse_mode": "HTML",
          "disable_web_page_preview": true
        }
      },
      "credentials": {
        "telegramApi": {
          "id": "h0kKP9CbkgczV76h",
          "name": "Khaisa Assistant"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "e43b9173-e102-4feb-b78a-40d7b43212ef",
      "name": "日历管理!",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        2440,
        1040
      ],
      "parameters": {
        "text": "={{ $('Merge').item.json.message || $('Merge').item.json.text }}",
        "options": {
          "systemMessage": "=You are a Google Calendar assistant chatbot designed to help users manage their calendar events through natural language commands via Telegram. You prioritize user experience, accuracy, and clear communication.\nSystem Configuration\nCurrent DateTime: {{ $now.toFormat('cccc d LLLL yyyy HH:mm') }}\nUser Timezone: Auto-detected\nDefault Event Duration: 1 hour\nResponse Format: Telegram HTML\nLanguage: English\nCRITICAL DATE HANDLING\nWhen using calendar tools, ALWAYS provide dates in ISO format:\n\nstart_date: \"2025-07-08T00:00:00.000Z\" (start of day)\nend_date: \"2025-07-08T23:59:59.999Z\" (end of day)\n\nFor common requests:\n\n\"today\": start_date = {{ $now.startOf('day').toISO() }}, end_date = {{ $now.endOf('day').toISO() }}\n\"tomorrow\": start_date = {{ $now.plus(1, 'day').startOf('day').toISO() }}, end_date = {{ $now.plus(1, 'day').endOf('day').toISO() }}\n\"next 7 days\": start_date = {{ $now.startOf('day').toISO() }}, end_date = {{ $now.plus(7, 'days').endOf('day').toISO() }}\n\"this week\": start_date = {{ $now.startOf('week').toISO() }}, end_date = {{ $now.endOf('week').toISO() }}\n\nCRITICAL TOOL USAGE WORKFLOW\nFor Event Creation:\n\nALWAYS extract or ask for:\n\nevent_title (required)\nstart_date in ISO format (required)\nend_date in ISO format (required)\nevent_description (optional)\nlocation (optional)\n\n\nIf time not specified, assume:\n\nDefault duration: 1 hour\nDefault time: next available hour\n\n\nUse \"Create Event\" tool with all parameters\nDisplay confirmation with full event details including formatted time\n\nFor Event Deletion:\n\nALWAYS use \"Get events\" tool FIRST to retrieve events and their IDs\nFind the matching event by title, time, or description\nExtract the event ID from the results\nUse \"Delete event\" tool with the extracted event_id\nConfirm success or handle errors\n\nFor Event Updates:\n\nUse \"Get events\" tool FIRST to find the event and get its ID\nUse \"Update Event\" tool with the event_id and new information\nConfirm the update\n\nFor Event Listing:\n\nUse \"Get events\" tool with appropriate date range\nFormat the results properly for display\n\nNEVER ask users for event IDs - always retrieve them yourself using the tools!\nALWAYS provide complete start_date and end_date when creating events!\nCore Capabilities\n1. Event Creation\n\nTrigger phrases: \"create\", \"add\", \"schedule\", \"book\", \"set up\"\nRequired: title, start_time, end_time\nOptional: description, location, attendees\nDefault duration: 1 hour if end time not specified\n\n2. Event Listing\n\nTrigger phrases: \"list\", \"show\", \"what's\", \"upcoming\", \"agenda\"\nDefault range: next 7 days\nGroup by date, chronological order\n\n3. Event Updates\n\nTrigger phrases: \"update\", \"change\", \"modify\", \"reschedule\", \"move\"\nAlways confirm before changes\nCan modify: time, location, title, description\n\n4. Event Deletion\n\nTrigger phrases: \"delete\", \"remove\", \"cancel\", \"clear\"\nAlways require confirmation\nShow event details before deletion\n\n5. Schedule Analysis\n\nCheck availability\nDetect conflicts\nSuggest meeting times\n\nTelegram HTML Formatting Rules\nUse ONLY these HTML tags:\n\n<b>bold text</b> or <strong>bold text</strong>\n<i>italic text</i> or <em>italic text</em>\n<u>underlined text</u>\n<code>monospace text</code>\n<pre>preformatted text</pre>\n\nDO NOT use: div, span, p, h1-h6, ul, ol, li, table, br\nResponse Templates\nEvent List Format:\n📅 <b>Your Upcoming Events</b>\n\n<b>Tuesday 8 July 2025</b>\n⏰ 14:00 - 15:00 - <b>Meeting Title</b>\n📍 Location (if available)\n\n<b>Wednesday 9 July 2025</b>\n⏰ 09:00 - 10:00 - <b>Another Event</b>\n📍 Location (if available)\n\n<i>Showing next 7 days</i>\nEvent Creation Success:\n✅ <b>Event Created Successfully!</b>\n\n📅 <b>[EVENT_TITLE]</b>\n⏰ [FORMATTED_START_TIME] - [FORMATTED_END_TIME]\n📍 [LOCATION] (if provided)\n📝 [DESCRIPTION] (if provided)\n\n<i>Event added to your calendar!</i>\nEvent Deletion Success:\n✅ <b>Event Deleted Successfully!</b>\n\n📅 <b>[EVENT_TITLE]</b> has been removed from your calendar.\n\n<i>Is there anything else I can help you with?</i>\nNo Events Found:\n📅 <b>No Upcoming Events</b>\n\n<i>No events found for the specified period.</i>\n\nReady to schedule something?\nConfirmation Required:\n🤔 <b>Confirmation Needed</b>\n\n[ACTION_DETAILS]\n\nReply \"Yes\" to confirm or \"No\" to cancel.\nError Handling:\n❌ <b>[ERROR_TYPE]</b>\n\n<i>[ERROR_MESSAGE]</i>\n\n💡 <b>Try:</b> [HELPFUL_SUGGESTION]\nCommunication Style\n\nFriendly and conversational\nUse appropriate emojis (📅 ⏰ 📍 📝 ✅ ❌)\nKeep messages under 4096 characters\nAlways end with helpful engagement\nConfirm destructive actions\nProvide clear error messages with suggestions\n\nError Handling\n\nInput errors: Provide format examples\nNot found: Suggest alternatives\nConflicts: Show conflicting events\nPermissions: Guide user to fix access\nAlways offer to help further\n\nTelegram HTML Formatting Rules\nUse ONLY these HTML tags:\n\n<b>bold text</b> or <strong>bold text</strong>\n<i>italic text</i> or <em>italic text</em>\n<u>underlined text</u>\n<code>monospace text</code>\n<pre>preformatted text</pre>\n\nDO NOT use: div, span, p, h1-h6, ul, ol, li, table, br\nResponse Templates\nEvent List Format:\n📅 <b>Your Upcoming Events</b>\n\n<b>Tuesday 8 July 2025</b>\n⏰ 14:00 - 15:00 - <b>Meeting Title</b>\n📍 Location (if available)\n\n<b>Wednesday 9 July 2025</b>\n⏰ 09:00 - 10:00 - <b>Another Event</b>\n📍 Location (if available)\n\n<i>Showing next 7 days</i>\nEvent Creation Success:\n✅ <b>Event Created Successfully!</b>\n\n📅 <b>[EVENT_TITLE]</b>\n⏰ [START_TIME] - [END_TIME]\n📍 [LOCATION]\n📝 [DESCRIPTION]\n\n<i>Event added to your calendar!</i>\nNo Events Found:\n📅 <b>No Upcoming Events</b>\n\n<i>No events found for the specified period.</i>\n\nReady to schedule something?\nConfirmation Required:\n🤔 <b>Confirmation Needed</b>\n\n[ACTION_DETAILS]\n\nReply \"Yes\" to confirm or \"No\" to cancel.\nError Handling:\n❌ <b>[ERROR_TYPE]</b>\n\n<i>[ERROR_MESSAGE]</i>\n\n💡 <b>Try:</b> [HELPFUL_SUGGESTION]\nCommunication Style\n\nFriendly and conversational\nUse appropriate emojis (📅 ⏰ 📍 📝 ✅ ❌)\nKeep messages under 4096 characters\nAlways end with helpful engagement\nConfirm destructive actions\nProvide clear error messages with suggestions\n\nError Handling\n\nInput errors: Provide format examples\nNot found: Suggest alternatives\nConflicts: Show conflicting events\nPermissions: Guide user to fix access\nAlways offer to help further\n"
        },
        "promptType": "define"
      },
      "typeVersion": 2
    },
    {
      "id": "8332bee6-8578-426b-81ad-7ebd8670a290",
      "name": "删除事件",
      "type": "n8n-nodes-base.googleCalendarTool",
      "position": [
        2400,
        1260
      ],
      "parameters": {
        "eventId": "={{ $fromAI('event_id') }}",
        "options": {},
        "calendar": {
          "__rl": true,
          "mode": "list",
          "value": "contactmuhtadin@gmail.com",
          "cachedResultName": "contactmuhtadin@gmail.com"
        },
        "operation": "delete",
        "descriptionType": "manual",
        "toolDescription": "=Use this tool to DELETE calendar events. The AI agent must provide the 'event_id' parameter with the actual event ID (not a date). To get event IDs, first use the 'Get events' tool to retrieve events, then use the ID from those results. Always confirm with user before deleting events."
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "id": "lU6A6eEP54fhSOnK",
          "name": "khmuhtadin@gmail.com"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "41595444-1657-4d2f-9f7a-9497f51a3f11",
      "name": "简单记忆",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        2280,
        1260
      ],
      "parameters": {
        "sessionKey": "={{ $('Start').item.json.message.chat.id }}",
        "sessionIdType": "customKey",
        "contextWindowLength": 20
      },
      "typeVersion": 1.3
    },
    {
      "id": "70831a99-0707-40a3-ab97-864a5663fa16",
      "name": "获取事件",
      "type": "n8n-nodes-base.googleCalendarTool",
      "position": [
        2520,
        1260
      ],
      "parameters": {
        "options": {
          "timeMax": "={{ $fromAI('end_date') || $now.plus(7, 'days').endOf('day').toISO() }}",
          "timeMin": "={{ $fromAI('start_date') || $now.startOf('day').toISO() }}"
        },
        "calendar": {
          "__rl": true,
          "mode": "list",
          "value": "contactmuhtadin@gmail.com",
          "cachedResultName": "contactmuhtadin@gmail.com"
        },
        "operation": "getAll",
        "descriptionType": "manual",
        "toolDescription": "=Use this tool to retrieve calendar events. Provide start_date and end_date in ISO format (YYYY-MM-DDTHH:mm:ss.sssZ). For 'today' use current date ({{$now}}), for 'next 7 days' use current date to 7 days from now. Example: start_date='2025-07-08T00:00:00.000Z', end_date='2025-07-15T23:59:59.999Z'"
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "id": "lU6A6eEP54fhSOnK",
          "name": "khmuhtadin@gmail.com"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "8530e92e-1c5e-46b3-bc42-eff1c9415aa2",
      "name": "创建事件",
      "type": "n8n-nodes-base.googleCalendarTool",
      "position": [
        2640,
        1260
      ],
      "parameters": {
        "end": "={{ $fromAI('end_date') }}",
        "start": "={{ $fromAI('start_date') }}",
        "calendar": {
          "__rl": true,
          "mode": "list",
          "value": "contactmuhtadin@gmail.com",
          "cachedResultName": "contactmuhtadin@gmail.com"
        },
        "descriptionType": "manual",
        "toolDescription": "Use this tool to CREATE new calendar events. REQUIRED parameters: event_title, start_date, end_date (both in ISO format YYYY-MM-DDTHH:mm:ss.sssZ). OPTIONAL: event_description, location. Example: event_title='Team Meeting', start_date='2025-07-08T14:00:00.000Z', end_date='2025-07-08T15:00:00.000Z', event_description='Weekly team sync', location='Conference Room A'",
        "additionalFields": {
          "summary": "={{ $fromAI('event_title') }}",
          "location": "={{ $fromAI('location') || '' }}",
          "attendees": [],
          "description": "={{ $fromAI('event_description') || '' }}"
        },
        "useDefaultReminders": false
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "id": "lU6A6eEP54fhSOnK",
          "name": "khmuhtadin@gmail.com"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "776ba60a-b80a-476a-adce-96120c2ce2eb",
      "name": "更新事件",
      "type": "n8n-nodes-base.googleCalendarTool",
      "position": [
        2760,
        1260
      ],
      "parameters": {
        "eventId": "={{ $fromAI('event_id') }}",
        "calendar": {
          "__rl": true,
          "mode": "list",
          "value": "contactmuhtadin@gmail.com",
          "cachedResultName": "contactmuhtadin@gmail.com"
        },
        "operation": "update",
        "updateFields": {
          "end": "={{ $fromAI('end_date') || '' }}",
          "start": "={{ $fromAI('start_date') || '' }}",
          "summary": "={{ $fromAI('event_title') || '' }}",
          "location": "={{ $fromAI('location') || '' }}",
          "description": "={{ $fromAI('event_description') || '' }}"
        },
        "descriptionType": "manual",
        "toolDescription": "Use this tool to UPDATE/MODIFY existing calendar events. REQUIRED: event_id (get this from 'Get events' tool first). OPTIONAL parameters to update: event_title, start_date, end_date (in ISO format), event_description, location. Only provide parameters you want to change. Example: event_id='abc123def', event_title='Updated Meeting', start_date='2025-07-08T15:00:00.000Z', end_date='2025-07-08T16:00:00.000Z'",
        "useDefaultReminders": false
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "id": "lU6A6eEP54fhSOnK",
          "name": "khmuhtadin@gmail.com"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "18eb6e28-1b39-41b5-b7db-0bea6d7b1f06",
      "name": "OpenAI",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        1400,
        1140
      ],
      "parameters": {
        "options": {
          "language": "ID"
        },
        "resource": "audio",
        "operation": "transcribe"
      },
      "credentials": {
        "openAiApi": {
          "id": "IWdqsaVAq1AL1S28",
          "name": "n8n - Money manager Khairul"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "597784d1-a40e-48e5-bdaa-b5db3561bd9c",
      "name": "📥 下载语音",
      "type": "n8n-nodes-base.telegram",
      "position": [
        1120,
        1140
      ],
      "webhookId": "7d9d13d4-ec19-40d7-a905-0b44b58867d9",
      "parameters": {
        "fileId": "={{ $json.message.voice.file_id }}",
        "resource": "file"
      },
      "credentials": {
        "telegramApi": {
          "id": "h0kKP9CbkgczV76h",
          "name": "Khaisa Assistant"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "telegram-trigger",
      "name": "开始",
      "type": "n8n-nodes-base.telegramTrigger",
      "position": [
        680,
        1040
      ],
      "webhookId": "a57703c3-a03a-406d-b980-f94a0d9a4e3f",
      "parameters": {
        "updates": [
          "message"
        ],
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "id": "h0kKP9CbkgczV76h",
          "name": "Khaisa Assistant"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "4a6a7c60-1ed6-448a-9dab-046f895e3025",
      "name": "合并",
      "type": "n8n-nodes-base.merge",
      "position": [
        1760,
        1040
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineAll"
      },
      "typeVersion": 3.2,
      "alwaysOutputData": true
    },
    {
      "id": "4313547f-b896-46a8-896c-ee268f137344",
      "name": "切换",
      "type": "n8n-nodes-base.switch",
      "position": [
        900,
        1040
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "text",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "77925101-ceaa-42eb-bb55-fedf830f2cc6",
                    "operator": {
                      "type": "string",
                      "operation": "exists",
                      "singleValue": true
                    },
                    "leftValue": "={{ $json.message.text }}",
                    "rightValue": ""
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "voice",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "d2e3b9a3-74a7-4f09-98df-16d49a898821",
                    "operator": {
                      "type": "string",
                      "operation": "exists",
                      "singleValue": true
                    },
                    "leftValue": "={{ $json.message.voice.file_id }}",
                    "rightValue": ""
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "34ffeb49-a92d-408a-b5be-4c9e46215274",
      "name": "输入中 2",
      "type": "n8n-nodes-base.telegram",
      "position": [
        2040,
        1040
      ],
      "webhookId": "fb7d9e87-d2a3-41af-a767-391533f26587",
      "parameters": {
        "chatId": "={{ $('Start').item.json.message.chat.id }}",
        "operation": "sendChatAction"
      },
      "credentials": {
        "telegramApi": {
          "id": "h0kKP9CbkgczV76h",
          "name": "Khaisa Assistant"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "25e2f802-702f-49c5-b4ec-b7859b358ff1",
      "name": "编辑字段",
      "type": "n8n-nodes-base.set",
      "position": [
        1400,
        940
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "4cdcaff2-6399-4d0c-8043-b9b4133af6ba",
              "name": "message",
              "type": "string",
              "value": "={{ $('Start').item.json.message.text }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "827ba6e7-f308-4cba-beee-31e1c6055b5b",
      "name": "便签",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1680,
        760
      ],
      "parameters": {
        "color": 3,
        "height": 220,
        "content": "## AI 处理器"
      },
      "typeVersion": 1
    },
    {
      "id": "317717f6-7223-4bd6-8cc5-4147e6836097",
      "name": "便签1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        620,
        860
      ],
      "parameters": {
        "color": 5,
        "width": 2500,
        "height": 580,
        "content": "# 日历代理"
      },
      "typeVersion": 1
    },
    {
      "id": "6a85f881-9c27-488b-a21c-cd2efd6d0b51",
      "name": "便签2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        620,
        380
      ],
      "parameters": {
        "color": 4,
        "width": 1200,
        "height": 440,
        "content": "# 提醒代理"
      },
      "typeVersion": 1
    },
    {
      "id": "856ed3d2-58f3-47c2-a63b-f876a1fff14a",
      "name": "便签3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1840,
        380
      ],
      "parameters": {
        "width": 440,
        "height": 440,
        "content": "## 如何使用机器人"
      },
      "typeVersion": 1
    },
    {
      "id": "00f1e9f5-435d-4d99-84f9-29fd27740cc8",
      "name": "便签4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2300,
        380
      ],
      "parameters": {
        "width": 340,
        "height": 440,
        "content": "## 🔧 机器人设置要求"
      },
      "typeVersion": 1
    },
    {
      "id": "90ffa13b-633c-46e6-92aa-3da633472c1d",
      "name": "便签5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2660,
        380
      ],
      "parameters": {
        "width": 460,
        "height": 440,
        "content": "### 🤖 示例命令"
      },
      "typeVersion": 1
    }
  ],
  "active": true,
  "pinData": {},
  "settings": {
    "executionOrder": "v1",
    "saveManualExecutions": true,
    "saveExecutionProgress": true,
    "saveDataErrorExecution": "all",
    "saveDataSuccessExecution": "all"
  },
  "versionId": "f5572e3c-4e0f-456a-b866-69aac88ea256",
  "connections": {
    "Merge": {
      "main": [
        [
          {
            "node": "Typing 2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Start": {
      "main": [
        [
          {
            "node": "Switch",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Switch": {
      "main": [
        [
          {
            "node": "Send Typing Indicator",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "📥 Download Voice",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Typing 2": {
      "main": [
        [
          {
            "node": "Calendar Manage!",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get events": {
      "ai_tool": [
        [
          {
            "node": "Calendar Manage!",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Create Event": {
      "ai_tool": [
        [
          {
            "node": "Calendar Manage!",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Delete event": {
      "ai_tool": [
        [
          {
            "node": "Calendar Manage!",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Update Event": {
      "ai_tool": [
        [
          {
            "node": "Calendar Manage!",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory": {
      "ai_memory": [
        [
          {
            "node": "Calendar Manage!",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Calendar Manage!": {
      "main": [
        [
          {
            "node": "Send AI Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Reminder Schedule": {
      "main": [
        [
          {
            "node": "Get Upcoming Events",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Upcoming Events": {
      "main": [
        [
          {
            "node": "Filter Duplicate Reminders",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Model": {
      "ai_languageModel": [
        [
          {
            "node": "Reminder Message Agent",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "Calendar Manage!",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "📥 Download Voice": {
      "main": [
        [
          {
            "node": "OpenAI",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Typing Indicator": {
      "main": [
        [
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Reminder Message Agent": {
      "main": [
        [
          {
            "node": "Send Reminder",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Duplicate Reminders": {
      "main": [
        [
          {
            "node": "Reminder Message Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
常见问题

如何使用这个工作流?

复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。

这个工作流适合什么场景?

高级 - 个人效率, AI 聊天机器人

需要付费吗?

本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。

工作流信息
难度等级
高级
节点数量27
分类2
节点类型14
难度说明

适合高级用户,包含 16+ 个节点的复杂工作流

外部链接
在 n8n.io 查看

分享此工作流