เอกสารการรวมเซิร์ฟเวอร์

กระบวนการสื่อสารของผลิตภัณฑ์

กระบวนการปกติ

เมื่อบริการยืนยันตัวตนทำงานปกติและเครือข่ายของผู้ใช้โหลดได้ตามปกติ กระบวนการ captcha จะดำเนินการ เซิร์ฟเวอร์จำเป็นต้องให้ความสำคัญกับขั้นตอนการยืนยันตัวตนครั้งที่สอง

image-20250427154654130

กระบวนการในกรณีข้อยกเว้น

กระบวนการ captcha ออฟไลน์

เมื่อบริการยืนยันตัวตนทำงานผิดปกติและใช้โหมดออฟไลน์ของ captcha เซิร์ฟเวอร์จำเป็นต้องให้ความสำคัญกับขั้นตอนการยืนยันตัวตนครั้งที่สอง ในกรณีนี้ คำขอของเซิร์ฟเวอร์ไปยังบริการ captcha จะพบข้อยกเว้น แนะนำให้จับข้อยกเว้นและตัดสินใจว่าจะอนุญาตให้ผู้ใช้ดำเนินการต่อหรือไม่ตามสถานการณ์ทางธุรกิจ

image-20250427154749118

กระบวนการลดระดับแบบกำหนดเอง (สำหรับการอ้างอิงเท่านั้น)

เมื่อบริการยืนยันตัวตนทำงานผิดปกติและใช้การยืนยันตัวตนลดระดับแบบกำหนดเอง เช่น การยืนยันตัวอักษร แนะนำให้เซิร์ฟเวอร์เพิ่มอินเทอร์เฟซหรือสวิตช์สำหรับส่วนหน้าเพื่อกำหนดวิธีการยืนยันตัวตนเฉพาะ เซิร์ฟเวอร์สามารถใช้อินเทอร์เฟซ check_status ที่ captcha ให้มาเพื่อตรวจสอบว่า captcha ทำงานปกติหรือไม่

image-20250427154933547

แผนการรวม captcha ฝั่งเซิร์ฟเวอร์

การเตรียมการก่อนการรวม

รับทรัพยากรที่จำเป็น ที่อยู่โดเมน และข้อมูลอื่น ๆ จากไคลเอนต์การรวม โปรดติดต่อผู้ประสานงานภายในบริษัทหลังการปรับใช้เพื่อรับข้อมูลนี้

ประเภทไคลเอนต์ ทรัพยากรที่จำเป็น คำอธิบายทรัพยากร
เซิร์ฟเวอร์ captchaId ID ของสถานการณ์การยืนยันตัวตน สามารถสร้างได้ผ่านคอนโซลการจัดการ
captchaKey KEY ของสถานการณ์การยืนยันตัวตน สร้างขึ้นเมื่อสร้างสถานการณ์ใหม่ในคอนโซลการจัดการ ตรงกับ captchaId แบบหนึ่งต่อหนึ่ง

การรวมฝั่งเซิร์ฟเวอร์

เมื่อผู้ใช้ผ่าน captcha บนอินเทอร์เฟซส่วนหน้า จะมีการสร้างชุดพารามิเตอร์ที่เกี่ยวข้องกับ captcha คำขอธุรกิจของผู้ใช้จะรวมพารามิเตอร์เหล่านี้ และอินเทอร์เฟซธุรกิจส่วนหลังจะอัปโหลดพารามิเตอร์เหล่านี้ไปยังอินเทอร์เฟซการยืนยันตัวตนครั้งที่สองของ EngageLab เพื่อยืนยันความถูกต้องของการยืนยันตัวตนของผู้ใช้

ตัวอย่างสถานการณ์การเข้าสู่ระบบ:

  1. ก่อนการรวม captcha ส่วนหน้าจะส่งชื่อผู้ใช้และรหัสผ่านไปยังอินเทอร์เฟซการเข้าสู่ระบบธุรกิจ ฝั่งธุรกิจจะตรวจสอบว่าชื่อผู้ใช้และรหัสผ่านตรงกันหรือไม่ หากตรงกัน ผู้ใช้จะเข้าสู่ระบบ หากไม่ตรงกัน จะปฏิเสธการเข้าสู่ระบบ
  2. หลังการรวม captcha ส่วนหน้าจะส่งข้อมูลธุรกิจพร้อมกับ พารามิเตอร์ที่เกี่ยวข้องกับ captcha ไปยังอินเทอร์เฟซการเข้าสู่ระบบธุรกิจ ฝั่งธุรกิจจะส่งพารามิเตอร์ที่เกี่ยวข้องกับ captcha ไปยังอินเทอร์เฟซการยืนยันตัวตนครั้งที่สอง (validate) ของเซิร์ฟเวอร์ captcha เพื่อรับผลลัพธ์ captcha โดยพิจารณาจากผลลัพธ์ captcha และผลการจับคู่ชื่อผู้ใช้และรหัสผ่าน จะตัดสินใจว่าจะอนุญาตให้ผู้ใช้ดำเนินการต่อในกระบวนการธุรกิจถัดไปหรือไม่

