首頁

目前文章總數:197 篇

  

最後更新:2025年 09月 13日

0099. C# × Selenium × reCAPTCHA:三種驗證模式完整實作與測試

日期:2025年 09月 20日

標籤: Asp.NET Core reCAPTCHA Google Cloud Platform Asp.NET Core Asp.NET Core Web MVC C# Selenium Web

摘要:C# 學習筆記


範例所需:1. Visual Studio 2022 Asp.net Core
     2. 開通 Google Cloud Platform 便於管理 reCAPTCHA 金鑰設定 (要有 Google 帳號啟用)
範例檔案:本篇範例代碼
解決問題:1. 2025/8月為止,說明當前 Google reCAPTCHA 的 3 種類型導入與用法
     2. 啟用 Google reCAPTCHA 並導入 Asp.net Core C# Web,達到保護網站,防止機器人攻擊
基本介紹:本篇分為六大部分。
第一部分:reCAPTCHA 介紹
第二部分:範例專案架構
第三部分:reCAPTCHA DEMO -「我不是機器人」核取方塊
第四部分:reCAPTCHA DEMO - 隱形 reCAPTCHA 標記
第五部分:reCAPTCHA DEMO - 以分數為依據 (v3)
第六部分:管理金鑰 & 統計分析






第一部分:reCAPTCHA 介紹

Step 1: 介紹

reCAPTCHA 是一項免費服務,可以保護您的網站免受垃圾內容和濫用行為的侵擾。並採用先進的風險分析技術,分辨真人和機器人。
以下是 Google 官方的reCAPTCHA 總覽

reCAPTCHA 採用進階風險分析技術偵測詐欺行為,您可以透過 reCAPTCHA 保護網站或行動應用程式免受垃圾內容和濫用行為侵擾,並偵測其他類型的詐欺活動,例如憑證填充、帳戶盜用 (ATO) 和自動建立帳戶。
reCAPTCHA 提供更精細的分數、高風險事件的原因代碼、行動應用程式 SDK、密碼外洩偵測、多重驗證 (MFA),以及調整網站專屬模型的功能,可保護企業業務。


目的就是保護自己架設的網站、應用程式。
本篇目標:針對自己的網站,分別說明 reCAPTCHA 3種驗證方式的用法與防護方式、C# DEMO 實作 (Checkbox , Invisible , Score)


Step2:可用方案 & 收費方式

可參考 Google 的付費方式分成 3 種方案類型

reCAPTCHAEssentials reCAPTCHAStandard reCAPTCHAEnterprise
最基礎版 標準版 企業版
未註冊 Google 帳戶 已註冊帳戶自動使用 花費更多錢升級
10,000 次免費評估 10,000 次免費評估 10,000 次免費評估
超過 10000 次停用 超過 10000 次可付 $8 最大可達 100,000 次 同 Standard
  超過 100,000 次自動升級到企業版 超過 100,000 每次會收 0.001$
基礎功能 標準功能 完整功能
不用繳費 月付 可以與 Google 談多久付一次錢




Step 3: 方案提供功能補充說明

在Google的reCAPTCHA參考指南裡,列出3種方案類型功能說明:
這邊簡要補充各功能具體意義,詳細說明建議還是參考上面官方文件:

