logo
bars

TenDI (Tencent) CAPTCHA
と CapMonster Cloud

キャプチャの解決、ウェブサイトへの設置とテスト。
キャプチャや防御機構が導入済みのサイトを引き継いだのに、ソースコードへアクセスできない? その場合、どの仕組みが入っているのか、設定は正しいのか、どう検証するのかが気になります。

この記事では、よくある疑問にできるだけお答えしました。まず最初のステップは、どのような保護システムが使われているかを特定することです。そのために、代表的なキャプチャやボット対策システムの一覧を参照できます。ここには、どの仕組みが使われているかを素早く見分けるための画面イメージや主な特徴がまとめられています。

もしサイトで TenDI (Tencent) が使われていることが分かったら、次のステップはその特徴と動作をより詳しく確認することです。同じこの記事の中で、TenDI (Tencent) をサイトに導入するための手順書も確認できるので、あなたのサイト上でどのように機能しているのかをしっかり理解できます。これにより、現在の保護を正しく把握できるだけでなく、今後の運用や保守も計画的に行えるようになります。

TenDI CAPTCHAとは
TenDI CAPTCHAとは
TenDI (Tencent) CAPTCHAは多層的なボット対策システムです。行動解析と特殊な仕組みにより、訪問者が人間かどうかを確認します。登録、ログイン、マーケティングキャンペーンの保護、スパムやデータの盗難防止に利用されます。
Background
TenDI (Tencent) の例
Non-perception CAPTCHA
Non-perception CAPTCHA
ユーザーの操作なしで自動的に検証されます。ユーザー体験が重要なシナリオに最適です。
Slider CAPTCHA
Slider CAPTCHA
スライダーをドラッグするだけの簡単で高速な検証。ほとんどのケースに適しています。
Graphic CAPTCHA
Graphic CAPTCHA
ユーザーが画像の要素を順番にクリックします。高セキュリティのシナリオで使用されます。
Audio CAPTCHA
Audio CAPTCHA
音声認証による検証。障害のあるユーザーに最適です。
Smart Verification
Smart Verification
システムがユーザーの行動を評価します:信頼できるユーザーはすぐに通過、疑わしいユーザーは追加検証されます。
Multi-dimensional Defense
Multi-dimensional Defense
複数の保護機能を使用:動的暗号化、アンチボットなど。

CapMonster CloudでTencent CAPTCHAを解く方法

Tencent CAPTCHAを使用したフォームのテストでは、キャプチャが正しく動作しているか、正しく統合されているかを確認する必要があります。
ウェブサイトに設置したキャプチャを手動でテストできます:
  • フォームページを開き、キャプチャが表示されていることを確認します。
  • キャプチャを解かずにフォームを送信してみてください — サーバーはエラーを返すはずです。
  • キャプチャを正しく解いた後、フォームはエラーなく送信されるはずです。
キャプチャを自動認識するにはCapMonster Cloudなどの専門サービスを使用できます — このツールはキャプチャのパラメータを受け取り、サーバーで処理して準備されたトークンを返します。このトークンをフォームに挿入すると、ユーザー操作なしで検証を通過できます。

CapMonster Cloud API を使った一般的な手順:

タスクの作成タスクの作成
arrow
API リクエストの送信API リクエストの送信
arrow
結果の受信結果の受信
arrow
トークンをページへ適用トークンをページへ適用
arrow
既存ライブラリでのTenDI (Tencent) CAPTCHA認識
CapMonster CloudはPythonJavaScript (Node.js)、C#向けに使いやすいライブラリを提供します。
Python
JavaScript
C#
解決、トークンの挿入とフォーム送信
Node.jsの例で、ウェブページ上のキャプチャを完全に認識する方法を示します。アプローチ例: HTMLと保護システムのパラメータ取得のためにHTTPリクエストを使用し、回答を送信して結果を処理。または下記例のように自動化ツール(例:Playwright)を使用 — ページを開き、検証を待機、CapMonster Cloudクライアント経由でパラメータ送信、結果取得、フォームにトークン挿入(テスト用に正しいデータや間違ったデータを使用可)、結果を確認。

// npx playwright install chromium

import { chromium } from 'playwright';
import { CapMonsterCloudClientFactory, ClientOptions, TenDIRequest } from '@zennolab_com/capmonstercloud-client';

// 自分の値に置き換えてください
const API_KEY = "YOUR_API_KEY";         
const WEBSITE_URL = "https://example.com";