คำอธิบายอินเทอร์เฟซ validate

ข้อมูลอินเทอร์เฟซ คำอธิบาย
ที่อยู่ของอินเทอร์เฟซ https://captcha-api.engagelab.com/validate
วิธีการร้องขอ POST
รูปแบบการร้องขอ application/json
ประเภทการตอบกลับ json
พารามิเตอร์การร้องขอ
ชื่อพารามิเตอร์ ประเภท คำอธิบาย แหล่งที่มา
lot_number string ID การยืนยันตัวตนของเซิร์ฟเวอร์ จัดเตรียมโดยส่วนหน้า
captcha_output string ผลลัพธ์การยืนยันตัวตน จัดเตรียมโดยส่วนหน้า
pass_token string โทเค็นผ่านการยืนยันตัวตน จัดเตรียมโดยส่วนหน้า
gen_time string เวลาประทับการยืนยันตัวตน จัดเตรียมโดยส่วนหน้า
captcha_id string ID สถานการณ์การยืนยันตัวตน ไฟล์การกำหนดค่าธุรกิจ ต้องตรงกับ captchaId ที่ใช้โดยส่วนหน้า
sign_token string ลายเซ็นการยืนยันตัวตน สร้างโดยฝั่งธุรกิจ

sign_token ถูกสร้างขึ้นดังนี้:

ใช้ lot_number ของการยืนยันตัวตนปัจจุบันเป็นข้อความต้นฉบับ ใช้ captchaKey คีย์ส่วนตัวของลูกค้าเป็นคีย์ และใช้ hmac_sha256 อัลกอริธึมแฮชเพื่อทำการแฮชข้อความและคีย์แบบทางเดียวเพื่อสร้างลายเซ็นสุดท้าย

โค้ด Java ด้านล่างแสดงกระบวนการ:

String signToken = new HmacUtils(HmacAlgorithms.HMAC_SHA_256, captchaKey).hmacHex(lotNumber);
              
              String signToken = new HmacUtils(HmacAlgorithms.HMAC_SHA_256, captchaKey).hmacHex(lotNumber);

            
โค้ดนี้โชว์เป็นหน้าต่างลอย
ตัวอย่างเนื้อหาการร้องขอ
{ "lot_number": "f26d13345c9980c7705b9111b9398a0f", "captcha_id": "59bbe0f128f0624fdd185a6a2207aa54", "sign_token": "2e61e2f6d40e2896b18978fe6ae1416347fc43027ab7c875460d17ffa149dd7a", "pass_token": "79a4b7fc89d917b346d35286991bc9bca388a78bd31c20fa00907dcb8632611c", "gen_time": "1684826917", "captcha_output": "X4oDQ5p61MhE0Zpy5wQcl98WjrDdlDyL5B_VO0zPYnS9ITuz1ZZ6o0iw4Odk9f0AbAlzraqmeLGSmQWHPwJr2Vvf_Nm2Z0SMCn2ATME67e5UhMdopMgc8_zZi-SFRyH1" }
              
              {
    "lot_number": "f26d13345c9980c7705b9111b9398a0f",
    "captcha_id": "59bbe0f128f0624fdd185a6a2207aa54",
    "sign_token": "2e61e2f6d40e2896b18978fe6ae1416347fc43027ab7c875460d17ffa149dd7a",
    "pass_token": "79a4b7fc89d917b346d35286991bc9bca388a78bd31c20fa00907dcb8632611c",
    "gen_time": "1684826917",
    "captcha_output": "X4oDQ5p61MhE0Zpy5wQcl98WjrDdlDyL5B_VO0zPYnS9ITuz1ZZ6o0iw4Odk9f0AbAlzraqmeLGSmQWHPwJr2Vvf_Nm2Z0SMCn2ATME67e5UhMdopMgc8_zZi-SFRyH1"
}

            
โค้ดนี้โชว์เป็นหน้าต่างลอย
พารามิเตอร์การตอบกลับ
ชื่อพารามิเตอร์ ประเภท จำเป็น ตัวอย่าง คำอธิบาย
status String ใช่ success สถานะการตอบกลับ success หมายถึงการตอบกลับสำเร็จ
data Object ใช่ ดูฟิลด์ data ส่งคืนเมื่ออินเทอร์เฟซตอบกลับสำเร็จ

