Blueskyでトレンドを生成する

上級

これはMarketing分野の自動化ワークフローで、20個のノードを含みます。主にSet, Code, Wait, HttpRequest, SplitInBatchesなどのノードを使用。 Blueskyでトピックを作成する

前提条件
  • ターゲットAPIの認証情報が必要な場合あり

カテゴリー

ワークフロープレビュー
ノード接続関係を可視化、ズームとパンをサポート
ワークフローをエクスポート
以下のJSON設定をn8nにインポートして、このワークフローを使用できます
{
  "id": "7ZIG5xxEACMBgj4Z",
  "meta": {
    "instanceId": "1b1e85a338c6ce950207b3b471d43405c7b292e6b980ee5b66c1a9e5af2a50f8"
  },
  "name": "Create Threads on Bluesky",
  "tags": [
    {
      "id": "f3JGorUk16BX0hZI",
      "name": "Bluesky",
      "createdAt": "2025-01-19T09:37:40.989Z",
      "updatedAt": "2025-01-19T09:37:40.989Z"
    },
    {
      "id": "hTHZamkzaTBmF3yo",
      "name": "Template",
      "createdAt": "2025-01-16T04:45:44.377Z",
      "updatedAt": "2025-01-16T04:45:44.377Z"
    }
  ],
  "nodes": [
    {
      "id": "5fea442d-80e7-4e9c-9214-12fa8bc98a71",
      "name": "Blueskyセッション作成",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -2160,
        540
      ],
      "parameters": {
        "url": "https://bsky.social/xrpc/com.atproto.server.createSession",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "identifier",
              "value": "={{ $json.BlueskyHandle }}"
            },
            {
              "name": "password",
              "value": "={{ $json.BlueskyAppPassword }}"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "8339e67d-87f8-48a5-a9c9-48d90d9baf49",
      "name": "返信作成",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1200,
        540
      ],
      "parameters": {
        "url": "https://bsky.social/xrpc/com.atproto.repo.createRecord",
        "method": "POST",
        "options": {},
        "jsonBody": "={{ $('Create Reply Text').item.json.toJsonString() }}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $('Create Bluesky Session').item.json.accessJwt}}"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "16fa4a6c-ab93-4ea1-9a9b-2f9e9804e25a",
      "name": "毎日9時に実行",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -2640,
        540
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 9
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "7c06e67d-a524-457b-a6ce-955aab353352",
      "name": "Bluesky認証情報設定",
      "type": "n8n-nodes-base.set",
      "position": [
        -2380,
        540
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "ec07f538-0164-40c5-a199-45e2a8a4604a",
              "name": "BlueskyHandle",
              "type": "string",
              "value": "[enter your bluesky handle here]"
            },
            {
              "id": "463e906c-c49b-41e0-9176-04bd2c175d0b",
              "name": "BlueskyAppPassword",
              "type": "string",
              "value": "[enter your app password here]"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "156da8f4-5cc7-4a58-9a6c-75b1bd6df4cd",
      "name": "付箋",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2440,
        340
      ],
      "parameters": {
        "color": 3,
        "width": 440,
        "height": 360,
        "content": "## Bluesky Authentication\nSet your Bluesky social link and also your App Password."
      },
      "typeVersion": 1
    },
    {
      "id": "2bd742a8-3955-4452-95c8-9c9a7b8071e2",
      "name": "付箋1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1960,
        340
      ],
      "parameters": {
        "color": 4,
        "width": 440,
        "height": 360,
        "content": "## Initial Post [A]\nWhen the first post is created two identifiers are returned:\n- URI (an at:// link to the post)\n- CID (a content-hash of the post)"
      },
      "typeVersion": 1
    },
    {
      "id": "e6e258e8-e4a7-4e33-bd7c-40dd4eb8842f",
      "name": "付箋2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1480,
        340
      ],
      "parameters": {
        "color": 5,
        "width": 460,
        "height": 360,
        "content": "## First Reply Post [B]\nHere we set the 'ROOT' and the 'PARENT' values.\n\nWe use both URI and CID as ROOT and PARENT, as this is the first child of the root post (Initial Post [A]).\n\nWe receive a new URI and CID in return."
      },
      "typeVersion": 1
    },
    {
      "id": "8e3808d3-ec7d-4f46-89b7-9b27350801de",
      "name": "付箋3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2440,
        740
      ],
      "parameters": {
        "width": 440,
        "height": 380,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## Sibling Post [C]\nSet 'ROOT' using URI/CID from the root post (Initial Post [A]).\n\nFor the PARENT, we use the URI and CID returned by the preceeding post (First Reply Post [B])."
      },
      "typeVersion": 1
    },
    {
      "id": "0b9d8329-2dde-4b3b-bd9e-42d5aa367225",
      "name": "返信テキスト作成",
      "type": "n8n-nodes-base.code",
      "position": [
        -1420,
        540
      ],
      "parameters": {
        "jsCode": "// Create the reply text\nconst replyText = \"[reply post - hidden]\";\n\n// Calculate timestamp 1 second from now\nconst futureDate = new Date(Date.now() + 1000);\n\n// Create the reply post object\nconst replyPostData = {\n    repo: $('Set Bluesky Credentials').first().json.BlueskyHandle,\n    collection: \"app.bsky.feed.post\",\n    record: {\n        \"$type\": \"app.bsky.feed.post\",\n        text: replyText,\n        reply: {\n            root: {\n                cid: $('Create Initial Post').first().json.cid,\n                uri: $('Create Initial Post').first().json.uri\n            },\n            parent: {\n                cid: $('Create Initial Post').first().json.cid,\n                uri: $('Create Initial Post').first().json.uri\n            }\n        },\n        createdAt: futureDate.toISOString()\n    }\n};\n\nreturn replyPostData;"
      },
      "typeVersion": 2
    },
    {
      "id": "abfbef84-1b94-4ec4-ae96-345d0ea888ce",
      "name": "関連投稿テキスト作成",
      "type": "n8n-nodes-base.code",
      "position": [
        -2380,
        780
      ],
      "parameters": {
        "jsCode": "// Create the sibling text\nconst siblingText = \"[first sibling - hidden]\";\n\n// Calculate timestamp 2 seconds from now\nconst futureDate = new Date(Date.now() + 2000);\n\n// Create the sibling post object\nconst siblingPostData = {\n    repo: $('Set Bluesky Credentials').first().json.BlueskyHandle,\n    collection: \"app.bsky.feed.post\",\n    record: {\n        \"$type\": \"app.bsky.feed.post\",\n        text: siblingText,\n        reply: {\n            root: {\n                cid: $('Create Initial Post').first().json.cid,\n                uri: $('Create Initial Post').first().json.uri\n            },\n            parent: {\n                cid: $('Create Reply').first().json.cid,\n                uri: $('Create Reply').first().json.uri\n            }\n        },\n        createdAt: futureDate.toISOString()\n    }\n};\n\nreturn siblingPostData;"
      },
      "typeVersion": 2
    },
    {
      "id": "f554f5bc-bd81-4b09-887b-6c4167e8f5f1",
      "name": "関連投稿作成",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -2160,
        780
      ],
      "parameters": {
        "url": "https://bsky.social/xrpc/com.atproto.repo.createRecord",
        "method": "POST",
        "options": {},
        "jsonBody": "={{ $('Create Sibling Text').item.json.toJsonString() }}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $('Create Bluesky Session').item.json.accessJwt}}"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "7a7025fe-4b35-44db-8974-2bc81c59eead",
      "name": "付箋5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2700,
        340
      ],
      "parameters": {
        "color": 7,
        "width": 220,
        "height": 360,
        "content": "## Trigger"
      },
      "typeVersion": 1
    },
    {
      "id": "097767bc-fbb2-4e71-af68-b87d354b796e",
      "name": "付箋6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1960,
        740
      ],
      "parameters": {
        "color": 6,
        "width": 940,
        "height": 380,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## Sibling Posts using Loop node [D]\nHere we set the 'ROOT' using both URI and CID from the root post (Initial Post [A]), and for all future siblings.\n\nFor the PARENT, we use the URI and CID returned by the preceeding post.\nSo the first loop iteration gets it from the 'Create Sibling' node, and after that from the 'Create Post' node."
      },
      "typeVersion": 1
    },
    {
      "id": "5f8e88ef-0f56-4d81-921f-17dbfea41eec",
      "name": "投稿をループ処理",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -1720,
        780
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "449a0269-61cb-477c-b315-943daada65ba",
      "name": "初期投稿作成",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1680,
        540
      ],
      "parameters": {
        "url": "https://bsky.social/xrpc/com.atproto.repo.createRecord",
        "method": "POST",
        "options": {},
        "jsonBody": "={{ $('Create Post Text').item.json.toJsonString() }}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $('Create Bluesky Session').item.json.accessJwt}}"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "e29aa109-2b11-44c7-9a85-b5199ef4923c",
      "name": "投稿作成",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1360,
        780
      ],
      "parameters": {
        "url": "https://bsky.social/xrpc/com.atproto.repo.createRecord",
        "method": "POST",
        "options": {},
        "jsonBody": "={{ $('Create Sibling Text (Loop)').item.json.toJsonString() }}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $('Create Bluesky Session').item.json.accessJwt}}"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "51c05a08-797b-448b-b291-753be14d7c78",
      "name": "待機",
      "type": "n8n-nodes-base.wait",
      "position": [
        -1200,
        780
      ],
      "webhookId": "0414c5a9-938c-427d-98a2-1295eb02380d",
      "parameters": {
        "amount": 2
      },
      "typeVersion": 1.1
    },
    {
      "id": "b9f1bd23-e8f2-472b-ab61-05e85ffece12",
      "name": "投稿テキスト作成",
      "type": "n8n-nodes-base.code",
      "position": [
        -1900,
        540
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "// Create the initial post text\nconst postText = \"[initial post - visible]\";\n\n// Create the parent post object\nconst postData = {\n    repo: $('Set Bluesky Credentials').first().json.BlueskyHandle,\n    collection: \"app.bsky.feed.post\",\n    record: {\n        $type: \"app.bsky.feed.post\",\n        text: postText,\n        createdAt: $now\n    }\n};\n\nreturn postData;"
      },
      "typeVersion": 2
    },
    {
      "id": "6c1e26df-564e-4b49-8aff-bc6e5bedcbb8",
      "name": "関連投稿配列作成",
      "type": "n8n-nodes-base.code",
      "position": [
        -1900,
        780
      ],
      "parameters": {
        "jsCode": "const items = [\n    { id: 2, name: '[sibling two - hidden]' },\n    { id: 3, name: '[sibling three - hidden]' },\n    { id: 4, name: '[sibling four - hidden]' },\n    { id: 5, name: '[sibling five - hidden]' },\n    { id: 6, name: '[sibling six - hidden]' },\n    { id: 7, name: '[sibling seven - hidden]' },\n    { id: 8, name: '[sibling eight - hidden]' },\n    { id: 9, name: '[sibling nine - visible]' },\n    { id: 10, name: '[sibling ten - visible]' }\n];\n\nreturn items;"
      },
      "typeVersion": 2
    },
    {
      "id": "5a91aff4-1b9d-4c69-beed-fa906c2a133b",
      "name": "関連投稿テキスト作成(ループ)",
      "type": "n8n-nodes-base.code",
      "position": [
        -1540,
        780
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "// Create the sibling text\nconst siblingText = `[${$json.name}]`;\n\n// For the first iteration, use the parent IDs from Create Sibling node\n// For subsequent iterations, use the Create Post node\nconst isFirstIteration = $runIndex === 0;\nconst cid = isFirstIteration \n    ? $('Create Sibling').first().json.cid \n    : $('Create Post').first().json.cid;\nconst uri = isFirstIteration \n    ? $('Create Sibling').first().json.uri \n    : $('Create Post').first().json.uri;\n\n// Calculate timestamp 2 seconds from now\nconst futureDate = new Date(Date.now() + 2000);\n\n// Create the sibling post object\nconst siblingPostData = {\n    repo: $('Set Bluesky Credentials').first().json.BlueskyHandle,\n    collection: \"app.bsky.feed.post\",\n    record: {\n        \"$type\": \"app.bsky.feed.post\",\n        text: siblingText,\n        reply: {\n            root: {\n                cid: $('Create Initial Post').first().json.cid,\n                uri: $('Create Initial Post').first().json.uri\n            },\n            parent: {\n                cid: cid,\n                uri: uri\n            }\n        },\n        createdAt: futureDate.toISOString()\n    }\n};\n\nreturn siblingPostData;"
      },
      "typeVersion": 2
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "d0c40145-fbf4-46b5-9df0-5b5c9c896d9c",
  "connections": {
    "51c05a08-797b-448b-b291-753be14d7c78": {
      "main": [
        [
          {
            "node": "5f8e88ef-0f56-4d81-921f-17dbfea41eec",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5f8e88ef-0f56-4d81-921f-17dbfea41eec": {
      "main": [
        [],
        [
          {
            "node": "5a91aff4-1b9d-4c69-beed-fa906c2a133b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "e29aa109-2b11-44c7-9a85-b5199ef4923c": {
      "main": [
        [
          {
            "node": "51c05a08-797b-448b-b291-753be14d7c78",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8339e67d-87f8-48a5-a9c9-48d90d9baf49": {
      "main": [
        [
          {
            "node": "abfbef84-1b94-4ec4-ae96-345d0ea888ce",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "f554f5bc-bd81-4b09-887b-6c4167e8f5f1": {
      "main": [
        [
          {
            "node": "6c1e26df-564e-4b49-8aff-bc6e5bedcbb8",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "b9f1bd23-e8f2-472b-ab61-05e85ffece12": {
      "main": [
        [
          {
            "node": "449a0269-61cb-477c-b315-943daada65ba",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0b9d8329-2dde-4b3b-bd9e-42d5aa367225": {
      "main": [
        [
          {
            "node": "8339e67d-87f8-48a5-a9c9-48d90d9baf49",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "16fa4a6c-ab93-4ea1-9a9b-2f9e9804e25a": {
      "main": [
        [
          {
            "node": "7c06e67d-a524-457b-a6ce-955aab353352",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "449a0269-61cb-477c-b315-943daada65ba": {
      "main": [
        [
          {
            "node": "0b9d8329-2dde-4b3b-bd9e-42d5aa367225",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "abfbef84-1b94-4ec4-ae96-345d0ea888ce": {
      "main": [
        [
          {
            "node": "f554f5bc-bd81-4b09-887b-6c4167e8f5f1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6c1e26df-564e-4b49-8aff-bc6e5bedcbb8": {
      "main": [
        [
          {
            "node": "5f8e88ef-0f56-4d81-921f-17dbfea41eec",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5fea442d-80e7-4e9c-9214-12fa8bc98a71": {
      "main": [
        [
          {
            "node": "b9f1bd23-e8f2-472b-ab61-05e85ffece12",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "7c06e67d-a524-457b-a6ce-955aab353352": {
      "main": [
        [
          {
            "node": "5fea442d-80e7-4e9c-9214-12fa8bc98a71",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5a91aff4-1b9d-4c69-beed-fa906c2a133b": {
      "main": [
        [
          {
            "node": "e29aa109-2b11-44c7-9a85-b5199ef4923c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
よくある質問

このワークフローの使い方は?

上記のJSON設定コードをコピーし、n8nインスタンスで新しいワークフローを作成して「JSONからインポート」を選択、設定を貼り付けて認証情報を必要に応じて変更してください。

このワークフローはどんな場面に適していますか?

上級 - マーケティング

有料ですか?

このワークフローは完全無料です。ただし、ワークフローで使用するサードパーティサービス(OpenAI APIなど)は別途料金が発生する場合があります。

ワークフロー情報
難易度
上級
ノード数20
カテゴリー1
ノードタイプ7
難易度説明

上級者向け、16ノード以上の複雑なワークフロー

作成者
Gareth B. Davies

Gareth B. Davies

@garethbdavies

API/AI/Automation Coach with 30 years experience helping teams build sustainable, efficient processes and systems. Join my Automate 30 for 30 live cohort and course to reclaim your time.

外部リンク
n8n.ioで表示

このワークフローを共有

カテゴリー

カテゴリー: 34