X(旧Twitter)の投稿を自動取得してTelegramで複製出力

中級

これは自動化ワークフローで、14個のノードを含みます。主にCode, Wait, Telegram, HttpRequest, GoogleSheetsなどのノードを使用。 X(原Twitter)の画像投稿を自動取得してTelegramに投稿し、Google Sheetsで保存

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

カテゴリー

-
ワークフロープレビュー
ノード接続関係を可視化、ズームとパンをサポート
ワークフローをエクスポート
以下のJSON設定をn8nにインポートして、このワークフローを使用できます
{
  "id": "ptwolWvQwd2VnU5e",
  "meta": {
    "instanceId": "237139412ba2bdccb5393d058ace6ee50c6bb809e4f130ea2f9b24f70a336b94"
  },
  "name": "Auto Scrape X Posts & Publish to Telegram copy 2",
  "tags": [],
  "nodes": [
    {
      "id": "260d511b-12b8-4dfb-93d9-6d0317c49dea",
      "name": "重複を削除",
      "type": "n8n-nodes-base.removeDuplicates",
      "position": [
        512,
        -112
      ],
      "parameters": {
        "options": {
          "historySize": 10000
        },
        "operation": "removeItemsSeenInPreviousExecutions",
        "dedupeValue": "={{ $json.tweet_id }}"
      },
      "typeVersion": 2
    },
    {
      "id": "863dc17e-446c-4118-9171-0db7402b967f",
      "name": "アイテムをループ処理",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -16,
        224
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "a13ca579-f044-4900-94f2-675d012ffa64",
      "name": "トリガー: X でスクレイピング開始",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -512,
        -112
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "1939f7d2-4ebd-459c-aaaa-8c4f5fdd0e94",
      "name": "Twitter API",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -272,
        -112
      ],
      "parameters": {
        "url": "https://api.twitterapi.io/twitter/user/last_tweets",
        "options": {},
        "sendQuery": true,
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "queryParameters": {
          "parameters": [
            {
              "name": "userID",
              "value": "1361142028667662338"
            },
            {
              "name": "userName",
              "value": "@Inku_Fr"
            }
          ]
        }
      },
      "credentials": {
        "httpHeaderAuth": {
          "id": "L7K4reMunvy4mC3C",
          "name": "X scrapping utilisateur"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "9a988b26-1746-4175-b0ff-92c06f391d99",
      "name": "テキストと画像を含むツイートのみをフィルタリング",
      "type": "n8n-nodes-base.code",
      "position": [
        256,
        -112
      ],
      "parameters": {
        "jsCode": "// Filter only tweets that have text and an image\nreturn items\n  .map(item => {\n    return {\n      json: {\n        author_name: item.json.author_name,\n        author_username: item.json.author_username,\n        tweet_text: item.json.tweet_text,\n        tweet_url: item.json.tweet_url,\n        tweet_id: item.json.tweet_id,\n        created_at: item.json.created_at,\n        image_url: item.json.first_image_url // retrieve the image link\n      }\n    };\n  })\n  .filter(item => item.json.tweet_text && item.json.image_url); // only keeps tweets with text AND images\n"
      },
      "typeVersion": 2
    },
    {
      "id": "93da9f3b-fea4-4d56-a900-298891ccd28d",
      "name": "スクレイピングデータを google シートに保存",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -512,
        224
      ],
      "parameters": {
        "columns": {
          "value": {
            "URL": "={{ $json.tweet_url }}",
            "Date": "={{ $json.created_at }}",
            "Image": "={{ $json.image_url }}",
            "Contenu": "={{ $json.tweet_text }}",
            "ID Tweet": "={{ $json.tweet_id }}",
            "Nom du compte": "={{ $json.author_name }}",
            "Nom d'utilisateur": "={{ $json.author_username }}"
          },
          "schema": [
            {
              "id": "ID Tweet",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "ID Tweet",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "URL",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Contenu",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Contenu",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Image",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Image",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Nom d'utilisateur",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Nom d'utilisateur",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Nom du compte",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Nom du compte",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1MSy_TwbRjl_IprnzZp9yX_W8pLeVxPd1c_gNnJgtykY/edit#gid=0",
          "cachedResultName": "Feuille 1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1xZbBYTPYAW-625aRFwfxNzkTA-nbVY7Mv_EX3ubk1uQ",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1xZbBYTPYAW-625aRFwfxNzkTA-nbVY7Mv_EX3ubk1uQ/edit?usp=drivesdk",
          "cachedResultName": "INSTANT ANIME"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "fvaXnOXV63MxY546",
          "name": "Google Sheets account 4"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "4fc30aa0-ef16-4865-80f4-1b8e7d924d4f",
      "name": "スクレイピングデータを整形しリンクを削除",
      "type": "n8n-nodes-base.code",
      "position": [
        -272,
        224
      ],
      "parameters": {
        "jsCode": "// Filter and clean tweets\nreturn $input.all()\n  .map(item => {\n    let text = item.json.Contenu;\n\n    // Removes links\n    text = text.replace(/https?:\\/\\/\\S+/g, '').trim();\n\n    return {\n      json: {\n        author_name: item.json[\"Nom du compte\"],\n        author_username: item.json[\"Nom d'utilisateur\"],\n        tweet_text: text,\n        tweet_url: item.json.URL,\n        tweet_id: item.json[\"ID Tweet\"],\n        created_at: item.json.Date,\n        first_image_url: item.json.Image,\n      }\n    };\n  })\n  // Only keep tweets that have text and an image\n  .filter(item => item.json.tweet_text && item.json.first_image_url);\n"
      },
      "typeVersion": 2
    },
    {
      "id": "f3495493-6a6a-48b8-979d-35e246583fc3",
      "name": "投稿ごとに3分間待機",
      "type": "n8n-nodes-base.wait",
      "position": [
        512,
        240
      ],
      "webhookId": "1eeb5acf-2934-4d56-b9a7-aeeb203dd465",
      "parameters": {
        "unit": "minutes",
        "amount": 3
      },
      "typeVersion": 1.1
    },
    {
      "id": "83ca9695-a6d7-4ed5-86c5-8455ecbf984e",
      "name": "チャンネルに写真とテキストを送信",
      "type": "n8n-nodes-base.telegram",
      "position": [
        256,
        240
      ],
      "webhookId": "d009379b-bf0d-4468-bea8-0a1ae64e8c99",
      "parameters": {
        "file": "={{ $json.first_image_url }}",
        "chatId": "=@instantanimee",
        "operation": "sendPhoto",
        "additionalFields": {
          "caption": "={{ $json.tweet_text }}"
        }
      },
      "credentials": {
        "telegramApi": {
          "id": "kbRZDVqu7tIpKwc7",
          "name": "Telegram account"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "6d359557-113a-4b5a-ae02-df43ecf98a67",
      "name": "付箋",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -368,
        -272
      ],
      "parameters": {
        "color": 6,
        "width": 256,
        "height": 352,
        "content": "## Enter the ID and username of the user account you want to scrape."
      },
      "typeVersion": 1
    },
    {
      "id": "f36be26a-4ae5-4e8a-b52b-d1b78726328a",
      "name": "付箋1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -64,
        -272
      ],
      "parameters": {
        "color": 6,
        "width": 784,
        "height": 352,
        "content": "## It will format the data. It also filters the tweets, keeping only those that contain text and at least one image."
      },
      "typeVersion": 1
    },
    {
      "id": "7fa0a416-8c2e-48dd-9aab-144d9f2afd82",
      "name": "付箋2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -592,
        144
      ],
      "parameters": {
        "color": 6,
        "width": 1312,
        "height": 320,
        "content": "## Publish the tweet on your telegram channel with a wait time of 3 minutes per post"
      },
      "typeVersion": 1
    },
    {
      "id": "09e7411e-dca4-43ad-8cb9-4f0e95f5448f",
      "name": "付箋4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1488,
        -480
      ],
      "parameters": {
        "width": 624,
        "height": 1216,
        "content": "\n\n## Who’s it for\n\nThis automation template is designed for content creators, social media managers, and automation enthusiasts who want to automatically scrape X (Twitter) posts with images and publish them directly to a Telegram channel — without writing a single line of code.\n\n##  How it works\n\n- Trigger: Start scraping from a specific X (Twitter) account using its ID and username.\n\n- Fetch data: The workflow calls the Twitter API to collect recent tweets.\n\n- Format data: Extracts fields such as author name, username, tweet text, tweet URL, tweet ID, creation date, images, and video URL.\n\n- Filter: Keeps only tweets that contain text and at least one image.\n\n- Remove duplicates: Ensures no repeated tweets are processed.\n\n- Save: Stores the cleaned tweet data into a Google Sheet for backup and future use.\n\n- Clean text: Removes unnecessary links from the tweet text before publishing.\n\n- Loop & Publish: Iterates over the filtered tweets and sends them (text + image) to your Telegram channel.\n\n- Delay: Waits 3 minutes between each post to avoid spamming.\n\n##  How to use\n\n- Enter the Twitter ID and username of the account you want to scrape.\n\n- Connect your Google Sheets account to store the data.\n\n- Connect your Telegram bot and channel where the posts will be published.\n\n- Start the workflow → tweets will be scraped, filtered, saved, and automatically published on Telegram.\n\n##  Requirements\n\n- A valid Twitter API connection or scraping endpoint.\n\n- A Google Sheet for storing scraped tweets.\n\n- A Telegram Bot connected to your channel.\n\n- n8n or any automation tool where this workflow runs.\n\n## ❓ Need help\n\n**Contact me for consulting and support:** [LinkedIn](https://www.linkedin.com/in/jaures-nya-83a033270/) / [YouTube](https://www.youtube.com/@jauresnya)  \n"
      },
      "typeVersion": 1
    },
    {
      "id": "5641d972-fc52-4c85-8a30-5ecbf6308852",
      "name": "付箋3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -816,
        -480
      ],
      "parameters": {
        "color": 7,
        "width": 1792,
        "height": 1056,
        "content": "## Use this workflow to automates the process of scraping tweets from X (Twitter) and publishing them to a Telegram channel\n### What problem is this workflow solving? / Use case\nMy workflow is solving the problem of automating content curation and cross-posting from Twitter to Telegram, while keeping it clean, organized, spam-free, and consistent."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "e1819680-5476-42e8-8fc1-56098c8e04b6",
  "connections": {
    "1939f7d2-4ebd-459c-aaaa-8c4f5fdd0e94": {
      "main": [
        [
          {
            "node": "9a988b26-1746-4175-b0ff-92c06f391d99",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "863dc17e-446c-4118-9171-0db7402b967f": {
      "main": [
        [],
        [
          {
            "node": "83ca9695-a6d7-4ed5-86c5-8455ecbf984e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "260d511b-12b8-4dfb-93d9-6d0317c49dea": {
      "main": [
        [
          {
            "node": "93da9f3b-fea4-4d56-a900-298891ccd28d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "f3495493-6a6a-48b8-979d-35e246583fc3": {
      "main": [
        [
          {
            "node": "863dc17e-446c-4118-9171-0db7402b967f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "a13ca579-f044-4900-94f2-675d012ffa64": {
      "main": [
        [
          {
            "node": "1939f7d2-4ebd-459c-aaaa-8c4f5fdd0e94",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "83ca9695-a6d7-4ed5-86c5-8455ecbf984e": {
      "main": [
        [
          {
            "node": "f3495493-6a6a-48b8-979d-35e246583fc3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "93da9f3b-fea4-4d56-a900-298891ccd28d": {
      "main": [
        [
          {
            "node": "4fc30aa0-ef16-4865-80f4-1b8e7d924d4f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9a988b26-1746-4175-b0ff-92c06f391d99": {
      "main": [
        [
          {
            "node": "260d511b-12b8-4dfb-93d9-6d0317c49dea",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4fc30aa0-ef16-4865-80f4-1b8e7d924d4f": {
      "main": [
        [
          {
            "node": "863dc17e-446c-4118-9171-0db7402b967f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
よくある質問

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

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

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

中級

有料ですか?

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

ワークフロー情報
難易度
中級
ノード数14
カテゴリー-
ノードタイプ9
難易度説明

経験者向け、6-15ノードの中程度の複雑さのワークフロー

作成者
Jaures NYA

Jaures NYA

@jauresnya

Je rends l’IA claire et pratique même pour ceux qui débutent

外部リンク
n8n.ioで表示

このワークフローを共有

カテゴリー

カテゴリー: 34