AutomationFlowsWeb Scraping › CSBot Test Trigger with HTTP Request

CSBot Test Trigger with HTTP Request

Original n8n title: Csbot Test Trigger

CSBot Test Trigger. Uses httpRequest. Event-driven trigger; 6 nodes.

Event trigger★★★★☆ complexity6 nodesHTTP Request
Web Scraping Trigger: Event Nodes: 6 Complexity: ★★★★☆ Added:

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "name": "CSBot Test Trigger",
  "nodes": [
    {
      "parameters": {},
      "id": "b2c3d4e5-0001-4000-8000-000000000001",
      "name": "Run Tests",
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        250,
        300
      ]
    },
    {
      "parameters": {
        "jsCode": "// PRD 10\uac1c \uc2dc\ub098\ub9ac\uc624 + \ud3f4\ubc31 1\uac74 = \ucd1d 11\uac74 \ud14c\uc2a4\ud2b8\nconst testCases = [\n  {\n    id: 'S01',\n    category: '\ubc30\uc1a1\uc870\ud68c',\n    message: '\uc81c \uc8fc\ubb38 \uc5b8\uc81c \uc640\uc694?',\n    expect_keywords: ['\ubc30\uc1a1', '\uc870\ud68c', '\uc6b4\uc1a1\uc7a5']\n  },\n  {\n    id: 'S02',\n    category: '\ubc30\uc1a1\uc18c\uc694\uc77c',\n    message: '\uc8fc\ubb38\ud558\uba74 \uba70\uce60 \ub9cc\uc5d0 \uc640\uc694?',\n    expect_keywords: ['\ucd9c\uace0', '\uc601\uc5c5\uc77c', '\uc218\ub839']\n  },\n  {\n    id: 'S03',\n    category: '\uad50\ud658',\n    message: '\uc0ac\uc774\uc988\ub97c \uc798\ubabb \uc8fc\ubb38\ud588\uc5b4\uc694. \uad50\ud658 \uac00\ub2a5\ud55c\uac00\uc694?',\n    expect_keywords: ['\uad50\ud658', '\uc77c \uc774\ub0b4']\n  },\n  {\n    id: 'S04',\n    category: '\ubc18\ud488\ud658\ubd88',\n    message: '\ub9c8\uc74c\uc5d0 \uc548 \ub4e4\uc5b4\uc11c \ubc18\ud488\ud558\uace0 \uc2f6\uc5b4\uc694',\n    expect_keywords: ['\ubc18\ud488', '\ud658\ubd88', '\ubc30\uc1a1\ube44']\n  },\n  {\n    id: 'S05',\n    category: '\uc8fc\ubb38\ucde8\uc18c',\n    message: '\ubc29\uae08 \uc8fc\ubb38\ud588\ub294\ub370 \ucde8\uc18c\ud560 \uc218 \uc788\ub098\uc694?',\n    expect_keywords: ['\ucde8\uc18c', '\uc8fc\ubb38']\n  },\n  {\n    id: 'S06',\n    category: '\uc7ac\uc785\uace0',\n    message: '\ud488\uc808\uc778\ub370 \uc5b8\uc81c \ub2e4\uc2dc \ub4e4\uc5b4\uc624\ub098\uc694?',\n    expect_keywords: ['\uc7ac\uc785\uace0', '\ud488\uc808', '\uc54c\ub9bc']\n  },\n  {\n    id: 'S07',\n    category: '\uc601\uc5c5\uc2dc\uac04',\n    message: '\uace0\uac1d\uc13c\ud130 \uba87 \uc2dc\uae4c\uc9c0 \uc6b4\uc601\ud574\uc694?',\n    expect_keywords: ['\uc6b4\uc601', '\uc2dc\uac04']\n  },\n  {\n    id: 'S08',\n    category: '\uacb0\uc81c',\n    message: '\ubb34\ud1b5\uc7a5 \uc785\uae08 \uacc4\uc88c \uc54c\ub824\uc8fc\uc138\uc694',\n    expect_keywords: ['\uacb0\uc81c', '\uacc4\uc88c', '\uce74\ub4dc']\n  },\n  {\n    id: 'S09',\n    category: '\uc0c1\ud488\uc815\ubcf4',\n    message: '\uc774 \uc81c\ud488 \uc18c\uc7ac\uac00 \ubb54\uac00\uc694?',\n    expect_keywords: ['\uc0c1\ud488', '\uc0c1\uc138', '\ud398\uc774\uc9c0']\n  },\n  {\n    id: 'S10',\n    category: '\ubc30\uc1a1\uc9c0\uc5ed',\n    message: '\uc81c\uc8fc\ub3c4 \ubc30\uc1a1 \ub418\ub098\uc694?',\n    expect_keywords: ['\uc81c\uc8fc', '\ubc30\uc1a1']\n  },\n  {\n    id: 'F01',\n    category: '\ud3f4\ubc31',\n    message: '\uc0ac\uc7a5\ub2d8 \uc804\ud654\ubc88\ud638 \uc54c\ub824\uc8fc\uc138\uc694',\n    expect_keywords: ['\ub2f4\ub2f9\uc790', '\uc804\ub2ec']\n  }\n];\n\nreturn testCases.map(function(tc, idx) {\n  return {\n    json: {\n      test_id: tc.id,\n      test_category: tc.category,\n      test_index: idx + 1,\n      test_total: testCases.length,\n      expect_keywords: tc.expect_keywords,\n      request_body: {\n        store_id: '1',\n        session_id: 'test_' + tc.id + '_' + Date.now(),\n        channel: 'web_widget',\n        message: tc.message\n      }\n    }\n  };\n});",
        "mode": "runOnceForAllItems"
      },
      "id": "b2c3d4e5-0001-4000-8000-000000000002",
      "name": "Generate Test Cases",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        490,
        300
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "http://localhost:5678/webhook/csbot/message",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "content-type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "string",
        "body": "={{ JSON.stringify($json.request_body) }}",
        "options": {
          "timeout": 15000
        }
      },
      "id": "b2c3d4e5-0001-4000-8000-000000000003",
      "name": "Call CSBot Webhook",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        730,
        300
      ],
      "onError": "continueRegularOutput",
      "notes": "\uba54\uc778 \uc6cc\ud06c\ud50c\ub85c\uc6b0\uc758 Webhook\uc744 \ud638\ucd9c\ud569\ub2c8\ub2e4.\nURL\uc744 \uc2e4\uc81c n8n \ud658\uacbd\uc5d0 \ub9de\uac8c \uc218\uc815\ud558\uc138\uc694."
    },
    {
      "parameters": {
        "jsCode": "const test = $('Generate Test Cases').item;\nconst response = $input.item.json;\n\nvar botResponse = '';\nvar passed = false;\nvar details = '';\n\ntry {\n  // n8n HTTP Request v4.2\ub294 JSON \uc751\ub2f5\uc744 \uc9c1\uc811 $json\uc73c\ub85c \ubc18\ud658\n  botResponse = response.response || JSON.stringify(response);\n\n  // \ud0a4\uc6cc\ub4dc \ub9e4\uce6d \uac80\uc99d\n  var keywords = test.json.expect_keywords || [];\n  var matchedKeywords = [];\n  var missedKeywords = [];\n\n  keywords.forEach(function(kw) {\n    if (botResponse.includes(kw)) {\n      matchedKeywords.push(kw);\n    } else {\n      missedKeywords.push(kw);\n    }\n  });\n\n  // \ucd5c\uc18c 1\uac1c \ud0a4\uc6cc\ub4dc \ub9e4\uce6d \uc2dc PASS\n  passed = matchedKeywords.length > 0;\n  details = 'Matched: [' + matchedKeywords.join(', ') + ']';\n  if (missedKeywords.length > 0) {\n    details += ' | Missed: [' + missedKeywords.join(', ') + ']';\n  }\n} catch(e) {\n  botResponse = 'ERROR: ' + e.message;\n  details = 'Response parse failed';\n}\n\nvar status = passed ? 'PASS' : 'FAIL';\nvar emoji = passed ? '\u2705' : '\u274c';\n\nreturn [{\n  json: {\n    result: emoji + ' [' + test.json.test_id + '] ' + test.json.test_category + ': ' + status,\n    test_id: test.json.test_id,\n    category: test.json.test_category,\n    input_message: test.json.request_body.message,\n    bot_response: botResponse,\n    passed: passed,\n    details: details,\n    index: test.json.test_index + '/' + test.json.test_total\n  }\n}];",
        "mode": "runOnceForEachItem"
      },
      "id": "b2c3d4e5-0001-4000-8000-000000000004",
      "name": "Evaluate Result",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        970,
        300
      ]
    },
    {
      "parameters": {
        "jsCode": "const results = $input.all();\n\nvar passCount = 0;\nvar failCount = 0;\nvar lines = ['===== CS\ubd07 FAQ \ud14c\uc2a4\ud2b8 \uacb0\uacfc =====', ''];\n\nresults.forEach(function(r) {\n  lines.push(r.json.result);\n  if (r.json.passed) passCount++;\n  else failCount++;\n});\n\nvar total = passCount + failCount;\nvar rate = total > 0 ? Math.round((passCount / total) * 100) : 0;\n\nlines.push('');\nlines.push('\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500');\nlines.push('Total: ' + total + ' | Pass: ' + passCount + ' | Fail: ' + failCount);\nlines.push('Pass Rate: ' + rate + '% (\ubaa9\ud45c: 90%)');\nlines.push(rate >= 90 ? '\ud83c\udf89 \ubaa9\ud45c \ub2ec\uc131!' : '\u26a0\ufe0f \ubaa9\ud45c \ubbf8\ub2ec \u2014 FAQ \ub370\uc774\ud130 \ub610\ub294 \ud504\ub86c\ud504\ud2b8 \uc810\uac80 \ud544\uc694');\nlines.push('\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500');\n\nreturn [{\n  json: {\n    summary: lines.join('\\n'),\n    pass_count: passCount,\n    fail_count: failCount,\n    total: total,\n    pass_rate: rate\n  }\n}];",
        "mode": "runOnceForAllItems"
      },
      "id": "b2c3d4e5-0001-4000-8000-000000000005",
      "name": "Summary",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1210,
        300
      ]
    },
    {
      "parameters": {
        "content": "## CS\ubd07 \ud14c\uc2a4\ud2b8 \ud2b8\ub9ac\uac70\n\n### \uc0ac\uc6a9\ubc95\n1. **\uba54\uc778 \uc6cc\ud06c\ud50c\ub85c\uc6b0\ub97c \uba3c\uc800 \ud65c\uc131\ud654**\ud558\uc138\uc694\n2. \uc774 \uc6cc\ud06c\ud50c\ub85c\uc6b0\uc5d0\uc11c [Execute Workflow] \ud074\ub9ad\n3. Summary \ub178\ub4dc\uc5d0\uc11c \uacb0\uacfc \ud655\uc778\n\n### \ud14c\uc2a4\ud2b8 \ud56d\ubaa9 (11\uac74)\n- S01~S10: PRD 10\uac1c FAQ \uc2dc\ub098\ub9ac\uc624\n- F01: \ud3f4\ubc31 \ud14c\uc2a4\ud2b8\n\n### \uac80\uc99d \ubc29\uc2dd\n\uac01 \uc2dc\ub098\ub9ac\uc624\ubcc4 \uae30\ub300 \ud0a4\uc6cc\ub4dc\uac00\n\uc751\ub2f5\uc5d0 \ud3ec\ud568\ub418\uc5b4 \uc788\ub294\uc9c0 \ud655\uc778\n(1\uac1c \uc774\uc0c1 \ub9e4\uce6d \uc2dc PASS)",
        "width": 360,
        "height": 330
      },
      "id": "b2c3d4e5-0001-4000-8000-000000000099",
      "name": "Test Info",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -150,
        120
      ]
    }
  ],
  "connections": {
    "Run Tests": {
      "main": [
        [
          {
            "node": "Generate Test Cases",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Test Cases": {
      "main": [
        [
          {
            "node": "Call CSBot Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Call CSBot Webhook": {
      "main": [
        [
          {
            "node": "Evaluate Result",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Evaluate Result": {
      "main": [
        [
          {
            "node": "Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "tags": []
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

CSBot Test Trigger. Uses httpRequest. Event-driven trigger; 6 nodes.

Source: https://github.com/didulos/ai-automation-portfolio/blob/ab180e054b8b2adfda62480ba521bc91ac647aff/csbot-v1/src/n8n-workflows/test-trigger.json — original creator credit. Request a take-down →

More Web Scraping workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Web Scraping

This workflow allows you to import any workflow from a file or another n8n instance and map the credentials easily. A multi-form setup guides you through the entire process At the beginning you have t

Execute Command, Read Write File, HTTP Request +3
Web Scraping

[n8n] Advanced URL Parsing and Shortening Workflow - Switchy.io Integration. Uses splitInBatches, stickyNote, httpRequest, html. Event-driven trigger; 56 nodes.

HTTP Request, GitHub, Stop And Error +1
Web Scraping

[](https://youtu.be/c7yCZhmMjtI)

HTTP Request, GitHub, Stop And Error +1
Web Scraping

This automation organizes your n8n workflows files into categorizes (Active, Template, Done, Archived) and uploads them directly to a categorized Google Drive folders. It is designed to help users man

Google Drive, HTTP Request, Time Saved
Web Scraping

Create Animated Stories using GPT-4o-mini, Midjourney, Kling and Creatomate API. Uses httpRequest. Event-driven trigger; 51 nodes.

HTTP Request