株式市場の日次レポートを自動化
上級
これはContent Creation, Multimodal AI分野の自動化ワークフローで、27個のノードを含みます。主にSet, Wait, Switch, Airtable, SplitOutなどのノードを使用。 Bright Data、GPT-4.1、Airtable、Gmail を使った自動化による毎日の株式市場レポート
前提条件
- •Airtable API Key
- •Googleアカウント + Gmail API認証情報
- •ターゲットAPIの認証情報が必要な場合あり
- •OpenAI API Key
使用ノード (27)
ワークフロープレビュー
ノード接続関係を可視化、ズームとパンをサポート
ワークフローをエクスポート
以下のJSON設定をn8nにインポートして、このワークフローを使用できます
{
"id": "dnw1cvGPaYS9dCog",
"meta": {
"instanceId": "18b0d04ad5030054be4ab49562e84ea4a079ab4cb036003697394140227c7e76",
"templateId": "5305",
"templateCredsSetupCompleted": true
},
"name": "Automated Daily Stock Market Report with Bright Data, GPT, Airtable, and Gmail",
"tags": [],
"nodes": [
{
"id": "0a0def72-9c6f-43fb-8db5-268da98f82dd",
"name": "Simple Memory",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
3904,
656
],
"parameters": {},
"typeVersion": 1.3
},
{
"id": "e13cbed2-0837-4b4b-82b4-49c61510dff5",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
3760,
656
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"id": "eDzFw4LYXVKJQcfH",
"name": "OpenAi account"
}
},
"typeVersion": 1.2
},
{
"id": "cf744498-62bf-4e6a-8570-dda7fea35fe5",
"name": "Daily Run Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
208,
576
],
"parameters": {
"rule": {
"interval": [
{}
]
}
},
"typeVersion": 1.2
},
{
"id": "d0ee4823-0536-415e-8fa9-861c1701665d",
"name": "銘柄リスト設定",
"type": "n8n-nodes-base.set",
"position": [
528,
576
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "8d1bd0c8-37bf-4028-a20c-ac214ec06d7b",
"name": "json",
"type": "array",
"value": "=[\n {\n \"ticker\": \"SHEL\",\n \"name\": \"Shell plc\",\n \"market_cap\": \"≈ $250B\"\n },\n {\n \"ticker\": \"NESN.SW\",\n \"name\": \"Nestlé S.A.\",\n \"market_cap\": \"≈ $320B\"\n },\n {\n \"ticker\": \"SAP\",\n \"name\": \"SAP SE\",\n \"market_cap\": \"≈ $210B\"\n },\n {\n \"ticker\": \"ASML\",\n \"name\": \"ASML Holding N.V.\",\n \"market_cap\": \"≈ $470B\"\n },\n {\n \"ticker\": \"SONY\",\n \"name\": \"Sony Group Corporation\",\n \"market_cap\": \"≈ $110B\"\n },\n {\n \"ticker\": \"TCEHY\",\n \"name\": \"Tencent Holdings Ltd.\",\n \"market_cap\": \"≈ $420B\"\n },\n {\n \"ticker\": \"BABA\",\n \"name\": \"Alibaba Group Holding Ltd.\",\n \"market_cap\": \"≈ $190B\"\n },\n {\n \"ticker\": \"7203.T\",\n \"name\": \"Toyota Motor Corporation\",\n \"market_cap\": \"≈ $270B\"\n },\n {\n \"ticker\": \"RHHBY\",\n \"name\": \"Roche Holding AG\",\n \"market_cap\": \"≈ $210B\"\n },\n {\n \"ticker\": \"NFLX\",\n \"name\": \"Netflix Inc.\",\n \"market_cap\": \"≈ $260B\"\n }\n]\n"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "88b7e912-af0c-4527-baa3-4f8cf0b072d1",
"name": "銘柄分割",
"type": "n8n-nodes-base.splitOut",
"position": [
816,
576
],
"parameters": {
"options": {},
"fieldToSplitOut": "json"
},
"typeVersion": 1
},
{
"id": "2aab292f-0287-4da6-86ee-83c5a9aee30a",
"name": "株キーワード準備",
"type": "n8n-nodes-base.set",
"position": [
1104,
576
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "8d9e80d9-16dd-4658-928f-d94735209bfd",
"name": "keyword",
"type": "string",
"value": "={{ $json.ticker }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "13f81727-f586-4fb6-be73-4880c9efd165",
"name": "Bright Data Scraper",
"type": "n8n-nodes-base.httpRequest",
"position": [
1456,
576
],
"parameters": {
"url": "https://api.brightdata.com/datasets/v3/trigger",
"method": "POST",
"options": {},
"jsonBody": "={{ $('Prepare Stock Keyword').all().map(item => item.json)}}",
"sendBody": true,
"sendQuery": true,
"sendHeaders": true,
"specifyBody": "json",
"queryParameters": {
"parameters": [
{
"name": "dataset_id",
"value": "gd_lmrpz3vxmz972ghd7"
},
{
"name": "include_errors",
"value": "true"
},
{
"name": "type",
"value": "discover_new"
},
{
"name": "discover_by",
"value": "keyword"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "=Bearer YOUR_BRIGHTDATA_API_KEY"
}
]
}
},
"executeOnce": true,
"typeVersion": 4.2
},
{
"id": "2cc8d35f-f255-4adc-b1d7-7f9ab34dde66",
"name": "スクレイピング進捗確認",
"type": "n8n-nodes-base.httpRequest",
"position": [
1936,
576
],
"parameters": {
"url": "=https://api.brightdata.com/datasets/v3/progress/{{ $json.snapshot_id }}",
"options": {},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_BRIGHTDATA_API_KEY"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "eb6ab86c-3e8b-4dc6-8d70-3346531905fa",
"name": "スクレイパーステータススイッチ",
"type": "n8n-nodes-base.switch",
"position": [
2368,
576
],
"parameters": {
"rules": {
"values": [
{
"outputKey": "ready",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "4712e222-2bad-4d91-be87-ab0e0693c0c6",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.status }}",
"rightValue": "ready"
}
]
},
"renameOutput": true
},
{
"outputKey": "running",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "9a473960-6ba5-4f1b-afc6-396348bd338d",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.status }}",
"rightValue": "=running"
}
]
},
"renameOutput": true
}
]
},
"options": {}
},
"typeVersion": 3.2
},
{
"id": "e27afbc7-8cae-44b6-b506-474bb2692f08",
"name": "データ待機",
"type": "n8n-nodes-base.wait",
"position": [
2480,
1088
],
"webhookId": "cf27222d-20db-4ba5-bd4c-e6ca05efd4d7",
"parameters": {
"amount": 20
},
"typeVersion": 1.1
},
{
"id": "5e828381-8268-4114-b16c-a60c4ca23e80",
"name": "スクレイピング結果取得",
"type": "n8n-nodes-base.httpRequest",
"position": [
2848,
560
],
"parameters": {
"url": "=https://api.brightdata.com/datasets/v3/snapshot/{{ $json.snapshot_id }}",
"options": {},
"sendQuery": true,
"sendHeaders": true,
"queryParameters": {
"parameters": [
{
"name": "format",
"value": "json"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_BRIGHTDATA_API_KEY"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "4c2826ee-30bb-4438-a531-c370edbe2103",
"name": "株価データ集計",
"type": "n8n-nodes-base.aggregate",
"position": [
3312,
560
],
"parameters": {
"options": {},
"aggregate": "aggregateAllItemData"
},
"typeVersion": 1
},
{
"id": "ef5165a4-0452-4b20-b2fa-994429f3bc5b",
"name": "デイリーサマリー生成(AI)",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
3792,
416
],
"parameters": {
"text": "=## 🎯 ROLE\nYou are an **AI-powered financial analyst agent** integrated inside an n8n workflow. \nYour responsibilities are to: \n- Parse incoming JSON datasets of U.S. equities (typically top 10 by market cap). \n- Detect **market trends, anomalies, and investor-relevant signals** from the data. \n- Convert raw JSON into a **professionally written HTML email digest**, with clear structure, styling, and actionable insights. \n- Act as if you were a **senior analyst writing for institutional investors**, keeping the tone sharp, concise, and technical. \n- Output only **clean HTML content** ready for use inside an email body (no markdown, no plaintext, no metadata). \n\n---\n\n## 📥 INPUT FORMAT (JSON)\n\nYou will receive daily input structured like this:\n\n```\nThe day and date today is {{ $now.format('cccc yyyy-MM-dd t') }}\n\nHere is today’s stock market data: =\n\n{{ $json.data.toJsonString() }}\n```\n\nWhere each stock object may contain: \n- `ticker` → Stock symbol (e.g., AAPL, NVDA) \n- `name` → Company name (e.g., Apple Inc.) \n- `market_cap` → Market capitalization \n- `price` → Current price or last close price \n- `change` → Daily percentage change (can be positive or negative) \n- `sentiment` → Qualitative sentiment (optional: 🟢 Positive, 🟡 Neutral, 🔴 Negative) \n- `news` → Associated news snippets (optional) \n\n---\n\n## ✅ TASKS\n\n1. **Market Context** \n - Start with a headline summary of the day (general trend: bullish, bearish, or mixed). \n - Mention notable **macro events** or **sector-specific highlights** if derivable from input. \n\n2. **Top Movers** \n - Identify and highlight the **2 biggest gainers** and **2 biggest losers**. \n - Give context if available (based on percentage change or attached news). \n\n3. **Stock Data Table** \n - Generate a professional `<table>` with the following columns: \n - Ticker \n - Company Name \n - Daily % Change (with ↑/↓ and colored formatting) \n - Market Cap \n - Sentiment Icon (🟢 🟡 🔴) \n\n4. **Insights Section** \n - Provide **3–5 key takeaways**: \n - Example: “Tech continues outperforming with NVDA +X% and AAPL +Y%” \n - Highlight any **sector rotation, unusual volatility, or outlier performance**. \n - Mention if the **trend diverges** from broader market sentiment. \n\n5. **Upcoming Catalysts** \n - If `news` mentions future events (earnings calls, product launches, Fed meetings), list them in a dedicated section. \n - If no events are available, skip gracefully. \n\n6. **Professional Formatting** \n - Use inline CSS to ensure email compatibility. \n - Use clear hierarchy: \n - `<h2>` for main title (“Daily U.S. Stock Market Digest – {Date}”) \n - `<h3>` for sub-sections (e.g., “Top Gainers & Losers”, “Market Insights”, “Upcoming Events”) \n - `<ul>` for bullet point insights \n - `<table>` for stock performance data \n - Add color indicators for sentiment: \n - 🟢 Positive = green text \n - 🟡 Neutral = gold text \n - 🔴 Negative = red text \n\n---\n\n## ✨ OUTPUT FORMAT (HTML Only)\n\n- Produce **only** HTML, no markdown. \n- Must be **email-client safe**: \n - Inline styles only (no external CSS). \n - Avoid JavaScript or advanced CSS. \n- Structure example: \n\n```html\n<h2>Daily U.S. Stock Market Digest – Thursday 2025-09-18</h2>\n\n<h3>📈 Top Gainers & Losers</h3>\n<ul>\n <li>NVDA +4.2% 🟢 — driven by strong chip demand</li>\n <li>TSLA -3.1% 🔴 — impacted by regulatory concerns</li>\n</ul>\n\n<h3>📊 Market Overview</h3>\n<table style=\"border-collapse:collapse;width:100%;\">\n <tr style=\"background:#f2f2f2;\">\n <th>Ticker</th><th>Company</th><th>Change %</th><th>Market Cap</th><th>Sentiment</th>\n </tr>\n <tr>\n <td>NVDA</td><td>NVIDIA Corporation</td><td style=\"color:green;\">+4.2%</td><td>$3.6T</td><td>🟢</td>\n </tr>\n <tr>\n <td>TSLA</td><td>Tesla Inc.</td><td style=\"color:red;\">-3.1%</td><td>$830B</td><td>🔴</td>\n </tr>\n</table>\n\n<h3>💡 Key Insights</h3>\n<ul>\n <li>Tech leads with NVDA and MSFT posting strong gains.</li>\n <li>Healthcare sector showed weakness with JNJ down 2%.</li>\n <li>Overall sentiment remained mixed ahead of Fed decision.</li>\n</ul>\n\n<h3>📅 Upcoming Events</h3>\n<ul>\n <li>Fed interest rate decision — Sept 20</li>\n <li>Apple iPhone launch event — Sept 21</li>\n</ul>\n\n<footer style=\"margin-top:20px;font-size:12px;color:#888;\">\n Generated automatically by your AI-powered stock monitor.\n</footer>\n```\n\n---\n\n## ⚠️ CONSTRAINTS\n\n- Do **not** include email subject or headers. \n- Do **not** output explanations, reasoning, or markdown. \n- Always output **clean HTML only**. \n- Ensure the HTML is **ready-to-send** in an email body without manual edits. \n- If data is missing, skip the section gracefully without placeholders. \n\n---\n\n## 📬 GOAL\n\nDeliver a **polished, mobile-friendly, and insight-rich stock market digest email**. \nFinal output must require zero manual edits, look professional for finance users, and be directly usable in n8n’s Gmail/SMTP nodes. \n",
"options": {},
"promptType": "define"
},
"typeVersion": 2
},
{
"id": "3f953ffd-4faa-4cd5-bd3a-b3a6d021eebf",
"name": "Gmail経由でレポート送信",
"type": "n8n-nodes-base.gmailTool",
"position": [
4064,
624
],
"webhookId": "fe4a416a-43f3-4ad1-80c8-51f1de4c2343",
"parameters": {
"sendTo": "Baptiste.fort.pro@gmail.com",
"message": "={{ $('Generate Daily Summary (AI)').first().json.output }}",
"options": {
"appendAttribution": false
},
"subject": "=Daily Stock Market Digest "
},
"credentials": {
"gmailOAuth2": {
"id": "RpkU3PW6jAmCX8ih",
"name": "Gmail account"
}
},
"typeVersion": 2.1
},
{
"id": "ae4e0ac6-1afb-463a-a273-7dac2dc975e3",
"name": "Airtableへ保存(デイリー株価)",
"type": "n8n-nodes-base.airtable",
"position": [
2944,
-288
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appqPdjbR45flhdgT",
"cachedResultUrl": "https://airtable.com/appqPdjbR45flhdgT",
"cachedResultName": "Untitled Base"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblvIkbZriGaCrfzP",
"cachedResultUrl": "https://airtable.com/appqPdjbR45flhdgT/tblvIkbZriGaCrfzP",
"cachedResultName": "Daily Stocks"
},
"columns": {
"value": {
"Price": "={{ $json.price }}",
"Ticker": "={{ $json.ticker }}",
"Company": "={{ $json.name }}",
"Change %": "={{ $json.change }}",
"Sentiment": "={{ $json.sentiment }}",
"Market Cap": "={{ $json.market_cap }}"
},
"schema": [
{
"id": "Ticker",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Ticker",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Company",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Company",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Market Cap",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Market Cap",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Price",
"type": "number",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Price",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Change %",
"type": "number",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Change %",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Sentiment",
"type": "options",
"display": true,
"options": [
{
"name": "🟢 Positive",
"value": "🟢 Positive"
},
{
"name": "🟡 Neutral",
"value": "🟡 Neutral"
},
{
"name": "🔴 Negative",
"value": "🔴 Negative"
}
],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Sentiment",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Date",
"type": "dateTime",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Date",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "create"
},
"credentials": {
"airtableTokenApi": {
"id": "vKZ5Wl43rmNFe0My",
"name": "Airtable Personal Access Token account 3"
}
},
"typeVersion": 2.1
},
{
"id": "ae35f4c3-6d12-440e-9cf5-c465a7c7d3ee",
"name": "付箋",
"type": "n8n-nodes-base.stickyNote",
"position": [
144,
160
],
"parameters": {
"color": 7,
"width": 288,
"height": 592,
"content": "## ⏰ Daily Run Trigger (Schedule Trigger)\n\n### Purpose\nStarts the workflow automatically at fixed intervals. \nThis ensures the stock digest runs daily without manual input.\n\n### Parameters\n- **Trigger Type**: `Time Interval` or `Cron`\n- **Every X**: `1 Day` (or custom interval)\n- **Timezone**: `UTC` or your local timezone\n- **Start Time**: optional (e.g., `09:00`)"
},
"typeVersion": 1
},
{
"id": "faa08484-c83e-49dd-bc8a-c29a0c9a95ce",
"name": "付箋1",
"type": "n8n-nodes-base.stickyNote",
"position": [
432,
96
],
"parameters": {
"color": 6,
"width": 288,
"height": 656,
"content": "## 📝 Set Stock List (Set Node – SAMPLE DATA)\n\n### Purpose\nDefines the list of stocks to track. \nThis acts as the **seed data** for the scraping step.\n\n### Parameters\n- **Values to Set**: `Fixed JSON`\n- **Keep Only Set**: `true`\n- **JSON Example**:\n ```json\n [\n { \"ticker\": \"AAPL\", \"name\": \"Apple Inc.\", \"market_cap\": \"≈ $3.0T\" },\n { \"ticker\": \"MSFT\", \"name\": \"Microsoft Corporation\", \"market_cap\": \"≈ $3.6T\" }\n ]"
},
"typeVersion": 1
},
{
"id": "57ff48b7-fb7a-4c8e-b122-ff8878a46a97",
"name": "付箋2",
"type": "n8n-nodes-base.stickyNote",
"position": [
720,
208
],
"parameters": {
"color": 4,
"width": 288,
"height": 544,
"content": "## 🔀 Split Stocks (Split Out)\n\n### Purpose\nTakes the stock list (array) and splits it into **individual items**, \nso each stock can be processed separately in the workflow.\n\n### Parameters\n- **Operation**: `Split Out Items`\n- **Field to Split**: `stocks[]` (array field from Set node)\n"
},
"typeVersion": 1
},
{
"id": "04a19b0a-1d0f-4fc3-9b5a-a1dbe39daf8e",
"name": "付箋3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1008,
160
],
"parameters": {
"color": 6,
"width": 288,
"height": 592,
"content": "## 🏷 Prepare Stock Keyword (Set Node)\n\n### Purpose\nAdds a `keyword` field for each stock item. \nThis keyword is used by Bright Data’s scraper to identify which stock to fetch.\n\n### Parameters\n- **Values to Set**: `Add Field`\n- **Field Name**: `keyword`\n- **Value**: `{{ $json[\"ticker\"] }}`"
},
"typeVersion": 1
},
{
"id": "a24344d1-ef9c-4333-83b8-b8e1055667ed",
"name": "付箋4",
"type": "n8n-nodes-base.stickyNote",
"position": [
1296,
160
],
"parameters": {
"color": 2,
"width": 480,
"height": 592,
"content": "## 🕸 Bright Data Scraper (HTTP Request)\n\n### Purpose\nSends a request to **Bright Data API** to launch a stock scraping job. \nIt returns a `snapshot_id` used later to fetch results.\n\n### Parameters\n- **Method**: `POST`\n- **Endpoint**: `https://api.brightdata.com/datasets/v1/trigger`\n- **Authentication**: `API Token` \n (Header: `Authorization: Bearer <token>`)\n- **Body Fields**:\n - `dataset_id`: Bright Data dataset ID\n - `discover_by`: `keyword`\n - `keyword`: stock ticker\n"
},
"typeVersion": 1
},
{
"id": "608e6709-2b53-4b85-8a6f-04339d4f7029",
"name": "付箋5",
"type": "n8n-nodes-base.stickyNote",
"position": [
1776,
160
],
"parameters": {
"color": 4,
"width": 432,
"height": 592,
"content": "## 🔄 Check Scraper Progress (HTTP Request)\n\n### Purpose\nChecks if the Bright Data scraping job is finished or still running. \nLoops until results are ready.\n\n### Parameters\n- **Method**: `GET`\n- **Endpoint**: `https://api.brightdata.com/datasets/v1/snapshots/{snapshot_id}`\n- **Authentication**: `API Token`\n- **Query Params**:\n - `snapshot_id`: returned from Bright Data Scraper\n - `status`: current job status (`running`, `ready`)"
},
"typeVersion": 1
},
{
"id": "8e82b0a8-1682-4b7f-b12d-a5569ac1e70a",
"name": "付箋6",
"type": "n8n-nodes-base.stickyNote",
"position": [
2208,
752
],
"parameters": {
"color": 6,
"width": 432,
"height": 512,
"content": "## ⏳ Wait for Data (Wait Node)\n\n### Purpose\nPauses the workflow for a fixed time before checking the scraper progress again. \nThis prevents API rate limits and ensures Bright Data has time to finish the job.\n\n### Parameters\n- **Mode**: `Wait a fixed amount of time`\n- **Time**: e.g., `30 seconds`"
},
"typeVersion": 1
},
{
"id": "6350cebc-4794-49df-a637-a982ab96a7fe",
"name": "付箋7",
"type": "n8n-nodes-base.stickyNote",
"position": [
2208,
160
],
"parameters": {
"color": 7,
"width": 432,
"height": 592,
"content": "## 🔀 Scraper Status Switch (Switch Node)\n\n### Purpose\nRoutes the workflow based on the scraper job status. \nIf the status is `running`, it loops back to **Wait for Data**. \nIf the status is `ready`, it continues to fetch the snapshot.\n\n### Parameters\n- **Value to Check**: `status`\n- **Rules**:\n - Equals `running` → go to Wait\n - Equals `ready` → go to Fetch Scraper Results\n"
},
"typeVersion": 1
},
{
"id": "93becc4b-e2ea-42e8-8eca-9e9e0f79d0c8",
"name": "付箋8",
"type": "n8n-nodes-base.stickyNote",
"position": [
2640,
160
],
"parameters": {
"width": 512,
"height": 608,
"content": "## 📥 Fetch Scraper Results (HTTP Request)\n\n### Purpose\nRetrieves the completed stock market data from Bright Data once the job is finished. \nThe results are returned as JSON and include price, change %, sentiment, and more.\n\n### Parameters\n- **Method**: `GET`\n- **Endpoint**: `https://api.brightdata.com/datasets/v1/snapshots/{snapshot_id}/data`\n- **Authentication**: `API Token`\n- **Query Params**:\n - `snapshot_id`: ID from Bright Data Scraper\n - `format`: `json`"
},
"typeVersion": 1
},
{
"id": "867cf6ea-2a5f-45fa-98a7-68d194df1dfc",
"name": "付箋9",
"type": "n8n-nodes-base.stickyNote",
"position": [
3152,
112
],
"parameters": {
"color": 3,
"width": 512,
"height": 656,
"content": "## 📊 Aggregate Stock Data (Aggregate Node)\n\n### Purpose\nMerges the stock data from multiple items (each ticker) into one consolidated dataset. \nThis is used as input for the AI to generate a summary.\n\n### Parameters\n- **Mode**: `Aggregate`\n- **Fields to Include**: \n - `ticker` \n - `name` \n - `price` \n - `change` \n - `sentiment` \n- **Output**: Single JSON object with all stock records\n"
},
"typeVersion": 1
},
{
"id": "8e741c22-987f-4f7a-9e2b-d1d2158ec074",
"name": "付箋10",
"type": "n8n-nodes-base.stickyNote",
"position": [
3664,
-240
],
"parameters": {
"color": 6,
"width": 880,
"height": 1008,
"content": "## 🤖 Generate Daily Summary (AI Node – OpenAI/Gemini)\n\n### Purpose\nUses an AI model to analyze the aggregated stock data. \nGenerates an HTML-formatted email with trends, top movers, insights, and upcoming events.\n\n### Parameters\n- **Model**: `gemini-2.0-flash-lite` (or `gpt-4.1` if using OpenAI)\n- **Input**: JSON data from Aggregate node\n- **Prompt**: \n - Analyze market trends \n - Identify top gainers/losers \n - Generate stock performance table \n - Add 3–5 insights \n - Format everything as **HTML email body**\n\n## 📧 Send Report via Gmail (Gmail Node)\n\n### Purpose\nDelivers the generated HTML stock market digest directly to the recipient’s inbox. \nThis is the final step that sends the daily summary email.\n\n### Parameters\n- **Operation**: `Send Email`\n- **Send To**: recipient email (e.g., `investor@domain.com`)\n- **Subject**: \n"
},
"typeVersion": 1
},
{
"id": "e03b89d9-d530-4c7f-8b9e-b85a39a1fa11",
"name": "付箋11",
"type": "n8n-nodes-base.stickyNote",
"position": [
2784,
-752
],
"parameters": {
"color": 6,
"width": 512,
"height": 656,
"content": "## 🗂 Save to Airtable (Airtable – Create Record)\n\n### Purpose\nStores each day’s stock data in Airtable for historical tracking. \nActs as a database of all reports.\n\n### Parameters\n- **Operation**: `Create Record`\n- **Base ID**: `appXXXXXX` (from Airtable URL)\n- **Table**: `Daily Stocks`\n- **Field Mapping**:\n - `Ticker` → `{{ $json.ticker }}`\n - `Company` → `{{ $json.name }}`\n - `Price` → `{{ $json.price }}`\n - `Change %` → `{{ $json.change }}`\n - `Sentiment` → `{{ $json.sentiment }}`\n - `Date` → `{{ $now.toISO() }}`\n"
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "ccdfd109-9fd2-40e4-981e-f85eef7cfba6",
"connections": {
"88b7e912-af0c-4527-baa3-4f8cf0b072d1": {
"main": [
[
{
"node": "2aab292f-0287-4da6-86ee-83c5a9aee30a",
"type": "main",
"index": 0
}
]
]
},
"0a0def72-9c6f-43fb-8db5-268da98f82dd": {
"ai_memory": [
[
{
"node": "ef5165a4-0452-4b20-b2fa-994429f3bc5b",
"type": "ai_memory",
"index": 0
}
]
]
},
"e27afbc7-8cae-44b6-b506-474bb2692f08": {
"main": [
[
{
"node": "2cc8d35f-f255-4adc-b1d7-7f9ab34dde66",
"type": "main",
"index": 0
}
]
]
},
"d0ee4823-0536-415e-8fa9-861c1701665d": {
"main": [
[
{
"node": "88b7e912-af0c-4527-baa3-4f8cf0b072d1",
"type": "main",
"index": 0
}
]
]
},
"cf744498-62bf-4e6a-8570-dda7fea35fe5": {
"main": [
[
{
"node": "d0ee4823-0536-415e-8fa9-861c1701665d",
"type": "main",
"index": 0
}
]
]
},
"e13cbed2-0837-4b4b-82b4-49c61510dff5": {
"ai_languageModel": [
[
{
"node": "ef5165a4-0452-4b20-b2fa-994429f3bc5b",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"13f81727-f586-4fb6-be73-4880c9efd165": {
"main": [
[
{
"node": "2cc8d35f-f255-4adc-b1d7-7f9ab34dde66",
"type": "main",
"index": 0
}
]
]
},
"4c2826ee-30bb-4438-a531-c370edbe2103": {
"main": [
[
{
"node": "ef5165a4-0452-4b20-b2fa-994429f3bc5b",
"type": "main",
"index": 0
}
]
]
},
"5e828381-8268-4114-b16c-a60c4ca23e80": {
"main": [
[
{
"node": "4c2826ee-30bb-4438-a531-c370edbe2103",
"type": "main",
"index": 0
},
{
"node": "ae4e0ac6-1afb-463a-a273-7dac2dc975e3",
"type": "main",
"index": 0
}
]
]
},
"2aab292f-0287-4da6-86ee-83c5a9aee30a": {
"main": [
[
{
"node": "13f81727-f586-4fb6-be73-4880c9efd165",
"type": "main",
"index": 0
}
]
]
},
"eb6ab86c-3e8b-4dc6-8d70-3346531905fa": {
"main": [
[
{
"node": "5e828381-8268-4114-b16c-a60c4ca23e80",
"type": "main",
"index": 0
}
],
[
{
"node": "e27afbc7-8cae-44b6-b506-474bb2692f08",
"type": "main",
"index": 0
}
]
]
},
"3f953ffd-4faa-4cd5-bd3a-b3a6d021eebf": {
"ai_tool": [
[
{
"node": "ef5165a4-0452-4b20-b2fa-994429f3bc5b",
"type": "ai_tool",
"index": 0
}
]
]
},
"2cc8d35f-f255-4adc-b1d7-7f9ab34dde66": {
"main": [
[
{
"node": "eb6ab86c-3e8b-4dc6-8d70-3346531905fa",
"type": "main",
"index": 0
}
]
]
},
"ef5165a4-0452-4b20-b2fa-994429f3bc5b": {
"main": [
[]
]
}
}
}よくある質問
このワークフローの使い方は?
上記のJSON設定コードをコピーし、n8nインスタンスで新しいワークフローを作成して「JSONからインポート」を選択、設定を貼り付けて認証情報を必要に応じて変更してください。
このワークフローはどんな場面に適していますか?
上級 - コンテンツ作成, マルチモーダルAI
有料ですか?
このワークフローは完全無料です。ただし、ワークフローで使用するサードパーティサービス(OpenAI APIなど)は別途料金が発生する場合があります。
関連ワークフロー
WordPressブログの自動化プロフェッショナル版(先端研究)v2.1マーケットプラグイン
GPT-4o、Perplexity AI、そして多言語対応を使ったSEO最適化ブログ作成の自動化
If
Set
Xml
+
If
Set
Xml
125 ノードDaniel Ng
コンテンツ作成
再生リスト詳細設定ボットコピー
Suno、GPT-4、Runway、Creatomate を使って AI 生成の YouTube ミュージックプレイリストを作成
If
Set
Code
+
If
Set
Code
203 ノードJoseph
コンテンツ作成
キーワードからGPT-5とfal.ai画像を使ってWordPressまで自動SEOブログ生成のプロセス
GPT-5とfal.ai画像を使用したキーワードからWordPressへのSEOブログ自動化プロセス
Set
Code
Wait
+
Set
Code
Wait
96 ノードPaul
コンテンツ作成
バッチSEOコンテンツ生成とAI画像付きWebflowドラフト作成(テンプレート)
GPT、Gemini画像、Webflowデラフトで行う大量SEOコンテンツ生成
If
Set
Code
+
If
Set
Code
54 ノードDahiana
コンテンツ作成
完全な B2B セールスフロー:Apollo リード生成、Mailgun 外信、および AI 返信管理
完全なB2Bセールスフロー:Apolloリード生成、Mailgunアウト Reach、AI返信管理
If
Set
Code
+
If
Set
Code
116 ノードPaul
コンテンツ作成
マージ
Suno API、Claude、Telegramボットを使って完全な20曲YouTubeプレイリストを作成
If
Set
Code
+
If
Set
Code
150 ノードJoseph
コンテンツ作成