功能 功能說明
視覺挑戰支援 指在驗證失敗或風險過高時,會展示圖片驗證挑戰(例如選擇交叉口圖片),以確保是真人操作。
網路應用程式防火牆防護 網站前面加一層安全防護網,會幫你擋掉惡意流量(像是爬蟲、DDoS 攻擊)
支援多重驗證 (MFA) (預先發布版) 除了密碼,還要多一個驗證步驟(EX: 簡訊 OTP 或 Email 驗證碼),降低帳號被盜的風險
密碼防護 使用者密碼有沒有出現在已知的資料外洩名單
帳戶防護工具 若判定風險高,可要求額外驗證或暫時鎖定帳號
漫遊器分數精細程度 標準版分數等級只有(0.1, 0.3, 0.7, 0.9) ; 企業版可以更精細。便於使用者調整防禦策略
簡訊費用詐欺防護功能 防止惡意程式自動發送大量 SMS 驗證碼,導致你支付昂貴的簡訊費用
防範付款詐欺 配合分數與行為分析,提前阻擋可疑交易。
原因代碼 除了分數,還會告訴你「為什麼」分數低。 (EX: 部分 IP 來自高風險國家、裝置異常、或短時間大量操作)
使用 Annotation API 提供評估意見 可以回傳自己對該次驗證的評價(真人/機器人)給 Google,幫助它的 AI 變得更精準。
SLA Google 對你保證的服務可用性,例如「99.9% 正常運作時間」。 未達到,可以向 Google 進行索賠
SLO SLA 是合約責任,SLO 是內部 KPI,達不到 Google 也不一定賠償。




Step 4: 網站可啟用驗證方式與應用場景

以下是 3 種驗證方式與適用場景:

項目 \ 驗證 v2 Checkbox Invisible reCAPTCHA (v2) v3(分數評估)
使用者互動 需點「我不是機器人」核取方塊,有時出現圖片驗證 無需點擊核取框,隱形觸發驗證 (觸發才有操作) 完全無使用者操作
UX 體驗 介入性中:有視覺挑戰,減少衝擊 較無介入:對使用者更友善 零中斷用戶體驗
防機器人機制說明 使用行為分析 + 圖像驗證挑戰拦截機器人 背景行為風險評估,自動根據風險可能再顯示驗證畫面 背景分析使用者行為,回傳 0–1 分數,自訂門檻採取額外動作
適合應用場景 表單、註冊、留言板的快速實作防護 需要平滑驗證流程的平台(如登入、提交) 大型網站、高流量平台,自己的網站需彈性策略防護




第二部分:範例專案架構

Step 1:範例專案架構

打開本篇範例代碼後,架構基本分成以下:

1. 初始化配置 依賴注入 IHttpClientFactory,善用微軟的 集中管理連線 + 自動回收 的方式,避免 TCP 資源浪費導致 Socket 用盡
2. Model 取得 Google reCAPTCHA 的 Response Json 資料,分別是 V2、V3
3. 控制器 分別實現 3 種 reCAPTCHA 驗證器
4. Web 檢視器 對應 3 種 reCAPTCHA 驗證器的檢視畫面
5. 自動化測試專案 實現自動化 Selenium 訪問我們架設好的 reCAPTCHA 驗證器,實證 reCAPTCHA 防護力






第三部分:reCAPTCHA DEMO -「我不是機器人」核取方塊

Step 1:註冊新 reCAPTCHA

登入Google reCAPTCHA網站,我們要註冊新的金鑰 -> 開始使用
※每個驗證器都需要獨立新增 reCAPTCHA ,因為 Google 會依照選擇驗證方式從而產生一對驗證器的金鑰。


Step 2:註冊新 reCAPTCHA - CheckBox

進入後到註冊新頁面,依序填寫如圖內容
這邊驗證類型選擇 驗證問題(v2) -> 「我不是機器人」核取方塊
網域填寫:localhost ,這會用於開發者在 DEBUG 模式下可以驗證 reCAPTCHA 是否符合預期


Step 3:註冊新 reCAPTCHA - 取得網站金鑰、密鑰

接著會跳轉到設定完成,請將畫面上的 網站金鑰密鑰 記錄下來

功能 功能說明
網站金鑰 提供給前端的金鑰,即使明文被用戶知道也無訪
密鑰 存在於伺服器、應用程式中的密鑰,用來與網站金鑰配對,相符合時驗證器才生效




Step 4:範例專案 - Razor 檢視器