async function solveTenDIOnPage() {
    const browser = await chromium.launch({ headless: false });
    const context = await browser.newContext();
    const page = await context.newPage();

    // 1. ページを開く
    await page.goto(WEBSITE_URL, { waitUntil: 'networkidle' });

    // 2. キャプチャが表示されるのを待つ(例:inputまたはiframe)
    await page.waitForSelector('#tendi_response, iframe[src*="tendi"], input[name="tendi_response"]', { timeout: 15000 });

    // 必要に応じてページからwebsiteKeyを抽出可能
    const WEBSITE_KEY = await page.evaluate(() => {
        // 例:sitekeyはdata属性またはグローバル変数にある場合があります
        const el = document.querySelector('#tendi_response') || document.querySelector('div[data-sitekey]');
        return el?.getAttribute('data-sitekey') || window.TenDI_siteKey || "183268248";
    });

    console.log("Website key detected:", WEBSITE_KEY);

    const client = CapMonsterCloudClientFactory.Create(
        new ClientOptions({ clientKey: API_KEY })
    );

    // 3. TenDIタスクを作成
    const tenDIRequest = new TenDIRequest({
        websiteURL: page.url(),
        websiteKey: WEBSITE_KEY,
    });

    const balance = await client.getBalance();
    console.log("Balance:", balance);

    // 4. キャプチャを解く
    const solution = await client.Solve(tenDIRequest);
    console.log("Solution:", solution);

    const { ticket, randstr } = solution.solution.data;

    // 5. 解決結果の挿入方法
    await page.evaluate(({ ticket, randstr }) => {
        // inputに挿入
        const inputSelectors = ['#tendi_response', 'input[name="tendi_response"]', 'input[type="hidden"]'];
        let inserted = false;
        for (const sel of inputSelectors) {
            const input = document.querySelector(sel);
            if (input) {
                input.value = ticket;
                input.dispatchEvent(new Event('input', { bubbles: true }));
                const form = input.closest('form');
                if (form) form.submit();
                inserted = true;
                break;
            }
        }

        // JS callback関数
        if (typeof window.onCaptchaSolved === 'function') {
            window.onCaptchaSolved(ticket, randstr);
            inserted = true;
        }

        // inputやcallbackがない場合
        if (!inserted) {
            window._tenDITicket = ticket;
            window._tenDIRandStr = randstr;
            console.log("Ticket and randstr saved to window._tenDITicket and window._tenDIRandStr");
        }
    }, { ticket, randstr });

    await page.waitForTimeout(5000);
    await browser.close();
}

solveTenDIOnPage().catch(console.error);
  
TenDI (Tencent) CAPTCHAをサイトに接続する方法
サイト上でのキャプチャの動作、検証ロジックを理解し、再接続や再設定するためにこのセクションを参照してください。保護統合プロセスを説明しており、すべての詳細を迅速に理解するのに役立ちます。
  • 1. Captcha Consoleでアカウントにログインするか、新規作成。
  • 2. Verification Managementセクションを開く。
  • 3. 新しいキャプチャを作成(未作成の場合)。

2つのパラメータを取得:CaptchaAppIdAppSecretKey。フロントエンドとサーバーで使用します。

フロントエンド統合例フロントエンド統合例
arrow

統合の仕組み

ステップ1: キャプチャJSを読み込む

スクリプトは動的に読み込む必要があります:

<script src="https://ca.turing.captcha.qcloud.com/TJNCaptcha-global.js"></script>

標準外の方法やキャッシュ化をすると、キャプチャが正しく動作しない場合があります。

ステップ2: TencentCaptchaオブジェクト作成

JS読み込み後、グローバルクラスが出現:

<script src="new TencentCaptcha(domElement, CaptchaAppId, callback, options);"></script>

パラメータ:

domElement - チェックボックス/iframeを埋め込むコンテナ

CaptchaAppId - あなたのID

callback - 検証後のアクション

options - 外観設定(任意)

ステップ3: メソッド呼び出し .show()

captcha.show();

キャプチャを表示。複数回呼び出し可能。

ステップ4: 結果を処理

Callbackはオブジェクトを受け取る:


{
  ret: 0,              // 0 -- 成功, 2 -- ユーザーがウィンドウを閉じた
  ticket: "...",       // サーバーが必要
  randstr: "...",      // サーバーも必要
  errorCode: 1001,     // キャプチャが読み込まれなかった場合
  errorMessage: "..."  // エラーメッセージ
}

サーバー側で必ずticketの二次検証を実行してください。

"災害復旧モード"

キャプチャが読み込まれない場合(例: CDNが利用不可)、業務プロセスを妨げないように「緊急チケット」を自動発行できます。

シナリオ:

  • キャプチャ作成を試み → エラー。
  • 呼び出す loadErrorCallback().
  • 以下の形式のチケットを生成:
    trerror_<errorcode>_<appid>_<timestamp>
  • 通常の処理を継続しますが、サーバーはこれが緊急チケットであると認識し、処理を判断します。

AppId暗号化(任意)

最大限の保護が必要な場合、キャプチャに公開AppIdではなく暗号化されたバージョンを渡すことができます:

