{
  "_meta": {
    "\u8aac\u660e": "WF01: Vtuber\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u6295\u7a3f\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\uff08\u5b9f\u7a3c\u50cd\u7248\u3092\u53cd\u6620\uff09",
    "n8n\u30ef\u30fc\u30af\u30d5\u30ed\u30fcID": "311u3BRZZRrR0gDN",
    "n8nURL": "https://n8n.appexx.me/workflow/311u3BRZZRrR0gDN",
    "\u6700\u7d42\u66f4\u65b0": "2026-03-18",
    "\u72b6\u614b": "n8n\u4e0a\u3067\u7a3c\u50cd\u4e2d\uff08\u3053\u306e\u30d5\u30a1\u30a4\u30eb\u306f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u30fb\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u7528\uff09",
    "\u30d5\u30ed\u30fc": "Schedule(6h) \u2192 Read Config(config\u30b7\u30fc\u30c8) \u2192 Parse Config \u2192 Read vtubers_db \u2192 Filter Pending(dir_status\u304c\u7a7a/\u6700\u59275\u4ef6) \u2192 Has Pending? \u2192 Gemini & Prepare WP Body \u2192 Create WP Post \u2192 Extract WP Response \u2192 Update vtubers_db \u2192 Append Log",
    "Google\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8": {
      "ID": "1WwyRbzS7XfVqcaH6Ipe2JFqMtD-X1c5NKXJViaZAtvM",
      "config\u30b7\u30fc\u30c8\u5fc5\u9808\u30ad\u30fc\uff08key\u5217/value\u5217\u306e\u5f62\u5f0f\uff09": {
        "wp_url": "http://localhost:10004\uff08\u672c\u756a\u306f\u672c\u756a\u30c9\u30e1\u30a4\u30f3\uff09",
        "wp_user": "admin",
        "wp_app_password": "SkAw 2UXs ldt3 m0nH GPKT ndlX",
        "gemini_api_key": "Google AI Studio API\u30ad\u30fc",
        "sheets_id": "1WwyRbzS7XfVqcaH6Ipe2JFqMtD-X1c5NKXJViaZAtvM"
      },
      "vtubers_db\u30b7\u30fc\u30c8\u5fc5\u9808\u5217": [
        "slug\uff08URL\u30b9\u30e9\u30c3\u30b0\u30fb\u30e6\u30cb\u30fc\u30af\u30ad\u30fc\uff09",
        "tool_name\uff08\u6d3b\u52d5\u540d\u30fb\u65e5\u672c\u8a9e\uff09",
        "tool_name_en\uff08\u82f1\u8a9e\u540d\uff09",
        "group\uff08\u6240\u5c5e\u30b0\u30eb\u30fc\u30d7\u540d\uff09",
        "debut_date\uff08\u30c7\u30d3\u30e5\u30fc\u65e5 YYYY-MM-DD\uff09",
        "subscribers_yt\uff08YouTube\u767b\u9332\u8005\u6570\uff09",
        "total_views\uff08\u7dcf\u518d\u751f\u56de\u6570\uff09",
        "stream_frequency\uff08\u914d\u4fe1\u983b\u5ea6\uff09",
        "primary_content\uff08\u30e1\u30a4\u30f3\u30b3\u30f3\u30c6\u30f3\u30c4\u30fb\u30ab\u30f3\u30de\u533a\u5207\u308a\uff09",
        "voice_type\uff08\u58f0\u8cea\uff09",
        "sns_youtube\uff08YouTube\u30c1\u30e3\u30f3\u30cd\u30ebURL\uff09",
        "sns_twitter\uff08Twitter/X URL\uff09",
        "sns_twitcast\uff08\u30c4\u30a4\u30ad\u30e3\u30b9\u30c8URL\uff09",
        "milestone_100k\uff0810\u4e07\u4eba\u9054\u6210\u65e5\uff09",
        "milestone_1m\uff08100\u4e07\u4eba\u9054\u6210\u65e5\uff09",
        "affiliate_link\uff08\u30a2\u30d5\u30a3\u30ea\u30a8\u30a4\u30c8\u30ea\u30f3\u30af\uff09",
        "is_retired\uff08\u5f15\u9000\u30d5\u30e9\u30b0: 1/TRUE\uff09",
        "dir_status\uff08\u51e6\u7406\u72b6\u614b: \u7a7a=\u672a\u51e6\u7406 / published=\u6295\u7a3f\u6e08\u307f\uff09",
        "dir_post_id\uff08\u6295\u7a3f\u5f8c\u306eWP Post ID\uff09",
        "published_url\uff08\u6295\u7a3f\u5f8c\u306eURL\uff09"
      ],
      "logs\u30b7\u30fc\u30c8\u5217": [
        "timestamp",
        "workflow",
        "keyword_or_slug",
        "status",
        "error_message",
        "retry_count"
      ]
    }
  },
  "name": "WF01 - Vtubers Directory Post",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 6
            }
          ]
        }
      },
      "id": "5763e2d0-38d0-46de-933d-41e8f666fd2b",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        -1840,
        144
      ],
      "notes": "6\u6642\u9593\u3054\u3068\u5b9f\u884c\uff081\u65e54\u56de\uff09"
    },
    {
      "parameters": {
        "documentId": {
          "__rl": true,
          "value": "1WwyRbzS7XfVqcaH6Ipe2JFqMtD-X1c5NKXJViaZAtvM",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "config",
          "mode": "name"
        },
        "options": {}
      },
      "id": "66e02a15-90dd-49e4-b9b6-c62bc35baf05",
      "name": "Read Config",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        -1616,
        144
      ],
      "notes": "config\u30b7\u30fc\u30c8\u306ekey/value\u5f62\u5f0f\u304b\u3089\u8a8d\u8a3c\u60c5\u5831\u3092\u8aad\u307f\u53d6\u308b\u3002.env\u306f\u4f7f\u7528\u3057\u306a\u3044\u3002"
    },
    {
      "parameters": {
        "jsCode": "// config \u30b7\u30fc\u30c8\u306e key/value \u884c\u3092\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306b\u5909\u63db\nconst cfg = {};\nfor (const item of $input.all()) {\n  if (item.json.key) cfg[item.json.key] = item.json.value;\n}\nreturn [{ json: cfg }];"
      },
      "id": "452d02c8-9397-4989-8871-17b509a0ebcc",
      "name": "Parse Config",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -1392,
        144
      ]
    },
    {
      "parameters": {
        "documentId": {
          "__rl": true,
          "value": "={{ $('Parse Config').item.json.sheets_id }}",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "vtubers_db",
          "mode": "name"
        },
        "options": {}
      },
      "id": "64bca23d-02d3-4bfb-a3df-20f224c46ecf",
      "name": "Read vtubers_db",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        -1168,
        144
      ]
    },
    {
      "parameters": {
        "jsCode": "// dir_status \u304c\u7a7a\u306e\u884c\u3092\u6700\u59275\u4ef6\u53d6\u5f97\u3057\u3001config \u3092\u5404\u30a2\u30a4\u30c6\u30e0\u306b\u4ed8\u4e0e\nconst cfg = $('Parse Config').item.json;\nconst pending = $input.all()\n  .filter(i => !i.json.dir_status || i.json.dir_status.trim() === '')\n  .slice(0, 5);\n\nif (pending.length === 0) return [];\n\nreturn pending.map(i => ({ json: { ...i.json, _config: cfg } }));"
      },
      "id": "e6d10ca2-f692-44e2-806b-6ce1cd2b0f2d",
      "name": "Filter Pending",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -960,
        144
      ],
      "notes": "dir_status\u304c\u7a7a=\u672a\u51e6\u7406\u3002\u6700\u59275\u4ef6/\u5b9f\u884c"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict"
          },
          "conditions": [
            {
              "id": "cond-001",
              "leftValue": "={{ $input.all().length }}",
              "rightValue": 0,
              "operator": {
                "type": "number",
                "operation": "gt"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "02989635-8e4d-434e-81a3-7362074e601f",
      "name": "Has Pending?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        -736,
        144
      ]
    },
    {
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "function encodeBase64(str) {\n  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n  let result = '', i = 0;\n  while (i < str.length) {\n    const a = str.charCodeAt(i++);\n    const b = i < str.length ? str.charCodeAt(i++) : NaN;\n    const c = i < str.length ? str.charCodeAt(i++) : NaN;\n    result += chars[a >> 2];\n    result += chars[((a & 3) << 4) | ((isNaN(b) ? 0 : b) >> 4)];\n    result += isNaN(b) ? '=' : chars[((b & 15) << 2) | ((isNaN(c) ? 0 : c) >> 6)];\n    result += isNaN(c) ? '=' : chars[c & 63];\n  }\n  return result;\n}\n\nconst vt = $input.item.json;\nconst cfg = vt._config;\n\nif (!vt.tool_name) return { json: { skip: true, reason: 'no tool_name' } };\n\nconst promptText = '\u4ee5\u4e0b\u306eV\u30c1\u30e5\u30fc\u30d0\u30fc\u306b\u3064\u3044\u3066\u65e5\u672c\u8a9e\u3067SEO\u8a18\u4e8b\u3092\u4f5c\u6210\u3057\u3066\u304f\u3060\u3055\u3044\u3002\\n\\n'\n  + '\u6d3b\u52d5\u540d: ' + vt.tool_name\n  + '\\n\u6240\u5c5e: ' + (vt.group || '\u500b\u4eba\u52e2')\n  + '\\n\u30c7\u30d3\u30e5\u30fc\u65e5: ' + (vt.debut_date || '\u4e0d\u660e')\n  + '\\nYouTube\u767b\u9332\u8005\u6570: ' + (vt.subscribers_yt ? Number(vt.subscribers_yt).toLocaleString('ja-JP') + '\u4eba' : '\u975e\u516c\u958b')\n  + '\\n\u914d\u4fe1\u983b\u5ea6: ' + (vt.stream_frequency || '\u4e0d\u5b9a\u671f')\n  + '\\n\u4e3b\u306a\u30b3\u30f3\u30c6\u30f3\u30c4: ' + (vt.primary_content || '\u4e0d\u660e')\n  + '\\n\u58f0\u8cea: ' + (vt.voice_type || '\u4e0d\u660e')\n  + '\\n\\n\u8a18\u4e8b\u69cb\u6210\uff08\u5404\u30bb\u30af\u30b7\u30e7\u30f3\u3092H2\u30bf\u30b0\u3067\u533a\u5207\u308b\uff09:'\n  + '\\n\u2460\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u6982\u8981\uff08300\u5b57\u4ee5\u4e0a\uff09\\n\u2461\u914d\u4fe1\u30b9\u30bf\u30a4\u30eb\u3068\u7279\u5fb4\uff08200\u5b57\u4ee5\u4e0a\uff09\\n\u2462\u307e\u3068\u3081\uff08200\u5b57\u4ee5\u4e0a\uff09'\n  + '\\n\\n\u51fa\u529b\u5f62\u5f0f: {\"html_content\":\"<h2>...</h2>...\",\"seo_title\":\"...\",\"seo_desc\":\"...\",\"target_kw\":\"...\"}';\n\nlet aiHtml = '', aiTitle = '', aiDesc = '', aiKw = '';\n\ntry {\n  const gemRes = await this.helpers.httpRequest({\n    method: 'POST',\n    url: 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=' + cfg.gemini_api_key,\n    headers: { 'Content-Type': 'application/json' },\n    body: {\n      systemInstruction: { parts: [{ text: '\u3042\u306a\u305f\u306fV\u30c1\u30e5\u30fc\u30d0\u30fc\u5c02\u9580\u306eSEO\u30e9\u30a4\u30bf\u30fc\u3067\u3059\u3002JSON\u5f62\u5f0f\u306e\u307f\u3067\u51fa\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002' }] },\n      contents: [{ role: 'user', parts: [{ text: promptText }] }],\n      generationConfig: { maxOutputTokens: 2000, temperature: 0.7, responseMimeType: 'application/json' }\n    },\n    json: true\n  });\n  const ai = JSON.parse(gemRes.candidates[0].content.parts[0].text.trim());\n  aiHtml = String(ai.html_content || ''); aiTitle = String(ai.seo_title || '');\n  aiDesc = String(ai.seo_desc || '');    aiKw    = String(ai.target_kw  || '');\n} catch (e) {\n  aiHtml  = '<h2>' + vt.tool_name + '\u306e\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb</h2><p>' + vt.tool_name + '\u306f' + (vt.group || '\u500b\u4eba\u52e2') + '\u306eV\u30c1\u30e5\u30fc\u30d0\u30fc\u3067\u3059\u3002</p>';\n  aiTitle = vt.tool_name + ' \u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\uff5c\u914d\u4fe1\u30b9\u30bf\u30a4\u30eb\u30fb\u767b\u9332\u8005\u6570\u307e\u3068\u3081';\n  aiDesc  = vt.tool_name + '\u306e\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u30fb\u914d\u4fe1\u30b9\u30bf\u30a4\u30eb\u30fb\u767b\u9332\u8005\u6570\u30fbSNS\u30ea\u30f3\u30af\u3092\u307e\u3068\u3081\u3066\u3044\u307e\u3059\u3002';\n  aiKw    = vt.tool_name + ' \u30d7\u30ed\u30d5\u30a3\u30fc\u30eb';\n}\n\nconst primaryContent = vt.primary_content\n  ? vt.primary_content.split(',').map(s => s.trim()).filter(Boolean) : [];\n\nconst authHeader = 'Basic ' + encodeBase64(cfg.wp_user + ':' + cfg.wp_app_password);\n\nconst wpBody = {\n  title: vt.tool_name + ' \u30d7\u30ed\u30d5\u30a3\u30fc\u30eb', content: aiHtml, status: 'publish', slug: vt.slug,\n  meta: {\n    vt_name_jp: vt.tool_name || '', vt_name_en: vt.tool_name_en || '',\n    vt_debut_date: vt.debut_date || '',\n    vt_subscribers_yt: parseInt(vt.subscribers_yt) || 0,\n    vt_subscribers_updated: new Date().toISOString().split('T')[0],\n    vt_total_views: parseInt(vt.total_views) || 0,\n    vt_stream_frequency: vt.stream_frequency || '',\n    vt_primary_content: primaryContent,\n    vt_voice_type: vt.voice_type || '',\n    vt_sns_youtube: vt.sns_youtube || '', vt_sns_twitter: vt.sns_twitter || '', vt_sns_twitcast: vt.sns_twitcast || '',\n    vt_milestone_100k: vt.milestone_100k || '', vt_milestone_1m: vt.milestone_1m || '',\n    vt_affiliate_link: vt.affiliate_link || '',\n    vt_group_name: vt.group || '',\n    vt_is_retired: vt.is_retired === '1' || vt.is_retired === 'TRUE' || vt.is_retired === true,\n    _seopress_titles_title: aiTitle, _seopress_titles_desc: aiDesc,\n    _seopress_analysis_target_kw: aiKw,\n    _seopress_social_fb_title: aiTitle, _seopress_social_fb_desc: aiDesc,\n    _seopress_social_twitter_title: aiTitle, _seopress_social_twitter_desc: aiDesc\n  }\n};\n\n// \u30b0\u30eb\u30fc\u30d7\u30bf\u30af\u30bd\u30ce\u30df\u30fc\uff08vtuber_group_tax\uff09\u3092WP REST API\u3067\u691c\u7d22\u3057\u3066\u8a2d\u5b9a\ntry {\n  if (vt.group) {\n    const groupTermRes = await this.helpers.httpRequest({\n      method: 'GET',\n      url: cfg.wp_url + '/wp-json/wp/v2/group?search=' + encodeURIComponent(vt.group) + '&per_page=10&hide_empty=false',\n      headers: { 'Authorization': authHeader },\n      json: true\n    });\n    if (Array.isArray(groupTermRes) && groupTermRes.length > 0) {\n      // \u5b8c\u5168\u4e00\u81f4\u512a\u5148\u3001\u306a\u3051\u308c\u3070\u6700\u521d\u306e\u5019\u88dc\n      const exactMatch = groupTermRes.find(t => t.name === vt.group);\n      const termId = exactMatch ? exactMatch.id : groupTermRes[0].id;\n      wpBody.group = [termId];\n    }\n  }\n} catch(grpErr) { /* \u30b0\u30eb\u30fc\u30d7\u30bf\u30af\u30bd\u30ce\u30df\u30fc\u8a2d\u5b9a\u5931\u6557\u306f\u51e6\u7406\u3092\u6b62\u3081\u306a\u3044 */ }\n\n// YouTube\u30c1\u30e3\u30f3\u30cd\u30eb\u30a2\u30d0\u30bf\u30fc\u3092WP\u30e1\u30c7\u30a3\u30a2\u306b\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3057\u3066featured_media\u306b\u8a2d\u5b9a\nlet featuredMediaId = 0;\ntry {\n  const ytUrl = vt.sns_youtube || '';\n  const handleMatch = ytUrl.match(/@([\\w-]+)/);\n  if (handleMatch) {\n    const handle = handleMatch[1];\n    const ytHtml = await this.helpers.httpRequest({\n      method: 'GET',\n      url: 'https://www.youtube.com/@' + handle,\n      headers: { 'User-Agent': 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)' },\n      returnFullResponse: false\n    });\n    const ogMatch = String(ytHtml).match(/<meta[^>]+property=[\"']og:image[\"'][^>]+content=[\"']([^\"']+)[\"']/);\n    if (ogMatch) {\n      const avatarUrl = ogMatch[1];\n      const imgRes = await this.helpers.httpRequest({\n        method: 'GET', url: avatarUrl,\n        encoding: 'arraybuffer', returnFullResponse: true\n      });\n      const mediaRes = await this.helpers.httpRequest({\n        method: 'POST',\n        url: cfg.wp_url + '/wp-json/wp/v2/media',\n        headers: {\n          'Authorization': authHeader,\n          'Content-Disposition': 'attachment; filename=\"' + handle + '.jpg\"',\n          'Content-Type': 'image/jpeg'\n        },\n        body: imgRes.body,\n        encoding: 'arraybuffer',\n        returnFullResponse: true\n      });\n      const mediaJson = typeof mediaRes.body === 'string' ? JSON.parse(mediaRes.body) : mediaRes.body;\n      featuredMediaId = mediaJson.id || 0;\n    }\n  }\n} catch(imgErr) { /* \u30b5\u30e0\u30cd\u30a4\u30eb\u53d6\u5f97\u5931\u6557\u306f\u51e6\u7406\u3092\u6b62\u3081\u306a\u3044 */ }\n\nif (featuredMediaId) wpBody.featured_media = featuredMediaId;\n\nreturn { json: { wpBody, authHeader, wp_url: cfg.wp_url, sheets_id: cfg.sheets_id, slug: vt.slug, tool_name: vt.tool_name } };"
      },
      "id": "new-gemini-code-1773727081080",
      "name": "Gemini & Prepare WP Body",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -288,
        32
      ],
      "notes": "Gemini 2.5 Flash \u3067SEO\u8a18\u4e8b\u751f\u6210 + WP Body\u7d44\u307f\u7acb\u3066\u3002SEOPress\u30e1\u30bf\u3082\u540c\u6642\u8a2d\u5b9a\u3002"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "={{ $json.wp_url }}/wp-json/wp/v2/vtubers",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "={{ $json.authHeader }}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "contentType": "raw",
        "rawContentType": "application/json",
        "body": "={{ JSON.stringify($json.wpBody) }}",
        "options": {
          "timeout": 30000
        }
      },
      "id": "6ef583af-2773-40a5-af6b-b9d3239e9ba9",
      "name": "Create WP Post",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        160,
        32
      ]
    },
    {
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "const wpRes = $input.item.json;\nconst prev  = $('Gemini & Prepare WP Body').item.json;\nreturn { json: { slug: prev.slug, dir_status: 'published', dir_post_id: String(wpRes.id), published_url: wpRes.link, sheets_id: prev.sheets_id, timestamp: new Date().toISOString() } };"
      },
      "id": "be100a04-8af3-4afd-9bc4-185bcee0c5ff",
      "name": "Extract WP Response",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        368,
        32
      ]
    },
    {
      "parameters": {
        "operation": "update",
        "documentId": {
          "__rl": true,
          "value": "={{ $json.sheets_id }}",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "vtubers_db",
          "mode": "name"
        },
        "columns": {
          "mappingMode": "autoMapInputData",
          "value": {},
          "matchingColumns": [
            "slug"
          ],
          "schema": [
            {
              "id": "slug",
              "displayName": "slug",
              "defaultMatch": true
            },
            {
              "id": "dir_status",
              "displayName": "dir_status"
            },
            {
              "id": "dir_post_id",
              "displayName": "dir_post_id"
            },
            {
              "id": "published_url",
              "displayName": "published_url"
            }
          ]
        },
        "options": {}
      },
      "id": "c4bb770a-a8fa-4077-94cb-5c8f6d072004",
      "name": "Update vtubers_db",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        592,
        32
      ]
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": {
          "__rl": true,
          "value": "={{ $('Extract WP Response').item.json.sheets_id }}",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "logs",
          "mode": "name"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "timestamp": "={{ $('Extract WP Response').item.json.timestamp }}",
            "workflow": "WF01-directory-post",
            "keyword_or_slug": "={{ $('Extract WP Response').item.json.slug }}",
            "status": "published",
            "error_message": "",
            "retry_count": "0"
          },
          "schema": [
            {
              "id": "timestamp"
            },
            {
              "id": "workflow"
            },
            {
              "id": "keyword_or_slug"
            },
            {
              "id": "status"
            },
            {
              "id": "error_message"
            },
            {
              "id": "retry_count"
            }
          ]
        },
        "options": {}
      },
      "id": "9d6c7a8e-e9e3-4778-bbd5-86ecdb05550f",
      "name": "Append Log",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        816,
        32
      ]
    }
  ],
  "connections": {
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Read Config",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read Config": {
      "main": [
        [
          {
            "node": "Parse Config",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Config": {
      "main": [
        [
          {
            "node": "Read vtubers_db",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read vtubers_db": {
      "main": [
        [
          {
            "node": "Filter Pending",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Pending": {
      "main": [
        [
          {
            "node": "Has Pending?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Has Pending?": {
      "main": [
        [
          {
            "node": "Gemini & Prepare WP Body",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Gemini & Prepare WP Body": {
      "main": [
        [
          {
            "node": "Create WP Post",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create WP Post": {
      "main": [
        [
          {
            "node": "Extract WP Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract WP Response": {
      "main": [
        [
          {
            "node": "Update vtubers_db",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update vtubers_db": {
      "main": [
        [
          {
            "node": "Append Log",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1",
    "saveManualExecutions": true,
    "callerPolicy": "workflowsFromSameOwner"
  },
  "active": false,
  "meta": {
    "templateCredsSetupCompleted": true
  }
}