開啟範例專案 -> Views/Home/CheckBoxV2.cshtml 檔案 -> 內容如下:
當用戶訪問時,必須要對 我不是機器人打勾(CheckBox)

@{
    ViewData["Title"] = "reCAPTCHA V2 - 核取方塊,我不是機器人機制";
}

<h2>reCAPTCHA V2 - 核取方塊,我不是機器人機制 Demo</h2>

<form method="post" asp-action="CheckBoxV2Validate">
    <input type="text" name="Username" placeholder="輸入名稱" value="MilkTeaGreen"  />

    <div class="g-recaptcha" data-sitekey="6Ld8zqErAAAAAOCngiA0B_rcMWjMdz3w3fjr8puv"></div>

    <button type="submit">送出</button>
</form>

<script src="https://www.google.com/recaptcha/api.js" async defer></script>

@if (ViewBag.Message != null)
{
    <p>@ViewBag.Message</p>
}



Step 5:範例專案 - 後端控制器

開啟範例專案 -> Controller/Home/HomeController.CheckBoxV2.cs 檔案 -> 內容如下:
提供檢視、前端用戶點擊送出按鈕後,進行 reCAPTCHA 的 CheckBox V2 驗證
當 Success 時即表示驗證成功,此資訊會記錄於 Google 的分析統計中
請將 Step 3 得到的一對金鑰填入對應:

項目 對應代碼變數
網站金鑰 _checkBoxV2WebSiteKey
密鑰 _checkBoxV2SecretKey


public partial class HomeController : Controller
{
    // 1-1. 前端使用的網站金鑰
    private readonly string _checkBoxV2WebSiteKey = $@"";
    // 1-2. 後端使用的金鑰
    private readonly string _checkBoxV2SecretKey = $@"";

    /// <summary>
    /// 2. 檢視 View
    /// </summary>    
    [HttpGet]
    public IActionResult CheckBoxV2()
    {
        return View();
    }

    /// <summary>
    /// 3. 從前端獲得訪問 Token ,並反饋 reCAPTCHA CheckBox V2 驗證結果
    /// </summary>
    [HttpPost]
    public async Task<IActionResult> CheckBoxV2Validate(string Username)
    {
        // 3-1. 前端使用的 WebSite Key 
        var captchaResponse = Request.Form["g-recaptcha-response"];
        if (string.IsNullOrEmpty(captchaResponse))
        {
            ViewBag.Message = "請完成 reCAPTCHA - CheckBox V2 驗證";
            return View();
        }

        // 3-2. 將後端 + 前端使用的 key 送到 Google 的 reCAPTCHA 驗證
        var client = _httpClientFactory.CreateClient();
        var postData = new Dictionary<string, string> {
                           {"secret", _checkBoxV2SecretKey},
                           {"response", captchaResponse}
                       };

        // 3-3. 獲得響應結果 (CheckBox 與 Invisible 使用的 Json 格式相同)
        var response = await client.PostAsync("https://www.google.com/recaptcha/api/siteverify",
                                               new FormUrlEncodedContent(postData));
        var json = await response.Content.ReadAsStringAsync();
        var captchaResult = JsonSerializer.Deserialize<ReCaptchaResponse>(json);

        // 3-4.響應 - 並將結果放進 ViewBag 給用戶提示
        if (captchaResult.success)
        {
            ViewBag.Message = $"CheckBox V2 驗證成功,歡迎 {Username}!";
        }
        else
        {
            ViewBag.Message = "CheckBox V2 驗證失敗,請重試。";
        }

        // 4.返回頁面
        return View("CheckBoxV2");
    }
}



Step 6:驗證成果 - 啟動程式到首頁

啟動專案後,會來到程式首頁,選擇框選的地方跳轉到 DEMO 頁面




Step 7:驗證成果 - CheckBox V2 頁面

進入測試頁面 -> 進行打勾 (我不是機器人)


Step 8:驗證成果 - 判斷出真人