ฟิลด์ data อธิบายดังนี้:

ชื่อพารามิเตอร์ ประเภท จำเป็น ตัวอย่าง คำอธิบาย
result String ใช่ success ผลลัพธ์การยืนยันตัวตนครั้งที่สอง success หมายถึงการยืนยันตัวตนผ่าน ค่าอื่นหมายถึงการยืนยันตัวตนล้มเหลว
reason String ใช่ "" คำอธิบายผลลัพธ์การยืนยันตัวตน
captcha_args Object ใช่ {} ข้อมูลที่ส่งคืนให้กับไคลเอนต์ รวมถึงผลลัพธ์กลยุทธ์เป็นหลัก

ตัวบ่งชี้การยืนยัน captcha ผ่านคือ: ฟิลด์ status ในการตอบกลับคือ success และฟิลด์ result ก็เป็น success

ฟิลด์ captcha_args มีพารามิเตอร์ดังนี้:

ชื่อพารามิเตอร์ ประเภท จำเป็น ตัวอย่าง คำอธิบาย
model_cnn int ใช่ 0 ผลการตัดสินแบบจำลอง CNN sliding track 0 หมายถึง track ปกติ 1 หมายถึง track ผิดปกติ
model_probability int ใช่ 0 เป็นคำขอ captcha platform หรือไม่ 0 สำหรับผู้ใช้ปกติ 1 สำหรับคำขอ captcha แนะนำให้ดำเนินการแบบเรียลไทม์โดยธุรกิจ
used_type String ใช่ slide วิธีการยืนยันตัวตนที่ใช้ในครั้งนี้
web_simulator int ใช่ 0 เป็นซิมูเลเตอร์หรือไม่ 0 หมายถึงเบราว์เซอร์ปกติ 1 หมายถึงซิมูเลเตอร์
user_ip String ใช่ "127.0.0.1" IP ของผู้ใช้เมื่อการยืนยันตัวตนผ่าน
user_referer String ใช่ "" Referer ของคำขอของผู้ใช้เมื่อการยืนยันตัวตนผ่าน
cnn_records int ใช่ 0 แบบจำลอง sliding คาดการณ์ track ผิดปกติในกระบวนการหรือไม่
user_agent String ใช่ "User-Agent" UA ของผู้ใช้เมื่อการยืนยันตัวตนผ่าน
lot_number String ใช่ "9b57c5289e" ID การยืนยันตัวตนของผู้ใช้

หมายเหตุ: model_probability เป็นตัวบ่งชี้ captcha เมื่อค่าตัวบ่งชี้นี้คือ 1 จะถูกระบุว่าเป็นคำขอ captcha ผิดปกติ แนะนำให้ดำเนินการต่อโดยฝั่งธุรกิจ

เมื่อฟิลด์ result ใน data เป็น success หมายถึงผลลัพธ์การยืนยันตัวตนผ่าน