aidEncrypted = Base64(IV + AES256(AppId & timestamp & ttl))

必要なもの:

  • 32バイトキー (AppSecretKey → 32バイトまで補完)
  • AES-256 CBC + PKCS7Padding
  • 16バイトIV
  • タイムスタンプと有効期間(秒)

サーバー側暗号化例(Python)


from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import base64

def encrypt(plaintext, key, iv):
    cipher = AES.new(key, AES.MODE_CBC, iv)
    ciphertext = cipher.encrypt(pad(plaintext.encode(), AES.block_size))
    return base64.b64encode(iv + ciphertext).decode("utf-8")

サーバー側検証

ステップ1. APIアクセス設定

キー管理パネル(CAM / API Key Management)でSecretIdSecretKeyを取得。署名付きAPIリクエストに必要。

ステップ2. API DescribeCaptchaResult呼び出し

クライアントがticketrandstrを返した後、サーバーはリクエストを送信:

  • Action: DescribeCaptchaResult
  • Version: 2019-07-22 (または現在の)

パラメータ:

CaptchaType - 9 (固定値)

Ticket - 文字列 — ticket、クライアントから返却

Randstr - 文字列 — randstr、クライアントから返却

CaptchaAppId - あなたのAppId

AppSecretKey - あなたのSecretKey

UserIp - ユーザーIP(推奨)

ステップ3. 応答処理

APIは以下を返す:

  • CaptchaCode: integer検証結果。
  • 0(またはOK) — キャプチャ成功、ticket有効

CaptchaCode === OKの場合、ユーザーは検証済みとみなされます。そうでない場合は拒否。

例 — Node.jsでのticket検証


import { v20190722 as captcha } from "@tencentcloud/tencentcloud-sdk-nodejs";
const client = new captcha.Client({
  credential: {
    secretId: "YOUR_SECRET_ID",
    secretKey: "YOUR_SECRET_KEY"
  },
  region: "ap-project", // 必要な場合、リージョン指定
});

async function verifyCaptcha(ticket, randstr, userIp) {
  const params = {
    CaptchaType: 9,
    Ticket: ticket,
    Randstr: randstr,
    CaptchaAppId: YOUR_APP_ID,
    AppSecretKey: "YOUR_APP_SECRET_KEY",
    UserIp: userIp
  };

  const resp = await client.DescribeCaptchaResult(params);
  const code = resp.Response.CaptchaCode;
  return code === 0;
}
HelpIcon

Tencent CAPTCHAをサイトに接続する詳細情報は公式ドキュメントにあります。

Background
想定されるエラーとデバッグ
Bug Icon
キャプチャが読み込まれない
(エラー 1001、1002、または無効な署名のメッセージ) — 原因はリクエストパラメータが正しくない可能性があります。CaptchaAppIdAppSecretKey、およびすべてのリクエストパラメータが正しく指定されていることを確認してください。
Bug Icon
ticket/randstrが無効または空です
クライアントが両方のパラメータを正しく送信していることを確認してください。
Bug Icon
解決タイムアウト
サーバー側の待機時間を延長してください。
保護の堅牢性チェック
接続後、保護が正しく動作していることを確認することが重要です。
セキュリティと最適化のヒント
<b>AppSecretKey</b>はサーバーのみで保管し、ブラウザに送信せず、JSコードに含めないでください。
Tencent CAPTCHAの完全な応答、エラーコード、リクエスト時間、検証パラメータをログに記録 — 問題の診断が迅速になります。
すべてのパラメータ<b>(ticket, randstr)</b>送信時にHTTPSを使用して改ざんを防ぐ。
ライセンスに従い、ページに正しい<b>プライバシーポリシー</b>と<b>Tencent利用規約</b>へのリンクを配置。
まとめ

すでにキャプチャや別の保護システムが導入されているサイトを引き継いだものの、コードにはアクセスできない場合でも心配はいりません!どの技術が使われているかを特定するのはそれほど難しくありません。動作が正しいか確認するには、隔離されたテスト環境で認識サービスCapMonster Cloudを利用し、トークン処理の仕組みと検証ロジックが正しく機能しているかをチェックできます。

TenDI (Tencent)の場合も、システムを特定し、その挙動を調べて、保護機能が正しく動いていることを確認すれば十分です。この記事では、TenDI (Tencent)を見分ける方法と、その導入や再設定に関する手順書の見つけ方を紹介しました。これにより、防御を安心して維持し、その動作をしっかりと管理できます。

Conclusion
参考リンク
DocIconTenDI (Tencent) CAPTCHAドキュメントDocIconCapMonster Cloudドキュメント (Tencent CAPTCHA操作)DocIconTencent Captcha (TenDI)とは何か、そして解決方法