當我們用滑鼠點擊時,如果 reCAPTCHA 判斷從頁面載入,到打勾的過程中,演算出執行者是真人,會立刻出現打勾,表示正確

然後我們按下送出,可以獲得驗證成功的結果


Step 9:驗證成果 - 自動化工具訪問 CheckBox V2 驗證器 - 保持網站啟動

在本機對專案啟動,可以開啟 2 個 Visual Studio 或者直接下以下指令,啟動 localhost 的 Web

dotnet reCAPTCHATbyGoogleExample.dll




Step 10:驗證成果 - 自動化工具訪問 CheckBox V2 驗證器 - 開啟工具

啟動該專案,並且選擇 Program_CheckBoxV2.cs 做為啟動對象,執行自動化 Selenium 程式

代碼如下:

public class Program_CheckBoxV2
{
    static void Main(string[] args)
    {

        ChromeOptions options = new ChromeOptions();
        options.AddArgument("--start-maximized");
        try
        {
            using (IWebDriver driver = new ChromeDriver(options))
            {
                // 1. 進入 reCAPTCHA v2 Checkbox 測試頁面
                driver.Navigate().GoToUrl("http://localhost:5000/Home/CheckBoxV2");

                // 2. 等待頁面載入
                Thread.Sleep(2000);

                // 3. 填入名稱
                var nameInput = driver.FindElement(By.Name("Username"));
                nameInput.Clear();
                nameInput.SendKeys("MilkTeaGreen");

                Thread.Sleep(2000);

                // 4. 切換到 reCAPTCHA iframe
                IWebElement iframe = driver.FindElement(By.CssSelector("iframe[title='reCAPTCHA']"));
                driver.SwitchTo().Frame(iframe);

                // 5. 直接點擊(很容易被判定機器人)
                Console.WriteLine("直接 DOM Click reCAPTCHA...");
                IWebElement checkbox = driver.FindElement(By.Id("recaptcha-anchor"));
                checkbox.Click();

                Thread.Sleep(30000);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }
    }

}



Step 11:驗證成果 - CheckBox V2 驗證器 - 防護成功

自動化的過程,因為 Selenium 實現了瞬移,因此跳出驗證畫面,需要對圖片做驗證
成功的實現阻擋自動化機器人攻擊自家的網站。




第四部分:reCAPTCHA DEMO - 隱形 reCAPTCHA 標記

Step 1:註冊新 reCAPTCHA

登入Google reCAPTCHA網站,我們要註冊新的金鑰 -> 開始使用
※每個驗證器都需要獨立新增 reCAPTCHA ,因為 Google 會依照選擇驗證方式從而產生一對驗證器的金鑰。


Step 2:註冊新 reCAPTCHA - Invisible

進入後到註冊新頁面,依序填寫如圖內容
這邊驗證類型選擇 驗證問題(v2) -> 「隱形 reCAPTCHA」標記
網域填寫:localhost ,這會用於開發者在 DEBUG 模式下可以驗證 reCAPTCHA 是否符合預期


Step 3:註冊新 reCAPTCHA - 取得網站金鑰、密鑰

接著會跳轉到設定完成,請將畫面上的 網站金鑰密鑰 記錄下來

功能 功能說明
網站金鑰 提供給前端的金鑰,即使明文被用戶知道也無訪
密鑰 存在於伺服器、應用程式中的密鑰,用來與網站金鑰配對,相符合時驗證器才生效




Step 4:範例專案 - Razor 檢視器

開啟範例專案 -> Views/Home/InvisibleV2.cshtml 檔案 -> 內容如下:
當用戶訪問時,不需要做任何事,只要行為可疑,就會被判對為機器人,從而要求驗證

@{
    ViewData["Title"] = "reCAPTCHA V2 - 隱藏在背景機制";
}

<h2>reCAPTCHA V2 - 隱藏在背景機制 Demo</h2>

<form id="demo-form" method="post" asp-action="InvisibleV2Validate">
    <input type="text" name="Username" placeholder="輸入名稱" value="MilkTeaGreen" />


