You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

POST请求返回JSON为null问题排查及Cookies、Tokens自动生成实现问询

自动获取请求所需Cookies与验证Token的实现方案

咱们先来理清楚核心问题:你手动填入的这些Cookies和Token,都是网站在用户首次访问页面时动态生成并绑定到当前会话的。要实现自动化,就得完整模拟用户从加载页面到完成验证的整个流程。下面分步骤给你具体的实现方法:

1. 用会话获取初始Cookies和__RequestVerificationToken

网站的__RequestVerificationToken(ASP.NET的防伪造令牌)是嵌入在页面HTML里的隐藏输入框中,而会话Cookies(比如.AspNetCore.Antiforgery.*和BIGipServer*)会在你首次GET请求页面时由服务器自动设置。我们可以用requests.Session()来自动维护会话Cookies,再用BeautifulSoup解析页面提取令牌:

import requests
from bs4 import BeautifulSoup

# 初始化会话,自动管理Cookies
session = requests.Session()

# 模拟浏览器的User-Agent,避免被识别为爬虫
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
}

# 首次访问目标页面,获取Cookies和验证Token
response = session.get('https://services.paci.gov.kw/card/search', headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')

# 从页面的隐藏input中提取__RequestVerificationToken
verification_token = soup.find('input', {'name': '__RequestVerificationToken'})['value']
print(f"已获取防伪造令牌: {verification_token[:20]}...")

2. 自动获取Google reCAPTCHA Token

你代码里的Token字段是Google reCAPTCHA的验证响应(也就是前端提交的g-recaptcha-response),这是网站的反爬机制。要自动获取这个Token,通常需要借助第三方验证码破解服务(比如2Captcha)——因为手动破解reCAPTCHA的难度极高。

下面是集成2Captcha的示例代码(你需要先注册2Captcha账号并获取API密钥):

def get_recaptcha_token(api_key, sitekey, target_url):
    # 向2Captcha提交reCAPTCHA破解任务
    submit_url = f"http://2captcha.com/in.php?key={api_key}&method=userrecaptcha&googlekey={sitekey}&pageurl={target_url}"
    submit_response = requests.get(submit_url)
    
    if not submit_response.text.startswith('OK'):
        raise Exception(f"提交验证码任务失败: {submit_response.text}")
    
    captcha_id = submit_response.text.split('|')[1]
    # 轮询等待破解结果
    while True:
        result_url = f"http://2captcha.com/res.php?key={api_key}&action=get&id={captcha_id}"
        result_response = requests.get(result_url)
        
        if result_response.text.startswith('OK'):
            return result_response.text.split('|')[1]
        elif result_response.text == 'CAPCHA_NOT_READY':
            import time
            time.sleep(2)  # 等待2秒后重试
        else:
            raise Exception(f"获取验证码结果失败: {result_response.text}")

# 配置你的2Captcha密钥和目标网站的reCAPTCHA Sitekey(从页面源码的data-sitekey属性提取)
CAPTCHA_API_KEY = "你的2Captcha API密钥"
RECAPTCHA_SITEKEY = "从目标页面源码中找到的sitekey值"
TARGET_URL = "https://services.paci.gov.kw/card/search"

# 获取reCAPTCHA验证Token
recaptcha_token = get_recaptcha_token(CAPTCHA_API_KEY, RECAPTCHA_SITEKEY, TARGET_URL)
print(f"已获取reCAPTCHA令牌: {recaptcha_token[:20]}...")

3. 组装请求并发起查询

现在把所有获取到的凭证组装起来,用之前的会话发起POST请求——会话会自动带上之前获取的Cookies,确保请求的合法性:

# 组装请求参数
payload = {
    'CivilId': '278071306337',
    'Token': recaptcha_token,
    'InquiryType': '2',
    '__RequestVerificationToken': verification_token,
}

# 发起POST请求
response = session.post('https://services.paci.gov.kw/card/search', headers=headers, data=payload)

# 处理响应结果
print(response.text)
with open('Output.txt', 'w', encoding='utf-8') as f:
    f.write(response.text)

关键注意事项

  • 会话必须保持:全程使用同一个requests.Session()实例,因为网站的Cookies和Token是绑定到会话的,分开的请求会导致凭证失效。
  • UA要真实:一定要设置和浏览器一致的User-Agent,很多网站会拦截默认的python-requests/xxx UA。
  • 合规性问题:使用第三方验证码服务时,要确保符合目标网站的服务条款,避免触发反爬机制导致IP或账号被封禁。

内容的提问来源于stack exchange,提问作者YasserKhalil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 17:27:36