NanobotでCaptchaをCapSolverを使って解く方法

Sora Fujimoto
AI Solutions Architect
02-Mar-2026

AIアシスタントがウェブタスクを自動化するとき、CAPTCHAが最も大きな障害になります。保護されたページは送信されず、ログインフローは停止し、全体の自動化ループは人間の介入を待って停止します。
Nanobot は、自前のハードウェアで実行可能な超軽量な個人用AIアシスタントフレームワークです。WhatsApp、Telegram、Discord、Slack、メールなど、すでに使用しているチャネルに接続し、エージェントがスクリプトを自動的に書き込み実行できる組み込みの exec ツールを備えています。
CapSolver はAIを活用したCAPTCHA解決APIを提供するサービスです。Nanobotのスクリプト実行機能とCapSolverのREST APIを組み合わせることで、エージェントはCAPTCHAの検出、解決、トークンのインジェクト、フォームの送信を人間の介入なしに行うことができます。
最高の点は、ただエージェントに何をしたいかを平文で伝えるだけでよいということです。エージェントはPlaywrightスクリプトを書き、サイトキーを抽出し、CapSolverを呼び出し、トークンをインジェクトし、フォームを送信する——すべて自動的に行います。
Nanobotとは何ですか?
Nanobot は約3,500行のコアPythonコードで構成される個人用AIアシスタントフレームワークです。軽量で拡張可能、かつセルフホスト可能な設計となっています。

