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

使用Python requests模块通过许可证号获取网页电话号码遇权限问题求助

问题描述

我用Python的requests模块编写了脚本,试图从指定网页通过许可证号354206获取对应电话号码,期望返回含目标号码的JSON响应。手动搜索该许可证号可正常得到带电话号码的结果,但脚本执行后返回状态码200及如下报错:

200
{'event': {'descriptor': 'markup://aura:invalidSession', 'attributes': {'values': {}}, 'eventDef': {'descriptor': 'markup://aura:invalidSession', 't': 'APPLICATION', 'xs': 'I', 'a': {'newToken': ['newToken', 'aura://String', 'I', False]}}}, 'exceptionMessage': 'Guest user access is not allowed', 'exceptionEvent': True}

原脚本代码如下:

import requests
import json

link = 'https://azroc.my.site.com/AZRoc/s/sfsites/aura'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36',
    'Referer': 'https://azroc.my.site.com/AZRoc/s/contractor-search',
    'Origin': 'https://azroc.my.site.com',
    'Accept': '*/*',
    'Accept-Encoding': 'gzip, deflate, br, zstd',
    'Accept-Language': 'en-US,en;q=0.9',
    'X-Sfdc-Page-Scope-Id': 'dd1f6a24-3e7b-41e9-8fcb-f0bda9979cc2',
    'X-Sfdc-Request-Id': '13815039000012b044',
}

params = {
    'r': '5',
    'other.ARCP_ContractorSearch.getRecords': '1'
}
payload = {
    'message': '{"actions":[{"id":"176;a","descriptor":"apex://ARCP_ContractorSearch/ACTION$getRecords","callingDescriptor":"markup://c:ARCP_ContractorSearch","params":{"searchKey":"354206","classification":null,"city":""}}]}',
    'aura.context': '{"mode":"PROD","fwuid":"eGx3MHlRT1lEMUpQaWVxbGRUM1h0Z2hZX25NdHFVdGpDN3BnWlROY1ZGT3cyNTAuOC40LTYuNC41","app":"siteforce:communityApp","loaded":{"APPLICATION@markup://siteforce:communityApp":"wi0I2YUoyrm6Lo80fhxdzA","MODULE@markup://lightning:f6Controller":"5PtsAUCMnPdpZDcNTHXtbg","COMPONENT@markup://instrumentation:o11ySecondaryLoader":"1JitVv-ZC5qlK6HkuofJqQ"},"dn":[],"globals":{},"uad":false}',
    'aura.pageURI': '/AZRoc/s/contractor-search',
    'aura.token': 'null',
}

with requests.Session() as session:
    session.headers.update(headers)
    res = session.post(link,params=params,data=json.dumps(payload))
    print(res.status_code)
    print(res.json())

请问如何修改脚本,才能通过requests模块实现通过许可证号获取目标网页的电话号码?


解决方案

报错Guest user access is not allowed说明Salesforce的Aura框架拒绝了未通过验证的请求,需模拟浏览器完整会话流程,而非直接发送硬编码参数。以下是修改思路和代码:

  • 先访问搜索页面获取动态会话参数:硬编码的X-Sfdc-Page-Scope-Id、fwuid、aura.token等参数与会话绑定,不能复用。需先GET访问搜索页面,从页面源码提取这些动态生成的参数。
  • 正确构造请求Payload:原Payload中的HTML实体编码(")无需保留,直接用标准JSON格式字符串即可,避免编码混乱。
  • 保持会话一致性:用同一个Session对象处理所有请求,确保Cookie和会话状态延续。

修改后的脚本示例:

import requests
import re
import json

# 初始化会话
session = requests.Session()
search_url = "https://azroc.my.site.com/AZRoc/s/contractor-search"
aura_url = "https://azroc.my.site.com/AZRoc/s/sfsites/aura"

# 第一步:访问搜索页面,提取必要的Aura参数和会话Cookie
base_headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'
}
response = session.get(search_url, headers=base_headers)
response.raise_for_status()

# 从页面源码提取动态参数
fwuid_match = re.search(r'"fwuid":"([^"]+)"', response.text)
page_scope_id_match = re.search(r'"X-Sfdc-Page-Scope-Id":"([^"]+)"', response.text)
aura_token_match = re.search(r'"auraToken":"([^"]+)"', response.text)

if not all([fwuid_match, page_scope_id_match, aura_token_match]):
    raise ValueError("无法从页面提取必要的Aura参数")

fwuid = fwuid_match.group(1)
page_scope_id = page_scope_id_match.group(1)
aura_token = aura_token_match.group(1)

# 第二步:构造Aura请求的Headers和Payload
request_headers = base_headers.copy()
request_headers.update({
    'Referer': search_url,
    'Origin': 'https://azroc.my.site.com',
    'Accept': '*/*',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'en-US,en;q=0.9',
    'X-Sfdc-Page-Scope-Id': page_scope_id,
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
})

params = {
    'r': '5',
    'other.ARCP_ContractorSearch.getRecords': '1'
}

payload = {
    'message': json.dumps([{
        "id": "1;a",
        "descriptor": "apex://ARCP_ContractorSearch/ACTION$getRecords",
        "callingDescriptor": "markup://c:ARCP_ContractorSearch",
        "params": {
            "searchKey": "354206",
            "classification": None,
            "city": ""
        }
    }]),
    'aura.context': json.dumps({
        "mode": "PROD",
        "fwuid": fwuid,
        "app": "siteforce:communityApp",
        "loaded": {},
        "dn": [],
        "globals": {},
        "uad": False
    }),
    'aura.pageURI': '/AZRoc/s/contractor-search',
    'aura.token': aura_token
}

# 第三步:发送POST请求并解析响应
response = session.post(aura_url, params=params, data=payload, headers=request_headers)
response.raise_for_status()

data = response.json()
print(response.status_code)
print(json.dumps(data, indent=2))

# 提取电话号码(根据实际响应结构调整)
if 'actions' in data and data['actions']:
    result = data['actions'][0].get('returnValue', {})
    records = result.get('records', [])
    if records:
        phone = records[0].get('Phone')
        if phone:
            print(f"提取到电话号码: {phone}")

关键说明

  • 先访问搜索页面动态提取会话参数,这些参数是Salesforce生成的会话标识,每次会话都会变化,硬编码无法通过验证。
  • Payload用json.dumps生成标准JSON字符串,避免原脚本的HTML实体编码问题。
  • 保持会话Cookie一致性,确保请求被识别为合法用户会话而非孤立请求。

内容的提问来源于stack exchange,提问作者robots.txt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:35:01