    <button class="g-recaptcha"
            data-sitekey="6Ld0m6QrAAAAALRPum4xz9IUcUB55tjDtMl4WMx7"
            data-callback="onSubmit"
            data-size="invisible">
            送出
    </button>
</form>

<script src="https://www.google.com/recaptcha/api.js" async defer></script>

<script>
    function onSubmit(token) {
        document.getElementById("demo-form").submit();
    }
</script>

@if (ViewBag.Message != null)
{
    <p>@ViewBag.Message</p>
}



Step 5:範例專案 - 後端控制器

開啟範例專案 -> Controller/Home/HomeController.InvisibleV2.cs 檔案 -> 內容如下:
提供檢視、前端在執行送出的過程之間,若被偵測到異常,會被視為機器人
當 Success 時即表示驗證成功,此資訊會記錄於 Google 的分析統計中
請將 Step 3 得到的一對金鑰填入對應:

項目 對應代碼變數
網站金鑰 _checkBoxV2WebSiteKey
密鑰 _checkBoxV2SecretKey


public partial class HomeController : Controller
{
    // 1-1. 前端使用的網站金鑰
    private readonly string _InvisibleV2WebSiteKey = $@"";
    // 1-2. 後端使用的金鑰
    private readonly string _InvisibleV2WebSecretKey = $@"";
    
    /// <summary>
    /// 2. 檢視 View
    /// </summary>    
    [HttpGet]
    public IActionResult InvisibleV2()
    {
        return View();
    }