主な特徴
- マルチチャネル受信トレイ: WhatsApp、Discord、Telegram、Slack、メール、QQなど、さまざまなチャネルからAIに話しかけられます
- 組み込みツール: エージェントはファイルの読み書き、シェルコマンドの実行、ウェブ検索、ページの取得、チャネル間でのメッセージ送信、バックグラウンドタスクの生成が可能です
- プロバイダーに依存しない: Anthropic、OpenAI、DeepSeek、Gemini、Qwen、Moonshot、Zhipu、Groq、vLLM、およびOpenRouterなどのゲートウェイプロバイダーと動作します
- ローカル第一: 自分のハードウェアで動作します——あなたのデータはあなたに残ります
- メモリシステム: コンバセーション間で永続化される日々のノートと長期記憶
- スキルシステム: 既存のスキルまたはカスタムスキルを拡張して、専門的なタスクに対応
execツール
Nanobotのexecツールは、ブラウザ自動化を可能にするものです。エージェントはあらゆるシェルコマンドを実行でき、ヘッドレスブラウザを制御するNode.jsスクリプトも実行可能です。あなたがウェブページとやり取りするようエージェントに依頼すると、それは:
- Playwrightスクリプトを書く
execツールを介して実行する- 出力とスクリーンショットを読み取る
- その結果をチャットチャネルで報告する
これは、AIアシスタントに完全なコマンドラインアクセスを与えるようなものです——ツールのインストール、スクリプトの作成、実行、すべてが自然言語の指示から行われます。
CapSolverとは何ですか?
CapSolver は、さまざまなCAPTCHAチャレンジを回避するためのAI駆動型ソリューションを提供するリーディングなCAPTCHA解決サービスです。複数のCAPTCHAタイプをサポートし、高速な応答時間を提供し、自動ワークフローにシームレスに統合されます。
サポートされているCAPTCHAタイプ
- reCAPTCHA v2 (画像ベースおよび非表示)
- reCAPTCHA v3 & v3 Enterprise
- Cloudflare Turnstile
- Cloudflare 5秒チャレンジ
- AWS WAF CAPTCHA
- その他の広く使用されているCAPTCHAおよびアンチボットメカニズム
Nanobotのアプローチが異なる理由
ほとんどのCAPTCHA解決統合は、コードレベルのAPI統合(専用サービスクラスを書く)か、ブラウザ拡張機能(Chrome拡張機能がすべてを非表示で処理する)の2つのグループに分けられます。Nanobotは3つ目のアプローチを採用しています:エージェント駆動型API統合。
AIエージェント自体が、Playwrightスクリプトを書く、ページのDOMからサイトキーを抽出する、CapSolver APIを呼び出す、解決トークンをインジェクトする——すべてをスクリプトを書き、実行することで自動的に行います。
| ブラウザ拡張機能アプローチ | Nanobotのエージェント駆動型アプローチ |
|---|---|
| Chrome拡張機能のインストールが必要 | ただAPIキーが必要で、拡張機能は不要 |
| 互換性のあるChromeビルドが必要 | あらゆるヘッドレスブラウザで動作 |
| 拡張機能が自動的にCAPTCHAを検出 | エージェントがページのDOMからサイトキーを抽出 |
| 拡張機能がバックグラウンドでAPIを呼び出す | エージェントがCapSolver REST APIを直接呼び出す |
| 表示(サーバーではXvfb)が必要 | 完全なヘッドレスで、表示は必要ない |
重要な洞察: Nanobotのエージェントはブラウザ拡張機能が不要なのは、プログラム的にCapSolver APIを呼び出し、ページのDOMからサイトキーを抽出し、解決トークンをインジェクトできるからです——すべてPlaywrightスクリプトを通じてexecツールで実行します。これは、表示の設定なしで完全なヘッドレス環境で動作します。
前提条件
注意: 以下の例は Ubuntu 22.04 / 24.04 でテストされています。コマンドは
aptとbashを使用しています——必要に応じてディストロに合わせて調整してください。
統合をセットアップする前に、以下のものを確認してください:
- Ubuntu 22.04+ (または他のDebianベースのLinux — 他のディストロは同等のパッケージで動作します)
- Python 3.11+ がインストールされていること (
sudo apt install python3 python3-pip python3-venv) - Nanobot がインストールされ、動作していること (
pip install nanobot-aiまたはpip install -e ".[dev]") - CapSolverアカウント とAPIキー (ここから登録)
- Node.js 18+ がインストールされていること(Playwrightスクリプトを実行するため)
- Playwright がワークスペースにインストールされていること
ステップバイステップのセットアップ
ステップ1: Nanobotをインストール
bash
# PyPIからインストール
pip install nanobot-ai
# 開発用にソースからインストール
git clone https://github.com/HKUDS/nanobot.git
cd nanobot
pip install -e ".[dev]"
# 設定とワークスペースを初期化
nanobot onboard
ステップ2: CapSolverのAPIキーを設定
環境変数としてCapSolverのAPIキーを追加します:
bash
export CAPSOLVER_API_KEY="CAP-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
APIキーは、CapSolverダッシュボードから取得できます。
永続的な設定のために、シェルプロファイル(~/.bashrc または ~/.zshrc)に追加してください。
ステップ3: ブラウザ自動化ツールをインストール
UbuntuでPlaywrightとそのシステム依存関係をインストールします:
bash
# Playwrightのブラウザ依存関係をインストール(Ubuntu)
sudo apt install -y libnss3 libatk-bridge2.0-0 libdrm2 libxcomposite1 \
libxdamage1 libxrandr2 libgbm1 libpango-1.0-0 libasound2t64
# Playwrightをnanobotワークスペースにインストール
cd ~/.nanobot/workspace
npm init -y
npm install playwright
npx playwright install chromium
ステップ4: ゲートウェイを起動
bash
# チャネルサービス(Telegram、Discordなど)を起動
nanobot gateway
# またはインタラクティブなテスト用
nanobot agent
ステップ5: 設定を確認
接続されたチャネルを通じてエージェントにテストメッセージを送信します:
利用可能なツールは何ですか?
エージェントはexecをリストアップするはずです——これはブラウザ自動化スクリプトを実行するために使用されます。
組み込みのCapSolverスキル
Nanobotには、常にロードされる組み込みのcapsolverスキルが含まれています。これにより、メッセージごとにエージェントは正しいCapSolver APIドキュメント、タスクタイプ、コードパターン、実行指示をコンテキストに持っています——それらを推測したり、検索したりする必要はありません。
Nanobotでのスキルの動作方法
スキルはnanobot/skills/{name}/SKILL.mdにあるMarkdownファイルで、YAMLフロントマターを持っています。メタデータにalways: trueが設定されている場合、スキルの全コンテンツがエージェントのシステムプロンプトに自動的にインジェクトされます。エージェントはread_fileを呼び出す必要はありません——それだけで知っています。
スキルファイル (nanobot/skills/capsolver/SKILL.md)
スキルをインストールするには、以下の内容でファイルnanobot/skills/capsolver/SKILL.mdを作成してください:
markdown
---
name: capsolver
description: "Playwrightを使用してCapSolver REST APIでCAPTCHAを解決します。reCAPTCHA v2、reCAPTCHA v3、Cloudflare Turnstileをサポートします。フォーム送信やページ操作でCAPTCHAチャレンジに遭遇したときに使用してください。"
metadata: {"nanobot":{"emoji":"🔓","always":true,"requires":{"bins":["node"],"env":["CAPSOLVER_API_KEY"]}}}
---
# CapSolver
## 重要: 実行が必要
ユーザーがCAPTCHAを解決するよう依頼した場合、**すぐにツールを呼び出す必要があります**。"実行中..."や"I'll start..."や"I've started the automation..."などのテキストで応答しないでください。
最初のアクションは以下のいずれかでなければなりません:
1. Node.jsスクリプトを`write_file`で保存し、その後`exec`で実行
2. 詳細なタスク説明を`spawn`でバックグラウンド実行用に渡す
テキストのみで応答し、ツール呼び出しをしない場合、ユーザーは何も起こっていないと感じます。常に実行してください。
## APIエンドポイント
- **タスク作成**: `POST https://api.capsolver.com/createTask`
- **結果取得**: `POST https://api.capsolver.com/getTaskResult`
## タスクタイプ
| CAPTCHA | タスクタイプ | サイトキーの場所 |
|---|---|---|
| reCAPTCHA v2 | `ReCaptchaV2TaskProxyLess` | `data-sitekey`属性 |
| reCAPTCHA v3 | `ReCaptchaV3TaskProxyLess` | `grecaptcha.execute`コールまたはページソース |
| Cloudflare Turnstile | `AntiTurnstileTaskProxyLess` | Turnstile divの`data-sitekey` |
エンタープライズバージョン: `ReCaptchaV2EnterpriseTaskProxyLess`、`ReCaptchaV3EnterpriseTaskProxyLess`。
## ワークフロー
1. Playwrightでページに移動(ヘッドレスChromium)
2. DOMからサイトキーを抽出(`[data-sitekey]`属性)
3. サイトキーとページURLで`createTask`を呼び出す
4. 2秒ごとに`getTaskResult`をポーリングし、`status: "ready"`になるまで待つ
5. トークンをページにインジェクト(隠しフォームフィールド)
6. フォームを送信
## コアコードパターン
```javascript
const CAPSOLVER_API_KEY = process.env.CAPSOLVER_API_KEY;
// ステップ1: タスク作成
const createRes = await fetch('https://api.capsolver.com/createTask', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
clientKey: CAPSOLVER_API_KEY,
task: {
type: 'ReCaptchaV2TaskProxyLess', // または ReCaptchaV3TaskProxyLess、AntiTurnstileTaskProxyLess
websiteURL: pageUrl,
websiteKey: siteKey
}
})
});
const { taskId } = await createRes.json();
// ステップ2: 結果をポーリング
let token;
while (true) {
await new Promise(r => setTimeout(r, 2000));
const res = await fetch('https://api.capsolver.com/getTaskResult', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ clientKey: CAPSOLVER_API_KEY, taskId })
});
const result = await res.json();
if (result.status === 'ready') { token = result.solution.gRecaptchaResponse || result.solution.token; break; }
if (result.status === 'failed') throw new Error('Solve failed');
}
// ステップ3: トークンをインジェクト(reCAPTCHA)
await page.evaluate((t) => {
document.querySelectorAll('textarea[name="g-recaptcha-response"]')
.forEach(el => { el.value = t; el.innerHTML = t; });
}, token);
```
Turnstileの場合、トークンフィールドは通常`input[name="cf-turnstile-response"]`で、解決は`result.solution.token`にあります。
## 完全なAPIリファレンス
すべてのタスクタイプのパラメータドキュメント、オプションフィールド、および例の応答については `{baseDir}/references/api.md` を参照してください。
重要なポイント:
always: trueフラグにより、このスキルはすべての会話にロードされます——エージェントは常にAPIドキュメントをコンテキストに持ちますrequiresフィールドはnodeがインストールされていることとCAPSOLVER_API_KEYが設定されていることを確認します- 「実行が必要」セクションは、エージェントが何をしようとしているかを説明するのではなく、実際にツール呼び出しを強制します
APIリファレンス (references/api.md)
スキルはエージェントが必要に応じて読み込める完全なAPIリファレンスをバンドルしています。以下にカバーする内容を示します:
reCAPTCHA v2
必須パラメータ: type、websiteURL、websiteKey
オプションパラメータ: isInvisible(Boolean)、pageAction(String)、recaptchaDataSValue(String)、enterprisePayload(Object)、apiDomain(String)
json
{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "ReCaptchaV2TaskProxyLess",
"websiteURL": "https://www.google.com/recaptcha/api2/demo",
"websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
"isInvisible": false
}
}
応答トークン: solution.gRecaptchaResponse → textarea[name="g-recaptcha-response"]にインジェクト
reCAPTCHA v3
必須パラメータ: type、websiteURL、websiteKey
オプションパラメータ: pageAction(String — grecaptcha.execute(key, {action: "..."})から、一般的な値: login、submit、homepage)、enterprisePayload(Object)、apiDomain(String)
json
{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "ReCaptchaV3TaskProxyLess",
"websiteURL": "https://www.example.com",
"websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_kl-",
"pageAction": "login"
}
}
応答トークン: solution.gRecaptchaResponse → textarea[name="g-recaptcha-response"]にインジェクト
Cloudflare Turnstile
必須パラメータ: type(AntiTurnstileTaskProxyLess)、websiteURL、websiteKey
オプションパラメータ: metadata.action(String — data-action属性から)、metadata.cdata(String — data-cdata属性から)
json
{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "AntiTurnstileTaskProxyLess",
"websiteURL": "https://www.example.com",
"websiteKey": "0x4XXXXXXXXXXXXXXXXX",
"metadata": {
"action": "login",
"cdata": "0000-1111-2222-3333-example-cdata"
}
}
}
応答トークン: solution.token → input[name="cf-turnstile-response"]にインジェクト
一般的な解決時間
| CAPTCHAタイプ | 解決時間 |
|---|---|
| reCAPTCHA v2 | 1-10秒 |
| reCAPTCHA v3 | 1-10秒 |
| Cloudflare Turnstile | 1-20秒 |
動作原理
NanobotにCAPTCHA保護ページとやり取りするよう依頼すると、以下のような処理が裏で行われます:
あなたのメッセージ Nanobotエージェント
────────────────────────────────────────────────────
"そのページに行き、 ──► エージェントがメッセージを受信
フォームを埋め、 │
CAPTCHAを解決し、 ▼
送信してください" エージェントが自動化スクリプトを書く
│
▼
execツールがスクリプトを実行
┌─────────────────────────────────┐
│ ヘッドレスChromium │
│ │
│ 1. ターゲットページに移動 │
│ 2. DOMからサイトキーを抽出 │
│ (data-sitekey属性) │
│ │
│ 3. CapSolver REST APIを呼び出す: │
│ POST /createTask │
│ POST /getTaskResult (poll) │
│ │
│ 4. トークンを非表示の │
│ テキストエリア/入力フィールドに挿入 │
│ │
│ 5. 送信ボタンをクリック │
│ 6. 成功を確認 │
│ 7. スクリーンショットを取得 │
└─────────────────────────────────┘
│
▼
エージェントが出力とスクリーンショットを読み取る
│
▼
"フォームが正常に送信されました!
ページには「検証成功...おめでとう!」と表示されています"
### CapSolver APIフロー
統合のコアとなる2つのAPIコール:
**1. タスクの作成** — CAPTCHAのサイトキーとページURLをCapSolverに送信します:
```javascript
const response = await fetch('https://api.capsolver.com/createTask', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
clientKey: CAPSOLVER_API_KEY,
task: {
type: 'ReCaptchaV2TaskProxyLess',
websiteURL: pageUrl,
websiteKey: siteKey
}
})
});
2. 結果のポーリング — CapSolverが解決されたトークンを返すまで2秒ごとにチェックします:
javascript
const result = await fetch('https://api.capsolver.com/getTaskResult', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
clientKey: CAPSOLVER_API_KEY,
taskId: taskId
})
});
// result.solution.gRecaptchaResponseにトークンが含まれます
3. トークンの挿入 — reCAPTCHAが期待する非表示フォームフィールドに設定します:
javascript
await page.evaluate((token) => {
const textarea = document.querySelector('textarea[name="g-recaptcha-response"]');
if (textarea) {
textarea.value = token;
textarea.innerHTML = token;
}
}, captchaToken);
完全な動作例
Nanobotのエージェントが生成して実行した、GoogleデモページでのreCAPTCHA解決の実際のスクリプトです。エージェントはwrite_fileでこれを記録し、execで実行しました—すべてが1つのDiscordメッセージから自動的に行われます:
javascript
const { chromium } = require('playwright');
const https = require('https');
const CAPSOLVER_API_KEY = process.env.CAPSOLVER_API_KEY;
const PAGE_URL = 'https://www.google.com/recaptcha/api2/demo';
function httpsPost(url, data) {
return new Promise((resolve, reject) => {
const req = https.request(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' }
}, (res) => {
let body = '';
res.on('data', chunk => body += chunk);
res.on('end', () => resolve(JSON.parse(body)));
});
req.on('error', reject);
req.write(JSON.stringify(data));
req.end();
});
}
async function solveRecaptcha(siteKey, pageUrl) {
console.log('CapSolverタスクを作成中...');
const createRes = await httpsPost('https://api.capsolver.com/createTask', {
clientKey: CAPSOLVER_API_KEY,
task: {
type: 'ReCaptchaV2TaskProxyLess',
websiteURL: pageUrl,
websiteKey: siteKey
}
});
const { taskId } = createRes;
console.log(`タスクID: ${taskId}`);
let token;
while (true) {
await new Promise(r => setTimeout(r, 2000));
const res = await httpsPost('https://api.capsolver.com/getTaskResult', {
clientKey: CAPSOLVER_API_KEY,
taskId
});
if (res.status === 'ready') {
token = res.solution.gRecaptchaResponse;
console.log(`トークンを取得しました!長さ: ${token.length}`);
break;
}
if (res.status === 'failed') {
throw new Error('CapSolverタスクが失敗しました');
}
}
if (!token) throw new Error('トークンを取得できませんでした');
return token;
}
async function main() {
const browser = await chromium.launch({ headless: true });
const page = await browser.newPage();
console.log('ページに移動中...');
await page.goto(PAGE_URL, { waitUntil: 'domcontentloaded', timeout: 30000 });
console.log('サイトキーを抽出中...');
const siteKey = await page.locator('[data-sitekey]').getAttribute('data-sitekey');
console.log(`サイトキー: ${siteKey}`);
console.log('CapSolverでreCAPTCHAを解決中...');
const token = await solveRecaptcha(siteKey, PAGE_URL);
console.log('トークンを挿入中...');
await page.evaluate((t) => {
document.querySelectorAll('textarea[name="g-recaptcha-response"]')
.forEach(el => { el.value = t; el.innerHTML = t; });
}, token);
console.log('フォームを送信中...');
await page.locator('input[type="submit"]').click();
console.log('結果を待機中...');
await page.waitForTimeout(3000);
const successText = await page.textContent('body');
if (successText.includes('Success') || successText.includes('Verification')) {
console.log('\n✅ 成功!reCAPTCHAが解決され、フォームが正常に送信されました!');
console.log('成功メッセージ:', successText.slice(0, 200));
} else {
console.log('\n❌ 結果が不明です。ページの内容:', successText.slice(0, 300));
}
await page.screenshot({ path: 'recaptcha_result.png' });
console.log('スクリーンショットをrecaptcha_result.pngに保存しました');
await browser.close();
}
main().catch(console.error);
実行方法:
bash
CAPSOLVER_API_KEY=CAP-XXX node solve_recaptcha.js
Nanobotとの使い方
セットアップが完了したら、CapSolverをNanobotと使うのは非常に簡単です。メッセージを送るだけで動作します。
例1: reCAPTCHAデモを解決する
Telegram、Discord、WhatsApp、または接続されたチャネルを通じてエージェントに以下を送信してください:
https://www.google.com/recaptcha/api2/demoに移動し、CapSolver APIを使用してreCAPTCHAを解決し、フォームを送信して、それが成功したかどうかを教えてください。
起こること:
- エージェントがPlaywrightスクリプトを記録します
- スクリプトがページに移動し、DOMからreCAPTCHAのサイトキーを抽出します
- サイトキーでCapSolverの
createTaskAPIを呼び出します - トークンが準備できるまで2秒ごとに
getTaskResultをポーリングします(約18秒) - トークンを非表示の
g-recaptcha-responseフィールドに挿入します - 送信ボタンをクリックし、成功を確認します
- エージェントが報告します: "フォームが正常に送信されました!ページには「検証成功...おめでとう!」と表示されています"
例2: プロテクトされたサイトにログインする
https://example.com/loginに移動し、メールアドレスに"[email protected]"、パスワードに"mypassword"を入力し、ページに表示されるCAPTCHAを検出し、解決して、サインインをクリックし、何が起こったかを教えてください。
例3: お問い合わせフォームを送信する
https://example.com/contactを開き、名前、メールアドレス、メッセージのフィールドに入力し、CAPTCHAを解決し、フォームを送信し、確認メッセージを教えてください。
なぜこれで動作するのか
Nanobotのエージェントには以下があります:
execツール — 任意のシェルコマンドを実行できます(Node.jsスクリプトも含む)web_fetchツール — ページ構造を理解するためにページコンテンツを取得します- ファイルツール — 自動化スクリプトを書き込み、編集、読み取りできます
- メモリ — 今後のタスクで使用できる作業方法を記憶します
- 永続的な
capsolverスキル — エージェントのコンテキストに常にロードされます(上記の組み込みのCapSolverスキルを参照)、タスクタイプ、コードパターン、APIリファレンス、実行指示が含まれており、エージェントがスクリプトを記述するのではなく実行することを保証します
ハルシネーションリトライ: エージェントが行動することを保証する
LLM駆動エージェントの課題の1つは、モデルが「今から実行します」といったテキストを返すが、ツールを呼び出さないことです。ユーザーは進行状況が見えないまま、進捗がない状態を見ています。
Nanobotは、エージェントループに組み込まれたハルシネーションリトライメカニズムでこれを解決します。LLMが最初の反復でツール呼び出しをしないでテキストを返した場合、Nanobotはそれを検出し、自動的に修正プロンプトを送信します:
"あなたはタスクを開始したと説明しましたが、ツールを呼び出しませんでした。ユーザーはexec、write_file、spawnなどのツールを使用しないと進捗が見えません。実際にタスクを実行するには適切なツールを呼び出してください。"
LLMは再度試行し、実際のツール(例: spawnでバックグラウンドの自動化タスクを起動)を呼び出します。これは透過的に行われます—ユーザーは数秒後に結果が表示されるだけです。
これはNanobotの一般的な機能であり、すべてのツール使用タスクの信頼性を向上させます。組み込みのcapsolverスキルの明確な実行指示と組み合わせることで、エージェントがただ何をすることを説明するのではなく、実際に行動することを保証します。
推奨されるコード変更
ハルシネーションリトライとその他の信頼性向上のため、Nanobotインストールに以下の3つの変更を適用してください:
1. ハルシネーションリトライ (nanobot/agent/loop.py)
_process_messageメソッドのelseブランチを置き換えます:
python
else:
# ツール呼び出しなし — しかしLLMが行動を幻覚しているか確認
if iteration == 1 and self._seems_like_hallucinated_action(response.content):
logger.warning("LLMがツール呼び出しなしで行動を説明しました — リトライします")
messages.append({"role": "assistant", "content": response.content})
messages.append({
"role": "user",
"content": (
"[システム: あなたはタスクを開始したと説明しましたが、ツールを呼び出しませんでした。ユーザーはexec、write_file、spawnなどのツールを使用しないと進捗が見えません。実際にタスクを実行するには適切なツールを呼び出してください。]"
),
})
continue
final_content = response.content
break
そして、AgentLoopクラスにこの検出メソッドを追加します:
python
@staticmethod
def _seems_like_hallucinated_action(content: str | None) -> bool:
"""LLMがツール呼び出しなしで行動を説明しているかを検出します。"""
if not content:
return False
lower = content.lower()
phrases = [
"running now", "i've started", "i'll start", "starting the",
"i've begun", "i'll begin", "executing now", "i'm working on",
"let me run", "running the", "i've kicked off", "launched the",
"i've initiated", "working on it",
]
return any(phrase in lower for phrase in phrases)
2. サブエージェントのスキル (nanobot/agent/subagent.py)
spawnツールで生成されたサブエージェントは、デフォルトではcapsolverスキルを持っていません。以下を追加します:
python
// 以下をインポート
from nanobot.agent.skills import SkillsLoader
// __init__に追加:
self._skills = SkillsLoader(workspace)
// _build_subagent_prompt()の最後に追加:
always_skills = self._skills.get_always_skills()
if always_skills:
skills_content = self._skills.load_skills_for_context(always_skills)
if skills_content:
prompt += f"\n\n## 参考ドキュメント\n\n{skills_content}"
return prompt
3. Execタイムアウト (nanobot/config/schema.py)
ブラウザ自動化スクリプトはデフォルトの60秒より長く必要です — CapSolverポーリングだけで20秒以上かかることがあります。タイムアウトを増やします:
python
class ExecToolConfig(BaseModel):
"""シェル実行ツールの設定。"""
timeout: int = 120 # 以前は60
これらの変更を適用した後、Nanobotを再起動してください(pm2 restart nanobotまたはサービスを再実行)。
性能結果
GoogleのreCAPTCHA v2デモページで統合をテストしました。デモ実行の実際の結果は以下の通りです:
| メトリクス | 値 |
|---|---|
| エージェントの思考 + スクリプト生成 | 約10秒 |
| スクリプト実行(全体) | 約34秒 |
| ページ読み込み(domcontentloaded) | 約2秒 |
| サイトキー抽出 | 1秒未満 |
| CAPTCHA解決(CapSolver API) | 約20秒 |
| トークン挿入 + フォーム送信 | 約3秒 |
| 成功確認 + スクリーンショット | 約3秒 |
| エンドツーエンド(メッセージ → 応答) | 約45秒 |
| 結果 | 検証成功 |
エージェントはフォーム送信後の成功ページを示す最終的なスクリーンショット(recaptcha_result.png)を保存しました。
問題解決
"Cannot find module 'playwright'"
Playwrightがワークスペースにインストールされていません。以下を実行してください:
bash
cd ~/.nanobot/workspace && npm install playwright && npx playwright install chromium
Ubuntuでブラウザライブラリが不足している場合
Chromiumがエラーで起動できない場合、システムの依存関係をインストールしてください:
bash
sudo apt install -y libnss3 libatk-bridge2.0-0 libdrm2 libxcomposite1 \
libxdamage1 libxrandr2 libgbm1 libpango-1.0-0 libasound2t64
CAPTCHA解決のタイムアウト
- 有効なCapSolver APIキーか確認してください
- CapSolverアカウントの残高を確認してください capsolver.com/dashboard
- スクリプトは2秒ごとにCapSolverが
readyまたはfailedを返すまでポーリングします — これに時間がかかる場合は、APIキーと残高を確認してください
サイトキーが見つからない
スクリプトはreCAPTCHAのDOM要素のdata-sitekey属性からサイトキーを抽出します。data-sitekeyを持つ要素が見つからない場合、ページはキーを別の方法で埋め込んでいる可能性があります — エージェントは必要に応じてiframeのURLやページソースから抽出するようにスクリプトを変更できます。
Docker/コンテナでブラウザがクラッシュする
Playwrightの起動オプションに以下のフラグを追加してください:
javascript
chromium.launch({
headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage']
});
エージェントがCapSolverを使用しない
CAPSOLVER_API_KEY環境変数がNanobot起動前に設定されているか確認してください。エージェントはスクリプト実行時にそれをチェックします。
最良の実践方法
1. APIキーを環境変数として設定する
スクリプトにハードコードしないでください。process.env.CAPSOLVER_API_KEYを使用して、エージェントが自動的に取得できるようにします。
2. サーバーでヘッドレスモードを使用する
NanobotのAPIベースのアプローチは完全なヘッドレス環境で動作します — Xvfbや仮想ディスプレイは必要ありません。これは拡張機能ベースのアプローチと比較して大きな利点です。
3. CapSolverの残高を監視する
各CAPTCHAの解決にはクレジットが必要です。定期的にcapsolver.com/dashboardで残高を確認してください。
4. Playwrightを最新版に保つ
CAPTCHAプロバイダーは進化し続けます。検出問題を避けるために、PlaywrightとChromiumを最新の状態に保ってください:
bash
cd ~/.nanobot/workspace && npm update playwright && npx playwright install chromium
結論
Nanobot + CapSolverの統合は、拡張機能ベースのCAPTCHA解決とは根本的に異なるアプローチを採用しています。Chrome拡張機能をロードする代わりに、AIエージェント自体がすべての解決フローを調整します:
- Playwrightでターゲットページに移動
- data-sitekey属性からサイトキーを抽出
- CapSolverのREST APIを直接呼び出して解決
- 解決トークンを非表示フォームフィールドに挿入
- フォームを送信し、成功を確認
これにより、以下の利点があります:
- Chrome拡張機能の依存関係なし — あらゆるヘッドレスブラウザで動作
- ヘッドレスサーバーのサポート — 表示やXvfbは不要
- 自然言語制御 — エージェントに何を実行するかをただ伝えるだけでOK
さっそく始めたいですか? CapSolverに登録し、初回チャージで6%のボーナスを追加するためのボーナスコードNANOBOTを使用してください!

FAQ
Nanobotはブラウザ拡張機能とはどのようにCAPTCHAを解決しますか?
NanobotはREST APIを直接使用します。エージェントはcreateTaskとgetTaskResultを呼び出すスクリプトを書いたり実行したりして、解決トークンを取得し、それをページのDOMに挿入します。ブラウザ拡張機能は必要ありません。
特別なChromeバージョンが必要ですか?
いいえ。ブラウザ拡張機能に依存するアプローチでは、ブランド版Chrome 137以降で拡張機能の読み込みが無効になったため、Chrome for Testingが必要ですが、NanobotはあらゆるChromiumビルドで動作します。PlaywrightのバンドルChromium、標準Chromiumパッケージ、またはヘッドレスChromeでも動作します。
CapSolverはどの種類のCAPTCHAをサポートしていますか?
CapSolverはreCAPTCHA v2(チェックボックスおよび非表示)、reCAPTCHA v3、Cloudflare Turnstile、AWS WAF CAPTCHAなどに対応しています。Nanobotの統合はreCAPTCHA v2でテストされ、ReCaptchaV2TaskProxyLessタスクタイプを使用しています。他のCAPTCHAタイプの場合、エージェントは適切なCapSolverタスクタイプを使用してスクリプトを書くことができます。詳細はCapSolverドキュメントをご覧ください。
ヘッドレスサーバーで使用できますか?
はい。これはNanobotのアプローチが光るところです。ブラウザ拡張機能は関与していないため、Xvfbや仮想ディスプレイは必要ありません。Playwrightは標準で完全なヘッドレスモードで動作します。
CapSolverの料金はどのくらいですか?
CapSolverはCAPTCHAの種類や数量に基づいて競争力のある価格を提供しています。現在の価格についてはcapsolver.comにアクセスしてください。
Nanobotは無料ですか?
Nanobotはオープンソースで、自分のハードウェア上で無料で実行できます。AIモデルプロバイダーのAPIキーが必要であり、CAPTCHAの解決にはCapSolverアカウントとクレジットが必要です。
CAPTCHAの解決にはどのくらい時間がかかりますか?
reCAPTCHA v2のテストでは、CapSolver APIは約20秒で解決を返しました。エージェントは2秒ごとにポーリングし、トークンが準備でき次第すぐに処理を続けます。スクリプト実行時間(ナビゲート+解決+インジェクト+送信)は約34秒で、メッセージから応答までのエンドツーエンド時間はエージェントがスクリプトを書く時間を含めて約45秒でした。
コンプライアンス免責事項: このブログで提供される情報は、情報提供のみを目的としています。CapSolverは、すべての適用される法律および規制の遵守に努めています。CapSolverネットワークの不法、詐欺、または悪用の目的での使用は厳格に禁止され、調査されます。私たちのキャプチャ解決ソリューションは、公共データのクローリング中にキャプチャの問題を解決する際に100%のコンプライアンスを確保しながら、ユーザーエクスペリエンスを向上させます。私たちは、サービスの責任ある使用を奨励します。詳細については、サービス利用規約およびプライバシーポリシーをご覧ください。
もっと見る

PicoClaw Automation: CapSolver APIの統合ガイド
CapSolverをPicoClawと統合する方法を学び、超軽量な10ドルのエッジハードウェアで自動CAPTCHA解決を実現しましょう。

Sora Fujimoto
02-Mar-2026

NanobotでCaptchaをCapSolverを使って解く方法
Nanobot と CapSolver を使って CAPTCHA の解決を自動化します。Playwright を使って reCAPTCHA と Cloudflare を自律的に解決します。

Sora Fujimoto
02-Mar-2026

AI SEOオートメーションの仕組み:SERPクローリングからコンテンツ生成まで
AIを活用したSEOオートメーションがワークフローを変革する方法を学びましょう。SERPスクリーピングとコンテンツ生成を通じて。2026年のためのスケーラブルなSEOシステムの構築方法を発見しましょう。

Sora Fujimoto
13-Feb-2026

CapSolver AI-LLMアーキテクチャの実践: 適応型CAPTCHA認識システムの意思決定パイプライン構築
CapSolverのAI-LLMアーキテクチャを探索し、視覚、推論、および自律的な意思決定を統合した適応型CAPTCHA解決を実現します。

Sora Fujimoto
10-Feb-2026

Crawl4AI 対 Firecrawl: 完全な比較 & 2026年レビュー
2026年のCrawl4AIとFirecrawlを比較する。LLM対応のマーカドン抽出用のこれらのAIウェブスクレイピングツールの特徴、価格、パフォーマンスを確認する。

Sora Fujimoto
04-Feb-2026

ブラウザの利用 vs ブラウザベース: AIエージェントに適したブラウザ自動化ツールはどちらですか?
AIエージェントの自動化において、ブラウザの使用とBrowserbaseを比較する。CapSolverを使ってCAPTCHAを解決する方法、特徴、価格を確認し、スムーズなワークフローを実現する。

Adélia Cruz
26-Jan-2026