ตัวอย่างการตอบกลับ
{ "status": "success", "data": { "captcha_args": { "cnn_records": 0, "lot_number": "a989b864ad08cc08f270c22d9ab1fba0", "model_cnn": 0, "model_probability": 0, "used_type": "slide", "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36", "user_ip": "59.174.224.96", "user_referer": "http://127.0.0.1:5000/", "web_simulator": 0 }, "reason": "validate success", "result": "success" } } #### ตัวอย่างการผสานรวมโค้ด Java ใช้ด้านธุรกิจที่พัฒนาด้วยภาษา Java เป็นตัวอย่าง โค้ดอ้างอิงมีดังนี้: ```java package com.engagelab.demo.controller; import org.apache.commons.codec.digest.HmacAlgorithms; import org.apache.commons.codec.digest.HmacUtils; import org.json.JSONObject; import org.springframework.http.*; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import java.util.HashMap; import java.util.Map; @RestController public class MainController { @RequestMapping(value = "/login", method = {RequestMethod.GET}) public String userLogin(@RequestParam Map<String, String> getParams) { // 1. กำหนดค่าพารามิเตอร์เริ่มต้น ซึ่งต้องสอดคล้องกับ captchaId ที่ใช้ในส่วนหน้า และสามารถใส่ในไฟล์การตั้งค่าได้ String captchaId = "37830cbb24f5a2134d39c7cf3093bc14"; String captchaKey = "ab8aeb88a3c30e170ab04af8ada6e6ec"; // domain คือโดเมนบริการ captcha ของ EngageLab String domain = "https://captcha-api.engagelab.com"; // 2. รับพารามิเตอร์การยืนยันที่ส่งมาจากส่วนหน้าหลังจากการยืนยัน String lotNumber = getParams.get("lot_number"); String captchaOutput = getParams.get("captcha_output"); String passToken = getParams.get("pass_token"); String genTime = getParams.get("gen_time"); // 3. สร้างลายเซ็น // ใช้อัลกอริธึม HMAC มาตรฐานเพื่อสร้างลายเซ็น โดยใช้หมายเลขลำดับการยืนยันปัจจุบันของผู้ใช้ lot_number เป็นข้อความต้นฉบับ และใช้คีย์ส่วนตัวของการยืนยันของไคลเอนต์เป็นคีย์ // ใช้อัลกอริธึมแฮช SHA256 เพื่อแฮชข้อความและคีย์ในทิศทางเดียวเพื่อสร้างลายเซ็นสุดท้าย String signToken = new HmacUtils(HmacAlgorithms.HMAC_SHA_256, captchaKey).hmacHex(lotNumber); // 4. อัปโหลดพารามิเตอร์การยืนยันไปยังอินเทอร์เฟซการยืนยันขั้นที่สองของ EngageLab เพื่อยืนยันสถานะการยืนยันของผู้ใช้ Map<String, String> queryParams = new HashMap<>(); queryParams.put("captcha_id", captchaId); queryParams.put("lot_number", lotNumber); queryParams.put("captcha_output", captchaOutput); queryParams.put("pass_token", passToken); queryParams.put("gen_time", genTime); queryParams.put("sign_token", signToken); String url = String.format(domain + "/validate"); SimpleClientHttpRequestFactory clientHttpRequestFactory = new SimpleClientHttpRequestFactory(); clientHttpRequestFactory.setConnectTimeout(3000); // ตั้งค่าการหมดเวลาการเชื่อมต่อ clientHttpRequestFactory.setReadTimeout(1500); // ตั้งค่าการหมดเวลาอ่าน RestTemplate client = new RestTemplate(); client.setRequestFactory(clientHttpRequestFactory); JSONObject responseJsonObject = new JSONObject(); // ให้ความสำคัญกับข้อยกเว้นของอินเทอร์เฟซ และจัดการข้อยกเว้นที่เกี่ยวข้องเมื่อเกิดข้อยกเว้นในอินเทอร์เฟซการยืนยันขั้นที่สองหรือสถานะการตอบกลับไม่ใช่ 200 // เพื่อให้แน่ใจว่ากระบวนการทางธุรกิจไม่ถูกขัดขวางเนื่องจากการหมดเวลาของคำขออินเทอร์เฟซหรือเซิร์ฟเวอร์ไม่ตอบสนอง try { RequestEntity<Map<String, String>> requestEntity = RequestEntity.post(url).accept(MediaType.APPLICATION_JSON).body(queryParams); ResponseEntity<String> response = client.exchange(requestEntity, String.class); String resBody = response.getBody(); responseJsonObject = new JSONObject(resBody); }catch (Exception e){ // Todo: จัดการกรณีที่การเข้าถึงอินเทอร์เฟซหมดเวลา ในตัวอย่างนี้ สมมติว่าการยืนยันสำเร็จโดยค่าเริ่มต้น responseJsonObject.put("status", "success"); responseJsonObject.put("data", new JSONObject("{\"result\": \"success\", \"reason\": \"request captcha api fail\"}")); } // 5. พิจารณาสถานะการยืนยันของผู้ใช้ที่ส่งคืนจาก EngageLab เจ้าของเว็บไซต์ปฏิบัติตามตรรกะทางธุรกิจของตนเอง JSONObject res = new JSONObject(); // เงื่อนไขสำหรับการยืนยัน captcha ที่สำเร็จคือ: 1. ฟิลด์สถานะใน jsonObject เป็น success และ 2. แอตทริบิวต์ result ในฟิลด์ data ของ jsonObject เป็น success String status = responseJsonObject.getString("status"); if (status.equals("success")) { String data = responseJsonObject.getJSONObject("data").getString("result"); if (data.equals("success")) { res.put("login", "success"); res.put("reason", responseJsonObject.getJSONObject("data").getString("reason")); } else { res.put("login", "fail"); res.put("reason", responseJsonObject.getJSONObject("data").getString("reason")); } JSONObject captchaArgs = responseJsonObject.getJSONObject("data").getJSONObject("captcha_args"); // ที่นี่ รับผลลัพธ์การจดจำการแคร็กโปรโตคอล ในตัวอย่างนี้ จะบันทึกไว้เท่านั้น ขอแนะนำให้ธุรกิจจัดการตามโมเดลธุรกิจของตนเอง // model_probability ที่เป็น 0 หมายถึงผู้ใช้ปกติ ในขณะที่ 1 หมายถึงการแคร็กโปรโตคอล กล่าวคือ การเข้าถึงโดยตรงผ่านอินเทอร์เฟซ (crawler) Integer model_probability = captchaArgs.getInt("model_probability"); System.out.println("ผลลัพธ์การจดจำ crawler ของอินเทอร์เฟซนี้คือ: " + model_probability); } else { // อินเทอร์เฟซส่งคืนแต่ล้มเหลว จัดการเป็นการยืนยันล้มเหลว res.put("login", "fail"); res.put("reason", "captcha verify fail"); } return res.toString(); } }
              
              {
    "status": "success",
    "data": {
        "captcha_args": {
            "cnn_records": 0,
            "lot_number": "a989b864ad08cc08f270c22d9ab1fba0",
            "model_cnn": 0,
            "model_probability": 0,
            "used_type": "slide",
            "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36",
            "user_ip": "59.174.224.96",
            "user_referer": "http://127.0.0.1:5000/",
            "web_simulator": 0
        },
        "reason": "validate success",
        "result": "success"
    }
}

