RPA/ブラウザ自動化

PlaywrightでInstagram自動運用の基礎 (規約リスクと回避策)

公開: 2026-05-19 · 著者: Sasaki Ryuji

Instagram自動運用を作るすべての開発者へ、BANを避けるための実装思想

PlaywrightでInstagram自動運用の基礎 (規約リスクと回避策)

Instagram自動運用ツールを作るとき、最大の技術課題は Meta の検知回避です。私が開発・運用しているGramShift Desktop は、Playwright を使って実Chromeブラウザを操作し、検知を回避しながら自動いいね/フォローを実行しています。この記事ではその設計の核と、Bot判定を避けるために実装した Human-Pacing の具体的なコードパターンを共有します。なお、本記事の手法はあくまで規約の範囲内での運用を前提とし、規約違反を推奨するものではありません。

なぜ公式APIではなくブラウザ自動化なのか

Meta が提供する Graph API では、Instagram の「自動いいね」「自動フォロー」は元々許可されていません。マーケティング用途のAPIは Business Account 連携のみで、個人アカウントへのフォロー/いいねは API では実行できない仕様です。そのため Instagram自動運用ツールはほぼ全てが「ブラウザ操作の自動化」で実装されています。Playwright・Puppeteer のようなツールで実Chromeを駆動し、人間と同じ操作を再現するアプローチです。

ただしこの方式は Meta の利用規約で明示的に許可されていないため、サービス提供時は「ユーザーが自分のアカウントで自分の端末から操作する」前提の設計が必要です。GramShift Desktop が「クラウド型ではなくデスクトップアプリ」として提供されているのも、この前提を守るためです。

最小限の起動コード — persistent context

Instagram の自動操作で最も重要なのが、毎回ログインしない仕組みです。Playwright の launchPersistentContext を使い、ユーザーデータディレクトリを指定すれば、初回ログイン後はクッキーとセッションが永続化されます。

import { chromium } from 'playwright';

async function startBrowser(profileDir) {
 const browser = await chromium.launchPersistentContext(profileDir, {
 headless: false, // 初期は false で動作確認、本番は true 可
 viewport: { width: 1280, height: 800 },
 args: [
 '--no-sandbox',
 '--disable-blink-features=AutomationControlled', // bot 判定回避ヒント
 ]
 });
 const page = await browser.newPage();
 await page.goto('https://www.instagram.com/', { waitUntil: 'networkidle' });
 return { browser, page };
}

--disable-blink-features=AutomationControlled は、Chrome 起動時に navigator.webdriver プロパティを true にしない指定です。Bot判定の基本的なシグナルを1つ消せます。ただしこれ単体では検知回避にはなりません。組み合わせが必要です。

Human-Pacing の核 — 待機時間のランダム化

Bot判定で最も警戒されるのが「機械的なリズム」です。0.5秒ごとに正確にクリック、5秒ごとに正確にスクロール、こうしたパターンは即座に検知されます。GramShift で実装している Human-Pacing は3段階のランダム化を組み合わせています。

// 短い揺らぎ (タイピング間隔、クリック前の躊躇)
function microPause() {
 return new Promise(r => setTimeout(r, randomInt(120, 480)));
}

// 中間の待機 (アクション間)
function normalPause() {
 return new Promise(r => setTimeout(r, randomInt(2500, 7500)));
}

// 長い間 (10回に1回ほど、人間の「考える時間」を再現)
function longPause() {
 if (Math.random() < 0.1) {
 return new Promise(r => setTimeout(r, randomInt(20000, 60000)));
 }
 return Promise.resolve();
}

function randomInt(min, max) {
 return Math.floor(Math.random() * (max - min + 1)) + min;
}

1いいねごとに normalPause + 10%の確率で longPause を入れる。これだけで自動化検知率が体感で 1/3 になりました。重要なのは「予測可能なリズムを残さない」ことです。

サイクル設計 — 1日のアクション分散

GramShift Desktop は1日のアクションを複数のサイクルに分けて分散させます。1サイクル = 連続したアクション群、サイクル間に長い待機を入れる構成です。

async function runDailyCycles(account) {
 const totalCycles = randomInt(4, 8); // 1日4-8サイクル
 for (let i = 0; i < totalCycles; i++) {
 const hour = new Date().getHours();
 if (hour >= 23 || hour < 6) {
 // 深夜帯はスキップ (人間らしくない)
 console.log('Skipping cycle in late night');
 break;
 }
 await runOneCycle(account);
 // サイクル間 60-180分のランダム待機
 const intervalMs = randomInt(60, 180) * 60 * 1000;
 await new Promise(r => setTimeout(r, intervalMs));
 }
}

async function runOneCycle(account) {
 const likes = randomInt(30, 50); // 1サイクル30-50いいね
 for (let i = 0; i < likes; i++) {
 await performLike(account);
 await normalPause();
 await longPause();
 }
}

この設計で「1日750-1000いいね」のような Meta の暗黙の閾値内に収め、検知リスクを下げています。なお過去に 運営者の検証用Instagramアカウント で警告を受けた経験があり、その対処は 自動化で直面した3つの実例 に詳述しています。

規約とリスクの注意点

最後に重要な注意点です。Instagram の利用規約では「サードパーティツールによる自動化アクション」は基本的に禁止されています。検知された場合のリスクは段階的で、第1段階で警告メール、第2段階でアクション制限、第3段階でアカウント停止という流れです。GramShift Desktop は「ユーザーが自分のアカウントで自分のPCから自分の意思で操作する」前提のツールとして提供していますが、利用は自己責任の範囲です。本記事の実装例も、技術的解説を目的としたものです。

関連する自動化失敗事例は RPAカテゴリ に、SNS自動投稿の他の実装パターンは 自動化レシピカテゴリ に蓄積しています。

Playwright を含む個人開発 SaaS の VPS 運用全体像は 個人開発SaaS を ConoHa VPS 2GB プランで運用した実測ガイド も合わせてご覧ください。