    /// <summary>
    /// 3. 從前端獲得訪問 Token ,並反饋 reCAPTCHA Invisible V2 驗證結果
    /// </summary>    
    [HttpPost]
    public async Task<IActionResult> InvisibleV2Validate(string Username)
    {
        // 3-1. 前端使用的 WebSite Key 
        var captchaResponse = Request.Form["g-recaptcha-response"];
        if (string.IsNullOrEmpty(captchaResponse))
        {
            ViewBag.Message = "請完成 reCAPTCHA - Invisible V2 驗證";
            return View();
        }

        // 3-2. 將後端 + 前端使用的 key 送到 Google 的 reCAPTCHA 驗證
        var client = _httpClientFactory.CreateClient();
        var postData = new Dictionary<string, string> {
                          { "secret", _InvisibleV2WebSecretKey },
                          { "response", captchaResponse }
                      };
        
        // 3-3. 獲得響應結果
        var httpResponse = await client.PostAsync("https://www.google.com/recaptcha/api/siteverify",
                                                   new FormUrlEncodedContent(postData));
        var json = await httpResponse.Content.ReadAsStringAsync();
        var captchaResult = JsonSerializer.Deserialize<ReCaptchaResponse>(json);

        // 3-4. 響應 - 並將結果放進 ViewBag 給用戶提示
        if (captchaResult.success)
        {
            ViewBag.Message = $"Invisible V2 驗證成功,歡迎 {Username}!";
        }
        else
        {
            ViewBag.Message = "Invisible V2 驗證失敗,請重試。";
        }

        // 4. 返回頁面
        return View("InvisibleV2");
    }
}



Step 6:驗證成果 - 啟動程式到首頁

啟動專案後,會來到程式首頁,選擇框選的地方跳轉到 DEMO 頁面


Step 7:驗證成果 - Invisible V2 頁面

進入測試頁面 -> 直接送出


Step 8:驗證成果 - 判斷出真人


然後我們按下送出,可以獲得驗證成功的結果,


Step 9:驗證成果 - 自動化工具訪問 Invisible V2 驗證器 - 保持網站啟動

在本機對專案啟動,可以開啟 2 個 Visual Studio 或者直接下以下指令,啟動 localhost 的 Web

dotnet reCAPTCHATbyGoogleExample.dll




Step 10:驗證成果 - 自動化工具訪問 Invisible V2 驗證器 - 開啟工具

啟動該專案,並且選擇 Program_InvisibleV2.cs 做為啟動對象,執行自動化 Selenium 程式

代碼如下:

public class Program_InvisibleV2
{
    static void Main(string[] args)
    {
        ChromeOptions options = new ChromeOptions();
        options.AddArgument("--start-maximized");
        try
        {
            using (IWebDriver driver = new ChromeDriver(options))
            {
                // 1. 進入 Invisible V2 驗證器測試頁面
                driver.Navigate().GoToUrl("http://localhost:5000/Home/InvisibleV2");

                // 2. 填入名稱
                var nameInput = driver.FindElement(By.Name("Username"));
                nameInput.Clear();
                nameInput.SendKeys("MilkTeaGreen");

                // 3. 點擊送出按鈕(Invisible reCAPTCHA 會自動觸發)
                var submitButton = driver.FindElement(By.CssSelector(".g-recaptcha"));
                submitButton.Click();

                // 4. 等待驗證處理(實際應該用顯示等待 WebDriverWait)
                Thread.Sleep(5000);

                // 5. 取得頁面結果
                var bodyText = driver.FindElement(By.TagName("body")).Text;
                Console.WriteLine("頁面內容:\n" + bodyText);

                Thread.Sleep(30000);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }
    }
}



Step 11:驗證成果 - CheckBox V2 驗證器 - 防護成功

自動化的過程,因為 Selenium 仍實現了瞬移,因此跳出驗證畫面,需要對圖片做驗證
成功的實現阻擋自動化機器人攻擊自家的網站。




第五部分:reCAPTCHA DEMO - 以分數為依據 (v3)

Step 1:註冊新 reCAPTCHA

登入Google reCAPTCHA網站,我們要註冊新的金鑰 -> 開始使用
※每個驗證器都需要獨立新增 reCAPTCHA ,因為 Google 會依照選擇驗證方式從而產生一對驗證器的金鑰。


Step 2:註冊新 reCAPTCHA - Score

進入後到註冊新頁面,依序填寫如圖內容
這邊驗證類型選擇 以分數為依據 (v3)
網域填寫:localhost ,這會用於開發者在 DEBUG 模式下可以驗證 reCAPTCHA 是否符合預期


Step 3:註冊新 reCAPTCHA - 取得網站金鑰、密鑰

接著會跳轉到設定完成,請將畫面上的 網站金鑰密鑰 記錄下來

功能 功能說明
網站金鑰 提供給前端的金鑰,即使明文被用戶知道也無訪
密鑰 存在於伺服器、應用程式中的密鑰,用來與網站金鑰配對,相符合時驗證器才生效




Step 4:範例專案 - Razor 檢視器

開啟範例專案 -> Views/Home/Program_ScoreV3.cshtml 檔案 -> 內容如下:
當用戶訪問時,不需要做任何事,只要行為可疑,就會被判對為機器人,從而要求驗證
備註:(Invisiable 是二元判斷, Score 是分數判斷)

@{
    ViewData["Title"] = "reCAPTCHA V3 - Score 機制";
}

<h2>reCAPTCHA V3 - Score 機制 Demo</h2>

<form id="score-form" method="post" asp-action="ScoreV3Validate">
    <input type="text" name="Username" placeholder="輸入名稱" value="MilkTeaGreen" />
    <input type="hidden" name="g-recaptcha-response" id="g-recaptcha-response"  />
    <button type="submit">送出</button>
</form>

<script src="https://www.google.com/recaptcha/api.js?render=6Ldqo6QrAAAAAHoycY5qc7pwJjE1b8igiXXJ8vCq"></script>
<script>
    grecaptcha.ready(function () {
        grecaptcha.execute('6Ldqo6QrAAAAAHoycY5qc7pwJjE1b8igiXXJ8vCq', { action: 'submit' }).then(function (token) {
            document.getElementById('g-recaptcha-response').value = token;
        });
    });
</script>

@if (ViewBag.Message != null)
{
    <p>@ViewBag.Message</p>
}



Step 5:範例專案 - 後端控制器

開啟範例專案 -> Controller/Home/HomeController.ScoreV3.cs 檔案 -> 內容如下:
提供檢視、前端在執行送出的過程之間,若被偵測到異常,會被視為機器人
當 Success 時即回傳分數,分數越高越接近真人(滿分 1.0),越低越接近機器人(最低 0),此資訊會記錄於 Google 的分析統計中
請將 Step 3 得到的一對金鑰填入對應:

項目 對應代碼變數
網站金鑰 _checkBoxV2WebSiteKey
密鑰 _checkBoxV2SecretKey


public partial class HomeController : Controller
{
    // 1-1.  前端使用的網站金鑰
    private readonly string _ScoreV3WebSiteKey = $@"";
    // 1-2. 後端使用的金鑰
    private readonly string _ScoreV3WebSecretKey = $@"";

