无法从API请求获取acw_sc__v2 token,求其生成逻辑与获取方法
前程无忧acw_sc__v2 Token 获取方案
核心说明
acw_sc__v2是前程无忧通过前端混淆JS动态生成的加密Token,用于验证请求合法性。它的生成依赖以下几个要素:
- 搜索页面中嵌入的加密种子(通常是页面源码里的一段特定字符串)
- 已获取的
guid、acw_tcCookie - 自定义的加密算法(经过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×tamp=1693104486&keyword=python%20developer&searchType=2&function=&industry=&jobArea=000000&jobArea2=&landmark=&metro=&salary=&workYear=°ree=&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
相关产品推荐
相关产品推荐