#### ตัวอย่างการผสานรวมโค้ด Java

ใช้ด้านธุรกิจที่พัฒนาด้วยภาษา Java เป็นตัวอย่าง โค้ดอ้างอิงมีดังนี้:

```java
package com.engagelab.demo.controller;

import org.apache.commons.codec.digest.HmacAlgorithms;
import org.apache.commons.codec.digest.HmacUtils;
import org.json.JSONObject;
import org.springframework.http.*;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;

@RestController
public class MainController {


    @RequestMapping(value = "/login", method = {RequestMethod.GET})
    public String userLogin(@RequestParam Map<String, String> getParams) {
        // 1. กำหนดค่าพารามิเตอร์เริ่มต้น ซึ่งต้องสอดคล้องกับ captchaId ที่ใช้ในส่วนหน้า และสามารถใส่ในไฟล์การตั้งค่าได้
        String captchaId = "37830cbb24f5a2134d39c7cf3093bc14";
        String captchaKey = "ab8aeb88a3c30e170ab04af8ada6e6ec";
        // domain คือโดเมนบริการ captcha ของ EngageLab
        String domain = "https://captcha-api.engagelab.com";

        // 2. รับพารามิเตอร์การยืนยันที่ส่งมาจากส่วนหน้าหลังจากการยืนยัน
        String lotNumber = getParams.get("lot_number");
        String captchaOutput = getParams.get("captcha_output");
        String passToken = getParams.get("pass_token");
        String genTime = getParams.get("gen_time");

        // 3. สร้างลายเซ็น
        // ใช้อัลกอริธึม HMAC มาตรฐานเพื่อสร้างลายเซ็น โดยใช้หมายเลขลำดับการยืนยันปัจจุบันของผู้ใช้ lot_number เป็นข้อความต้นฉบับ และใช้คีย์ส่วนตัวของการยืนยันของไคลเอนต์เป็นคีย์
        // ใช้อัลกอริธึมแฮช SHA256 เพื่อแฮชข้อความและคีย์ในทิศทางเดียวเพื่อสร้างลายเซ็นสุดท้าย
        String signToken = new HmacUtils(HmacAlgorithms.HMAC_SHA_256, captchaKey).hmacHex(lotNumber);

        // 4. อัปโหลดพารามิเตอร์การยืนยันไปยังอินเทอร์เฟซการยืนยันขั้นที่สองของ EngageLab เพื่อยืนยันสถานะการยืนยันของผู้ใช้
        Map<String, String> queryParams = new HashMap<>();
        queryParams.put("captcha_id", captchaId);
        queryParams.put("lot_number", lotNumber);
        queryParams.put("captcha_output", captchaOutput);
        queryParams.put("pass_token", passToken);
        queryParams.put("gen_time", genTime);
        queryParams.put("sign_token", signToken);

        String url = String.format(domain + "/validate");
        SimpleClientHttpRequestFactory clientHttpRequestFactory = new SimpleClientHttpRequestFactory();
        clientHttpRequestFactory.setConnectTimeout(3000);  // ตั้งค่าการหมดเวลาการเชื่อมต่อ
        clientHttpRequestFactory.setReadTimeout(1500);  // ตั้งค่าการหมดเวลาอ่าน
        RestTemplate client = new RestTemplate();
        client.setRequestFactory(clientHttpRequestFactory);

        JSONObject responseJsonObject = new JSONObject();
        // ให้ความสำคัญกับข้อยกเว้นของอินเทอร์เฟซ และจัดการข้อยกเว้นที่เกี่ยวข้องเมื่อเกิดข้อยกเว้นในอินเทอร์เฟซการยืนยันขั้นที่สองหรือสถานะการตอบกลับไม่ใช่ 200
        // เพื่อให้แน่ใจว่ากระบวนการทางธุรกิจไม่ถูกขัดขวางเนื่องจากการหมดเวลาของคำขออินเทอร์เฟซหรือเซิร์ฟเวอร์ไม่ตอบสนอง
        try { 
            RequestEntity<Map<String, String>> requestEntity = RequestEntity.post(url).accept(MediaType.APPLICATION_JSON).body(queryParams);
            ResponseEntity<String> response = client.exchange(requestEntity, String.class);
            String resBody = response.getBody();
            responseJsonObject = new JSONObject(resBody);
        }catch (Exception e){
            // Todo: จัดการกรณีที่การเข้าถึงอินเทอร์เฟซหมดเวลา ในตัวอย่างนี้ สมมติว่าการยืนยันสำเร็จโดยค่าเริ่มต้น
            responseJsonObject.put("status", "success");
            responseJsonObject.put("data", new JSONObject("{\"result\": \"success\", \"reason\": \"request captcha api fail\"}"));
        }

        // 5. พิจารณาสถานะการยืนยันของผู้ใช้ที่ส่งคืนจาก EngageLab เจ้าของเว็บไซต์ปฏิบัติตามตรรกะทางธุรกิจของตนเอง
        JSONObject res = new JSONObject();
        // เงื่อนไขสำหรับการยืนยัน captcha ที่สำเร็จคือ: 1. ฟิลด์สถานะใน jsonObject เป็น success และ 2. แอตทริบิวต์ result ในฟิลด์ data ของ jsonObject เป็น success
        String status = responseJsonObject.getString("status");
        if (status.equals("success")) {
            String data = responseJsonObject.getJSONObject("data").getString("result");
            if (data.equals("success")) {
                res.put("login", "success");
                res.put("reason", responseJsonObject.getJSONObject("data").getString("reason"));
            } else {
                res.put("login", "fail");
                res.put("reason", responseJsonObject.getJSONObject("data").getString("reason"));
            }
            JSONObject captchaArgs = responseJsonObject.getJSONObject("data").getJSONObject("captcha_args");
            // ที่นี่ รับผลลัพธ์การจดจำการแคร็กโปรโตคอล ในตัวอย่างนี้ จะบันทึกไว้เท่านั้น ขอแนะนำให้ธุรกิจจัดการตามโมเดลธุรกิจของตนเอง
            // model_probability ที่เป็น 0 หมายถึงผู้ใช้ปกติ ในขณะที่ 1 หมายถึงการแคร็กโปรโตคอล กล่าวคือ การเข้าถึงโดยตรงผ่านอินเทอร์เฟซ (crawler)
            Integer model_probability = captchaArgs.getInt("model_probability");
            System.out.println("ผลลัพธ์การจดจำ crawler ของอินเทอร์เฟซนี้คือ: " + model_probability);
        } else {
            // อินเทอร์เฟซส่งคืนแต่ล้มเหลว จัดการเป็นการยืนยันล้มเหลว
            res.put("login", "fail");
            res.put("reason", "captcha verify fail");
        }
        return res.toString();

    }
}

            
โค้ดนี้โชว์เป็นหน้าต่างลอย
icon
ติดต่อฝ่ายขาย