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

无法从API请求获取acw_sc__v2 token,求其生成逻辑与获取方法

前程无忧acw_sc__v2 Token 获取方案

核心说明

acw_sc__v2是前程无忧通过前端混淆JS动态生成的加密Token,用于验证请求合法性。它的生成依赖以下几个要素:

  • 搜索页面中嵌入的加密种子(通常是页面源码里的一段特定字符串)
  • 已获取的guid、acw_tc Cookie
  • 自定义的加密算法(经过JS混淆,需逆向分析)

注意:该Token以64开头是因为加密结果做了Base64编码,直接解码无法得到明文,需先还原加密逻辑。

获取步骤

  • 请求搜索页面,提取加密种子:先访问目标搜索页面,从页面源码中找到加密所需的初始种子(通常在<script>标签内,可通过正则匹配包含acw_sc__v2相关的变量内容)。
  • 逆向JS加密逻辑:通过浏览器开发者工具定位页面加载的混淆JS文件,分析生成acw_sc__v2的加密流程——通常是结合guid、acw_tc和种子值,经过多轮异或、哈希或自定义加密后,再做Base64编码得到最终Token。
  • Python实现加密逻辑:将逆向得到的加密逻辑用Python重写,生成合法的acw_sc__v2。

优化后的代码示例

以下是整合了页面请求、种子提取和Token生成的简化示例(注:加密逻辑需根据实际逆向结果调整):

import requests
import re
import hashlib
import base64

session = requests.Session()

# 1. 请求搜索页面,获取加密种子和基础Cookie
search_url = "https://we.51job.com/pc/search?keyword=python%20developer&searchType=2&sortType=0&metro="
response = session.get(search_url)
# 从页面源码提取加密种子(示例正则,需根据实际页面调整)
seed_match = re.search(r'acw_sc__v2.*?="(64.*?)"', response.text)
if not seed_match:
    raise ValueError("未找到加密种子")
seed = seed_match.group(1)

# 获取已有的guid和acw_tc
cookie_data = session.cookies.get_dict()
guid = cookie_data.get("guid")
acw_tc = cookie_data.get("acw_tc")
if not guid or not acw_tc:
    raise ValueError("未获取到必要的Cookie")

# 2. 实现加密逻辑(示例,需替换为实际逆向的算法)
def generate_acw_sc_v2(seed, guid, acw_tc):
    # 示例:结合种子、guid、acw_tc做SHA-256哈希后Base64编码
    raw_data = f"{seed}{guid}{acw_tc}".encode()
    hash_result = hashlib.sha256(raw_data).digest()
    return base64.b64encode(hash_result).decode()

acw_sc_v2 = generate_acw_sc_v2(seed, guid, acw_tc)

# 3. 构造请求Headers
headers = {
    'Accept': 'application/json, text/plain, */*',
    'Accept-Language': 'en,en-US;q=0.9,fr-FR;q=0.8,fr;q=0.7,pt;q=0.6',
    'Connection': 'keep-alive',
    'From-Domain': '51job_web',
    'Referer': search_url,
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-origin',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36',
    'account-id': '',
    'partner': 'www_google_com',
    'property': '{"partner":"www_google_com","webId":2,"fromdomain":"51job_web","frompageUrl":"https://we.51job.com/","pageUrl":"https://we.51job.com/pc/search?keyword=python developer&searchType=2&sortType=0&metro=","identityType":"","userType":"","isLogin":"是","accountid":"","keywordType":""}',
    'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': 'Windows',
    'sign': '75f6fe150e9824fa27fe977fe3010da9925090e7af46e301a87fda31dca761c4',
    'user-token': '',
    'uuid': '95473941fbf1c03bfb07abf237130b54',
}

# 更新Cookie
session.cookies.set("acw_sc__v2", acw_sc_v2)

# 4. 请求API
api_url = 'https://we.51job.com/api/job/search-pc?api_key=51job&timestamp=1693104486&keyword=python%20developer&searchType=2&function=&industry=&jobArea=000000&jobArea2=&landmark=&metro=&salary=&workYear=&degree=&companyType=&companySize=&jobType=&issueDate=&sortType=0&pageNum=1&requestId=&pageSize=20&source=1&accountId=&pageCode=sou%7Csou%7Csoulb'
response = session.get(api_url, headers=headers)

# 调试信息
print("Status Code:", response.status_code)
print("Response Text:", response.text)

try:
    print("JSON Response:", response.json())
except requests.exceptions.JSONDecodeError:
    print("Could not decode JSON.")

注意事项

  • 前程无忧的加密逻辑可能会随时更新,需定期重新逆向JS代码
  • 请确保请求头和Cookie的完整性,模拟真实浏览器行为,避免被反爬检测
  • 不要过度频繁请求,遵守网站的使用规范

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:57:03