    /// <summary>
    /// 2. 檢視 View
    /// </summary>
    [HttpGet]
    public IActionResult ScoreV3()
    {
        return View();
    }

    /// <summary>
    /// 3. 從前端獲得訪問 Token ,並反饋 reCAPTCHA Score V3 驗證結果
    /// </summary>
    [HttpPost]
    public async Task<IActionResult> ScoreV3Validate(string Username)
    {
        // 3-1. 前端使用的 WebSite Key 
        var captchaResponse = Request.Form["g-recaptcha-response"];
        if (string.IsNullOrEmpty(captchaResponse))
        {
            ViewBag.Message = "請完成 reCAPTCHA - Score V3 驗證";
            return View();
        }

        // 3-2. 將後端 + 前端使用的 key 送到 Google 的 reCAPTCHA 驗證
        var client = _httpClientFactory.CreateClient();
        var postData = new Dictionary<string, string> {
                           {"secret", _ScoreV3WebSecretKey},
                           {"response", captchaResponse}
                       };
        
        // 3-3. 獲得響應結果 Score V3 的 Json 格式多了 score 欄位
        var response = await client.PostAsync("https://www.google.com/recaptcha/api/siteverify", 
                                               new FormUrlEncodedContent(postData));

        var json = await response.Content.ReadAsStringAsync();
        var captchaResult = JsonSerializer.Deserialize<ReCaptchaResponseV3>(json);

        // 3-4. 響應 - 並將結果放進 ViewBag 給用戶提示
        if (captchaResult.success)
        {
            // 3-5. 可以依照分數決定自己網站對於機器人應對策略
            ViewBag.Message = $"Score V3 驗證成功,當前分數 : {captchaResult.score},歡迎 {Username}!";
        }
        else
        {
            ViewBag.Message = "Score V3 驗證失敗,請重試。";
        }

        // 4. 返回頁面
        return View("ScoreV3");
    }

}



Step 6:驗證成果 - 啟動程式到首頁

啟動專案後,會來到程式首頁,選擇框選的地方跳轉到 DEMO 頁面


Step 7:驗證成果 - Score V3 頁面

進入測試頁面 -> 直接送出


Step 8:驗證成果 - 判斷出真人


然後我們按下送出,可以獲得驗證成功的結果,得到分數 0.9 (但實際上需要給此驗證器一些時間,可參考第五部分 Step 11.)


Step 9:驗證成果 - 自動化工具訪問 Score V3 驗證器 - 保持網站啟動

在本機對專案啟動,可以開啟 2 個 Visual Studio 或者直接下以下指令,啟動 localhost 的 Web

dotnet reCAPTCHATbyGoogleExample.dll




Step 10:驗證成果 - 自動化工具訪問 Score V3 驗證器 - 開啟工具

啟動該專案,並且選擇 Program_ScoreV3.cs 做為啟動對象,執行自動化 Selenium 程式

代碼如下:

public class Program_ScoreV3
{
    static void Main(string[] args)
    {
        // 啟動 ChromeDriver
        var options = new ChromeOptions();
        options.AddArgument("--start-maximized");        

        try
        {
            using (var driver = new ChromeDriver(options))
            {
                // 1. 進入 reCAPTCHA v3 測試頁面
                driver.Navigate().GoToUrl("http://localhost:5000/Home/ScoreV3"); // 改成你的實際 URL

                // 2. 填入 Username
                var usernameField = driver.FindElement(By.Name("Username"));
                usernameField.Clear();
                usernameField.SendKeys("MilkTeaGreen");

                // 3. 等待 g-recaptcha-response 有值
                var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
                wait.Until(d =>
                {
                    var tokenValue = d.FindElement(By.Id("g-recaptcha-response")).GetAttribute("value");
                    return !string.IsNullOrEmpty(tokenValue);
                });

                // 4. 取得 Token
                Console.WriteLine("[Debug] Token 已產生: " +
                    driver.FindElement(By.Id("g-recaptcha-response")).GetAttribute("value"));

                // 5. 送出表單
                driver.FindElement(By.CssSelector("form#score-form button[type='submit']")).Click();

                // 6. 等驗證結果出現
                wait.Until(d => d.PageSource.Contains("Score V3 驗證成功") || d.PageSource.Contains("Score V3 驗證失敗"));

                Console.WriteLine("頁面回應:\n" + driver.PageSource);

                Thread.Sleep(30000);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }
    }
}



Step 11:驗證成果 - Score V3 驗證器 - 機制影響

自動化的過程,雖然 Selenium 實現了瞬移,但是在 Score V3 驗證機制下,會有自己的演算法判斷是否在測試 (我的域名是 localhost)
要影響分數的變化有以下,否則恆定為 0.9 :

1. 需要啟用網站並且營運一段時間, Google 才能為您的網站判斷其訪問的真人行為
2. 基準版、標準版相對於企業版需要更多時間,直接花錢變企業版可以加快分數變化



可參考 StackOverflow 的討論串:連結


第六部分:管理金鑰 & 統計分析

Step 1: Google 提供 2 種入口網站

Google 提供了 reCAPTCHA 2 種入口來提供用戶管理,2 個網站都可以為 reCAPTCHA 做資料統計,補充說明:
分別原始 reCAPTCHA 管理後台開發者整合 reCAPTCHA 後台(GCP)

連結項目 差異說明
原始 reCAPTCHA 管理後台 功能比較單純、早期(v1、v2、v3)都是從這裡建立與管理網站金鑰、目前仍從這邊建立網站金鑰、密鑰
開發者整合 reCAPTCHA 後台(GCP) Google Cloud Platform (GCP) 的產品頁與管理入口,在這裡建立的 key,通常是 Enterprise 版,而不是免費的 reCAPTCHA



Step 2:管理金鑰 - GCP 進入管理

若要刪除金鑰,對金鑰管理建議在 GCP 做管理
進入連結後 -> 管理 reCAPTCHA


Step 3:管理金鑰 - 選擇金鑰

進入 GCP 後 -> 選擇金鑰詳細
每把金鑰對應著不同的 reCAPTCHA 驗證器


Step 4:管理金鑰 - 統計分析頁、管理設定

進入金鑰詳細後,上方的 機器人 分頁,可以出現使用此金鑰用戶訪問的次數,並且會提供統計圖
若要管理此金鑰可選擇右上角的 編輯金鑰刪除金鑰


Step 5:管理金鑰 - 編輯金鑰 - 域名

進入編輯金鑰後,最常修改的應屬於 網域清單 ,因為金鑰會在自己網站綁定域名後,到此來做編輯設定